{
  "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"
    }
  ],
  "tags": [],
  "paths": {
    "/system/healthcheck": {
      "get": {
        "summary": "Dienst-Gesundheitsprüfung (öffentlich, nicht authentifiziert)",
        "description": "Öffentliche, nicht authentifizierte Liveness-Probe. Gibt `HTTP 200` mit `{status: \"ok\", timestamp}` zurück, wenn Dienst, DB, Cache und Broker funktionsfähig sind.",
        "operationId": "get_system_healthcheck",
        "x-didit-sdk": {
          "resource": "system",
          "method": "healthcheck",
          "auth": "public",
          "server": false
        },
        "tags": [
          "System"
        ],
        "security": [
          {}
        ],
        "parameters": [],
        "responses": {
          "200": {
            "description": "Der Dienst ist betriebsbereit und nimmt Anfragen an. Der Antwort-Body ist immer `{\"status\": \"ok\", \"timestamp\": \"<iso8601>\"}`.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "status",
                    "timestamp"
                  ],
                  "properties": {
                    "status": {
                      "type": "string",
                      "enum": [
                        "ok"
                      ],
                      "description": "Liveness-Markierung. Bei einer 200-Antwort immer die literale Zeichenkette `\"ok\"`.",
                      "example": "ok"
                    },
                    "timestamp": {
                      "type": "string",
                      "format": "date-time",
                      "description": "Serverzeitpunkt, zu dem die Gesundheitsprüfung ausgewertet wurde, in ISO 8601 mit Millisekundengenauigkeit und dem Suffix `Z` (UTC).",
                      "example": "2026-04-21T16:42:50.445Z"
                    }
                  }
                },
                "examples": {
                  "Healthy": {
                    "summary": "Dienst ist betriebsbereit",
                    "value": {
                      "status": "ok",
                      "timestamp": "2026-04-21T16:42:50.445Z"
                    }
                  }
                }
              }
            }
          },
          "503": {
            "description": "Dienst ist fehlerhaft — eines der konfigurierten Healthcheck-Plugins (Datenbank, Cache, Broker) schlägt fehl. Der Response-Body ist bewusst minimal gehalten; der HTTP-Status ist das maßgebliche Signal. Wiederholen Sie den Vorgang mit exponentiellem Backoff."
          },
          "5XX": {
            "description": "Der Verifizierungsdienst ist beeinträchtigt oder nicht erreichbar. Behandeln Sie jede Nicht-2xx-Antwort als „nicht funktionsfähig“ und führen Sie Wiederholungsversuche mit exponentiellem Backoff durch."
          }
        },
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -i https://verification.didit.me/system/healthcheck"
          },
          {
            "lang": "Python",
            "label": "Python (requests)",
            "source": "import requests\n\nresp = requests.get(\"https://verification.didit.me/system/healthcheck\", timeout=5)\nresp.raise_for_status()\nprint(resp.json())  # {'status': 'ok', 'timestamp': '2026-04-21T16:42:50.445Z'}"
          },
          {
            "lang": "JavaScript",
            "label": "Node.js (fetch)",
            "source": "const res = await fetch(\"https://verification.didit.me/system/healthcheck\");\nif (!res.ok) throw new Error(`Didit unhealthy: ${res.status}`);\nconst body = await res.json();\nconsole.log(body); // { status: 'ok', timestamp: '2026-04-21T16:42:50.445Z' }"
          }
        ]
      }
    },
    "/v3/email/risk/": {
      "post": {
        "summary": "Risiko-Score für eine E-Mail-Adresse ermitteln",
        "description": "Gibt Zustellbarkeit, Einweg-Adressen, Datenlecks, sitzungsübergreifende Übereinstimmungen und normalisierte Risiko-Intelligence-Signale zurück, ohne ein OTP zu senden. Der Endpoint erstellt eine API-Sitzung und gibt deren ID als `request_id` zurück.\n\n**Entscheidung.** Der übergeordnete `status` spiegelt `email.status` wider. Er lautet normalerweise `Approved`; die Risikobewertung kann `In Review` oder `Declined` ergeben.\n\n**Kompatibilitäts-Aliase.** Live-Antworten stellen das normalisierte Intelligence-Objekt sowohl als `email.email_intelligence` als auch als `email.enrichment` bereit. Die Werte sind identisch. Neue Integrationen können `email.enrichment` auslesen. Beide Schlüssel fehlen, wenn keine nutzbaren Intelligence-Daten zurückgegeben wurden.\n\n**Abrechnung.** Live-Aufrufe nutzen die Preise der Email Risk API. Die Anfrage ist abrechenbar, sobald die Abfrage startet, selbst wenn einige Best-Effort-Felder nicht verfügbar sind.\n\n**Sandbox.** Sandbox-Schlüssel validieren die Anfrage und geben deterministische, genehmigte Daten zurück, ohne eine E-Mail zu senden, Credits zu verbrauchen, eine Sitzung zu erstellen oder zu Networks beizutragen.\n\n**Authentifizierung.** Senden Sie den API-Schlüssel Ihrer Anwendung in `x-api-key`. Fehlende oder ungültige Anmeldedaten geben `403` zurück – diese API gibt niemals `401` zurück.\n\n**Rate-Limit.** Geteiltes Schreib-Budget von 300 Anfragen pro Minute pro API-Schlüssel über POST/PATCH/DELETE-Endpoints hinweg (Transaktionserstellungen und Ereignis-Ingestion haben ein separates Budget von 600).\n\n**Digitaler Fußabdruck.** Setzen Sie `enable_social` auf `true`, um einen `email_social`-Block hinzuzufügen: die Online-Plattformen, auf denen diese Adresse registriert ist, mit Anzahlen pro Kategorie und allen verfügbaren Profildetails. `profiles_registered: 0` bedeutet, dass die Plattformen überprüft wurden und die Adresse auf keiner davon gefunden wurde – eine gültige, abrechenbare Antwort. Der Block fehlt, wenn das Add-on nicht angefordert wurde oder die Überprüfung nicht abgeschlossen werden konnte, und wird in diesem Fall nicht abgerechnet. Die Abrechnung fügt pro Anfrage eine `email_social`-Einheit zusätzlich zum eigenen Preis dieses Endpoints hinzu.",
        "operationId": "post_v3email_risk",
        "x-didit-sdk": {
          "resource": "email",
          "method": "assess_risk",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Standalone APIs"
        ],
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X POST https://verification.didit.me/v3/email/risk/ \\\n  -H 'x-api-key: YOUR_API_KEY' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\n    \"email\": \"alice@example.com\",\n    \"country_code\": \"US\",\n    \"vendor_data\": \"lead-123\",\n    \"metadata\": {\"source\": \"signup_prescreen\"}\n  }'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.email.assess_risk(\n    email=\"alice@example.com\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.email.assessRisk({\n  email: \"alice@example.com\",\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Email.AssessRisk(ctx, didit.EmailRiskRequest{\n\tEmail: \"alice@example.com\",\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\nimport me.didit.types.EmailRiskRequest;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.email().assessRisk(EmailRiskRequest.builder()\n        .email(\"alice@example.com\")\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->email->assessRisk([\n    'email' => 'alice@example.com',\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.email.assess_risk(email: \"alice@example.com\")\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Email.AssessRiskAsync(new EmailRiskRequest\n{\n    Email = \"alice@example.com\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/EmailRiskRequest"
              },
              "examples": {
                "Minimal": {
                  "summary": "Eine Adresse mit Standardwerten bewerten",
                  "value": {
                    "email": "alice@example.com"
                  }
                },
                "Full context": {
                  "summary": "Score mit Signalen, Länderhinweis und Korrelations-IDs",
                  "value": {
                    "email": "alice@example.com",
                    "country_code": "US",
                    "signals": {
                      "ip": "192.0.2.1",
                      "device_id": "8F0B8FDD-C2CB-4387-B20A-56E9B2E5A0D2",
                      "device_platform": "web",
                      "os_version": "14.4",
                      "app_version": "1.2.34",
                      "user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.4 Safari/605.1.15"
                    },
                    "vendor_data": "lead-123",
                    "metadata": {
                      "source": "signup_prescreen"
                    }
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Die Risikobewertung wurde abgeschlossen. Prüfen Sie `status` für die Entscheidung; HTTP ist bei abgeschlossenen Abfragen immer `200`.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EmailRiskResponse"
                },
                "examples": {
                  "Clean address": {
                    "summary": "Zustellbare Adresse ohne Datenleckrisiko",
                    "value": {
                      "request_id": "82397be9-5921-4970-a979-2d5b43e08b33",
                      "status": "Approved",
                      "email": {
                        "status": "Approved",
                        "email": "alice@example.com",
                        "is_breached": false,
                        "breaches": [],
                        "is_disposable": false,
                        "is_undeliverable": false,
                        "verification_attempts": 0,
                        "verified_at": null,
                        "warnings": [],
                        "lifecycle": [],
                        "matches": [],
                        "email_intelligence": {
                          "score": 4.0,
                          "deliverable": "high",
                          "breach_risk_level": "Low",
                          "breach_risk_index": 4,
                          "is_recent_breach": false,
                          "is_frequent_breached": false,
                          "is_disposable": false,
                          "is_free_domain": false,
                          "is_breached": false,
                          "no_of_breaches": 0,
                          "reason_codes": []
                        },
                        "enrichment": {
                          "score": 4.0,
                          "deliverable": "high",
                          "breach_risk_level": "Low",
                          "breach_risk_index": 4,
                          "is_recent_breach": false,
                          "is_frequent_breached": false,
                          "is_disposable": false,
                          "is_free_domain": false,
                          "is_breached": false,
                          "no_of_breaches": 0,
                          "reason_codes": []
                        }
                      },
                      "vendor_data": "lead-123",
                      "metadata": {
                        "source": "signup_prescreen"
                      },
                      "created_at": "2026-09-01T10:30:00.123456+00:00"
                    }
                  },
                  "Breached address": {
                    "summary": "Adresse in bekannten Datenlecks gefunden",
                    "value": {
                      "request_id": "d1e5c2a8-6f30-4c1a-8b2d-3e4f5a6b7c8d",
                      "status": "In Review",
                      "email": {
                        "status": "In Review",
                        "email": "bob@example.org",
                        "is_breached": true,
                        "breaches": [
                          {
                            "name": "ExampleBreach2023",
                            "domain": "example.org",
                            "breach_date": "2023-06-01",
                            "breach_emails_count": 1200000,
                            "description": "A data breach affecting example.org accounts.",
                            "logo_path": "https://logos.example.org/example.png",
                            "data_classes": [
                              "email_addresses",
                              "passwords"
                            ],
                            "is_verified": true
                          }
                        ],
                        "is_disposable": false,
                        "is_undeliverable": false,
                        "verification_attempts": 0,
                        "verified_at": null,
                        "warnings": [],
                        "lifecycle": [],
                        "matches": [],
                        "email_intelligence": {
                          "score": 58.0,
                          "deliverable": "high",
                          "breach_risk_level": "High",
                          "breach_risk_index": 72,
                          "is_recent_breach": true,
                          "is_frequent_breached": true,
                          "is_disposable": false,
                          "is_free_domain": true,
                          "is_breached": true,
                          "no_of_breaches": 4,
                          "reason_codes": [
                            {
                              "code": "IR-F784B630",
                              "direction": "risk",
                              "message": "Email's digital footprint diversity is Very Low",
                              "impact_level": "low"
                            }
                          ]
                        },
                        "enrichment": {
                          "score": 58.0,
                          "deliverable": "high",
                          "breach_risk_level": "High",
                          "breach_risk_index": 72,
                          "is_recent_breach": true,
                          "is_frequent_breached": true,
                          "is_disposable": false,
                          "is_free_domain": true,
                          "is_breached": true,
                          "no_of_breaches": 4,
                          "reason_codes": [
                            {
                              "code": "IR-F784B630",
                              "direction": "risk",
                              "message": "Email's digital footprint diversity is Very Low",
                              "impact_level": "low"
                            }
                          ]
                        }
                      },
                      "vendor_data": "lead-125",
                      "metadata": null,
                      "created_at": "2026-09-01T10:30:00.123456+00:00"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/EmailRiskValidationError"
          },
          "403": {
            "$ref": "#/components/responses/RiskPermissionDenied"
          },
          "429": {
            "$ref": "#/components/responses/RateLimitedWrite"
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/v3/ip/risk/": {
      "post": {
        "summary": "Risiko-Score für eine IP-Adresse ermitteln",
        "description": "Gibt Geolokalisierung, Netzwerk-Eigentümerstruktur, VPN/Tor- und Rechenzentrums-Flags, Bedrohungsdaten sowie `country_mismatch` für eine angegebene IP-Adresse zurück. Der Endpoint erstellt eine API-Sitzung und gibt deren ID als `request_id` zurück.\n\n**Entscheidung.** `status` ist `In Review`, wenn das ermittelte Land im Konflikt mit `claimed_country` steht oder wenn die Adresse mit VPN-, Tor- oder Rechenzentrumsinfrastruktur verknüpft ist. Andernfalls lautet er `Approved`.\n\n**Best Effort.** Die IP-Anreicherung erfolgt nach dem Best-Effort-Prinzip. Wenn keine Anreicherungsquelle nutzbare Daten liefert, gibt der Endpoint eine genehmigte Antwort mit `ip.ip_address: null`, `ip.country_mismatch: null` und einem leeren `ip.threat`-Objekt zurück.\n\n**Abrechnung.** Live-Aufrufe nutzen die Preise der IP Risk API. Die Anfrage ist abrechenbar, sobald die Abfrage startet.\n\n**Sandbox.** Sandbox-Schlüssel validieren die Anfrage und geben deterministische, genehmigte Daten zurück, ohne Credits zu verbrauchen, eine Sitzung zu erstellen oder zu Networks beizutragen.\n\n**Authentifizierung.** Senden Sie den API-Schlüssel Ihrer Anwendung in `x-api-key`. Fehlende oder ungültige Anmeldedaten geben `403` zurück – diese API gibt niemals `401` zurück.\n\n**Rate-Limit.** Geteiltes Schreib-Budget von 300 Anfragen pro Minute pro API-Schlüssel über POST/PATCH/DELETE-Endpoints hinweg (Transaktionserstellungen und Ereignis-Ingestion haben ein separates Budget von 600).",
        "operationId": "post_v3ip_risk",
        "x-didit-sdk": {
          "resource": "ip",
          "method": "assess_risk",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Standalone APIs"
        ],
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X POST https://verification.didit.me/v3/ip/risk/ \\\n  -H 'x-api-key: YOUR_API_KEY' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\n    \"ip_address\": \"8.8.8.8\",\n    \"claimed_country\": \"ESP\",\n    \"user_agent\": \"Mozilla/5.0\",\n    \"vendor_data\": \"lead-123\"\n  }'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.ip.assess_risk(\n    ip_address=\"8.8.8.8\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.ip.assessRisk({\n  ip_address: \"8.8.8.8\",\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.IP.AssessRisk(ctx, didit.IPRiskRequest{\n\tIPAddress: \"8.8.8.8\",\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\nimport me.didit.types.IPRiskRequest;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.ip().assessRisk(IPRiskRequest.builder()\n        .ipAddress(\"8.8.8.8\")\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->ip->assessRisk([\n    'ip_address' => '8.8.8.8',\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.ip.assess_risk(ip_address: \"8.8.8.8\")\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Ip.AssessRiskAsync(new IPRiskRequest\n{\n    IpAddress = \"8.8.8.8\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/IPRiskRequest"
              },
              "examples": {
                "Minimal": {
                  "summary": "Eine Adresse mit Standardwerten bewerten",
                  "value": {
                    "ip_address": "8.8.8.8"
                  }
                },
                "With claimed country": {
                  "summary": "Score mit angegebenem Land zur Abweichungserkennung",
                  "value": {
                    "ip_address": "8.8.8.8",
                    "claimed_country": "ESP",
                    "user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.4 Safari/605.1.15",
                    "vendor_data": "lead-123"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Die Risikobewertung wurde abgeschlossen. Prüfen Sie `status` für die Entscheidung; HTTP ist bei abgeschlossenen Abfragen immer `200`.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IPRiskResponse"
                },
                "examples": {
                  "Clean residential IP": {
                    "summary": "Wohnadresse, angegebenes Land stimmt überein",
                    "value": {
                      "request_id": "9a96ed2a-721e-4b86-8cbf-d61eda529279",
                      "status": "Approved",
                      "ip": {
                        "status": "Approved",
                        "ip_address": "192.0.2.10",
                        "ip_country": "Spain",
                        "ip_country_code": "ES",
                        "ip_state": "Madrid",
                        "ip_city": "Madrid",
                        "latitude": 40.4168,
                        "longitude": -3.7038,
                        "isp": "Example Telecom",
                        "organization": "Example Telecom SA",
                        "is_vpn_or_tor": false,
                        "is_data_center": false,
                        "time_zone": "Europe/Madrid",
                        "time_zone_offset": "+0200",
                        "asn_number": 3352,
                        "asn_organization": "EXAMPLE-TELECOM",
                        "connection_type": "broadband",
                        "carrier": "Example Telecom",
                        "proxy_type": null,
                        "claimed_country": "ESP",
                        "country_mismatch": false,
                        "threat": {}
                      },
                      "vendor_data": "lead-123",
                      "metadata": null,
                      "created_at": "2026-09-01T10:30:00.123456+00:00"
                    }
                  },
                  "Datacenter mismatch": {
                    "summary": "Rechenzentrumsadresse steht im Widerspruch zum angegebenen Land",
                    "value": {
                      "request_id": "5b1d4e9a-3c7b-4f8e-9a2d-1b0c9d8e7f6a",
                      "status": "In Review",
                      "ip": {
                        "status": "In Review",
                        "ip_address": "8.8.8.8",
                        "ip_country": "United States",
                        "ip_country_code": "US",
                        "ip_state": "California",
                        "ip_city": "Mountain View",
                        "latitude": 37.386,
                        "longitude": -122.0838,
                        "isp": "Google",
                        "organization": "Google LLC",
                        "is_vpn_or_tor": true,
                        "is_data_center": true,
                        "time_zone": "America/Los_Angeles",
                        "time_zone_offset": "-0700",
                        "asn_number": 15169,
                        "asn_organization": "GOOGLE, US",
                        "connection_type": "hosting",
                        "carrier": null,
                        "proxy_type": "VPN",
                        "claimed_country": "ESP",
                        "country_mismatch": true,
                        "threat": {
                          "is_proxy": true,
                          "is_data_center": true,
                          "is_tor": false
                        }
                      },
                      "vendor_data": "lead-126",
                      "metadata": null,
                      "created_at": "2026-09-01T10:30:00.123456+00:00"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/IPRiskValidationError"
          },
          "403": {
            "$ref": "#/components/responses/RiskPermissionDenied"
          },
          "429": {
            "$ref": "#/components/responses/RateLimitedWrite"
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/v3/phone/risk/": {
      "post": {
        "summary": "Risiko-Score für eine Telefonnummer ermitteln",
        "description": "Lösen Sie eine Telefonnummer auf und erhalten Sie Informationen zu Mobilfunkanbieter, Leitungstyp, Portierung, Wegwerfnummern, sitzungsübergreifendem Abgleich und normalisierten Signalen zur Risikoanalyse, ohne ein OTP zu senden. Der Endpoint erstellt eine API-Sitzung und gibt deren ID als `request_id` zurück.\n\n**Entscheidung.** Der `status` auf oberster Ebene spiegelt `phone.status` wider. Er ist normalerweise `Approved`; die Risikobewertung kann `In Review` oder `Declined` ergeben.\n\n**Kompatibilitäts-Aliase.** Live-Antworten stellen das normalisierte Informationsobjekt sowohl als `phone.phone_intelligence` als auch als `phone.enrichment` bereit. Die Werte sind identisch. Neue Integrationen können `phone.enrichment` auslesen. Beide Schlüssel fehlen, wenn keine nutzbaren Informationsdaten zurückgegeben wurden.\n\n**Abrechnung.** Live-Aufrufe nutzen die Preise der Phone Risk API. Die Anfrage ist abrechenbar, sobald die Abfrage beginnt, selbst wenn einige nach Möglichkeit ermittelte Felder nicht verfügbar sind.\n\n**Sandbox.** Sandbox-Schlüssel validieren die Anfrage und geben deterministische genehmigte Daten zurück, ohne ein OTP zu senden, Credits zu verbrauchen, eine Sitzung zu erstellen oder zu Networks beizutragen.\n\n**Authentifizierung.** Senden Sie den API-Schlüssel Ihrer Anwendung in `x-api-key`. Fehlende oder ungültige Anmeldedaten geben `403` zurück – diese API gibt niemals `401` zurück.\n\n**Rate-Limit.** Geteiltes Schreibkontingent von 300 Anfragen pro Minute pro API-Schlüssel über POST/PATCH/DELETE-Endpoints hinweg (Transaktionserstellungen und Ereigniserfassung haben ein separates Budget von 600).\n\n**Online-Präsenz.** Setzen Sie `enable_social` auf `true`, um einen `phone_social`-Block hinzuzufügen: die Online-Plattformen, auf denen diese Nummer registriert ist, mit Anzahlen pro Kategorie und allen verfügbaren Profildetails. `profiles_registered: 0` bedeutet, dass die Plattformen überprüft wurden und die Nummer auf keiner davon gefunden wurde – eine gültige, abrechenbare Antwort. Der Block fehlt, wenn das Add-on nicht angefordert wurde oder die Überprüfung nicht abgeschlossen werden konnte, und er wird in diesem Fall nicht abgerechnet. Die Abrechnung fügt zusätzlich zum Preis dieses Endpoints eine `phone_social`-Einheit pro Anfrage hinzu.",
        "operationId": "post_v3phone_risk",
        "x-didit-sdk": {
          "resource": "phone",
          "method": "assess_risk",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Standalone APIs"
        ],
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X POST https://verification.didit.me/v3/phone/risk/ \\\n  -H 'x-api-key: YOUR_API_KEY' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\n    \"phone_number\": \"+14155552671\",\n    \"country_code\": \"US\",\n    \"vendor_data\": \"lead-123\",\n    \"metadata\": {\"source\": \"signup_prescreen\"}\n  }'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.phone.assess_risk(\n    phone_number=\"+14155552671\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.phone.assessRisk({\n  phone_number: \"+14155552671\",\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Phone.AssessRisk(ctx, didit.PhoneRiskRequest{\n\tPhoneNumber: \"+14155552671\",\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\nimport me.didit.types.PhoneRiskRequest;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.phone().assessRisk(PhoneRiskRequest.builder()\n        .phoneNumber(\"+14155552671\")\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->phone->assessRisk([\n    'phone_number' => '+14155552671',\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.phone.assess_risk(phone_number: \"+14155552671\")\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Phone.AssessRiskAsync(new PhoneRiskRequest\n{\n    PhoneNumber = \"+14155552671\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PhoneRiskRequest"
              },
              "examples": {
                "Minimal": {
                  "summary": "Eine Nummer mit Standardwerten bewerten",
                  "value": {
                    "phone_number": "+14155552671"
                  }
                },
                "Full context": {
                  "summary": "Score mit Signalen, Länderhinweis und Korrelations-IDs",
                  "value": {
                    "phone_number": "+14155552671",
                    "country_code": "US",
                    "signals": {
                      "ip": "192.0.2.1",
                      "device_id": "8F0B8FDD-C2CB-4387-B20A-56E9B2E5A0D2",
                      "device_platform": "ios",
                      "device_model": "iPhone17,2",
                      "os_version": "18.0.1",
                      "app_version": "1.2.34",
                      "user_agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 18_0_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.0 Mobile/15E148 Safari/604.1"
                    },
                    "vendor_data": "lead-123",
                    "metadata": {
                      "source": "signup_prescreen"
                    }
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Die Risikobewertung wurde abgeschlossen. Prüfen Sie `status` für die Entscheidung; HTTP ist bei abgeschlossenen Abfragen immer `200`.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PhoneRiskResponse"
                },
                "examples": {
                  "Clean mobile number": {
                    "summary": "Bereinigte Mobilfunknummer mit Intelligence-Abdeckung",
                    "value": {
                      "request_id": "4fd09d2e-9bc9-4c4e-9c46-7f625ac0ab62",
                      "status": "Approved",
                      "phone": {
                        "status": "Approved",
                        "phone_number_prefix": "+1",
                        "phone_number": "4155552671",
                        "full_number": "+14155552671",
                        "country_code": "US",
                        "country_name": "United States",
                        "carrier": {
                          "name": "Example Mobile",
                          "type": "mobile"
                        },
                        "is_disposable": false,
                        "is_virtual": false,
                        "verification_method": null,
                        "verification_attempts": 0,
                        "verified_at": null,
                        "warnings": [],
                        "lifecycle": [],
                        "matches": [],
                        "phone_intelligence": {
                          "score": 3.0,
                          "phone_type_risk": "Low",
                          "phone_trust_index": 97,
                          "network_stability_index": 95,
                          "is_disposable": false,
                          "is_ported": false,
                          "is_recently_ported": false,
                          "carrier_type": "mobile",
                          "reason_codes": []
                        },
                        "enrichment": {
                          "score": 3.0,
                          "phone_type_risk": "Low",
                          "phone_trust_index": 97,
                          "network_stability_index": 95,
                          "is_disposable": false,
                          "is_ported": false,
                          "is_recently_ported": false,
                          "carrier_type": "mobile",
                          "reason_codes": []
                        }
                      },
                      "vendor_data": "lead-123",
                      "metadata": {
                        "source": "signup_prescreen"
                      },
                      "created_at": "2026-09-01T10:30:00.123456+00:00"
                    }
                  },
                  "Number in review": {
                    "summary": "Wegwerf- oder virtuelle Nummer zur Prüfung markiert",
                    "value": {
                      "request_id": "8c22e1f0-4b3d-4a3a-9d1e-2f6b7c8d9e0f",
                      "status": "In Review",
                      "phone": {
                        "status": "In Review",
                        "phone_number_prefix": "+44",
                        "phone_number": "7700900123",
                        "full_number": "+447700900123",
                        "country_code": "GB",
                        "country_name": "United Kingdom",
                        "carrier": {
                          "name": "Example VoIP",
                          "type": "voip"
                        },
                        "is_disposable": true,
                        "is_virtual": true,
                        "verification_method": null,
                        "verification_attempts": 0,
                        "verified_at": null,
                        "warnings": [],
                        "lifecycle": [],
                        "matches": [],
                        "phone_intelligence": {
                          "score": 72.0,
                          "phone_type_risk": "High",
                          "phone_trust_index": 28,
                          "network_stability_index": 40,
                          "is_disposable": true,
                          "is_ported": true,
                          "is_recently_ported": true,
                          "carrier_type": "voip",
                          "reason_codes": [
                            {
                              "code": "IR-5AC67A32",
                              "direction": "risk",
                              "message": "Phone type identified as non-mobile",
                              "impact_level": "medium"
                            }
                          ]
                        },
                        "enrichment": {
                          "score": 72.0,
                          "phone_type_risk": "High",
                          "phone_trust_index": 28,
                          "network_stability_index": 40,
                          "is_disposable": true,
                          "is_ported": true,
                          "is_recently_ported": true,
                          "carrier_type": "voip",
                          "reason_codes": [
                            {
                              "code": "IR-5AC67A32",
                              "direction": "risk",
                              "message": "Phone type identified as non-mobile",
                              "impact_level": "medium"
                            }
                          ]
                        }
                      },
                      "vendor_data": "lead-124",
                      "metadata": null,
                      "created_at": "2026-09-01T10:30:00.123456+00:00"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/PhoneRiskValidationError"
          },
          "403": {
            "$ref": "#/components/responses/RiskPermissionDenied"
          },
          "429": {
            "$ref": "#/components/responses/RateLimitedWrite"
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/v3/session/": {
      "post": {
        "summary": "Erstellen Sie eine Verifizierungssitzung",
        "description": "Erstellen Sie eine Sitzung zur Benutzerverifizierung (KYC) oder Unternehmensverifizierung (KYB) und erhalten Sie eine gehostete Verifizierungs-`url` sowie einen `session_token`, um Ihren Endbenutzer weiterzuleiten oder die Seite einzubinden. Die `workflow_id` bestimmt, welche Verifizierungsschritte ausgeführt werden und ob es sich um eine KYC- oder KYB-Sitzung handelt.\n\nRufen Sie diesen Endpoint von Ihrem Backend aus auf (niemals über den Browser – der API-Schlüssel ist geheim), wann immer ein Benutzer oder ein Unternehmen verifiziert werden muss: bei der Registrierung, vor einer sensiblen Aktion oder wenn eine erneute Verifizierung erforderlich ist. Voraussetzungen: ein veröffentlichter Workflow (erstellt auf der Seite [Workflows](https://docs.didit.me/de/console/workflows) in der Konsole) und ein API-Schlüssel der Anwendung mit verfügbaren Credits. Sandbox-Anwendungen umgehen die Credit-Prüfung.\n\n**Idempotenz:** Wenn `vendor_data` angegeben ist und bereits eine unvollendete Sitzung (`Not Started`, `In Progress`, `Resubmitted` oder `Awaiting User`) mit denselben `vendor_data` in der **aktuellsten veröffentlichten Version** des Workflows existiert (und diese Sitzung bereits eine gehostete Verifizierungs-URL hat), wird die bestehende Sitzung zurückgegeben (weiterhin `201`), anstatt ein Duplikat zu erstellen – wobei deren `callback` und `metadata` auf die neu übergebenen Werte aktualisiert werden. Eine unvollendete Sitzung, die auf einer älteren Version des Workflows erstellt wurde (die seitdem erneut veröffentlicht wurde), wird **nicht** wiederverwendet; stattdessen wird eine neue Sitzung erstellt, die an die neueste veröffentlichte Version gebunden ist. Sitzungen mit dem Status `Approved`, `Declined`, `In Review`, `Expired`, `Abandoned` oder `Kyc Expired` werden niemals wiederverwendet.\n\n**Nebeneffekte:** Die gehostete Verifizierungs-URL wird generiert und gespeichert; wenn `contact_details.send_notification_emails` `true` ist und eine E-Mail-Adresse angegeben wird, wird eine Einladungs-E-Mail zur Verifizierung gesendet. Die Sitzung läuft nach der im Workflow konfigurierten Sitzungsablaufzeit ab. Bei KYB-Workflows werden `contact_details.phone` und `expected_details` ignoriert.",
        "operationId": "post_v3_session_create",
        "x-didit-sdk": {
          "resource": "sessions",
          "method": "create",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Sessions"
        ],
        "responses": {
          "201": {
            "description": "Sitzung erstellt (oder zurückgegeben, wenn eine nicht abgeschlossene Sitzung mit denselben `vendor_data` bereits in der neuesten veröffentlichten Version des Workflows existiert). Die Antwort ist die serialisierte Sitzung, einschließlich der gehosteten Verifizierungs-`url`, zu der der Benutzer weitergeleitet werden soll.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "session_id",
                    "session_number",
                    "session_token",
                    "url",
                    "vendor_data",
                    "metadata",
                    "status",
                    "workflow_id",
                    "workflow_version",
                    "callback"
                  ],
                  "properties": {
                    "session_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "Eindeutige Kennung der Verifizierungssitzung. Verwenden Sie diese ID beim Aufruf von `GET /v3/session/{sessionId}/decision/`.",
                      "example": "11111111-2222-3333-4444-555555555555"
                    },
                    "session_number": {
                      "type": "integer",
                      "description": "Fortlaufende, lesbare Nummer, die der Sitzung innerhalb Ihrer Anwendung zugewiesen wurde. Nützlich für Support und Dashboards.",
                      "example": 43762
                    },
                    "session_token": {
                      "type": "string",
                      "description": "12-stelliger URL-sicherer Token, der den Endbenutzer autorisiert, auf den gehosteten Verifizierungsablauf unter `url` zuzugreifen. Gültig, bis die Sitzung abläuft. Behandeln Sie ihn wie ein Geheimnis — jeder, der ihn besitzt, kann den Verifizierungsablauf für diese Sitzung öffnen.",
                      "example": "3FaJ9wLqX2Mz"
                    },
                    "url": {
                      "type": "string",
                      "format": "uri",
                      "description": "Gehostete Verifizierungs-URL, zu der der Endbenutzer weitergeleitet werden soll. Die URL bettet das `session_token` ein und verwendet, sofern konfiguriert, Ihre White-Label-Domain. Wenn die Anfrage `language` enthält, enthält die URL ein Sprachpfadsegment – `https://verify.didit.me/{language}/session/{session_token}` (z. B. `/es/session/...`); ohne `language` wird das Segment weggelassen.",
                      "example": "https://verify.didit.me/session/3FaJ9wLqX2Mz"
                    },
                    "vendor_data": {
                      "type": "string",
                      "nullable": true,
                      "description": "Kennung, die Sie in der Anfrage übergeben haben, um die Sitzung mit einem Benutzer oder Unternehmen in Ihrem eigenen System zu verknüpfen. Wird unverändert zurückgegeben. Null, wenn nicht angegeben.",
                      "example": "user-123"
                    },
                    "metadata": {
                      "description": "Beliebige JSON-Payload, die Sie bei der Erstellung mit der Sitzung gespeichert haben. Wird unverändert zurückgegeben – welcher JSON-Wert auch immer gesendet wurde (Objekt, String, Zahl, Array), wird so belassen, obwohl ein JSON-Objekt empfohlen wird. Für den Endbenutzer nicht sichtbar. In Antworten immer vorhanden; `null`, wenn bei der Erstellung nicht angegeben.",
                      "example": {
                        "user_type": "premium",
                        "account_id": "ABC123"
                      }
                    },
                    "tags": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      },
                      "description": "Die Tags der Sitzung, nach Namen.",
                      "example": [
                        "VIP",
                        "ONBOARDING Q4"
                      ]
                    },
                    "status": {
                      "type": "string",
                      "enum": [
                        "Not Started",
                        "In Progress",
                        "Approved",
                        "Declined",
                        "In Review",
                        "Expired",
                        "Abandoned",
                        "Kyc Expired",
                        "Resubmitted",
                        "Awaiting User"
                      ],
                      "description": "Aktueller Status der Sitzung. Neu erstellte Sitzungen geben `Not Started` zurück. Falls für dieselben `vendor_data` in der neuesten veröffentlichten Version des Workflows bereits eine nicht abgeschlossene Sitzung existierte, spiegelt der zurückgegebene Status diese bestehende Sitzung wider.",
                      "example": "Not Started"
                    },
                    "callback": {
                      "type": "string",
                      "format": "uri",
                      "nullable": true,
                      "description": "Endgültige Weiterleitungs-URL, zu der der Benutzer nach Abschluss des Ablaufs weitergeleitet wird. Didit hängt `?verificationSessionId={session_id}&status={status}` an diese URL an. Fällt auf die im Workflow konfigurierte Callback-URL zurück, wenn sie nicht in der Anfrage angegeben ist; `null`, wenn keine von beiden festgelegt ist. Wenn die Anwendung erlaubte Domains konfiguriert hat und diese URL eine Web-URL außerhalb dieser ist (beispielsweise ein Workflow-Standard, der vor der Änderung der Liste festgelegt wurde), leitet der gehostete Ablauf den Benutzer nicht dorthin weiter.",
                      "example": "https://example.com/verification/callback"
                    },
                    "workflow_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "Stabiler Identifikator des Workflows, auf dem diese Sitzung läuft. Immer der stabile Gruppenidentifikator des Workflows – selbst wenn Sie in der Anfrage auf eine bestimmte UUID einer Workflow-Version verwiesen haben (abwärtskompatibles Nachschlagen), enthält die Antwort die stabile `workflow_id`. Verwenden Sie sie, um die Sitzung mit dem Workflow zu korrelieren, den Sie in der Console konfiguriert haben.",
                      "example": "11111111-2222-3333-4444-555555555555"
                    },
                    "workflow_version": {
                      "type": "integer",
                      "description": "Versionsnummer der veröffentlichten Workflow-Version, an die die Sitzung bei der Erstellung gebunden wurde. Didit löst `workflow_id` bei der Sitzungserstellung in die neueste veröffentlichte Version des Workflows auf, und die Sitzung verwendet diese Version weiterhin, selbst wenn der Workflow später erneut veröffentlicht wird.",
                      "example": 3
                    }
                  }
                },
                "examples": {
                  "KYC session": {
                    "summary": "KYC-Sitzung erstellt",
                    "value": {
                      "session_id": "11111111-2222-3333-4444-555555555555",
                      "session_number": 43762,
                      "session_token": "3FaJ9wLqX2Mz",
                      "url": "https://verify.didit.me/en/session/3FaJ9wLqX2Mz",
                      "vendor_data": "user-123",
                      "metadata": {
                        "user_type": "premium",
                        "account_id": "ABC123"
                      },
                      "status": "Not Started",
                      "workflow_id": "11111111-2222-3333-4444-555555555555",
                      "workflow_version": 3,
                      "callback": "https://example.com/verification/callback"
                    }
                  },
                  "KYB session": {
                    "summary": "KYB-Sitzung erstellt",
                    "value": {
                      "session_id": "22222222-3333-4444-5555-666666666666",
                      "session_number": 43763,
                      "session_token": "Yk7pQ2vN8aBc",
                      "url": "https://verify.didit.me/en/session/Yk7pQ2vN8aBc",
                      "vendor_data": "company-acme-001",
                      "metadata": {
                        "tier": "enterprise"
                      },
                      "status": "Not Started",
                      "workflow_id": "33333333-4444-5555-6666-777777777777",
                      "workflow_version": 1,
                      "callback": "https://example.com/kyb/callback"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Ungültige Anfrage – die Payload hat die Validierung nicht bestanden (fehlende oder unbekannte `workflow_id`, ungültige `language`, gesperrte `vendor_data`, fehlerhaftes `portrait_image`, `address` ohne `country`/`poa_country`, ungültiges `sandbox_scenario`, `sign`-Dokumente, Felder oder Werte, die der E-Signatur-Schritt des Workflows ablehnt, wie z. B. `signature_document_not_supported`, `signature_document_conversion_failed`, `field_anchor_not_found` oder `field_value_missing` usw.) oder Ihre Organisation hat nicht genügend Credits, um die Sitzung zu starten.\n\nDer Body ist ein Objekt mit dem fehlerhaften Feldnamen als Schlüssel (oder `detail` bei Fehlern, die kein Feld betreffen). Die Werte sind ein **Array von Strings** bei Eingabevalidierungsfehlern (z. B. fehlendes Pflichtfeld, ungültige Sprache, zu großes Porträtbild) und ein **einfacher String** bei Fehlern, die während der Sitzungserstellung erkannt wurden (unbekannte `workflow_id`, gesperrte `vendor_data`, kein Referenzgesicht für einen Face-Match-Workflow verfügbar). Behandeln Sie beide Formen.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true,
                  "properties": {
                    "detail": {
                      "type": "string",
                      "description": "Lesbare Fehlermeldung für Fehler, die sich nicht auf ein bestimmtes Feld beziehen (z. B. unzureichende Credits). Fehler auf Feldebene verwenden stattdessen den Feldnamen als Schlüssel mit einem String oder einem Array aus Strings als Wert.",
                      "example": "You don't have enough credits to perform this request. Please top up at https://business.didit.me"
                    }
                  }
                },
                "examples": {
                  "Missing workflow_id": {
                    "summary": "Erforderliches Feld weggelassen (Array-von-Strings-Format)",
                    "value": {
                      "workflow_id": [
                        "This field is required."
                      ]
                    }
                  },
                  "Invalid workflow_id": {
                    "summary": "Unbekannte workflow_id (reines Zeichenfolgenformat)",
                    "value": {
                      "workflow_id": "Invalid workflow_id."
                    }
                  },
                  "Insufficient credits": {
                    "summary": "Die Organisation hat keine Credits mehr",
                    "value": {
                      "detail": "You don't have enough credits to perform this request. Please top up at https://business.didit.me"
                    }
                  },
                  "Blocklisted vendor_data": {
                    "summary": "vendor_data steht auf der Sperrliste",
                    "value": {
                      "vendor_data": "This user or business has been blocked and cannot create new verification sessions."
                    }
                  },
                  "Portrait image too large": {
                    "summary": "portrait_image besteht die Größenvalidierung nicht",
                    "value": {
                      "portrait_image": [
                        "Image size exceeds 2MB."
                      ]
                    }
                  },
                  "No stored face for vendor_data": {
                    "summary": "Gesichtsabgleich-Workflow ohne portrait_image und ohne gespeichertes Gesicht für den vendor_data-Benutzer",
                    "value": {
                      "portrait_image": "No stored face image was found for this user. Send a portrait_image, or complete an approved verification with face liveness or an ID document for this vendor_data first."
                    }
                  },
                  "Portrait image required without vendor_data": {
                    "summary": "Gesichtsabgleich-Workflow ohne portrait_image und ohne vendor_data",
                    "value": {
                      "portrait_image": "A portrait image is required to perform face match for this workflow. Send a portrait_image, or provide the vendor_data of a user with a previously stored face image to reuse it."
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Authentifizierung oder Autorisierung fehlgeschlagen. Ein falscher, widerrufener oder abgelaufener Schlüssel gibt `401` zurück. Der Endpoint gibt `403` zurück, wenn der `x-api-key`-Header fehlt oder der API-Schlüssel gültig ist, der Client jedoch keine Berechtigung zum Erstellen von Sitzungen in dieser Anwendung hat (zum Beispiel wenn der API-Schlüssel zu einer anderen Organisation gehört). Diese Fehler teilen sich den Body `{\"detail\": \"You do not have permission to perform this action.\"}`. Überprüfen Sie, ob der `x-api-key`-Header vorhanden ist und zur vorgesehenen Anwendung gehört, rufen Sie den API-Schlüssel der Anwendung bei Bedarf erneut über die [Auth API](/de/auth-api/get-credentials) ab und versuchen Sie es erneut.\n\n**Gelöschte Anwendung:** Für einige Minuten nach dem Löschen einer Anwendung kann eine Anfrage, die mit einem ihrer API-Schlüssel gestellt wird, mit `{\"detail\": \"This application was deleted.\", \"code\": \"application_deleted\"}` antworten. Versuchen Sie es nicht erneut: Die Anwendung und ihre API-Schlüssel existieren nicht mehr. Nach diesen wenigen Minuten wird der Schlüssel wie jeder andere ungültige Schlüssel abgewiesen.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string",
                      "example": "You do not have permission to perform this action."
                    },
                    "code": {
                      "type": "string",
                      "description": "Maschinenlesbarer Grund, nur bei bestimmten Fehlern vorhanden. `application_deleted`: Der API-Schlüssel gehört zu einer Anwendung, die gelöscht wurde.",
                      "example": "application_deleted"
                    }
                  },
                  "required": [
                    "detail"
                  ]
                },
                "examples": {
                  "Missing or invalid API key": {
                    "summary": "Kein `x-api-key`-Header oder ungültiger API-Schlüssel",
                    "value": {
                      "detail": "You do not have permission to perform this action."
                    }
                  },
                  "No permission": {
                    "summary": "Client kann keine Sitzungen erstellen",
                    "value": {
                      "detail": "You do not have permission to perform this action."
                    }
                  },
                  "Application deleted": {
                    "summary": "API-Schlüssel einer gelöschten Anwendung",
                    "value": {
                      "detail": "This application was deleted.",
                      "code": "application_deleted"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate-Limit überschritten – mehr als 600 Anfragen zur Sitzungserstellung in einem 60-Sekunden-Fenster von demselben API-Schlüssel / derselben IP. Prüfen Sie `Retry-After` und warten Sie vor einem Wiederholungsversuch ab.\n\n**Hinweis:** Der Quellcode definiert neben `PAID_SESSION_RATE_LIMIT=600` (`sessions/serializers/session.py`) auch ein `FREE_SESSION_RATE_LIMIT` von 10 Aufrufen/Minute, diese Obergrenze für das kostenlose Kontingent wird jedoch **nicht auf diesen V3-Endpoint angewendet** – die Rate-Limit-Middleware erzwingt das `SESSION_CREATE_RATE_LIMIT` von 600/Min unabhängig vom Tarif. 600/Min ist das einzige Limit, das Sie hier erreichen können.",
            "headers": {
              "Retry-After": {
                "description": "Sekunden, die der Aufrufer warten muss, bevor er die Anfrage wiederholt.",
                "schema": {
                  "type": "integer",
                  "minimum": 1,
                  "example": 42
                }
              },
              "X-RateLimit-Limit": {
                "description": "Maximale Anzahl an Anfragen, die im aktuellen 60-Sekunden-Fenster für das überschrittene Limit zulässig sind (600 für session-create). Fehlt bei der Sandbox-Kontingent-Variante.",
                "schema": {
                  "type": "integer",
                  "example": 600
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Anzahl der im aktuellen Zeitfenster für das überschrittene Limit noch zulässigen Anfragen. Fehlt bei der Sandbox-Kontingent-Variante.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "example": 0
                }
              },
              "X-RateLimit-Reset": {
                "description": "UTC-Epochensekunden, zu denen das aktuelle Rate-Limit-Fenster zurückgesetzt wird. Fehlt bei der Variante sandbox-quota.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "example": 1747497600
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string",
                      "description": "Lesbare Erklärung der Rate-Limit-Überschreitung. Verwenden Sie diese Meldung, um zu unterscheiden, welches der drei Limits erreicht wurde.",
                      "example": "Session creation rate limit exceeded. You can make up to 600 requests per minute."
                    }
                  }
                },
                "examples": {
                  "Session-create limit": {
                    "summary": "Mehr als 600 Anfragen zur Sitzungserstellung pro Minute",
                    "value": {
                      "detail": "Session creation rate limit exceeded. You can make up to 600 requests per minute."
                    }
                  },
                  "Sandbox session quota": {
                    "summary": "Sandbox-Anwendung hat 500 Sitzungen in 24 Stunden überschritten",
                    "value": {
                      "detail": "Sandbox session quota exceeded (500 sessions per 24h). Wait for the window to reset. Expected available in 3600 seconds."
                    }
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "cURL",
            "source": "curl -X POST 'https://verification.didit.me/v3/session/' \\\n  -H 'x-api-key: YOUR_API_KEY' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\n    \"workflow_id\": \"11111111-2222-3333-4444-555555555555\",\n    \"vendor_data\": \"user-123\",\n    \"callback\": \"https://example.com/verification/callback\",\n    \"callback_method\": \"both\",\n    \"metadata\": {\"user_type\": \"premium\", \"account_id\": \"ABC123\"},\n    \"language\": \"en\",\n    \"contact_details\": {\n      \"email\": \"john.doe@example.com\",\n      \"send_notification_emails\": true,\n      \"email_lang\": \"en\",\n      \"phone\": \"+14155552671\"\n    },\n    \"expected_details\": {\n      \"first_name\": \"John\",\n      \"last_name\": \"Doe\",\n      \"date_of_birth\": \"1990-05-15\",\n      \"id_country\": \"USA\",\n      \"expected_document_types\": [\"P\", \"ID\"]\n    }\n  }'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.sessions.create(\n    workflow_id=\"11111111-2222-3333-4444-555555555555\",\n    vendor_data=\"user-123\",\n    callback=\"https://example.com/verification/callback\",\n    callback_method=\"both\",\n    metadata={\"user_type\": \"premium\", \"account_id\": \"ABC123\"},\n    language=\"en\",\n    contact_details={\n        \"email\": \"john.doe@example.com\",\n        \"send_notification_emails\": True,\n        \"email_lang\": \"en\",\n        \"phone\": \"+14155552671\",\n    },\n    expected_details={\n        \"first_name\": \"John\",\n        \"last_name\": \"Doe\",\n        \"date_of_birth\": \"1990-05-15\",\n        \"nationality\": \"USA\",\n        \"id_country\": \"USA\",\n        \"expected_document_types\": [\"P\", \"ID\"],\n    },\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.sessions.create({\n  workflow_id: \"11111111-2222-3333-4444-555555555555\",\n  vendor_data: \"user-123\",\n  callback: \"https://example.com/verification/callback\",\n  callback_method: \"both\",\n  metadata: { user_type: \"premium\", account_id: \"ABC123\" },\n  language: \"en\",\n  contact_details: {\n    email: \"john.doe@example.com\",\n    send_notification_emails: true,\n    email_lang: \"en\",\n    phone: \"+14155552671\",\n  },\n  expected_details: {\n    first_name: \"John\",\n    last_name: \"Doe\",\n    date_of_birth: \"1990-05-15\",\n    nationality: \"USA\",\n    id_country: \"USA\",\n    expected_document_types: [\"P\", \"ID\"],\n  },\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Sessions.Create(ctx, didit.SessionsCreateParams{\n\tWorkflowID:     \"11111111-2222-3333-4444-555555555555\",\n\tVendorData:     didit.String(\"user-123\"),\n\tCallback:       didit.String(\"https://example.com/verification/callback\"),\n\tCallbackMethod: didit.Some(didit.SessionsCreateParamsCallbackMethod(\"both\")),\n\tMetadata:       didit.Some[any](map[string]any{\"user_type\": \"premium\", \"account_id\": \"ABC123\"}),\n\tLanguage:       didit.Some(didit.SessionsCreateParamsLanguage(\"en\")),\n\tContactDetails: didit.Some(didit.SessionsCreateParamsContactDetails{\n\t\tEmail:                  didit.String(\"john.doe@example.com\"),\n\t\tSendNotificationEmails: didit.Bool(true),\n\t\tEmailLang:              didit.Some(didit.SessionsCreateParamsContactDetailsEmailLang(\"en\")),\n\t\tPhone:                  didit.String(\"+14155552671\"),\n\t}),\n\tExpectedDetails: didit.Some(didit.SessionsCreateParamsExpectedDetails{\n\t\tFirstName:             didit.String(\"John\"),\n\t\tLastName:              didit.String(\"Doe\"),\n\t\tDateOfBirth:           didit.String(\"1990-05-15\"),\n\t\tNationality:           didit.String(\"USA\"),\n\t\tIDCountry:             didit.String(\"USA\"),\n\t\tExpectedDocumentTypes: didit.Some([]didit.SessionsCreateParamsExpectedDetailsExpectedDocumentTypes{\"P\", \"ID\"}),\n\t}),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import java.time.LocalDate;\nimport java.util.List;\nimport java.util.Map;\nimport me.didit.Didit;\nimport me.didit.types.SessionsCreateParams;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.sessions().create(SessionsCreateParams.builder()\n        .workflowId(\"11111111-2222-3333-4444-555555555555\")\n        .vendorData(\"user-123\")\n        .callback(\"https://example.com/verification/callback\")\n        .callbackMethod(SessionsCreateParams.CallbackMethod.of(\"both\"))\n        .metadata(Map.of(\"user_type\", \"premium\", \"account_id\", \"ABC123\"))\n        .language(SessionsCreateParams.Language.of(\"en\"))\n        .contactDetails(SessionsCreateParams.ContactDetails.builder()\n                .email(\"john.doe@example.com\")\n                .sendNotificationEmails(true)\n                .emailLang(SessionsCreateParams.ContactDetails.EmailLang.of(\"en\"))\n                .phone(\"+14155552671\")\n                .build())\n        .expectedDetails(SessionsCreateParams.ExpectedDetails.builder()\n                .firstName(\"John\")\n                .lastName(\"Doe\")\n                .dateOfBirth(LocalDate.parse(\"1990-05-15\"))\n                .nationality(\"USA\")\n                .idCountry(\"USA\")\n                .expectedDocumentTypes(List.of(SessionsCreateParams.ExpectedDetails.ExpectedDocumentTypes.of(\"P\"), SessionsCreateParams.ExpectedDetails.ExpectedDocumentTypes.of(\"ID\")))\n                .build())\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->sessions->create([\n    'workflow_id' => '11111111-2222-3333-4444-555555555555',\n    'vendor_data' => 'user-123',\n    'callback' => 'https://example.com/verification/callback',\n    'callback_method' => 'both',\n    'metadata' => ['user_type' => 'premium', 'account_id' => 'ABC123'],\n    'language' => 'en',\n    'contact_details' => [\n        'email' => 'john.doe@example.com',\n        'send_notification_emails' => true,\n        'email_lang' => 'en',\n        'phone' => '+14155552671',\n    ],\n    'expected_details' => [\n        'first_name' => 'John',\n        'last_name' => 'Doe',\n        'date_of_birth' => '1990-05-15',\n        'nationality' => 'USA',\n        'id_country' => 'USA',\n        'expected_document_types' => ['P', 'ID'],\n    ],\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.sessions.create(\n  workflow_id: \"11111111-2222-3333-4444-555555555555\",\n  vendor_data: \"user-123\",\n  callback: \"https://example.com/verification/callback\",\n  callback_method: \"both\",\n  metadata: { user_type: \"premium\", account_id: \"ABC123\" },\n  language: \"en\",\n  contact_details: {\n    email: \"john.doe@example.com\",\n    send_notification_emails: true,\n    email_lang: \"en\",\n    phone: \"+14155552671\",\n  },\n  expected_details: {\n    first_name: \"John\",\n    last_name: \"Doe\",\n    date_of_birth: \"1990-05-15\",\n    nationality: \"USA\",\n    id_country: \"USA\",\n    expected_document_types: [\"P\", \"ID\"],\n  }\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Collections.Generic;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Sessions.CreateAsync(new SessionsCreateParams\n{\n    WorkflowId = \"11111111-2222-3333-4444-555555555555\",\n    VendorData = \"user-123\",\n    Callback = \"https://example.com/verification/callback\",\n    CallbackMethod = new SessionsCreateParamsCallbackMethod(\"both\"),\n    Metadata = new Dictionary<string, object> { [\"user_type\"] = \"premium\", [\"account_id\"] = \"ABC123\" },\n    Language = new SessionsCreateParamsLanguage(\"en\"),\n    ContactDetails = new SessionsCreateParamsContactDetails\n    {\n        Email = \"john.doe@example.com\",\n        SendNotificationEmails = true,\n        EmailLang = new SessionsCreateParamsContactDetailsEmailLang(\"en\"),\n        Phone = \"+14155552671\",\n    },\n    ExpectedDetails = new SessionsCreateParamsExpectedDetails\n    {\n        FirstName = \"John\",\n        LastName = \"Doe\",\n        DateOfBirth = \"1990-05-15\",\n        Nationality = \"USA\",\n        IdCountry = \"USA\",\n        ExpectedDocumentTypes = new SessionsCreateParamsExpectedDetailsExpectedDocumentTypes[] { \"P\", \"ID\" },\n    },\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "workflow_id"
                ],
                "properties": {
                  "workflow_id": {
                    "type": "string",
                    "format": "uuid",
                    "description": "Stabiler Identifikator des Workflows, der definiert, welche Verifizierungsschritte die Sitzung ausführt. Workflows werden auf der Seite [Workflows](/de/console/workflows) der Console erstellt und verwaltet. Die `workflow_id` legt zudem implizit fest, ob es sich bei der Sitzung um KYC oder KYB handelt.",
                    "example": "11111111-2222-3333-4444-555555555555",
                    "x-readme-id": "0.0"
                  },
                  "vendor_data": {
                    "type": "string",
                    "description": "Eine eindeutige Kennung für den zu verifizierenden Benutzer, wie z. B. eine UUID, E-Mail-Adresse oder interne Benutzer-ID. Dieses Feld wird verwendet für: (1) **Benutzergruppierung** – Sitzungen mit demselben vendor_data werden im Reiter „Benutzer“ mit demselben Benutzerprofil verknüpft. (2) **Sitzungsübergreifende Duplikaterkennung** – bei der Prüfung auf doppelte Gesichter, Dokumente, Telefonnummern, E-Mails, IP-Adressen oder Geräte-Fingerprints werden Sitzungen mit demselben vendor_data als derselbe Benutzer behandelt und von den Treffern ausgeschlossen. Ohne vendor_data wird jede Sitzung als eindeutiger Benutzer behandelt und alle potenziellen Duplikate werden angezeigt. Wir empfehlen dringend, stets einen vendor_data-Wert anzugeben, um Fehlalarme bei der Duplikaterkennung zu reduzieren.",
                    "example": "user-123",
                    "x-readme-id": "0.1"
                  },
                  "multi_account_segment": {
                    "type": "string",
                    "maxLength": 64,
                    "description": "Optionaler Bereich zur Duplikaterkennung innerhalb Ihrer Organisation. Prüfungen auf doppelte Gesichter vergleichen diese Sitzung nur mit anderen Sitzungen, die dasselbe Segment aufweisen, sodass getrennte Kontobasen (Privat- und Geschäftskonten oder eines pro B2B-Sub-Client) eine Person nicht markieren, die berechtigterweise jeweils ein Konto führt. Weglassen, um den einzelnen Standardbereich zu nutzen, den derzeit jede Sitzung verwendet. Der Abgleich mit Sperrlisten und Positivlisten ignoriert dieses Feld.",
                    "example": "business-accounts"
                  },
                  "callback": {
                    "type": "string",
                    "description": "URL, zu der der Benutzer nach Abschluss der Verifizierung weitergeleitet wird. Didit hängt `verificationSessionId` und `status` (Approved, Declined, In Review) automatisch als Query-Parameter an. Benutzerdefinierte URL-Schemata (z. B. `myapp://`) werden für mobile Callbacks unterstützt. Wenn weggelassen, wird die Standard-`callback_url` des Workflows verwendet. Wenn für die Anwendung erlaubte Domains konfiguriert sind (`allowed_domains` bei `PATCH /v3/webhook/`), muss ein `http`- oder `https`-Callback auf einer dieser Ursprungsdomains liegen (gleiches Schema, gleicher Host und Port), andernfalls schlägt die Anfrage mit 400 für `callback` fehl: `callback must be on one of the application's allowed domains: https://app.example.com`. Benutzerdefinierte URL-Schemata werden immer akzeptiert.",
                    "example": "https://example.com/verification/callback",
                    "x-readme-id": "0.2"
                  },
                  "callback_method": {
                    "type": "string",
                    "description": "Bestimmt, welches Gerät die Weiterleitung zur angegebenen Callback-URL durchführen soll. Verwenden Sie `initiator`, um nur das Gerät weiterzuleiten, das den Ablauf gestartet hat, `completer` für das Gerät, das ihn beendet, oder `both`, damit jedes Gerät den Callback auslösen kann. Falls Sie feststellen, dass der Callback nicht zuverlässig ausgelöst wird, empfehlen wir, diesen Wert auf `both` zu setzen.",
                    "enum": [
                      "initiator",
                      "completer",
                      "both"
                    ],
                    "default": "initiator",
                    "example": "both",
                    "x-readme-id": "0.3"
                  },
                  "metadata": {
                    "description": "Beliebiges JSON, das mit der Sitzung gespeichert und in der Antwort sowie in Webhooks unverändert zurückgegeben wird. Jeder JSON-Wert wird akzeptiert (Objekt, String, Zahl, Array), empfohlen wird jedoch ein JSON-Objekt aus Schlüssel-Wert-Paaren. Für den Endbenutzer nicht sichtbar. Nutzen Sie es, um eigene Korrelations-IDs, A/B-Varianten oder geschäftlichen Kontext zu übergeben.",
                    "example": {
                      "user_type": "premium",
                      "account_id": "ABC123"
                    },
                    "x-readme-id": "0.4"
                  },
                  "tags": {
                    "type": "array",
                    "items": {
                      "type": "string",
                      "maxLength": 50
                    },
                    "maxItems": 10,
                    "description": "Tags, die der Sitzung bei ihrer Erstellung nach Namen hinzugefügt werden. Bis zu 10, jeweils bis zu 50 Zeichen. Bei Namen wird die Groß-/Kleinschreibung nicht beachtet; sie werden in Großbuchstaben gespeichert. Ein Name, der in der Anwendung noch nicht existiert, wird als neues Tag erstellt. Die Tags werden bei der Sitzung in der Console angezeigt, wo Sie nach ihnen filtern können.",
                    "example": [
                      "VIP",
                      "ONBOARDING Q4"
                    ]
                  },
                  "language": {
                    "type": "string",
                    "description": "Sprachcode (ISO 639-1) für die Oberfläche des Verifizierungsprozesses. Steuert die dem Endbenutzer während der Verifizierung angezeigte Sprache. Falls nicht angegeben, wird die Sprache des Browsers automatisch erkannt und verwendet. Eine Übersicht aller unterstützten Sprachen finden Sie [hier](/de/integration/supported-languages).",
                    "enum": [
                      "en",
                      "ar",
                      "bg",
                      "bn",
                      "bs",
                      "ca",
                      "cnr",
                      "cs",
                      "da",
                      "de",
                      "el",
                      "es",
                      "et",
                      "fa",
                      "fi",
                      "fr",
                      "he",
                      "hi",
                      "hr",
                      "hu",
                      "hy",
                      "id",
                      "it",
                      "ja",
                      "ka",
                      "kk",
                      "ko",
                      "ky",
                      "lt",
                      "lv",
                      "mk",
                      "mn",
                      "ms",
                      "nl",
                      "no",
                      "pl",
                      "pt-BR",
                      "pt",
                      "ro",
                      "ru",
                      "sk",
                      "sl",
                      "so",
                      "sq",
                      "sr",
                      "sv",
                      "th",
                      "tr",
                      "uk",
                      "uz",
                      "vi",
                      "zh-CN",
                      "zh-TW",
                      "zh"
                    ],
                    "example": "en",
                    "x-readme-id": "0.5"
                  },
                  "contact_details": {
                    "type": "object",
                    "description": "Kontaktinformationen des Benutzers, die für Benachrichtigungen, das Vorausfüllen von Verifizierungsformularen und die Telefonverifizierung verwendet werden können. Dazu gehören die E-Mail-Adresse, die bevorzugte Sprache für Mitteilungen und die Telefonnummer.",
                    "example": {
                      "email": "john.doe@example.com",
                      "send_notification_emails": true,
                      "email_lang": "en",
                      "phone": "+14155552671"
                    },
                    "properties": {
                      "email": {
                        "type": "string",
                        "format": "email",
                        "description": "E-Mail-Adresse des Benutzers (z. B. \"john.doe@example.com\"), die während des Schritts der [E-Mail-Verifizierung](/de/core-technology/email-verification/overview) verwendet wird. Falls nicht angegeben, muss der Benutzer sie während des Verifizierungsablaufs angeben.",
                        "example": "john.doe@example.com",
                        "x-readme-id": "1.0"
                      },
                      "send_notification_emails": {
                        "type": "boolean",
                        "default": false,
                        "description": "Wenn true und eine E-Mail-Adresse angegeben ist, sendet Didit die anfängliche E-Mail „Verifizieren Sie Ihre Identität“ asynchron, sobald die Sitzung zur Benutzerverifizierung (KYC) oder Unternehmensverifizierung (KYB) erstellt wird. Didit sendet außerdem Benachrichtigungen zum Verifizierungsstatus für Sitzungen, die eine manuelle Prüfung erfordern, an die angegebene E-Mail-Adresse (z. B. von „In Review“ zu „Approved“ oder „Declined“). Dies hilft Benutzern, zu Ihrer Anwendung zurückzukehren, sobald ihre Verifizierung abgeschlossen ist. Wenn Sie White-Label für die Sitzung aktiviert haben, wird die versendete E-Mail als White-Label versendet.",
                        "example": true,
                        "x-readme-id": "1.1"
                      },
                      "email_lang": {
                        "type": "string",
                        "description": "Sprachcode (ISO 639-1) für E-Mail-Benachrichtigungen. Steuert die Sprache aller E-Mail-Mitteilungen (z. B. „en“, „es“, „fr“). Es ist kein Standardwert hinterlegt — wird der Parameter weggelassen, fällt die Verifizierungseinladungs-E-Mail beim Versand einfach auf Englisch (`en`) zurück. Das nachfolgende Enum ist eine Momentaufnahme; die maßgebliche Quelle für akzeptierte Werte ist die Dokumentation zu den [unterstützten Sprachen](/de/integration/supported-languages) — ziehen Sie diese stets zu Rate, bevor Sie sich auf einen bestimmten Code verlassen.",
                        "enum": [
                          "en",
                          "ar",
                          "bg",
                          "bn",
                          "bs",
                          "ca",
                          "cnr",
                          "cs",
                          "da",
                          "de",
                          "el",
                          "es",
                          "et",
                          "fa",
                          "fi",
                          "fr",
                          "he",
                          "hi",
                          "hr",
                          "hu",
                          "hy",
                          "id",
                          "it",
                          "ja",
                          "ka",
                          "kk",
                          "ko",
                          "ky",
                          "lt",
                          "lv",
                          "mk",
                          "mn",
                          "ms",
                          "nl",
                          "no",
                          "pl",
                          "pt-BR",
                          "pt",
                          "ro",
                          "ru",
                          "sk",
                          "sl",
                          "so",
                          "sq",
                          "sr",
                          "sv",
                          "th",
                          "tr",
                          "uk",
                          "uz",
                          "vi",
                          "zh-CN",
                          "zh-TW",
                          "zh"
                        ],
                        "example": "en",
                        "x-readme-id": "1.2"
                      },
                      "phone": {
                        "type": "string",
                        "description": "Telefonnummer im E.164-Format (z. B. „+14155552671“), die während des Schritts [Telefonverifizierung](/de/core-technology/phone-verification/overview) verwendet wird. Falls nicht angegeben, muss der Benutzer sie während des Verifizierungs-Flows eingeben. Wird bei Workflows der Unternehmensverifizierung (KYB) ignoriert. **Wichtig:** Diese Telefonnummer wird nur durchgesetzt, wenn es sich um eine gültige E.164-Telefonnummer handelt. Wenn die angegebene Nummer ungültig ist oder nicht geparst werden kann, wird sie ignoriert und der Benutzer kann während des Telefonverifizierungsschritts eine beliebige gültige Telefonnummer eingeben.",
                        "example": "+14155552671",
                        "x-readme-id": "1.3"
                      }
                    },
                    "x-readme-id": "0.4"
                  },
                  "expected_details": {
                    "type": "object",
                    "description": "Erwartete Benutzerdaten, die für die Kreuzvalidierung mit den aus dem Ausweisdokument des Benutzers, dem Adressnachweis und anderen Verifizierungsschritten extrahierten Daten verwendet werden. Abweichungen werden als Warnungen in der Entscheidung angezeigt; einige Felder (z. B. `id_country`, `expected_document_types`) verändern auch den für den Benutzer sichtbaren Ablauf. Bei Workflows zur Unternehmensverifizierung (KYB) werden nur die Unternehmensfelder (`company_name`, `registry_country`, `registration_number`) verwendet — sie füllen die Suche im Unternehmensregister für den Benutzer voraus — und alle Felder auf Personenebene werden ignoriert.",
                    "example": {
                      "first_name": "John",
                      "last_name": "Doe",
                      "date_of_birth": "1990-05-15",
                      "nationality": "USA",
                      "id_country": "USA",
                      "expected_document_types": [
                        "P",
                        "ID"
                      ]
                    },
                    "properties": {
                      "first_name": {
                        "type": "string",
                        "description": "Vorname des Benutzers. Zum Beispiel `John`. Der Abgleich verwendet einen unscharfen Vergleich, und Sie können die Genauigkeit anpassen, indem Sie den Schwellenwert für den Namensübereinstimmungswert in der Konsole sowohl für Ausweisdokument- als auch für Adressnachweis-Workflows konfigurieren.",
                        "example": "John",
                        "x-readme-id": "1.0"
                      },
                      "last_name": {
                        "type": "string",
                        "description": "Nachname des Benutzers. Zum Beispiel `Doe`. Der Abgleich verwendet einen unscharfen Vergleich, und Sie können die Genauigkeit anpassen, indem Sie den Schwellenwert für den Namensübereinstimmungswert in der Konsole sowohl für Ausweisdokument- als auch für Adressnachweis-Workflows konfigurieren.",
                        "example": "Doe",
                        "x-readme-id": "1.1"
                      },
                      "date_of_birth": {
                        "type": "string",
                        "format": "date",
                        "description": "Geburtsdatum des Benutzers im Format: YYYY-MM-DD. Zum Beispiel `1990-05-15`.",
                        "example": "1990-05-15",
                        "x-readme-id": "1.2"
                      },
                      "gender": {
                        "type": "string",
                        "nullable": true,
                        "enum": [
                          "M",
                          "F"
                        ],
                        "default": null,
                        "description": "Geschlecht des Benutzers. Muss entweder 'M', 'F' oder null sein.",
                        "example": "M",
                        "x-readme-id": "1.3"
                      },
                      "nationality": {
                        "type": "string",
                        "description": "ISO 3166-1-Alpha-3-Ländercode, der das Herkunftsland des Antragstellers darstellt. Zum Beispiel `USA`. Siehe die [vollständige Liste der unterstützten Ländercodes](https://docs.didit.me/de/core-technology/id-verification/supported-documents-id-verification#unterstützte-dokumente-nach-land).",
                        "example": "USA",
                        "x-readme-id": "1.4"
                      },
                      "country": {
                        "type": "string",
                        "description": "ISO 3166-1-Alpha-3-Ländercode, der als Fallback sowohl für Länderabgleichprüfungen der Ausweisverifizierung als auch des Adressnachweises dient. Erforderlich, wenn `address` angegeben ist und weder `id_country` noch `poa_country` festgelegt wurde.",
                        "example": "USA",
                        "x-readme-id": "1.4.1"
                      },
                      "id_country": {
                        "type": "string",
                        "description": "ISO 3166-1-Alpha-3-Ländercode, der das erwartete Land des Ausweisdokuments des Antragstellers darstellt, welches von der Staatsangehörigkeit abweichen kann. Zum Beispiel `GBR`. Hat bei Länderabgleichprüfungen der Ausweisverifizierung Vorrang vor `country`. Siehe die [vollständige Liste der unterstützten Ländercodes](https://docs.didit.me/de/core-technology/id-verification/supported-documents-id-verification#unterstützte-dokumente-nach-land).",
                        "example": "GBR",
                        "x-readme-id": "1.5"
                      },
                      "poa_country": {
                        "type": "string",
                        "description": "ISO 3166-1-Alpha-3-Ländercode, der das erwartete Land des Adressnachweis-Dokuments darstellt. Zum Beispiel `USA`. Hat bei Länderabgleichprüfungen des Adressnachweises (POA) Vorrang vor `country`. Siehe die [vollständige Liste der unterstützten Ländercodes](https://docs.didit.me/de/core-technology/id-verification/supported-documents-id-verification#unterstützte-dokumente-nach-land).",
                        "example": "USA",
                        "x-readme-id": "1.5.1"
                      },
                      "address": {
                        "type": "string",
                        "description": "Die Adresse in einem menschenlesbaren Format, einschließlich so vieler Informationen wie möglich. Zum Beispiel `123 Main St, San Francisco, CA 94105, USA`. Wenn angegeben, müssen Sie auch `country` oder `poa_country` übergeben, andernfalls schlägt die Anfrage mit `400` fehl.",
                        "example": "123 Main St, San Francisco, CA 94105, USA",
                        "x-readme-id": "1.6"
                      },
                      "identification_number": {
                        "type": "string",
                        "description": "Die Dokumentennummer, persönliche Identifikationsnummer oder Steuernummer des Benutzers. Zum Beispiel `123456789`.",
                        "example": "123456789",
                        "x-readme-id": "1.7"
                      },
                      "ip_address": {
                        "type": "string",
                        "description": "Erwartete IP-Adresse für die Sitzung im IPv4- oder IPv6-Format. Wenn die tatsächliche IP-Adresse von diesem Wert abweicht, wird eine Warnung protokolliert. Zum Beispiel `192.168.1.100` oder `2001:db8::1`.",
                        "example": "192.168.1.100",
                        "x-readme-id": "1.8"
                      },
                      "expected_document_types": {
                        "type": "array",
                        "description": "Schränkt die Dokumenttypen ein, die der Benutzer während des Schritts zur Ausweisverifizierung (OCR) vorlegen kann. Wenn festgelegt, zeigt der Dokumentauswahlbildschirm nur die angeforderten Typen an und das zurückgegebene `documents_allowed` wird entsprechend gefiltert. Werte unterscheiden nicht zwischen Groß- und Kleinschreibung und werden dedupliziert; unbekannte Werte werden mit `400` abgewiesen. Zulässige Codes: `P` (Reisepass), `ID` (Personalausweis), `DL` (Führerschein), `RP` (Aufenthaltstitel), `HIC` (Krankenversicherungskarte), `TC` (Steuerkarte), `SSC` (Sozialversicherungsausweis).",
                        "items": {
                          "type": "string",
                          "enum": [
                            "P",
                            "ID",
                            "DL",
                            "RP",
                            "HIC",
                            "TC",
                            "SSC"
                          ]
                        },
                        "example": [
                          "P",
                          "ID"
                        ],
                        "x-readme-id": "1.9"
                      },
                      "company_name": {
                        "type": "string",
                        "maxLength": 255,
                        "description": "Erwarteter rechtlicher Name des zu verifizierenden Unternehmens. Zum Beispiel `Tesco PLC`. Füllt das Feld für den Unternehmensnamen bei der Suche im Unternehmensregister in Workflows zur Unternehmensverifizierung (KYB) voraus; wenn auch `registration_number` angegeben ist, kombiniert die Registerabfrage beide Identifikatoren. Wird bei KYC-Workflows ignoriert.",
                        "example": "Tesco PLC",
                        "x-readme-id": "1.10"
                      },
                      "registry_country": {
                        "type": "string",
                        "maxLength": 10,
                        "description": "ISO 3166-1 Alpha-2-Code des Landes, in dessen Unternehmensregister das Unternehmen eingetragen ist. Zum Beispiel `GB`. Wenn Unternehmensregister auf Bundesstaat- oder Provinzebene geführt werden, hängen Sie den ISO 3166-2-Unterteilungscode als `XX-YY` an: `US-CA` zielt auf das kalifornische Register ab. Dasselbe Format wie `country_code` in der [KYB Registry Search API](https://docs.didit.me/de/standalone-apis/kyb-registry-search). Wählt das Registerland in Workflows der Unternehmensverifizierung (KYB) vor; wird bei KYC-Workflows ignoriert.",
                        "example": "US-CA",
                        "x-readme-id": "1.11"
                      },
                      "registration_number": {
                        "type": "string",
                        "maxLength": 100,
                        "description": "Erwartete Registernummer des Unternehmens im Unternehmensregister. Zum Beispiel `00445790`. Füllt das Feld für die Registernummer bei der Suche im Unternehmensregister in Workflows zur Unternehmensverifizierung (KYB) voraus; wenn auch `company_name` angegeben ist, kombiniert die Registerabfrage beide Identifikatoren. Wird bei KYC-Workflows ignoriert.",
                        "example": "00445790",
                        "x-readme-id": "1.12"
                      }
                    },
                    "x-readme-id": "0.5"
                  },
                  "portrait_image": {
                    "type": "string",
                    "format": "byte",
                    "description": "Base64-kodiertes Porträtbild des Gesichts des Endbenutzers (max. 2 MB; JPEG, PNG, WebP oder TIFF). Wird als Referenzbild für den Abgleich mit der Liveness-Aufnahme verwendet, wenn der Workflow ein `Biometric Authentication`-Workflow mit aktiviertem Gesichtsabgleich ist, oder bei jedem Graph-Workflow, bei dem der Gesichtsabgleich vor der Ausweisverifizierung (OCR) ausgeführt wird. Optional, wenn der `vendor_data`-Benutzer bereits ein gespeichertes Gesichtsbild hat: Didit verwendet dieses automatisch wieder, aufgelöst in dieser Prioritätsreihenfolge: genehmigtes Liveness-Gesicht, Foto vom ePass-Chip, Porträt aus dem Ausweisdokument, manuell registriertes Profilgesicht (nur Gesichter aus genehmigten Sitzungen oder Gesichter, die Sie selbst registriert haben, werden wiederverwendet). Falls angegeben, hat `portrait_image` immer Vorrang vor dem gespeicherten Gesicht. Wenn es weggelassen wird und kein gespeichertes Gesicht vorhanden ist (oder `vendor_data` nicht gesendet wird), schlägt die Sitzungserstellung mit `400` fehl. Wird bei anderen Workflow-Typen ignoriert.",
                    "example": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII=",
                    "x-readme-id": "0.6"
                  },
                  "sandbox_scenario": {
                    "type": "string",
                    "description": "Szenario-Slug nur für die Sandbox. Wird nur akzeptiert, wenn der API-Schlüssel zu einer Anwendung im Sandbox-Modus gehört; bei Produktionsanwendungen abgelehnt. Wenn dieser Parameter festgelegt ist, überträgt der Erstellungsablauf die gebündelten Magic Values des Szenarios auf die Eingabefelder der Sitzung (contact_details, expected_details), sodass die gemockten Provider das Ergebnis des Szenarios über die reale Workflow-Pipeline reproduzieren. Siehe den Szenarienkatalog unter GET /v1/sandbox/scenarios/ oder [Sandbox & Test Data](/de/integration/sandbox-testing). Sie können ein Szenario nach der Erstellung auch über POST /v3/session/{sessionId}/sandbox/arm/ aktivieren (oder erneut aktivieren), solange sich die Sitzung noch im Status `Not Started` befindet. Verwenden Sie für Lookups ohne Dokument `lookup_partial_match`, `lookup_no_match` oder `lookup_provider_error`, um das konfigurierte Versuchsbudget und den Fallback zu testen. Verwenden Sie für Identitäts-Wallets `wallet_cancelled`, `wallet_timeout` oder `wallet_provider_error`; `approve` simuliert eine verifizierte Wallet. Alle Katalog-Wallets können in der Sandbox getestet werden, einschließlich Schemas, die in Produktionsanwendungen nicht verfügbar sind. Simulierte Versuche werden nicht abgerechnet.",
                    "example": "decline_document_expired"
                  },
                  "sign": {
                    "type": "object",
                    "description": "E-Signatur-Eingabe für diese Sitzung. `documents` sind die zu unterzeichnenden Dokumente für einen Workflow, dessen E-Signatur-Schritt Dokumente aus der Sitzung übernimmt (`signature_documents_source` `session` oder `both`): bis zu 20 Dokumente und insgesamt 50 MB. `field_values` füllt die Felder aus, deren `prefill` `api.<key>` ist, sowohl auf Workflow- als auch auf Sitzungsdokumenten. Ein erneutes Erstellen einer Sitzung für dieselbe `workflow_id` und `vendor_data` gibt die ausstehende Sitzung zurück; wenn dieser Aufruf `sign` sendet, müssen die Dokumente, Felder und Werte mit den ersten identisch sein, andernfalls wird `400` mit `{\"sign\": \"signature_document_changed\"}` zurückgegeben. Siehe [E-Signatur-Dokumente](/de/sessions-api/create-session#e-signatur-dokumente).",
                    "properties": {
                      "documents": {
                        "type": "array",
                        "minItems": 1,
                        "maxItems": 20,
                        "items": {
                          "$ref": "#/components/schemas/SessionSignDocument"
                        }
                      },
                      "field_values": {
                        "type": "object",
                        "description": "Werte, aufgeschlüsselt nach dem `<key>` jeder `api.<key>`-Vorausfüllquelle: Strings von 1 bis 500 Zeichen für `text`- und `data`-Felder, boolesche Werte für eine `checkbox`. `400` mit `field_value_unknown` für einen Schlüssel, den kein Feld verwendet, `field_value_missing` für ein Pflichtfeld ohne Wert und `field_value_invalid` für einen Wert, der die Validierung seines Felds nicht besteht.",
                        "additionalProperties": {
                          "oneOf": [
                            {
                              "type": "string",
                              "minLength": 1,
                              "maxLength": 500
                            },
                            {
                              "type": "boolean"
                            }
                          ]
                        },
                        "example": {
                          "credit_limit": "3,000 EUR"
                        }
                      }
                    }
                  },
                  "user_state": {
                    "type": "string",
                    "maxLength": 16,
                    "description": "Wohnort der Person, falls bekannt: ein Code für eine ISO-3166-2-Unterteilung (`US-IL`, `ES-M`) oder ein US-Bundesstaatscode oder -name (`IL`, `Illinois`). Bei einem Bundesstaat, dessen Recht eine ausdrückliche biometrische Einwilligung vorschreibt (Illinois, Texas, Colorado), fordert der Verifizierungs-Workflow diese vor der Erfassung eines Gesichts mit dem Auslöser `declared_state` an. Ein nicht erkannter Wert gibt `400` zurück. Siehe [Biometrische Einwilligung](/de/getting-started/biometric-consent).",
                    "example": "US-IL"
                  },
                  "biometric_consent": {
                    "type": "object",
                    "description": "Explizite biometrische Einwilligung, die Sie bereits von der Person eingeholt haben. Sie erfüllt die Anforderung, sodass im Verifizierungsablauf nicht erneut gefragt wird und die Entscheidung dies als `status: \"given\"` mit dem Auslöser `customer_collected` erfasst. Eine Antwort, die die Person bereits im Ablauf gegeben hat, wird niemals ersetzt. Siehe [Biometrische Einwilligung](/de/getting-started/biometric-consent).",
                    "required": [
                      "given_at",
                      "text_version"
                    ],
                    "properties": {
                      "given_at": {
                        "type": "string",
                        "format": "date-time",
                        "description": "Wann die Person die ausdrückliche biometrische Einwilligung erteilt hat (ISO 8601). Darf nicht in der Zukunft liegen."
                      },
                      "text_version": {
                        "type": "string",
                        "maxLength": 64,
                        "description": "Versions-ID des Einwilligungstextes, den die Person akzeptiert hat, in Ihren eigenen Datensätzen."
                      }
                    }
                  }
                },
                "example": {
                  "workflow_id": "11111111-2222-3333-4444-555555555555",
                  "vendor_data": "user-123",
                  "callback": "https://example.com/verification/callback",
                  "callback_method": "both",
                  "metadata": {
                    "user_type": "premium",
                    "account_id": "ABC123"
                  },
                  "language": "en",
                  "contact_details": {
                    "email": "john.doe@example.com",
                    "send_notification_emails": true,
                    "email_lang": "en",
                    "phone": "+14155552671"
                  },
                  "expected_details": {
                    "first_name": "John",
                    "last_name": "Doe",
                    "date_of_birth": "1990-05-15",
                    "id_country": "USA",
                    "expected_document_types": [
                      "P",
                      "ID"
                    ]
                  }
                }
              },
              "examples": {
                "Create KYC session": {
                  "summary": "Vollständige Happy-Path-Payload für eine Benutzerverifizierungs-Sitzung (KYC)",
                  "description": "Realistischer Erstellungsaufruf, der alle gängigen Felder verwendet: Workflow-Auswahl, Anbieter-Verknüpfung, Callback-Routing, Metadaten, Spracheinstellung, Vorbefüllung von Kontaktdaten und erwartete Benutzerdetails. Kopieren Sie dies direkt in das obige cURL-Beispiel.",
                  "value": {
                    "workflow_id": "11111111-2222-3333-4444-555555555555",
                    "vendor_data": "user-123",
                    "callback": "https://example.com/verification/callback",
                    "callback_method": "both",
                    "metadata": {
                      "user_type": "premium",
                      "account_id": "ABC123"
                    },
                    "language": "en",
                    "contact_details": {
                      "email": "john.doe@example.com",
                      "send_notification_emails": true,
                      "email_lang": "en",
                      "phone": "+14155552671"
                    },
                    "expected_details": {
                      "first_name": "John",
                      "last_name": "Doe",
                      "date_of_birth": "1990-05-15",
                      "nationality": "USA",
                      "id_country": "USA",
                      "expected_document_types": [
                        "P",
                        "ID"
                      ]
                    }
                  }
                },
                "Create KYB session": {
                  "summary": "Payload für den Erfolgsfall einer Sitzung der Unternehmensverifizierung (KYB)",
                  "description": "Gleiche Struktur wie der KYC-Aufruf — die `workflow_id` bestimmt, dass es sich bei der Sitzung um KYB handelt. `vendor_data` verweist typischerweise auf das Unternehmen in Ihrem System und `contact_details.email` richtet sich an den gesetzlichen Vertreter, der den Ablauf abschließt. `expected_details` akzeptiert die Unternehmensfelder (`company_name`, `registry_country`, `registration_number`), die die Unternehmensregistersuche vorausfüllen; personenbezogene Felder und `contact_details.phone` werden bei KYB-Workflows ignoriert.",
                  "value": {
                    "workflow_id": "33333333-4444-5555-6666-777777777777",
                    "vendor_data": "company-acme-001",
                    "callback": "https://example.com/kyb/callback",
                    "callback_method": "both",
                    "metadata": {
                      "tier": "enterprise",
                      "company_id": "ACME-001"
                    },
                    "expected_details": {
                      "company_name": "Tesco PLC",
                      "registry_country": "GB",
                      "registration_number": "00445790"
                    },
                    "language": "en",
                    "contact_details": {
                      "email": "legal-rep@acme.example.com",
                      "send_notification_emails": true,
                      "email_lang": "en"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/v3/session/imports/": {
      "post": {
        "summary": "Erstellen Sie einen Verifizierungs-Importauftrag",
        "description": "Erstellt einen asynchronen Importauftrag für historische Benutzerverifizierungs-Sitzungen, Unternehmensverifizierungs-Sitzungen, Transaktionsüberwachungs-Datensätze oder benutzerdefinierte Workflow-Statusregeln. Setzen Sie `source=provider`, um von einem anderen Anbieter zu migrieren: Didit liest Sumsub, Onfido, Persona und ComplyCube mit Ihrem Nur-Lese-Schlüssel aus, liest Datensätze von Veriff, iDenfy und MetaMap anhand der IDs aus, die Sie in `file` hochladen, und importiert für andere Anbieter eine Exportdatei im Didit-Format. Datensatz-IDs erhalten einen Namespace nach Anbieter (`sumsub:<id>`), sodass ein erneuter Durchlauf alles überspringt, was bereits in Didit vorhanden ist. Zudem wird ein Datensatz, der über eine Datei mit der reinen Anbieter-ID importiert wurde, in beiden Richtungen erkannt, sodass beim Wechsel zwischen einem Datei-Import und einer Anbietermigration niemals ein Datensatz doppelt importiert wird. Eine Anwendung kann bis zu 4 Importaufträge gleichzeitig ausführen; ein durch ein Deployment oder einen Worker-Neustart unterbrochener Auftrag wird automatisch ab der zuletzt importierten Zeile fortgesetzt. Importe sind standardmäßig deaktiviert und müssen pro Organisation von Didit freigeschaltet werden.",
        "operationId": "post_v3_session_imports_create",
        "x-didit-sdk": {
          "resource": "sessions.imports",
          "method": "create",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Sessions"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "properties": {
                  "import_type": {
                    "type": "string",
                    "enum": [
                      "user_verification",
                      "business_verification",
                      "status_rules",
                      "transactions"
                    ],
                    "default": "user_verification",
                    "description": "Was importiert werden soll: historische Sitzungen der Benutzerverifizierung, historische Sitzungen der Unternehmensverifizierung, benutzerdefinierte Statusregeln für Workflows oder historische Datensätze der Transaktionsüberwachung."
                  },
                  "workflow_id": {
                    "type": "string",
                    "format": "uuid",
                    "description": "Workflow-UUID, mit der importierte Sitzungen oder Statusregeln verknüpft werden sollen. Erforderlich für user_verification, business_verification und status_rules. Bei Transaktionen weglassen."
                  },
                  "source_format": {
                    "type": "string",
                    "enum": [
                      "csv",
                      "ndjson"
                    ],
                    "description": "Optional. Wird anhand der Dateiendung der hochgeladenen Datei abgeleitet, wenn sie weggelassen wird."
                  },
                  "file": {
                    "type": "string",
                    "format": "binary",
                    "description": "Kanonische CSV- oder NDJSON-Datei. Verwenden Sie NDJSON für große Importe. Maximale Upload-Größe 25 MB (verwenden Sie `source_file_url` für größere Dateien). Ist mit `source_file_url` nicht kombinierbar."
                  },
                  "source_file_url": {
                    "type": "string",
                    "format": "uri",
                    "description": "Alternative zum Datei-Upload. Muss eine HTTPS-URL sein, die auf eine öffentliche Adresse auflöst (private/Loopback-Netzwerke werden abgelehnt). Schließt sich mit `file` gegenseitig aus."
                  },
                  "source": {
                    "type": "string",
                    "enum": [
                      "file",
                      "provider"
                    ],
                    "description": "`provider` kennzeichnet dies als Migration von einem anderen Anbieter für Ausweisverifizierung. Für einen Datei-Import weglassen."
                  },
                  "provider": {
                    "type": "string",
                    "enum": [
                      "sumsub",
                      "jumio",
                      "veriff",
                      "onfido",
                      "persona",
                      "metamap",
                      "socure",
                      "idnow",
                      "shufti",
                      "idenfy",
                      "ondato",
                      "trulioo",
                      "au10tix",
                      "complycube",
                      "other"
                    ],
                    "description": "Migrationsquelle, aus `GET /v3/session/imports/providers/`. Erforderlich, wenn `source` den Wert `provider` hat."
                  },
                  "credentials": {
                    "type": "object",
                    "additionalProperties": {
                      "type": "string"
                    },
                    "description": "Der schreibgeschützte Schlüssel des Anbieters mit den von `credential_fields` aufgelisteten Feldnamen. Im Ruhezustand verschlüsselt, wird niemals zurückgegeben und nach Abschluss des Imports gelöscht. Senden Sie ihn als JSON-String in multipart."
                  },
                  "options": {
                    "type": "object",
                    "properties": {
                      "region": {
                        "type": "string",
                        "description": "Die Region des Anbieters, eine seiner `regions` (Onfido: `eu`, `us`, `ca`)."
                      }
                    }
                  },
                  "status_mapping": {
                    "type": "object",
                    "additionalProperties": {
                      "type": "string",
                      "enum": [
                        "Approved",
                        "Declined",
                        "In Review",
                        "Expired",
                        "Not Finished",
                        "Abandoned"
                      ]
                    },
                    "description": "Anpassungen des Standard-Status-Mappings des Anbieters: Quellstatus zu Didit-Status. `Not Finished` und `Abandoned` werden übersprungen und gezählt, jedoch niemals importiert."
                  },
                  "dry_run": {
                    "type": "boolean",
                    "default": false,
                    "description": "Zählen, was die Migration importieren würde (nach Status, bereits in Didit, dieselbe Person, nicht abgeschlossen) und nichts schreiben. Der Auftrag endet als `READY`; starten Sie ihn mit `POST /v3/session/imports/{importId}/start/`."
                  },
                  "face_templates": {
                    "type": "boolean",
                    "default": false,
                    "description": "Erstellen Sie biometrische Templates aus den importierten Selfies und gleichen Sie diese mit den Gesichtern und der Sperrliste der Anwendung ab. Übereinstimmungen werden nur zur Prüfung markiert. Erfordert `lawful_basis_confirmed`."
                  },
                  "lawful_basis_confirmed": {
                    "type": "boolean",
                    "default": false,
                    "description": "Bestätigt, dass Sie über eine Rechtsgrundlage verfügen, um diese Selfies mit Didit als Auftragsverarbeiter zu teilen."
                  }
                }
              }
            },
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "source_file_url"
                ],
                "properties": {
                  "import_type": {
                    "type": "string",
                    "enum": [
                      "user_verification",
                      "business_verification",
                      "status_rules",
                      "transactions"
                    ],
                    "default": "user_verification",
                    "description": "Was importiert werden soll: historische Sitzungen der Benutzerverifizierung, historische Sitzungen der Unternehmensverifizierung, benutzerdefinierte Statusregeln für Workflows oder historische Datensätze der Transaktionsüberwachung."
                  },
                  "workflow_id": {
                    "type": "string",
                    "format": "uuid",
                    "description": "Workflow-UUID, mit der importierte Sitzungen oder Statusregeln verknüpft werden sollen. Erforderlich für user_verification, business_verification und status_rules. Bei Transaktionen weglassen."
                  },
                  "source_format": {
                    "type": "string",
                    "enum": [
                      "csv",
                      "ndjson"
                    ],
                    "description": "Optional. Wird anhand der Dateiendung der URL abgeleitet, wenn sie weggelassen wird."
                  },
                  "source_file_url": {
                    "type": "string",
                    "format": "uri",
                    "description": "Alternative zum Datei-Upload. Muss eine HTTPS-URL sein, die auf eine öffentliche Adresse auflöst (private/Loopback-Netzwerke werden abgelehnt). Schließt sich mit `file` gegenseitig aus."
                  },
                  "source": {
                    "type": "string",
                    "enum": [
                      "file",
                      "provider"
                    ],
                    "description": "`provider` kennzeichnet dies als Migration von einem anderen Anbieter für Ausweisverifizierung. Für einen Datei-Import weglassen."
                  },
                  "provider": {
                    "type": "string",
                    "enum": [
                      "sumsub",
                      "jumio",
                      "veriff",
                      "onfido",
                      "persona",
                      "metamap",
                      "socure",
                      "idnow",
                      "shufti",
                      "idenfy",
                      "ondato",
                      "trulioo",
                      "au10tix",
                      "complycube",
                      "other"
                    ],
                    "description": "Migrationsquelle, aus `GET /v3/session/imports/providers/`. Erforderlich, wenn `source` den Wert `provider` hat."
                  },
                  "credentials": {
                    "type": "object",
                    "additionalProperties": {
                      "type": "string"
                    },
                    "description": "Der schreibgeschützte Schlüssel des Anbieters mit den von `credential_fields` aufgelisteten Feldnamen. Im Ruhezustand verschlüsselt, wird niemals zurückgegeben und nach Abschluss des Imports gelöscht. Senden Sie ihn als JSON-String in multipart."
                  },
                  "options": {
                    "type": "object",
                    "properties": {
                      "region": {
                        "type": "string",
                        "description": "Die Region des Anbieters, eine seiner `regions` (Onfido: `eu`, `us`, `ca`)."
                      }
                    }
                  },
                  "status_mapping": {
                    "type": "object",
                    "additionalProperties": {
                      "type": "string",
                      "enum": [
                        "Approved",
                        "Declined",
                        "In Review",
                        "Expired",
                        "Not Finished",
                        "Abandoned"
                      ]
                    },
                    "description": "Anpassungen des Standard-Status-Mappings des Anbieters: Quellstatus zu Didit-Status. `Not Finished` und `Abandoned` werden übersprungen und gezählt, jedoch niemals importiert."
                  },
                  "dry_run": {
                    "type": "boolean",
                    "default": false,
                    "description": "Zählen, was die Migration importieren würde (nach Status, bereits in Didit, dieselbe Person, nicht abgeschlossen) und nichts schreiben. Der Auftrag endet als `READY`; starten Sie ihn mit `POST /v3/session/imports/{importId}/start/`."
                  },
                  "face_templates": {
                    "type": "boolean",
                    "default": false,
                    "description": "Erstellen Sie biometrische Templates aus den importierten Selfies und gleichen Sie diese mit den Gesichtern und der Sperrliste der Anwendung ab. Übereinstimmungen werden nur zur Prüfung markiert. Erfordert `lawful_basis_confirmed`."
                  },
                  "lawful_basis_confirmed": {
                    "type": "boolean",
                    "default": false,
                    "description": "Bestätigt, dass Sie über eine Rechtsgrundlage verfügen, um diese Selfies mit Didit als Auftragsverarbeiter zu teilen."
                  }
                }
              },
              "examples": {
                "URL-based import": {
                  "value": {
                    "import_type": "user_verification",
                    "workflow_id": "9f9b1234-aaaa-bbbb-cccc-1234567890ab",
                    "source_file_url": "https://files.example.com/exports/sessions.ndjson"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Import-Job akzeptiert. Fragen Sie die zurückgegebene `uuid` regelmäßig ab, bis der `status` `COMPLETED` oder `FAILED` lautet.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SessionImportJob"
                },
                "examples": {
                  "Job accepted": {
                    "value": {
                      "uuid": "3f9c1a2b-4d5e-4f60-8a7b-9c0d1e2f3a4b",
                      "status": "PENDING",
                      "import_type": "user_verification",
                      "source_format": "ndjson",
                      "source_filename": "sessions.ndjson",
                      "total_rows": 0,
                      "processed_rows": 0,
                      "checkpoint_row": 0,
                      "created_count": 0,
                      "updated_count": 0,
                      "skipped_count": 0,
                      "failed_count": 0,
                      "total_media_bytes": 0,
                      "last_error": null,
                      "created_at": "2026-05-17T08:42:11Z",
                      "updated_at": "2026-05-17T08:42:11Z",
                      "started_at": null,
                      "completed_at": null
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Ungültiger Workflow, Dateityp, Dateigröße, Quell-URL oder Selektorkombination. Eine Migration, deren Schlüssel der Anbieter ablehnt, gibt `code` (`invalid_credentials`, `missing_permission`, `wrong_region`, `provider_unavailable`, `rate_limited`, `ids_required`, `record_not_found`), `missing_permissions` und `suggested_region` zurück.",
            "content": {
              "application/json": {
                "examples": {
                  "Invalid workflow": {
                    "value": {
                      "workflow_id": [
                        "Invalid workflow_id."
                      ]
                    }
                  },
                  "Workflow required": {
                    "value": {
                      "workflow_id": [
                        "This field is required for this import type."
                      ]
                    }
                  },
                  "Wrong file type": {
                    "value": {
                      "file": [
                        "Only CSV and NDJSON files are supported."
                      ]
                    }
                  },
                  "File too large": {
                    "value": {
                      "file": [
                        "Import file exceeds the maximum allowed size."
                      ]
                    }
                  },
                  "No source": {
                    "value": {
                      "file": [
                        "Upload a file or provide source_file_url."
                      ]
                    }
                  },
                  "Both sources": {
                    "value": {
                      "file": [
                        "Use either file or source_file_url, not both."
                      ]
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Importe nicht aktiviert, Sandbox-Anwendung oder fehlender API-Schlüssel (ein falscher, widerrufener oder abgelaufener Schlüssel führt zu `401`). Verifizierungsimporte sind standardmäßig deaktiviert und müssen von Didit pro Organisation aktiviert werden.",
            "content": {
              "application/json": {
                "examples": {
                  "Imports not enabled": {
                    "value": {
                      "detail": "Verification imports are not enabled for this organization."
                    }
                  },
                  "Sandbox": {
                    "value": {
                      "detail": "Verification imports are not enabled for sandbox applications."
                    }
                  },
                  "Bad API key": {
                    "value": {
                      "detail": "You do not have permission to perform this action."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Die Anwendung hat bereits 4 aktive Import-Jobs (PENDING/PROCESSING/PAUSED) – das Maximum, das gleichzeitig ausgeführt werden kann. Warten Sie, bis einer abgeschlossen ist, bevor Sie einen weiteren starten.",
            "content": {
              "application/json": {
                "examples": {
                  "Active job": {
                    "value": {
                      "detail": "This application already has 4 active import jobs, the most it can run at once. Wait for one to finish before starting another."
                    }
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "x-codeSamples": [
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.sessions.imports.create(\n    import_type=\"user_verification\",\n    workflow_id=\"9f9b1234-aaaa-bbbb-cccc-1234567890ab\",\n    source_file_url=\"https://files.example.com/exports/sessions.ndjson\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.sessions.imports.create({\n  import_type: \"user_verification\",\n  workflow_id: \"9f9b1234-aaaa-bbbb-cccc-1234567890ab\",\n  source_file_url: \"https://files.example.com/exports/sessions.ndjson\",\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Sessions.Imports.Create(ctx, didit.SessionsImportsCreateParams{\n\tImportType:    didit.Some(didit.SessionsImportsCreateParamsImportType(\"user_verification\")),\n\tWorkflowID:    didit.String(\"9f9b1234-aaaa-bbbb-cccc-1234567890ab\"),\n\tSourceFileURL: didit.String(\"https://files.example.com/exports/sessions.ndjson\"),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\nimport me.didit.types.SessionsImportsCreateParams;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.sessions().imports().create(SessionsImportsCreateParams.builder()\n        .importType(SessionsImportsCreateParams.ImportType.of(\"user_verification\"))\n        .workflowId(\"9f9b1234-aaaa-bbbb-cccc-1234567890ab\")\n        .sourceFileUrl(\"https://files.example.com/exports/sessions.ndjson\")\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->sessions->imports->create([\n    'import_type' => 'user_verification',\n    'workflow_id' => '9f9b1234-aaaa-bbbb-cccc-1234567890ab',\n    'source_file_url' => 'https://files.example.com/exports/sessions.ndjson',\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.sessions.imports.create(\n  import_type: \"user_verification\",\n  workflow_id: \"9f9b1234-aaaa-bbbb-cccc-1234567890ab\",\n  source_file_url: \"https://files.example.com/exports/sessions.ndjson\"\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Sessions.Imports.CreateAsync(new SessionsImportsCreateParams\n{\n    ImportType = new SessionsImportsCreateParamsImportType(\"user_verification\"),\n    WorkflowId = \"9f9b1234-aaaa-bbbb-cccc-1234567890ab\",\n    SourceFileUrl = \"https://files.example.com/exports/sessions.ndjson\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ]
      }
    },
    "/v3/session/imports/template/": {
      "get": {
        "summary": "Vorlage für Verifizierungsimport herunterladen",
        "description": "Laden Sie den kanonischen CSV-Header für Verifizierungsimporte herunter. Der Spaltensatz wird durch `import_type` bestimmt. Die erste Spalte von Sitzungsvorlagen ist der Idempotenz-Schlüssel `external_id`.",
        "operationId": "get_v3_session_imports_template",
        "x-didit-sdk": {
          "resource": "sessions.imports",
          "method": "retrieve_template",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Sessions"
        ],
        "parameters": [
          {
            "name": "import_type",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "user_verification",
                "business_verification",
                "status_rules",
                "transactions"
              ],
              "default": "user_verification"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "CSV-Vorlagendatei.",
            "content": {
              "text/csv": {
                "schema": {
                  "type": "string",
                  "format": "binary"
                }
              }
            }
          },
          "403": {
            "description": "Fehlender, ungültiger oder widerrufener API-Schlüssel, oder der Schlüssel kann keine Importvorlagen herunterladen. Ein fehlender Schlüssel gibt `403` zurück; ein falscher, widerrufener oder abgelaufener Schlüssel gibt `401` zurück.",
            "content": {
              "application/json": {
                "examples": {
                  "Forbidden": {
                    "summary": "Fehlender, ungültiger oder widerrufener API-Schlüssel",
                    "value": {
                      "detail": "You do not have permission to perform this action."
                    }
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "x-codeSamples": [
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\ncontent = client.sessions.imports.retrieve_template()\nwith open(\"download.csv\", \"wb\") as file:\n    file.write(content)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import { writeFile } from \"node:fs/promises\";\nimport Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst content = await didit.sessions.imports.retrieveTemplate();\nawait writeFile(\"download.csv\", Buffer.from(await content.arrayBuffer()));"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresp, err := client.Sessions.Imports.RetrieveTemplate(ctx, didit.SessionsImportsRetrieveTemplateParams{})\nif err != nil {\n\tlog.Fatal(err)\n}\ndefer resp.Body.Close()\nfile, err := os.Create(\"download.csv\")\nif err != nil {\n\tlog.Fatal(err)\n}\ndefer file.Close()\nif _, err := io.Copy(file, resp.Body); err != nil {\n\tlog.Fatal(err)\n}"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import java.nio.file.Path;\nimport me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nclient.sessions().imports().retrieveTemplate()\n        .writeTo(Path.of(\"download.csv\"));"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$content = $didit->sessions->imports->retrieveTemplate();\n$content->saveTo('download.csv');"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\ncontent = didit.sessions.imports.retrieve_template\nFile.binwrite(\"download.csv\", content)"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar content = await client.Sessions.Imports.RetrieveTemplateAsync();\nawait content.SaveToAsync(\"download.csv\");"
          }
        ]
      }
    },
    "/v3/session/imports/{importId}/": {
      "get": {
        "summary": "Einen Verifizierungs-Importauftrag abrufen",
        "description": "Rufen Sie Fortschrittszähler und den endgültigen Status für einen Importauftrag ab. Führen Sie ein Polling durch, bis `status` `COMPLETED` oder `FAILED` lautet; `failed_count` > 0 bedeutet, dass einige Zeilen abgelehnt wurden – listen Sie diese über den Fehler-Endpoint auf.",
        "operationId": "get_v3_session_imports_retrieve",
        "x-didit-sdk": {
          "resource": "sessions.imports",
          "method": "retrieve",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Sessions"
        ],
        "parameters": [
          {
            "name": "importId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Status des Import-Jobs.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SessionImportJob"
                }
              }
            }
          },
          "404": {
            "description": "Import-Job für diese Anwendung nicht gefunden.",
            "content": {
              "application/json": {
                "examples": {
                  "Not found": {
                    "value": {
                      "detail": "Not found."
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Fehlender, ungültiger oder widerrufener API-Schlüssel, oder der Schlüssel kann keine Import-Jobs für diese Anwendung lesen. Ein fehlender Schlüssel gibt `403` zurück; ein falscher, widerrufener oder abgelaufener Schlüssel gibt `401` zurück.",
            "content": {
              "application/json": {
                "examples": {
                  "Forbidden": {
                    "summary": "Fehlender, ungültiger oder widerrufener API-Schlüssel",
                    "value": {
                      "detail": "You do not have permission to perform this action."
                    }
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "x-codeSamples": [
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.sessions.imports.retrieve(\n    \"11111111-2222-3333-4444-555555555555\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.sessions.imports.retrieve(\"11111111-2222-3333-4444-555555555555\");\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Sessions.Imports.Retrieve(ctx, \"11111111-2222-3333-4444-555555555555\")\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.sessions().imports().retrieve(\"11111111-2222-3333-4444-555555555555\");\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->sessions->imports->retrieve('11111111-2222-3333-4444-555555555555');\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.sessions.imports.retrieve(\"11111111-2222-3333-4444-555555555555\")\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Sessions.Imports.RetrieveAsync(\"11111111-2222-3333-4444-555555555555\");\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ]
      }
    },
    "/v3/session/imports/{importId}/errors/": {
      "get": {
        "summary": "Zeilenfehler beim Verifizierungsimport auflisten",
        "description": "Fehler auf Zeilenebene für einen Verifizierungs-Importauftrag auflisten, sortiert nach `row_number`. Verwenden Sie diesen Endpoint, um eine korrigierte Datei für den Wiederholungsversuch zu erstellen, die nur fehlgeschlagene Zeilen enthält.",
        "operationId": "get_v3_session_imports_errors",
        "x-didit-sdk": {
          "resource": "sessions.imports",
          "method": "list_errors",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Sessions"
        ],
        "parameters": [
          {
            "name": "importId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "default": 50,
              "minimum": 1
            },
            "description": "Seitengröße. Standardmäßig 50, wenn weggelassen."
          },
          {
            "name": "offset",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "default": 0
            },
            "description": "Nullbasierter Offset des ersten zurückzugebenden Datensatzes."
          }
        ],
        "responses": {
          "200": {
            "description": "Paginierte Zeilenfehler.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "count": {
                      "type": "integer",
                      "description": "Anzahl der Fehlerzeilen – exakt bis 100, darüber hinaus auf 100 begrenzt. Verlassen Sie sich darauf, dass `next` `null` ist, um die letzte Seite zu erkennen."
                    },
                    "next": {
                      "type": "string",
                      "nullable": true,
                      "description": "Absolute URL der nächsten Seite oder `null` auf der letzten Seite."
                    },
                    "previous": {
                      "type": "string",
                      "nullable": true,
                      "description": "Absolute URL der vorherigen Seite oder `null` auf der ersten Seite."
                    },
                    "results": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/SessionImportError"
                      }
                    }
                  }
                },
                "examples": {
                  "Row errors": {
                    "value": {
                      "count": 1,
                      "next": null,
                      "previous": null,
                      "results": [
                        {
                          "uuid": "5a6b7c8d-9e0f-4a1b-8c2d-3e4f5a6b7c8d",
                          "row_number": 17,
                          "external_id": "ext-000017",
                          "error": "status: invalid value 'unknown_status'",
                          "raw_row": {
                            "external_id": "ext-000017",
                            "status": "unknown_status",
                            "first_name": "Jane"
                          },
                          "created_at": "2026-05-17T08:44:02Z"
                        }
                      ]
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Import-Job für diese Anwendung nicht gefunden.",
            "content": {
              "application/json": {
                "examples": {
                  "Not found": {
                    "value": {
                      "detail": "Not found."
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Fehlender, ungültiger oder widerrufener API-Schlüssel, oder der Schlüssel kann keine Import-Jobs für diese Anwendung lesen. Ein fehlender Schlüssel gibt `403` zurück; ein falscher, widerrufener oder abgelaufener Schlüssel gibt `401` zurück.",
            "content": {
              "application/json": {
                "examples": {
                  "Forbidden": {
                    "summary": "Fehlender, ungültiger oder widerrufener API-Schlüssel",
                    "value": {
                      "detail": "You do not have permission to perform this action."
                    }
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "x-codeSamples": [
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nfor item in client.sessions.imports.list_errors(\n    \"11111111-2222-3333-4444-555555555555\",\n):\n    print(item)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nfor await (const item of didit.sessions.imports.listErrors(\"11111111-2222-3333-4444-555555555555\")) {\n  console.log(item);\n}"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\niter := client.Sessions.Imports.ListErrorsAutoPaging(ctx, \"11111111-2222-3333-4444-555555555555\", didit.SessionsImportsListErrorsParams{})\nfor iter.Next() {\n\tfmt.Printf(\"%+v\\n\", iter.Current())\n}\nif err := iter.Err(); err != nil {\n\tlog.Fatal(err)\n}"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nfor (var item : client.sessions().imports().listErrors(\"11111111-2222-3333-4444-555555555555\")) {\n    System.out.println(item);\n}"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\nforeach ($didit->sessions->imports->listErrors('11111111-2222-3333-4444-555555555555') as $item) {\n    print_r($item->toArray());\n}"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\ndidit.sessions.imports.list_errors(\"11111111-2222-3333-4444-555555555555\").auto_paging_each do |item|\n  puts item.to_h\nend"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nawait foreach (var item in await client.Sessions.Imports.ListErrorsAsync(\"11111111-2222-3333-4444-555555555555\"))\n{\n    Console.WriteLine(JsonSerializer.Serialize(item));\n}"
          }
        ]
      }
    },
    "/v3/session/{sessionId}/decision/": {
      "get": {
        "summary": "Vollständige Entscheidung für eine Verifizierungssitzung abrufen",
        "description": "Rufen Sie den vollständigen Entscheidungsbericht für eine Verifizierungssitzung ab — den zusammengefassten Sitzungs-`status` plus einen Bericht pro Verifizierungsfunktion, die der Workflow ausgeführt hat. Dies ist der kanonische Lese-Endpoint sowohl für Benutzerverifizierungs- (KYC) als auch für Unternehmensverifizierungs-Sitzungen (KYB): Derselbe Pfad bedient beide, und der Diskriminator `session_kind` auf oberster Ebene gibt an, welche Struktur Sie erhalten haben (`\"user\"` oder `\"business\"`).\n\n**Jeder Funktionsbericht ist ein Array im Plural.** V3-Workflows sind Graphen, die dieselbe Funktion mehr als einmal ausführen können, sodass jeder Block (`id_verifications`, `nfc_verifications`, `liveness_checks`, `face_matches`, `poa_verifications`, `document_ai_documents`, `phone_verifications`, `email_verifications`, `aml_screenings`, `ip_analyses`, `database_validations`, `questionnaire_responses`) ein JSON-Array ist, dessen Elemente jeweils eine `node_id` tragen, die den Workflow-Graphknoten identifiziert, der sie erzeugt hat. Lesen Sie NFC als `response.nfc_verifications[0]` aus — niemals als einzelnes `nfc`-Feld. Ein Block ist `null`, bis der Workflow diese Funktion mindestens einmal ausgeführt hat; Funktionen, die der Workflow nicht enthält, erscheinen nie mit Daten. E-Signatur-Ergebnisse befinden sich in `signatures`, das nur vorhanden ist, wenn der Workflow einen E-Signatur-Schritt enthält.\n\n**Wann aufzurufen ist.** Das empfohlene Muster ist ereignisgesteuert: Warten Sie auf den Webhook `status.updated`, der ausgelöst wird, wenn die Sitzung eine Entscheidung (`Approved`, `Declined`, `In Review`) erreicht, und rufen Sie dann diesen Endpoint einmal auf, um den vollständigen Bericht abzurufen. Polling funktioniert ebenfalls — der Endpoint kann zu jedem Zeitpunkt im Lebenszyklus der Sitzung aufgerufen werden und gibt die bisher erzeugten Daten zurück —, aber die Kombination aus Webhook und anschließendem Abruf ist kostengünstiger und schneller. Medien-URLs in der Antwort (Dokumentenbilder, Videos, PDFs) sind kurzlebige vorab signierte Links: Rufen Sie sie zeitnah ab oder fordern Sie die Entscheidung erneut an, um frische Links zu erhalten, und speichern Sie sie nicht als langfristige Referenzen.\n\n**Status.** Der `status` auf oberster Ebene ist der Lebenszyklus-Status der Sitzung (`Not Started`, `In Progress`, `Awaiting User`, `In Review`, `Approved`, `Declined`, `Resubmitted`, `Expired`, `Kyc Expired`, `Abandoned`). Jedes Funktionselement trägt zusätzlich seinen eigenen `status` auf Funktionsebene (`Not Finished`, `Approved`, `Declined`, `In Review`, ...). Eine Sitzung kann insgesamt `Approved` sein, während eine einzelne Funktion `In Review` ist, abhängig von den Entscheidungsregeln des Workflows.\n\n**Authentifizierung und Sichtbarkeit.** Authentifizieren Sie sich mit dem API-Schlüssel der Anwendung im Header `x-api-key` (ein Bearer-Token eines Konsolenbenutzers mit der Berechtigung `read:sessions` funktioniert ebenfalls). Nur Sitzungen, die der authentifizierten Anwendung gehören, sind sichtbar. Wenn Ihr Workflow Antwortattribute einschränkt, werden nicht zulässige Felder innerhalb von Funktionselementen als `null` zurückgegeben, während `status`, `warnings` und `node_id` stets erhalten bleiben.\n\n**Rate-Limits.** GET-Anfragen sind auf 600 pro Minute pro API-Schlüssel begrenzt. Das Überschreiten des Limits gibt `429` mit den Headern `Retry-After` und `X-RateLimit-*` zurück.",
        "operationId": "get_v3_session_decision",
        "x-didit-sdk": {
          "resource": "sessions",
          "method": "retrieve_decision",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Sessions"
        ],
        "responses": {
          "200": {
            "description": "Vollständiger Entscheidungsbericht. `session_kind` unterscheidet die beiden Formen: `user`-Sitzungen enthalten die unten gezeigten KYC-Funktions-Arrays; `business`-Sitzungen enthalten stattdessen `registry_checks`, `document_verifications` und `key_people_checks` neben den gemeinsamen Arrays. Funktions-Arrays sind `null`, bis der Workflow diese Funktion ausgeführt hat; Medien-URLs sind kurzlebige, vorsignierte Links.",
            "content": {
              "application/json": {
                "examples": {
                  "Example": {
                    "summary": "Vollständiges Beispiel",
                    "value": {
                      "session_id": "11111111-2222-3333-4444-555555555555",
                      "session_kind": "user",
                      "session_number": 43762,
                      "session_url": "https://verify.didit.me/session/11111111-2222-3333-4444-555555555555",
                      "status": "In Review",
                      "environment": "live",
                      "workflow_id": "11111111-2222-3333-4444-555555555555",
                      "features": [
                        "ID_VERIFICATION",
                        "NFC",
                        "LIVENESS",
                        "FACE_MATCH",
                        "POA",
                        "PHONE",
                        "DATABASE_VALIDATION",
                        "AML",
                        "IP_ANALYSIS"
                      ],
                      "vendor_data": "11111111-1111-1111-1111-111111111111",
                      "metadata": {
                        "user_type": "premium",
                        "account_id": "ABC123"
                      },
                      "expected_details": {
                        "first_name": "Carmen",
                        "last_name": "Española Española"
                      },
                      "contact_details": {
                        "email": "carmen@example.com",
                        "email_lang": "es",
                        "send_notification_emails": false,
                        "phone": null
                      },
                      "callback": "https://verify.didit.me/",
                      "id_verifications": [
                        {
                          "node_id": "feature_ocr_1",
                          "status": "Approved",
                          "document_type": "Identity Card",
                          "document_subtype": "ID_CARD_GENERIC",
                          "document_number": "CAA000000",
                          "personal_number": "99999999R",
                          "portrait_image": "https://<media-host>/portrait.jpg",
                          "front_image": "https://<media-host>/front.jpg",
                          "front_video": "https://<media-host>/front.mp4",
                          "back_image": "https://<media-host>/back.jpg",
                          "back_video": "https://<media-host>/back.mp4",
                          "full_front_image": "https://<media-host>/full_front.jpg",
                          "full_back_image": "https://<media-host>/full_back.jpg",
                          "front_image_camera_front": "https://<media-host>/front_camera_front.jpg",
                          "back_image_camera_front": "https://<media-host>/back_camera_front.jpg",
                          "date_of_birth": "1980-01-01",
                          "age": 45,
                          "expiration_date": "2031-06-02",
                          "date_of_issue": "2021-06-02",
                          "issuing_state": "ESP",
                          "issuing_state_name": "Spain",
                          "first_name": "Carmen",
                          "last_name": "Española Española",
                          "full_name": "Carmen Española Española",
                          "gender": "F",
                          "address": "Avda de Madrid 34, Madrid, Madrid",
                          "formatted_address": "Avda de Madrid 34, Madrid, Madrid 28822, Spain",
                          "place_of_birth": "Madrid",
                          "marital_status": "Single",
                          "nationality": "ESP",
                          "extra_fields": {
                            "dl_categories": [],
                            "blood_group": null
                          },
                          "mrz": {
                            "surname": "ESPANOLA ESPANOLA",
                            "name": "CARMEN",
                            "country": "ESP",
                            "nationality": "ESP",
                            "birth_date": "800101",
                            "expiry_date": "310602",
                            "sex": "F",
                            "document_type": "ID",
                            "document_number": "CAA000000",
                            "optional_data": "99999999R",
                            "optional_data_2": "",
                            "birth_date_hash": "4",
                            "expiry_date_hash": "8",
                            "document_number_hash": "4",
                            "final_hash": "1",
                            "personal_number": "99999999R",
                            "warnings": [],
                            "errors": [],
                            "mrz_type": "TD1",
                            "mrz_string": "IDESPCAA000000499999999R<<<<<<\n8001014F3106028ESP<<<<<<<<<<<1\nESPANOLA<ESPANOLA<<CARMEN<<<<<",
                            "mrz_key": "CAA000000480010143106028"
                          },
                          "parsed_address": {
                            "city": "Madrid",
                            "label": "Spain ID Card Address",
                            "region": "Madrid",
                            "country": "ES",
                            "category": "Residential",
                            "street_1": "Avda de Madrid 34",
                            "street_2": null,
                            "is_verified": true,
                            "postal_code": "28822",
                            "raw_results": {
                              "types": [
                                "street_address"
                              ],
                              "geometry": {
                                "location": {
                                  "lat": 37.4222804,
                                  "lng": -122.0843428
                                },
                                "viewport": {
                                  "northeast": {
                                    "lat": 37.4237349802915,
                                    "lng": -122.083183169709
                                  },
                                  "southwest": {
                                    "lat": 37.4210370197085,
                                    "lng": -122.085881130292
                                  }
                                },
                                "location_type": "ROOFTOP"
                              },
                              "place_id": "ChIJN1t_tDeuEmsRUsoyG83frY4",
                              "formatted_address": "Avda de Madrid 34, 28822 Madrid, Spain",
                              "navigation_points": [
                                {
                                  "location": {
                                    "latitude": 37.4222804,
                                    "longitude": -122.0843428
                                  }
                                }
                              ],
                              "address_components": [
                                {
                                  "types": [
                                    "street_number"
                                  ],
                                  "long_name": "34",
                                  "short_name": "34"
                                },
                                {
                                  "types": [
                                    "route"
                                  ],
                                  "long_name": "Avda de Madrid",
                                  "short_name": "Avda de Madrid"
                                },
                                {
                                  "types": [
                                    "locality",
                                    "political"
                                  ],
                                  "long_name": "Madrid",
                                  "short_name": "Madrid"
                                },
                                {
                                  "types": [
                                    "country",
                                    "political"
                                  ],
                                  "long_name": "Spain",
                                  "short_name": "ES"
                                },
                                {
                                  "types": [
                                    "postal_code"
                                  ],
                                  "long_name": "28822",
                                  "short_name": "28822"
                                }
                              ]
                            },
                            "address_type": "Avda",
                            "document_location": {
                              "latitude": 37.4222804,
                              "longitude": -122.0843428
                            },
                            "formatted_address": "Avda de Madrid 34, 28822 Madrid, Spain"
                          },
                          "front_image_camera_front_face_match_score": 95.5,
                          "back_image_camera_front_face_match_score": 93.2,
                          "document_selfie_face_matches": [
                            {
                              "session_id": "3f0c9a52-7b1e-4d68-a2c4-5e9d8b7f1a20",
                              "session_number": 1180,
                              "similarity_percentage": 97.4,
                              "vendor_data": "user_ref_001",
                              "vendor_user_id": null,
                              "biometric_template_id": null,
                              "verification_date": "2026-09-02T09:15:00Z",
                              "user_details": {
                                "full_name": "Jane Doe"
                              },
                              "match_image_url": "https://<media-host>/match_face.jpg",
                              "status": "Approved",
                              "is_blocklisted": false,
                              "is_allowlisted": false,
                              "api_service": null,
                              "source": "session"
                            }
                          ],
                          "front_image_quality_score": {
                            "focus_score": 85.3,
                            "brightness_score": 92.1,
                            "brightness_issue": "ok",
                            "is_document_fully_visible": true,
                            "resolution_score": 72.4,
                            "overall_score": 88.7
                          },
                          "back_image_quality_score": {
                            "focus_score": 79.1,
                            "brightness_score": 90.5,
                            "brightness_issue": "ok",
                            "is_document_fully_visible": true,
                            "resolution_score": 72.4,
                            "overall_score": 85.2
                          },
                          "extra_files": [
                            "https://<media-host>/extra_id_verification.jpg"
                          ],
                          "matches": [
                            {
                              "session_id": "7d4f1f60-9c2e-4b8a-8f3d-2a1b5c6d7e8f",
                              "session_number": 1234,
                              "vendor_data": "user_ref_001",
                              "verification_date": "2024-06-15T10:30:00Z",
                              "user_details": {
                                "name": "John Smith",
                                "document_type": "ID",
                                "document_number": "CLM148418"
                              },
                              "status": "Approved",
                              "is_blocklisted": false,
                              "api_service": null,
                              "front_image_url": "https://<media-host>/document_front.jpg"
                            },
                            {
                              "session_id": "b2c8e4d1-6a3f-4e7b-95c0-1d8f2a6b4c9e",
                              "session_number": 1235,
                              "vendor_data": null,
                              "verification_date": "2024-05-20T14:45:00Z",
                              "user_details": {
                                "name": "John Smith",
                                "document_type": "ID",
                                "document_number": "CLM148418"
                              },
                              "status": "Declined",
                              "is_blocklisted": true,
                              "api_service": "ID_VERIFICATION",
                              "front_image_url": "https://<media-host>/document_front_2.jpg"
                            }
                          ],
                          "warnings": [
                            {
                              "feature": "ID_VERIFICATION",
                              "risk": "QR_NOT_DETECTED",
                              "additional_data": null,
                              "log_type": "information",
                              "short_description": "QR not detected",
                              "long_description": "The system couldn't find or read the QR code on the document, which is necessary for document verification. This could be due to poor image quality or an unsupported document type.",
                              "node_id": "feature_ocr_1"
                            }
                          ],
                          "verification_method": "document",
                          "assurance": "documentary",
                          "wallet_provider": null,
                          "fallback_from": null,
                          "id_lookup": null,
                          "wallet_verification": null,
                          "document_liveness": {
                            "portrait_replace": {
                              "score": 96.46,
                              "front": 96.46,
                              "back": 98.2,
                              "decline_threshold": 35,
                              "review_threshold": 70,
                              "bucket": "approve"
                            },
                            "printed_copy": {
                              "score": 91.2,
                              "front": 91.2,
                              "back": 93.7,
                              "decline_threshold": 35,
                              "review_threshold": 77,
                              "bucket": "approve"
                            },
                            "screen_replay": {
                              "score": 99.9,
                              "front": 99.9,
                              "back": 99.5,
                              "decline_threshold": 30,
                              "review_threshold": 70,
                              "bucket": "approve"
                            }
                          }
                        },
                        {
                          "node_id": "feature_ocr_2",
                          "status": "Approved",
                          "issuing_state": "ZAF",
                          "issuing_state_name": "South Africa",
                          "first_name": "Thabo",
                          "last_name": "Mokoena",
                          "full_name": "Thabo Mokoena",
                          "date_of_birth": "1991-06-15",
                          "personal_number": "9106155043088",
                          "verification_method": "id_lookup",
                          "assurance": "data_match",
                          "wallet_provider": null,
                          "fallback_from": null,
                          "id_lookup": {
                            "source": "Department of Home Affairs",
                            "checked_at": "2026-09-04T09:12:44Z",
                            "attempts": 1,
                            "max_attempts": 2,
                            "outcome": "match",
                            "comparison": [
                              {
                                "field": "identification_number",
                                "label": "ID number",
                                "provided": "9106155043088",
                                "record": "9106155043088",
                                "result": "match"
                              },
                              {
                                "field": "full_name",
                                "label": "Full name",
                                "provided": "Thabo Mokoena",
                                "record": "Thabo Mokoena",
                                "result": "match"
                              },
                              {
                                "field": "date_of_birth",
                                "label": "Date of birth",
                                "provided": "1991-06-15",
                                "record": "1991-06-15",
                                "result": "match"
                              }
                            ],
                            "registry_portrait": "https://<media-host>/registry_portrait.jpg",
                            "face_match_score": 96.4,
                            "source_errors": []
                          },
                          "wallet_verification": null,
                          "warnings": []
                        },
                        {
                          "node_id": "feature_ocr_3",
                          "status": "Approved",
                          "issuing_state": "DNK",
                          "issuing_state_name": "Denmark",
                          "first_name": "Freja",
                          "last_name": "Nielsen",
                          "full_name": "Freja Nielsen",
                          "date_of_birth": "1988-03-02",
                          "verification_method": "wallet",
                          "assurance": "cryptographic",
                          "wallet_provider": "mitid",
                          "fallback_from": null,
                          "id_lookup": null,
                          "wallet_verification": {
                            "provider": "mitid",
                            "provider_name": "MitID",
                            "issuing_authority": "Danish Agency for Digital Government",
                            "issuing_country": "DNK",
                            "credential_type": "person_identification",
                            "level_of_assurance": "substantial",
                            "verified_at": "2026-09-04T09:12:44Z",
                            "signature_valid": true,
                            "attributes": {
                              "full_name": "Freja Nielsen",
                              "date_of_birth": "1988-03-02",
                              "cpr_alias": "b0f1c2d3-e4f5-4678-9abc-def012345678"
                            },
                            "portrait": null,
                            "face_match_score": null
                          },
                          "warnings": []
                        }
                      ],
                      "nfc_verifications": [
                        {
                          "node_id": "feature_nfc_1",
                          "status": "In Review",
                          "is_nfc_skipped": false,
                          "skip_reason": null,
                          "chip_protocol": "icao",
                          "jpki": null,
                          "portrait_image": "https://<media-host>/portrait.jpg",
                          "signature_image": "https://<media-host>/signature.jpg",
                          "chip_data": {
                            "document_type": "ID",
                            "issuing_country": "ESP",
                            "document_number": "123456789",
                            "expiration_date": "2030-01-01",
                            "first_name": "John",
                            "last_name": "Smith",
                            "birth_date": "1990-05-15",
                            "gender": "M",
                            "nationality": "ESP",
                            "address": "CALLE MAYOR 123 4B, MADRID, MADRID",
                            "place_of_birth": "MADRID, MADRID"
                          },
                          "authenticity": {
                            "sod_integrity": true,
                            "dg_integrity": true
                          },
                          "certificate_summary": {
                            "issuer": "Common Name: CSCA SPAIN, Serial Number: 3, Organization: DIRECCION GENERAL DE LA POLICIA, Country: ES",
                            "subject": "Common Name: DS n-eID SPAIN 2, Organizational Unit: PASSPORT, Organization: DIRECCION GENERAL DE LA POLICIA, Country: ES",
                            "serial_number": "118120836164494130086420187336801405660",
                            "not_valid_after": "2031-02-18 10:21:11",
                            "not_valid_before": "2020-11-18 10:21:11"
                          },
                          "warnings": [
                            {
                              "feature": "NFC",
                              "risk": "DATA_INCONSISTENT",
                              "additional_data": null,
                              "log_type": "warning",
                              "short_description": "OCR and NFC mrz code extracted are not the same",
                              "long_description": "The Optical Character Recognition (OCR) data and the NFC chip data don't match, indicating potential document tampering or data inconsistency.",
                              "node_id": "feature_nfc_1"
                            }
                          ]
                        }
                      ],
                      "liveness_checks": [
                        {
                          "node_id": "feature_liveness_1",
                          "status": "Approved",
                          "method": "ACTIVE_3D",
                          "score": 89.92,
                          "reference_image": "https://<media-host>/reference.jpg",
                          "video_url": "https://<media-host>/video.mp4",
                          "age_estimation": 24.3,
                          "matches": [
                            {
                              "session_id": "7d4f1f60-9c2e-4b8a-8f3d-2a1b5c6d7e8f",
                              "session_number": 1234,
                              "vendor_data": "user_ref_001",
                              "verification_date": "2024-06-15T10:30:00Z",
                              "user_details": {
                                "full_name": "John Smith",
                                "document_type": "ID",
                                "document_number": "CLM148418"
                              },
                              "status": "Approved",
                              "is_blocklisted": false,
                              "is_allowlisted": false,
                              "api_service": null,
                              "source": "session",
                              "match_image_url": "https://<media-host>/face_match.jpg",
                              "similarity_percentage": 98.5
                            },
                            {
                              "session_id": "3e9a7c21-5b48-4f0e-9c6a-8d2f4b1e0a35",
                              "session_number": 1100,
                              "vendor_data": "customer_xyz",
                              "verification_date": "2024-04-10T09:15:00Z",
                              "user_details": {
                                "full_name": "John Smith",
                                "document_type": "P",
                                "document_number": "DZ8375806"
                              },
                              "status": "Approved",
                              "is_blocklisted": false,
                              "is_allowlisted": false,
                              "api_service": "PASSIVE_LIVENESS",
                              "source": "session",
                              "match_image_url": "https://<media-host>/face_match_2.jpg",
                              "similarity_percentage": 95.2
                            }
                          ],
                          "warnings": [
                            {
                              "feature": "LIVENESS",
                              "risk": "LOW_LIVENESS_SCORE",
                              "additional_data": null,
                              "log_type": "information",
                              "short_description": "Low liveness score",
                              "long_description": "The liveness check resulted in a low score, indicating potential use of non-live facial representations or poor-quality biometric data.",
                              "node_id": "feature_liveness_1"
                            }
                          ],
                          "face_quality": null,
                          "face_luminance": null
                        }
                      ],
                      "face_matches": [
                        {
                          "node_id": "feature_face_match_1",
                          "status": "In Review",
                          "score": 65.43,
                          "source_image_session_id": null,
                          "source_image": "https://<media-host>/source-image.jpg",
                          "target_image": "https://<media-host>/target-image.jpg",
                          "warnings": [
                            {
                              "feature": "FACEMATCH",
                              "risk": "LOW_FACE_MATCH_SIMILARITY",
                              "additional_data": null,
                              "log_type": "warning",
                              "short_description": "Low face match similarity",
                              "long_description": "The facial features of the provided image don't closely match the reference image, suggesting a potential identity mismatch.",
                              "node_id": "feature_face_match_1"
                            }
                          ]
                        }
                      ],
                      "phone_verifications": [
                        {
                          "node_id": "feature_phone_1",
                          "status": "Approved",
                          "phone_number_prefix": "+34",
                          "phone_number": "600600600",
                          "full_number": "+34600600600",
                          "country_code": "ES",
                          "country_name": "Spain",
                          "carrier": {
                            "name": "Orange",
                            "type": "mobile"
                          },
                          "is_disposable": false,
                          "is_virtual": false,
                          "verification_method": "sms",
                          "verification_attempts": 1,
                          "verified_at": "2024-07-28T06:47:35.654321Z",
                          "lifecycle": [
                            {
                              "type": "PHONE_VERIFICATION_MESSAGE_SENT",
                              "timestamp": "2025-08-24T09:12:39.580554+00:00",
                              "details": {
                                "status": "Success",
                                "reason": null,
                                "channel": "sms",
                                "actual_channel": "sms"
                              },
                              "fee": 0.1
                            },
                            {
                              "type": "VALID_CODE_ENTERED",
                              "timestamp": "2025-08-24T09:12:39.662157+00:00",
                              "details": {
                                "code_tried": "123456",
                                "status": "Approved"
                              },
                              "fee": 0
                            },
                            {
                              "type": "PHONE_VERIFICATION_APPROVED",
                              "timestamp": "2025-08-24T09:12:39.684292+00:00",
                              "details": null,
                              "fee": 0
                            }
                          ],
                          "warnings": [],
                          "matches": [
                            {
                              "session_id": null,
                              "session_number": null,
                              "vendor_data": null,
                              "verification_date": null,
                              "phone_number": "+34600000000",
                              "status": null,
                              "is_blocklisted": true,
                              "api_service": null,
                              "source": "list_entry"
                            }
                          ]
                        }
                      ],
                      "email_verifications": [
                        {
                          "node_id": "feature_email_1",
                          "status": "Approved",
                          "email": "test@example.com",
                          "is_breached": true,
                          "breaches": [
                            {
                              "name": "TAPAirPortugal",
                              "domain": "flytap.com",
                              "logo_path": "https://logos.example.com/TAPAirPortugal.png",
                              "breach_date": "2022-08-25",
                              "description": "In August 2022, the Portuguese airline <a href=\"https://www.bleepingcomputer.com/news/security/ragnar-locker-ransomware-claims-attack-on-portugals-flag-airline/\" target=\"_blank\" rel=\"noopener\">TAP Air Portugal was the target of a ransomware attack perpetrated by the Ragnar Locker gang</a> who later leaked the compromised data via a public dark web site. Over 5M unique email addresses were exposed alongside other personal data including names, genders, DoBs, phone numbers and physical addresses.",
                              "is_verified": true,
                              "data_classes": [
                                "dates_of_birth",
                                "email_addresses",
                                "genders",
                                "names",
                                "nationalities",
                                "phone_numbers",
                                "physical_addresses",
                                "salutations",
                                "spoken_languages"
                              ],
                              "breach_emails_count": 6083479
                            }
                          ],
                          "is_disposable": false,
                          "is_undeliverable": false,
                          "verification_attempts": 1,
                          "verified_at": "2025-09-15T17:36:19.963451Z",
                          "warnings": [
                            {
                              "feature": "EMAIL",
                              "risk": "BREACHED_EMAIL_DETECTED",
                              "additional_data": null,
                              "log_type": "information",
                              "short_description": "Breached email detected",
                              "long_description": "This email address was found in one or more known data breaches.",
                              "node_id": "feature_email_1"
                            }
                          ],
                          "lifecycle": [
                            {
                              "type": "EMAIL_VERIFICATION_MESSAGE_SENT",
                              "timestamp": "2025-09-15T17:36:19.792684+00:00",
                              "details": {
                                "status": "Success",
                                "reason": null
                              },
                              "fee": 0.02
                            },
                            {
                              "type": "VALID_CODE_ENTERED",
                              "timestamp": "2025-09-15T17:36:19.963427+00:00",
                              "details": {
                                "code_tried": "123456",
                                "status": "Approved"
                              },
                              "fee": 0
                            },
                            {
                              "type": "EMAIL_VERIFICATION_DECLINED",
                              "timestamp": "2025-09-15T17:36:20.081471+00:00",
                              "details": {
                                "reason": "BREACHED_EMAIL_DETECTED"
                              },
                              "fee": 0
                            }
                          ],
                          "matches": [
                            {
                              "session_id": null,
                              "session_number": null,
                              "vendor_data": null,
                              "verification_date": null,
                              "email": "test@example.com",
                              "status": null,
                              "is_blocklisted": true,
                              "api_service": null,
                              "source": "list_entry"
                            }
                          ]
                        }
                      ],
                      "poa_verifications": [
                        {
                          "node_id": "feature_poa_1",
                          "status": "Declined",
                          "document_file": "https://<media-host>/poa_document.pdf",
                          "issuing_state": "AR",
                          "document_type": "UTILITY_BILL",
                          "document_subtype": null,
                          "document_language": "es",
                          "document_metadata": {
                            "file_size": 1000,
                            "content_type": "application/pdf",
                            "creation_date": "2021-01-01",
                            "modified_date": "2021-01-01",
                            "overlay_manipulation": null,
                            "creator": null,
                            "producer": "PDF Generator",
                            "software": null,
                            "encryption": null,
                            "is_signed": false,
                            "is_tampered": false,
                            "signature_info": null,
                            "exif_original_date": null,
                            "exif_digitized_date": null,
                            "processed_by_known_editor": false,
                            "has_different_creation_mod_date": true
                          },
                          "issuer": "Aguas del Norte",
                          "issue_date": "2021-02-01",
                          "expiration_date": null,
                          "poa_address": "AVDA. MONSEÑOR TAVELLA N° 3396, SALTA",
                          "poa_formatted_address": "Av. Monseñor Tavella 3396, A4400 Salta, Argentina",
                          "poa_parsed_address": {
                            "address_type": "Avenida",
                            "street_1": "Avenida Monseñor Tavella 3396",
                            "street_2": null,
                            "city": "Salta",
                            "region": "Salta",
                            "country": "AR",
                            "postal_code": "A4400",
                            "document_location": {
                              "latitude": -24.8208664,
                              "longitude": -65.4131
                            }
                          },
                          "name_on_document": "Fernando De Lima",
                          "name_match_score_expected_details": null,
                          "name_match_score_id_verification": 38.5,
                          "expected_details_address": null,
                          "expected_details_formatted_address": null,
                          "expected_details_parsed_address": {},
                          "extra_fields": {
                            "bank_account_number": "1234567890",
                            "bank_iban": null,
                            "bank_sort_code": null,
                            "bank_routing_number": null,
                            "bank_swift_bic": null,
                            "bank_branch_name": null,
                            "bank_branch_address": null,
                            "document_phone_number": "+5491112345678",
                            "additional_names": []
                          },
                          "extra_files": [
                            "https://<media-host>/extra_poa.pdf"
                          ],
                          "detected_codes": [
                            {
                              "type": "QR_CODE",
                              "page_number": 1,
                              "position": [
                                [
                                  820,
                                  1120
                                ],
                                [
                                  1002,
                                  1120
                                ],
                                [
                                  1002,
                                  1302
                                ],
                                [
                                  820,
                                  1302
                                ]
                              ],
                              "x": 820,
                              "y": 1120,
                              "width": 182,
                              "height": 182,
                              "page_width": 1190,
                              "page_height": 1684,
                              "raw_payload": "aHR0cHM6Ly9hZ3Vhc2RlbG5vcnRlLmNvbS9mYWN0dXJhLzk5ODgxMQ==",
                              "parsed_payload": "https://aguasdelnorte.com/factura/998811"
                            },
                            {
                              "type": "CODE_128",
                              "page_number": 1,
                              "position": [
                                [
                                  112,
                                  1480
                                ],
                                [
                                  560,
                                  1480
                                ],
                                [
                                  560,
                                  1540
                                ],
                                [
                                  112,
                                  1540
                                ]
                              ],
                              "x": 112,
                              "y": 1480,
                              "width": 448,
                              "height": 60,
                              "page_width": 1190,
                              "page_height": 1684,
                              "raw_payload": "MDA5OTg4MTEwMDA0Mg==",
                              "parsed_payload": "0099881100042"
                            }
                          ],
                          "warnings": []
                        }
                      ],
                      "document_ai_documents": [
                        {
                          "status": "Approved",
                          "node_id": "feature_document_ai_1",
                          "items": [
                            {
                              "uuid": "c1a2b3c4-d5e6-7f80-9a1b-2c3d4e5f6071",
                              "node_id": "feature_document_ai_1",
                              "document_key": "proof_of_funds",
                              "original_filename": "bank_statement.pdf",
                              "file_size": 184320,
                              "file_url": "https://<media-host>/document_ai/proof_of_funds.pdf",
                              "status": "Approved",
                              "extracted_data": {
                                "account_holder": "John Doe",
                                "balance": 15230.55,
                                "currency": "EUR",
                                "statement_date": "2026-05-31"
                              },
                              "detected_codes": [
                                {
                                  "type": "QR_CODE",
                                  "page_number": 2,
                                  "position": [
                                    [
                                      124,
                                      86
                                    ],
                                    [
                                      306,
                                      86
                                    ],
                                    [
                                      306,
                                      268
                                    ],
                                    [
                                      124,
                                      268
                                    ]
                                  ],
                                  "x": 124,
                                  "y": 86,
                                  "width": 182,
                                  "height": 182,
                                  "page_width": 1190,
                                  "page_height": 1684,
                                  "raw_payload": "SU5WLTIwMjYtMDA0Mg==",
                                  "parsed_payload": "INV-2026-0042"
                                }
                              ],
                              "fields": [
                                {
                                  "key": "account_holder",
                                  "name": "Account holder",
                                  "instruction": "Extract the full name of the account holder.",
                                  "type": "text",
                                  "required": true
                                },
                                {
                                  "key": "balance",
                                  "name": "Closing balance",
                                  "instruction": "Extract the closing balance amount.",
                                  "type": "number",
                                  "required": true
                                }
                              ],
                              "document_metadata": {
                                "is_tampered": false
                              },
                              "cross_check_result": null,
                              "created_at": "2026-06-01T12:34:56Z"
                            }
                          ],
                          "warnings": []
                        }
                      ],
                      "questionnaire_responses": [
                        {
                          "node_id": "feature_questionnaire_1",
                          "questionnaire_id": "9f7485e0-b00b-4d56-9d3e-7859b68d1213",
                          "title": "Source of Funds",
                          "description": "Reply to this questionnaire to help us understand the source of funds.",
                          "languages": [
                            "en"
                          ],
                          "default_language": "en",
                          "is_active": true,
                          "is_simple_questionnaire": true,
                          "questionnaire_group_id": "2b6a9d40-13a8-4b1e-9a6c-3f1d2e4b5a60",
                          "version": 1,
                          "published_at": "2025-11-02T09:14:55.000000Z",
                          "sections": [
                            {
                              "title": null,
                              "description": null,
                              "items": [
                                {
                                  "uuid": "618636d9-7d5c-41ce-b8d0-1ab2a4be20db",
                                  "value": "question_1",
                                  "element_type": "DROPDOWN",
                                  "is_required": true,
                                  "title": "What is your primary source of funds?",
                                  "description": null,
                                  "placeholder": null,
                                  "choices": [
                                    {
                                      "label": "Salary",
                                      "value": "salary"
                                    },
                                    {
                                      "label": "Business Income",
                                      "value": "business_income"
                                    },
                                    {
                                      "label": "Savings",
                                      "value": "savings"
                                    },
                                    {
                                      "label": "Investments",
                                      "value": "investments"
                                    },
                                    {
                                      "label": "Sale of Asset",
                                      "value": "sale_of_asset"
                                    },
                                    {
                                      "label": "Inheritance/Gift",
                                      "value": "inheritance_gift"
                                    },
                                    {
                                      "label": "Pension",
                                      "value": "pension"
                                    },
                                    {
                                      "label": "Crypto Proceeds",
                                      "value": "crypto_proceeds"
                                    },
                                    {
                                      "label": "Other",
                                      "value": "other",
                                      "requires_text_input": true
                                    }
                                  ],
                                  "max_files": 1,
                                  "answer": {
                                    "value": "salary"
                                  },
                                  "required_if": null,
                                  "repeatable_config": null
                                },
                                {
                                  "uuid": "2d16b527-72be-42e0-8e96-b164b818386c",
                                  "value": "question_2",
                                  "element_type": "LONG_TEXT",
                                  "is_required": true,
                                  "title": "Provide details of the primary source.",
                                  "description": null,
                                  "placeholder": null,
                                  "choices": null,
                                  "max_files": 1,
                                  "answer": {
                                    "value": "Test answer"
                                  },
                                  "required_if": null,
                                  "repeatable_config": null
                                },
                                {
                                  "uuid": "a9239b7c-fbfb-4ea7-b7e4-c835cd4016e0",
                                  "value": "question_3",
                                  "element_type": "DROPDOWN",
                                  "is_required": true,
                                  "title": "What is your annual income range (pre-tax)?",
                                  "description": null,
                                  "placeholder": null,
                                  "choices": [
                                    {
                                      "label": "Less than $25,000",
                                      "value": "<25k"
                                    },
                                    {
                                      "label": "$25,000 - $50,000",
                                      "value": "25k-50k"
                                    },
                                    {
                                      "label": "$50,001 - $100,000",
                                      "value": "50k-100k"
                                    },
                                    {
                                      "label": "$100,001 - $250,000",
                                      "value": "100k-250k"
                                    },
                                    {
                                      "label": "More than $250,000",
                                      "value": ">250k"
                                    }
                                  ],
                                  "max_files": 1,
                                  "answer": {
                                    "value": "<25k"
                                  },
                                  "required_if": null,
                                  "repeatable_config": null
                                },
                                {
                                  "uuid": "93dede62-6d0c-4a7f-934d-42175eb94011",
                                  "value": "question_4",
                                  "element_type": "DROPDOWN",
                                  "is_required": true,
                                  "title": "What is your approximate net worth (range)?",
                                  "description": null,
                                  "placeholder": null,
                                  "choices": [
                                    {
                                      "label": "Less than $50,000",
                                      "value": "<50k"
                                    },
                                    {
                                      "label": "$50,000 - $250,000",
                                      "value": "50k-250k"
                                    },
                                    {
                                      "label": "$250,001 - $1,000,000",
                                      "value": "250k-1m"
                                    },
                                    {
                                      "label": "$1,000,001 - $5,000,000",
                                      "value": "1m-5m"
                                    },
                                    {
                                      "label": "More than $5,000,000",
                                      "value": ">5m"
                                    }
                                  ],
                                  "max_files": 1,
                                  "answer": {
                                    "value": "<50k"
                                  },
                                  "required_if": null,
                                  "repeatable_config": null
                                },
                                {
                                  "uuid": "2af60d6f-6961-4692-9ee7-24b3033610a6",
                                  "value": "question_5",
                                  "element_type": "LONG_TEXT",
                                  "is_required": true,
                                  "title": "For your initial deposit/funding, indicate the exact source and amount.",
                                  "description": null,
                                  "placeholder": null,
                                  "choices": null,
                                  "max_files": 1,
                                  "answer": {
                                    "value": "Test answer"
                                  },
                                  "required_if": null,
                                  "repeatable_config": null
                                },
                                {
                                  "uuid": "0ad9d1aa-736f-46cf-947b-9e1241b53e40",
                                  "value": "question_6",
                                  "element_type": "LONG_TEXT",
                                  "is_required": true,
                                  "title": "Breakdown of sources by percentage.",
                                  "description": null,
                                  "placeholder": null,
                                  "choices": null,
                                  "max_files": 1,
                                  "answer": {
                                    "value": "Test answer"
                                  },
                                  "required_if": null,
                                  "repeatable_config": null
                                },
                                {
                                  "uuid": "1bf8a2a3-14ee-48a8-bb3d-175481aae4aa",
                                  "value": "question_7",
                                  "element_type": "SINGLE_CHOICE",
                                  "is_required": true,
                                  "title": "Will any funds originate from third parties? If yes, please provide details.",
                                  "description": null,
                                  "placeholder": null,
                                  "choices": [
                                    {
                                      "label": "Yes",
                                      "value": "yes",
                                      "requires_text_input": true
                                    },
                                    {
                                      "label": "No",
                                      "value": "no"
                                    }
                                  ],
                                  "max_files": 1,
                                  "answer": {
                                    "text": "Additional details",
                                    "value": "yes"
                                  },
                                  "required_if": null,
                                  "repeatable_config": null
                                },
                                {
                                  "uuid": "e18d4dd3-b7bf-4883-ba18-d6046adbe313",
                                  "value": "question_8",
                                  "element_type": "SINGLE_CHOICE",
                                  "is_required": true,
                                  "title": "Do you hold or plan to use virtual assets (e.g., crypto) to fund this account? If yes, please provide details.",
                                  "description": null,
                                  "placeholder": null,
                                  "choices": [
                                    {
                                      "label": "Yes",
                                      "value": "yes",
                                      "requires_text_input": true
                                    },
                                    {
                                      "label": "No",
                                      "value": "no"
                                    }
                                  ],
                                  "max_files": 1,
                                  "answer": {
                                    "text": "Additional details",
                                    "value": "yes"
                                  },
                                  "required_if": null,
                                  "repeatable_config": null
                                },
                                {
                                  "uuid": "a90a073d-e098-404c-bbce-5130d8b12a13",
                                  "value": "question_9",
                                  "element_type": "FILE_UPLOAD",
                                  "is_required": true,
                                  "title": "Upload a proof of funds document",
                                  "description": "You can upload your three (3) most recent bank statements, three (3) most recent payslips, your most recent tax return, proof of company ownership, trading exchange statement, sale of property, or proof of inheritance.",
                                  "placeholder": null,
                                  "choices": null,
                                  "max_files": 3,
                                  "answer": {
                                    "files": [
                                      "/media/ocr/",
                                      "/media/ocr/"
                                    ]
                                  },
                                  "required_if": null,
                                  "repeatable_config": null
                                },
                                {
                                  "uuid": "9503b486-7cb8-4c3b-a97d-4b64926a5a47",
                                  "value": "question_10",
                                  "element_type": "LONG_TEXT",
                                  "is_required": false,
                                  "title": "Would you like to add any details to help us expedite our review of the documents you submitted?",
                                  "description": null,
                                  "placeholder": null,
                                  "choices": null,
                                  "max_files": 1,
                                  "answer": {
                                    "value": "Test answer"
                                  },
                                  "required_if": null,
                                  "repeatable_config": null
                                }
                              ]
                            }
                          ],
                          "status": "Approved"
                        }
                      ],
                      "aml_screenings": [
                        {
                          "node_id": "feature_aml_1",
                          "status": "In Review",
                          "total_hits": 1,
                          "entity_type": "person",
                          "hits": [
                            {
                              "id": "hit_7c1e9a40b2d35f86e0a4c912",
                              "url": "https://news.example.org/articles/sample",
                              "match": false,
                              "score": 0.73,
                              "target": null,
                              "caption": "Javier Ejemplo Modelo",
                              "datasets": [
                                "PEP"
                              ],
                              "features": null,
                              "rca_name": "",
                              "last_seen": "2025-06-13T00:00:00",
                              "risk_view": {
                                "crimes": {
                                  "score": 0,
                                  "weightage": 20,
                                  "risk_level": "Low",
                                  "risk_scores": {}
                                },
                                "countries": {
                                  "score": 0,
                                  "weightage": 30,
                                  "risk_level": "Low",
                                  "risk_scores": {}
                                },
                                "categories": {
                                  "score": 100,
                                  "weightage": 50,
                                  "risk_level": "High",
                                  "risk_scores": {
                                    "PEP": 100
                                  }
                                },
                                "custom_list": {}
                              },
                              "first_seen": "2025-01-18T00:00:00",
                              "properties": {
                                "name": [
                                  "Javier Ejemplo Modelo"
                                ],
                                "alias": [
                                  "Javier Ejemplo Modelo",
                                  "David Azagra"
                                ],
                                "notes": [
                                  "Spanish orchestra conductor"
                                ],
                                "title": null,
                                "gender": [
                                  "male"
                                ],
                                "height": null,
                                "topics": null,
                                "weight": null,
                                "address": null,
                                "country": null,
                                "website": null,
                                "eyeColor": null,
                                "keywords": null,
                                "lastName": [
                                  "Ejemplo",
                                  "Modelo"
                                ],
                                "position": null,
                                "religion": null,
                                "birthDate": [
                                  "1974"
                                ],
                                "education": [
                                  "Tokyo Arts and Space (2012-2012)",
                                  "Saint Petersburg Conservatory (-2010)",
                                  "Comillas Pontifical University"
                                ],
                                "ethnicity": null,
                                "firstName": [
                                  "David"
                                ],
                                "hairColor": null,
                                "weakAlias": null,
                                "birthPlace": [
                                  "Madrid"
                                ],
                                "modifiedAt": null,
                                "wikidataId": null,
                                "citizenship": null,
                                "nationality": null
                              },
                              "match_score": 98,
                              "risk_score": 73,
                              "review_status": "Unreviewed",
                              "score_breakdown": {
                                "name_score": 95,
                                "name_weight": 60,
                                "name_weight_normalized": 70.59,
                                "name_contribution": 67.06,
                                "dob_score": 100,
                                "dob_weight": 25,
                                "dob_weight_normalized": 29.41,
                                "dob_contribution": 29.41,
                                "country_score": 0,
                                "country_weight": 15,
                                "country_weight_normalized": 0,
                                "country_contribution": 0,
                                "document_number_match_type": "NEUTRAL",
                                "document_number_effect": "No document number provided for screening",
                                "total_score": 98
                              },
                              "pep_matches": [
                                {
                                  "aliases": [
                                    "Javier Ejemplo Modelo",
                                    "David Azagra"
                                  ],
                                  "education": [
                                    "Tokyo Arts and Space (2012-2012)",
                                    "Saint Petersburg Conservatory (-2010)",
                                    "Comillas Pontifical University"
                                  ],
                                  "list_name": "Wikidata",
                                  "publisher": "Wikidata",
                                  "source_url": "https://news.example.org/articles/sample",
                                  "description": "Wikidata is the structured data project of the Wikipedia community, providing fact-based information edited by humans and machines",
                                  "matched_name": "Javier Ejemplo Modelo",
                                  "pep_position": "",
                                  "date_of_birth": "1974",
                                  "other_sources": [],
                                  "place_of_birth": "Madrid"
                                }
                              ],
                              "linked_entities": [
                                {
                                  "name": [
                                    "Antonio Ejemplo"
                                  ],
                                  "active": [],
                                  "status": [],
                                  "details": [],
                                  "relation": []
                                }
                              ],
                              "warning_matches": [],
                              "sanction_matches": [],
                              "adverse_media_details": {
                                "sentiment": "Moderately Negative",
                                "entity_type": "person",
                                "sentiment_score": -2,
                                "adverse_keywords": {
                                  "fraud": 3,
                                  "juicio": 1,
                                  "delitos": 2,
                                  "imputado": 1,
                                  "impunidad": 1,
                                  "corruption": 2,
                                  "favoritism": 2,
                                  "privilegio": 1,
                                  "corrupción": 1,
                                  "persecution": 2,
                                  "desconfianza": 1,
                                  "desprestigio": 1,
                                  "fraude de ley": 2,
                                  "manipulación": 1,
                                  "investigación": 3,
                                  "prevaricación": 8,
                                  "trato de favor": 1,
                                  "irregularidades": 2,
                                  "crisis de confianza": 1,
                                  "tráfico de influencias": 8
                                }
                              },
                              "adverse_media_matches": [
                                {
                                  "country": "spain",
                                  "summary": "Javier Ejemplo is implicated in legal violations related to favoritism and influence trafficking, leading to a negative portrayal in the article.",
                                  "headline": "La Diputación de Villaejemplo consolida la plaza a medida para el ex asesor de Moncloa amigo del \"hermanito\" de Ejemplo",
                                  "sentiment": "moderately negative",
                                  "thumbnail": "https://news.example.org/articles/sample",
                                  "source_url": "https://news.example.org/articles/sample",
                                  "author_name": null,
                                  "other_sources": [],
                                  "adverse_keywords": [
                                    "fraud",
                                    "prevaricación",
                                    "tráfico de influencias",
                                    "irregularidades",
                                    "imputado"
                                  ],
                                  "sentiment_score": -2,
                                  "publication_date": "2025-06-10T20:46:38"
                                },
                                {
                                  "country": "spain",
                                  "summary": "Javier Ejemplo is implicated in legal issues regarding favoritism and corruption, leading to a negative portrayal in the article.",
                                  "headline": "La Diputación de Villaejemplo consolida la plaza a medida para el ex asesor de Moncloa amigo del \"hermanito\" de Ejemplo",
                                  "sentiment": "moderately negative",
                                  "thumbnail": "https://news.example.org/articles/sample",
                                  "source_url": "https://news.example.org/articles/sample",
                                  "author_name": null,
                                  "other_sources": [],
                                  "adverse_keywords": [
                                    "fraud",
                                    "prevaricación",
                                    "tráfico de influencias",
                                    "irregularidades",
                                    "trato de favor"
                                  ],
                                  "sentiment_score": -2,
                                  "publication_date": "2025-06-10T20:46:38"
                                },
                                {
                                  "country": "spain",
                                  "summary": "Javier Ejemplo Modelo is mentioned in connection with Carlos Ficticio's corruption case, indicating his involvement in alleged influence peddling.",
                                  "headline": "España, paraíso del aforado",
                                  "sentiment": "moderately negative",
                                  "thumbnail": "https://news.example.org/articles/sample",
                                  "source_url": "https://news.example.org/articles/sample",
                                  "author_name": null,
                                  "other_sources": [],
                                  "adverse_keywords": [
                                    "prevaricación",
                                    "tráfico de influencias",
                                    "corrupción",
                                    "impunidad",
                                    "privilegio",
                                    "desconfianza",
                                    "manipulación",
                                    "fraude de ley"
                                  ],
                                  "sentiment_score": -2,
                                  "publication_date": "2025-06-10T05:05:34"
                                },
                                {
                                  "country": "spain",
                                  "summary": "Javier Ejemplo Modelo is implicated in the same investigation as Ficticio, which raises questions about his conduct and political ethics.",
                                  "headline": "Aforamientos: esa figura incómoda",
                                  "sentiment": "moderately negative",
                                  "thumbnail": "https://news.example.org/articles/sample",
                                  "source_url": "https://news.example.org/articles/sample",
                                  "author_name": null,
                                  "other_sources": [],
                                  "adverse_keywords": [
                                    "prevaricación",
                                    "tráfico de influencias",
                                    "investigación",
                                    "juicio",
                                    "fraude de ley",
                                    "desprestigio",
                                    "crisis de confianza",
                                    "delitos"
                                  ],
                                  "sentiment_score": -2,
                                  "publication_date": "2025-06-08T06:01:00"
                                },
                                {
                                  "country": "spain",
                                  "summary": "Javier Ejemplo is implicated in a legal investigation regarding irregularities in his hiring, which raises serious concerns about his conduct.",
                                  "headline": "La jueza del 'caso Javier Ejemplo' denuncia un «fraude de ley» en el aforamiento de Ficticio (Partido Ejemplo)",
                                  "sentiment": "moderately negative",
                                  "thumbnail": "https://news.example.org/articles/sample",
                                  "source_url": "https://news.example.org/articles/sample",
                                  "author_name": null,
                                  "other_sources": [],
                                  "adverse_keywords": [
                                    "fraud",
                                    "irregularities",
                                    "prevaricación",
                                    "tráfico de influencias"
                                  ],
                                  "sentiment_score": -2,
                                  "publication_date": "2025-06-09T10:19:10"
                                },
                                {
                                  "country": "spain",
                                  "summary": "Javier Ejemplo Modelo is mentioned in connection with legal allegations of corruption, contributing to a negative perception.",
                                  "headline": "'Caso aforamiento': la letrada mayor de la Asamblea certifica a la juez que Ficticio es diputado desde antes de prometer su cargo en el Pleno",
                                  "sentiment": "moderately negative",
                                  "thumbnail": "https://news.example.org/articles/sample",
                                  "source_url": "https://news.example.org/articles/sample",
                                  "author_name": null,
                                  "other_sources": [],
                                  "adverse_keywords": [
                                    "prevaricación",
                                    "tráfico de influencias"
                                  ],
                                  "sentiment_score": -2,
                                  "publication_date": "2025-06-09T08:08:30"
                                },
                                {
                                  "country": "spain",
                                  "summary": "Javier Ejemplo Modelo is implicated in the same investigation as Ficticio, raising concerns about political corruption and influence.",
                                  "headline": "Aforamientos: esa figura incómoda",
                                  "sentiment": "moderately negative",
                                  "thumbnail": "https://news.example.org/articles/sample",
                                  "source_url": "https://news.example.org/articles/sample",
                                  "author_name": null,
                                  "other_sources": [],
                                  "adverse_keywords": [
                                    "prevaricación",
                                    "tráfico de influencias",
                                    "investigación"
                                  ],
                                  "sentiment_score": -2,
                                  "publication_date": "2025-06-08T06:01:00"
                                },
                                {
                                  "country": "spain",
                                  "summary": "Javier Ejemplo Modelo is implicated in the same investigation as Ficticio, which raises concerns about political misconduct.",
                                  "headline": "Aforamientos: esa figura incómoda",
                                  "sentiment": "moderately negative",
                                  "thumbnail": "https://news.example.org/articles/sample",
                                  "source_url": "https://news.example.org/articles/sample",
                                  "author_name": null,
                                  "other_sources": [],
                                  "adverse_keywords": [
                                    "prevaricación",
                                    "tráfico de influencias",
                                    "investigación",
                                    "delitos"
                                  ],
                                  "sentiment_score": -2,
                                  "publication_date": "2025-06-08T06:00:59"
                                },
                                {
                                  "country": "spain",
                                  "summary": "Javier Ejemplo is implicated in a case of favoritism and corruption, which casts a negative light on his character and actions.",
                                  "headline": "'Caso Javier Ejemplo': las asociaciones judiciales salen en defensa de la juez Luisa Inventada ante las \"presiones externas\" que sufre",
                                  "sentiment": "moderately negative",
                                  "thumbnail": "https://news.example.org/articles/sample",
                                  "source_url": "https://news.example.org/articles/sample",
                                  "author_name": null,
                                  "other_sources": [],
                                  "adverse_keywords": [
                                    "favoritism",
                                    "corruption",
                                    "persecution"
                                  ],
                                  "sentiment_score": -2,
                                  "publication_date": "2025-06-06T10:08:15"
                                },
                                {
                                  "country": "spain",
                                  "summary": "Javier Ejemplo is implicated in a case of alleged favoritism and corruption, which casts a negative light on his character and actions.",
                                  "headline": "'Caso Javier Ejemplo': las asociaciones judiciales salen en defensa de la juez Luisa Inventada ante las \"presiones externas\" que sufre",
                                  "sentiment": "moderately negative",
                                  "thumbnail": "https://news.example.org/articles/sample",
                                  "source_url": "https://news.example.org/articles/sample",
                                  "author_name": null,
                                  "other_sources": [],
                                  "adverse_keywords": [
                                    "favoritism",
                                    "corruption",
                                    "persecution"
                                  ],
                                  "sentiment_score": -2,
                                  "publication_date": "2025-06-06T08:08:15"
                                }
                              ],
                              "additional_information": {}
                            }
                          ],
                          "score": 80,
                          "screened_data": {
                            "full_name": "Javier Ejemplo Modelo",
                            "nationality": "ES",
                            "date_of_birth": "1974-01-01",
                            "document_number": null
                          },
                          "is_ongoing_monitoring_enabled": true,
                          "next_ongoing_monitoring_bill_date": "2026-07-24",
                          "last_ongoing_screening_at": "2026-09-12T04:03:11Z",
                          "last_ongoing_screening_datasets_updated_at": "2026-09-11T06:00:00Z",
                          "warnings": [
                            {
                              "feature": "AML",
                              "risk": "POSSIBLE_MATCH_FOUND",
                              "additional_data": null,
                              "log_type": "warning",
                              "short_description": "Possible match found in AML screening",
                              "long_description": "The Anti-Money Laundering (AML) screening process identified potential matches with watchlists or high-risk databases, requiring further review.",
                              "node_id": "feature_aml_1"
                            }
                          ]
                        }
                      ],
                      "ip_analyses": [
                        {
                          "node_id": "feature_ip_1",
                          "status": "Approved",
                          "device_brand": "Apple",
                          "device_model": "iPhone",
                          "browser_family": "Mobile Safari",
                          "os_family": "iOS",
                          "platform": "mobile",
                          "device_fingerprint": "didit-fp-a1b2c3d4e5f6g7h8",
                          "ip_country": "Spain",
                          "ip_country_code": "ES",
                          "ip_state": "Barcelona",
                          "ip_city": "Barcelona",
                          "latitude": 41.4022,
                          "longitude": 2.1407,
                          "ip_address": "83.50.226.71",
                          "isp": null,
                          "organization": null,
                          "is_vpn_or_tor": false,
                          "is_data_center": false,
                          "time_zone": "Europe/Madrid",
                          "time_zone_offset": "+0100",
                          "ip": {
                            "location": {
                              "latitude": 40.2206327,
                              "longitude": 1.5770097
                            },
                            "distance_from_id_document": 23.4,
                            "distance_from_poa_document": 12.3
                          },
                          "id_document": {
                            "location": {
                              "latitude": 41.2706327,
                              "longitude": 1.9770097
                            },
                            "distance_from_ip": 23.4,
                            "distance_from_poa_document": 18.7
                          },
                          "poa_document": {
                            "location": {
                              "latitude": 41.2706327,
                              "longitude": 1.9770097
                            },
                            "distance_from_ip": 12.3,
                            "distance_from_id_document": 18.7
                          },
                          "warnings": [],
                          "matches": [
                            {
                              "session_id": "99999999-8888-7777-6666-555555555555",
                              "session_number": 41205,
                              "vendor_data": "22222222-2222-2222-2222-222222222222",
                              "verification_date": "2024-07-20T10:15:30Z",
                              "match_type": "ip_address",
                              "match_source": "ip_address",
                              "matched_value": "83.50.226.71",
                              "status": "Approved",
                              "is_blocklisted": false,
                              "api_service": null,
                              "source": "session",
                              "device_info": {
                                "device_brand": "Apple",
                                "device_model": "iPhone",
                                "browser_family": "Mobile Safari",
                                "os_family": "iOS",
                                "platform": "mobile",
                                "device_fingerprint": "didit-fp-f9e8d7c6b5a40312"
                              },
                              "location_info": {
                                "ip_address": "83.50.226.71",
                                "ip_country": "Spain",
                                "ip_country_code": "ES",
                                "ip_state": "Barcelona",
                                "ip_city": "Barcelona",
                                "is_vpn_or_tor": false,
                                "is_data_center": false
                              },
                              "confidence": 0.0,
                              "match_mode": "co_occurrence"
                            },
                            {
                              "session_id": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee",
                              "session_number": 42830,
                              "vendor_data": "33333333-3333-3333-3333-333333333333",
                              "verification_date": "2024-06-30T18:22:05Z",
                              "match_type": "device_fingerprint",
                              "match_source": "recovered_high",
                              "matched_value": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
                              "status": "Declined",
                              "is_blocklisted": false,
                              "api_service": null,
                              "source": "session",
                              "device_info": {
                                "device_brand": "Samsung",
                                "device_model": "SM-G991B",
                                "browser_family": "Chrome Mobile",
                                "os_family": "Android",
                                "platform": "mobile",
                                "device_fingerprint": null
                              },
                              "location_info": {
                                "ip_address": "83.50.231.18",
                                "ip_country": "Spain",
                                "ip_country_code": "ES",
                                "ip_state": "Madrid",
                                "ip_city": "Madrid",
                                "is_vpn_or_tor": false,
                                "is_data_center": false
                              },
                              "confidence": 1.0,
                              "match_mode": "deterministic",
                              "recovery_similarity": 0.9874,
                              "tls_ja4_corroborated": true,
                              "recovery_gate_reason": "hardware_root_match"
                            }
                          ]
                        }
                      ],
                      "database_validations": [
                        {
                          "node_id": "feature_db_validation_1",
                          "issuing_state": "BRA",
                          "validation_type": "one_by_one",
                          "screened_data": {
                            "last_name": "De Lima",
                            "first_name": "Fernando",
                            "tax_number": "01234567890",
                            "date_of_birth": "1980-01-01",
                            "document_type": "ID",
                            "expiration_date": "2030-01-01"
                          },
                          "validations": [
                            {
                              "service_id": "bra_cpf",
                              "service_name": "Brazil - CPF status check",
                              "outcome_code": "MATCH",
                              "validation": {
                                "full_name": "full_match",
                                "date_of_birth": "full_match",
                                "identification_number": "full_match"
                              },
                              "source_data": {
                                "identification_number": "01234567890",
                                "first_name": "FERNANDO",
                                "last_name": "DE LIMA",
                                "date_of_birth": "1980-01-01",
                                "gender": "M",
                                "nationality": "BRA"
                              }
                            }
                          ],
                          "match_type": "full_match",
                          "status": "Approved",
                          "warnings": []
                        }
                      ],
                      "reviews": [
                        {
                          "user": "compliance@example.com",
                          "new_status": "Declined",
                          "comment": "Possible match found in AML screening",
                          "created_at": "2024-07-18T13:29:00.366811Z"
                        }
                      ],
                      "created_at": "2024-07-24T08:54:25.443172Z",
                      "expires_at": "2025-07-24T08:54:25.443172Z",
                      "biometric_consent": {
                        "required": false,
                        "trigger": null,
                        "status": "not_required",
                        "given_at": null,
                        "declined_at": null,
                        "text_version": null,
                        "text_hash": null,
                        "locale": null,
                        "policy_url": null,
                        "step": null,
                        "node_id": null,
                        "ip_address": null,
                        "ip_country_code": null,
                        "ip_state": null,
                        "ip_city": null,
                        "user_agent": null,
                        "detected_ip_address": "83.50.226.71",
                        "detected_country_code": "ES",
                        "detected_state": "ES-B",
                        "detected_city": "Barcelona",
                        "declared_state": null,
                        "document_state": null,
                        "jurisdictions": [],
                        "retention_months": null,
                        "reason": null,
                        "decline_reason": null,
                        "face_data_deleted_at": null
                      }
                    }
                  },
                  "BusinessExample": {
                    "summary": "Beispiel für eine Unternehmenssitzung (KYB)",
                    "description": "Eine Entscheidung für `session_kind = \"business\"`: KYB-Sitzungen ersetzen die KYC-Funktions-Arrays durch `registry_checks`, `document_verifications` und `key_people_checks`, während sie `aml_screenings`, `phone_verifications`, `email_verifications`, `questionnaire_responses`, `ip_analyses`, `reviews` und den Sitzungsrahmen teilen.",
                    "value": {
                      "session_id": "66666666-7777-8888-9999-000000000000",
                      "session_kind": "business",
                      "session_number": 31415,
                      "session_url": "https://verify.didit.me/session/business123",
                      "status": "In Review",
                      "environment": "live",
                      "workflow_id": "abababab-cdcd-efef-0101-232323232323",
                      "features": [
                        "KYB_REGISTRY",
                        "KYB_DOCUMENTS",
                        "KYB_KEY_PEOPLE"
                      ],
                      "vendor_data": "merchant-001234",
                      "metadata": null,
                      "callback": "https://example.com/verification/callback",
                      "registry_checks": [
                        {
                          "status": "Approved",
                          "node_id": "feature_kyb_registry_1",
                          "data_resolved": true,
                          "company": {
                            "uuid": "dddd4444-eeee-5555-ffff-666677778888",
                            "node_id": "feature_kyb_registry_1",
                            "status": "Approved",
                            "registry_status": "active",
                            "data_resolved": true,
                            "company_name": "ACME HOLDINGS LTD",
                            "registration_number": "12345678",
                            "country_code": "GB",
                            "region": null,
                            "company_type": "Private Limited Company",
                            "incorporation_date": "2015-03-12",
                            "registered_address": "1 Example Street, London, EC1A 1AA",
                            "tax_number": null,
                            "risk_level": null,
                            "verification_status": "verified",
                            "is_from_registry": true,
                            "fetch_status": "resolved",
                            "alternative_names": null,
                            "nature_of_business": "62012 - Business and domestic software development",
                            "registered_capital": "100 GBP",
                            "registered_capital_amount": "100.00",
                            "registered_capital_currency": "GBP",
                            "website": null,
                            "email": null,
                            "phone": null,
                            "legal_entity_identifier": null,
                            "location_of_registration": "England and Wales",
                            "financial_summary": null,
                            "officers": [
                              {
                                "uuid": "aaaa1111-bbbb-2222-cccc-333344445555",
                                "name": "Jane Smith",
                                "designation": "Director",
                                "role": "director",
                                "nationality": "British",
                                "is_active": true,
                                "kyc_status": "Approved",
                                "kyc_session_url": "https://verify.didit.me/session/abc123def456"
                              }
                            ],
                            "beneficial_owners": [
                              {
                                "uuid": "bbbb2222-cccc-3333-dddd-444455556666",
                                "name": "John Doe",
                                "first_name": "John",
                                "last_name": "Doe",
                                "entity_type": "person",
                                "roles": [
                                  "ubo",
                                  "shareholder"
                                ],
                                "ownership_min_shares": "50",
                                "ownership_max_shares": "75",
                                "is_active": true,
                                "kyc_status": "Pending",
                                "kyc_session_url": "https://verify.didit.me/session/def456ghi789",
                                "effective_ownership_percent": 75.0
                              }
                            ],
                            "addresses": [
                              {
                                "type": "registered",
                                "address": "1 Example Street, London, EC1A 1AA",
                                "country": "GB"
                              }
                            ],
                            "industries": [
                              {
                                "code": "62012",
                                "description": "Business and domestic software development"
                              }
                            ],
                            "accounts": null,
                            "registry_data": {},
                            "user_provided_data": {
                              "company_name": "ACME HOLDINGS",
                              "registration_number": "12345678"
                            },
                            "confirmed_by_user_at": "2026-06-10T12:01:30.000000Z",
                            "last_console_edit_at": null,
                            "is_editable": false
                          },
                          "ownership_structure": {
                            "shareholders": [
                              {
                                "name": "John Doe",
                                "first_name": "John",
                                "last_name": "Doe",
                                "date_of_birth": null,
                                "country_of_birth": null,
                                "company_name": null,
                                "registration_number": null,
                                "entity_type": "person",
                                "nationality": null,
                                "designation": null,
                                "roles": [
                                  "shareholder"
                                ],
                                "ownership_min_shares": "75",
                                "ownership_max_shares": "75",
                                "voting_min_shares": null,
                                "voting_max_shares": null,
                                "appointment_date": null,
                                "is_active": true,
                                "shareholding": {
                                  "share_class": "ORDINARY",
                                  "number_of_shares": 750.0,
                                  "currency": "GBP",
                                  "nominal_value": 1.0,
                                  "total_value": null,
                                  "percentage": 75.0
                                }
                              }
                            ],
                            "beneficial_owners": []
                          },
                          "warnings": []
                        }
                      ],
                      "aml_screenings": null,
                      "document_verifications": [
                        {
                          "status": "In Review",
                          "node_id": "feature_kyb_documents_1",
                          "items": [
                            {
                              "uuid": "eeee5555-ffff-6666-0000-777788889999",
                              "document_type": "LEGAL_PRESENCE",
                              "document_subtype": "CERTIFICATE_OF_INCORPORATION",
                              "document_group": "LEGAL_PRESENCE",
                              "file_url": "https://<media-host>/kyb/certificate-of-incorporation.pdf",
                              "original_filename": "certificate_of_incorporation.pdf",
                              "file_size": 482133,
                              "status": "Approved",
                              "created_at": "2026-06-10T12:03:11.000000Z",
                              "cross_check_result": {
                                "critical": {
                                  "company_name": {
                                    "document": "ACME HOLDINGS LTD",
                                    "registry": "ACME HOLDINGS LTD",
                                    "score": 1.0,
                                    "match": true
                                  },
                                  "registration_number": {
                                    "document": "12345678",
                                    "registry": "12345678",
                                    "match": true
                                  }
                                },
                                "non_critical": {},
                                "people": {}
                              },
                              "document_metadata": {
                                "file_size": 482133,
                                "content_type": "application/pdf",
                                "creation_date": "2015-03-12T09:00:00",
                                "modified_date": "2015-03-12T09:00:00",
                                "creator": null,
                                "producer": null,
                                "software": null,
                                "encryption": null,
                                "is_signed": true,
                                "is_tampered": false,
                                "signature_info": null,
                                "exif_original_date": null,
                                "exif_digitized_date": null,
                                "processed_by_known_editor": false,
                                "has_different_creation_mod_date": false,
                                "overlay_manipulation": null
                              },
                              "description": null,
                              "is_requested": false,
                              "ocr_data": {
                                "company_name": "ACME HOLDINGS LTD",
                                "registration_number": "12345678",
                                "incorporation_date": "2015-03-12"
                              },
                              "is_console_upload": false,
                              "is_confirmed": true
                            },
                            {
                              "uuid": "ffff6666-0000-7777-1111-888899990000",
                              "document_type": "OWNERSHIP_STRUCTURE",
                              "document_subtype": null,
                              "document_group": "OWNERSHIP_STRUCTURE",
                              "file_url": null,
                              "original_filename": null,
                              "file_size": null,
                              "status": "Not Finished",
                              "created_at": "2026-06-10T15:40:02.000000Z",
                              "cross_check_result": null,
                              "document_metadata": null,
                              "description": "Please upload an up-to-date shareholder registry",
                              "is_requested": true,
                              "ocr_data": null,
                              "is_console_upload": false,
                              "is_confirmed": true
                            }
                          ],
                          "groups": {
                            "LEGAL_PRESENCE": {
                              "total": 1,
                              "approved": 1,
                              "pending": 0,
                              "declined": 0,
                              "in_review": 0,
                              "other": 0,
                              "missing": 0
                            },
                            "OWNERSHIP_STRUCTURE": {
                              "total": 1,
                              "approved": 0,
                              "pending": 0,
                              "declined": 0,
                              "in_review": 0,
                              "other": 0,
                              "missing": 1
                            }
                          },
                          "required_groups": [
                            "LEGAL_PRESENCE",
                            "OWNERSHIP_STRUCTURE"
                          ],
                          "warnings": []
                        }
                      ],
                      "key_people_checks": [
                        {
                          "status": "In Review",
                          "node_id": "feature_kyb_key_people_1",
                          "registry": {
                            "officers": [
                              {
                                "uuid": "aaaa1111-bbbb-2222-cccc-333344445555",
                                "name": "Jane Smith",
                                "designation": "Director",
                                "role": "director",
                                "nationality": "British",
                                "appointment_date": "2015-03-12",
                                "termination_date": null,
                                "is_active": true,
                                "address": "1 Example Street, London, EC1A 1AA",
                                "aml_status": "Approved",
                                "kyc_status": "Approved",
                                "kyc_session_url": "https://verify.didit.me/session/abc123def456",
                                "kyc_session_id": "77777777-8888-9999-aaaa-bbbbbbbbbbbb",
                                "verification_workflow_type": "kyc",
                                "verification_workflow_id": "12121212-3434-5656-7878-909090909090",
                                "verification_workflow_label": "Key People KYC",
                                "verification_workflow_features": [
                                  {
                                    "feature": "ID_VERIFICATION",
                                    "status": "Approved"
                                  },
                                  {
                                    "feature": "LIVENESS",
                                    "status": "Approved"
                                  },
                                  {
                                    "feature": "AML",
                                    "status": "Approved"
                                  }
                                ],
                                "didit_internal_id": "99999999-0000-1111-2222-333333333333",
                                "kyc_document_type": "P",
                                "kyc_nationality": "GBR",
                                "kyc_liveness_passed": true,
                                "kyc_verified_at": "2026-06-10T14:22:31.123456Z",
                                "kyc_aml_categories": {
                                  "sanctions": "clear",
                                  "pep": "clear",
                                  "adverse_media": "clear",
                                  "warnings": "clear"
                                },
                                "kyc_notification_sent_at": "2026-06-09T09:00:00.000000Z"
                              }
                            ],
                            "beneficial_owners": [
                              {
                                "uuid": "bbbb2222-cccc-3333-dddd-444455556666",
                                "name": "John Doe",
                                "first_name": "John",
                                "last_name": "Doe",
                                "date_of_birth": "1980-05-04",
                                "country_of_birth": null,
                                "email": null,
                                "company_name": null,
                                "registration_number": null,
                                "entity_type": "person",
                                "nationality": "British",
                                "designation": null,
                                "roles": [
                                  "ubo",
                                  "shareholder"
                                ],
                                "ownership_min_shares": "50",
                                "ownership_max_shares": "75",
                                "is_active": true,
                                "aml_status": null,
                                "kyc_status": "In Progress",
                                "kyc_session_url": "https://verify.didit.me/session/def456ghi789",
                                "kyc_session_id": "88888888-9999-aaaa-bbbb-cccccccccccc",
                                "verification_workflow_type": "kyc",
                                "verification_workflow_id": "12121212-3434-5656-7878-909090909090",
                                "verification_workflow_label": "Key People KYC",
                                "verification_workflow_features": [
                                  {
                                    "feature": "ID_VERIFICATION",
                                    "status": "Not Finished"
                                  },
                                  {
                                    "feature": "LIVENESS",
                                    "status": "Not Finished"
                                  },
                                  {
                                    "feature": "AML",
                                    "status": "Not Finished"
                                  }
                                ],
                                "didit_internal_id": null,
                                "kyc_document_type": null,
                                "kyc_nationality": null,
                                "kyc_liveness_passed": null,
                                "kyc_verified_at": null,
                                "kyc_aml_categories": null,
                                "kyc_notification_sent_at": null,
                                "child_beneficial_owners": [],
                                "effective_ownership_percent": 75.0
                              }
                            ]
                          },
                          "submitted": {
                            "parties": [
                              {
                                "uuid": "cccc3333-dddd-4444-eeee-555566667777",
                                "entity_type": "person",
                                "source": "USER",
                                "name": "John Doe",
                                "first_name": "John",
                                "last_name": "Doe",
                                "company_name": null,
                                "registration_number": null,
                                "email": "john.doe@example.com",
                                "nationality": "GBR",
                                "phone_number": "+447700900123",
                                "date_of_birth": "1980-05-04",
                                "position": "Chief Executive Officer",
                                "custom_fields": {},
                                "is_active": true,
                                "is_skipped": false,
                                "requires_verification": true,
                                "roles": [
                                  {
                                    "role": "ubo",
                                    "ownership_percent": 75.0,
                                    "voting_percent": 75.0
                                  },
                                  {
                                    "role": "director",
                                    "ownership_percent": null,
                                    "voting_percent": null
                                  }
                                ],
                                "kyc_session_id": "88888888-9999-aaaa-bbbb-cccccccccccc",
                                "kyc_session_status": "In Progress",
                                "kyc_session_url": "https://verify.didit.me/session/def456ghi789",
                                "kyb_sub_session_id": null,
                                "kyb_sub_session_status": null,
                                "kyb_sub_session_url": null,
                                "verification_workflow_type": "kyc",
                                "verification_workflow_id": "12121212-3434-5656-7878-909090909090",
                                "verification_workflow_label": "Key People KYC",
                                "verification_workflow_features": [
                                  {
                                    "feature": "ID_VERIFICATION",
                                    "status": "Not Finished"
                                  },
                                  {
                                    "feature": "LIVENESS",
                                    "status": "Not Finished"
                                  },
                                  {
                                    "feature": "AML",
                                    "status": "Not Finished"
                                  }
                                ],
                                "didit_internal_id": null
                              }
                            ]
                          },
                          "ubo_kyc_summary": {
                            "total": 1,
                            "approved": 0,
                            "flagged": 0,
                            "pending": 1
                          },
                          "warnings": []
                        }
                      ],
                      "phone_verifications": null,
                      "email_verifications": null,
                      "questionnaire_responses": null,
                      "ip_analyses": null,
                      "reviews": [],
                      "contact_details": null,
                      "expected_details": {
                        "company_name": "Tesco PLC",
                        "registry_country": "GB",
                        "registration_number": "00445790"
                      },
                      "created_at": "2026-06-10T11:58:04.000000Z",
                      "expires_at": "2026-06-24T11:58:04.000000Z"
                    }
                  }
                },
                "schema": {
                  "$ref": "#/components/schemas/SessionDecision"
                }
              }
            }
          },
          "403": {
            "description": "Authentifizierung oder Autorisierung fehlgeschlagen. Ein fehlender Schlüssel gibt `403` zurück; ein falscher, widerrufener oder abgelaufener Schlüssel gibt `401` zurück. Zwei `detail`-Zeichenfolgen unterscheiden die Fehlerarten:\n\n- `\"Authentication credentials were not provided or are invalid.\"` — kein `x-api-key`-Header (und kein `Authorization: Bearer`-Token), oder die übergebenen Anmeldedaten haben die Introspektion nicht bestanden (widerrufen, abgelaufen oder fehlerhaft formatiert).\n- `\"You do not have permission to perform this action.\"` — die Anmeldedaten sind gültig, jedoch nicht berechtigt, diese Sitzung zu lesen: Einem Bearer-Token eines Konsolenbenutzers fehlt die Berechtigung `read:sessions` oder er kann nicht auf die zugehörige Anwendung zugreifen, oder ein API-Schlüssel gehört zu einer anderen Organisation als der Sitzung zugeordnet ist.\n\nBeachten Sie, dass der Endpoint bei einer völlig unbekannten `sessionId` die zugehörige Anwendung auflöst, bevor er die Anmeldedaten validiert, sodass eine fehlende Sitzung auch dann `404` zurückgibt, wenn die Anmeldedaten fehlen oder ungültig sind.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string",
                      "example": "Authentication credentials were not provided or are invalid."
                    }
                  }
                },
                "examples": {
                  "Missing or invalid credentials": {
                    "summary": "Kein x-api-key-Header vorhanden oder die Schlüssel-Introspektion ist fehlgeschlagen",
                    "value": {
                      "detail": "Authentication credentials were not provided or are invalid."
                    }
                  },
                  "Insufficient permissions": {
                    "summary": "Gültige Anmeldedaten, denen read:sessions oder der Zugriff auf die zugehörige Anwendung fehlt",
                    "value": {
                      "detail": "You do not have permission to perform this action."
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Sitzung nicht gefunden. Wird zurückgegeben, wenn keine Live-Sitzung mit der angegebenen `sessionId` als Benutzerverifizierungs- (KYC) oder Unternehmensverifizierungs-Sitzung (KYB) übereinstimmt – eine gelöschte Sitzung fällt ebenfalls hierunter. Der Body entspricht dem Standard-`{\"detail\": ...}`-Envelope.\n\n**Zwei unterschiedliche `detail`-Strings.** Wenn die `sessionId` weder als KYC- noch als KYB-Sitzung bekannt ist, schlägt die Suche nach dem Eigentümer vor der Authentifizierung fehl und Sie erhalten `{\"detail\": \"Not found.\"}` – dies geschieht vor der Validierung der Anmeldedaten und wird daher auch bei nicht authentifizierten Aufrufen zurückgegeben. Wenn die Sitzung existiert, aber unter der authentifizierten Anwendung nicht abgerufen werden kann (beispielsweise ein veralteter oder gerade gelöschter Datensatz), gibt der View `{\"detail\": \"Session not found.\"}` zurück. Beide signalisieren dasselbe Ergebnis – auf die Sitzung kann nicht zugegriffen werden –, prüfen Sie daher auf den Statuscode `404` statt auf den String.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string",
                      "example": "Not found."
                    }
                  }
                },
                "examples": {
                  "Unknown session id": {
                    "summary": "sessionId ist für diese Anwendung unbekannt",
                    "value": {
                      "detail": "Not found."
                    }
                  },
                  "Session not retrievable": {
                    "summary": "Sitzung existiert, kann aber für diese Anwendung nicht abgerufen werden",
                    "value": {
                      "detail": "Session not found."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate-Limit überschritten. GET-Anfragen sind auf **600 pro Minute pro Anmeldeinformation** begrenzt (API-Schlüssel, Bearer-Token oder Quell-IP, wenn nicht authentifiziert). Prüfen Sie `Retry-After` / `X-RateLimit-Reset` und warten Sie vor einem Wiederholungsversuch ab. Wenn Sie dieses Limit beim Polling nach Entscheidungen erreichen, wechseln Sie zum Webhook `status.updated` und rufen Sie die Entscheidung stattdessen einmal pro Statusänderung ab.",
            "headers": {
              "Retry-After": {
                "description": "Anzahl der Sekunden, die vor einer erneuten Anfrage gewartet werden muss.",
                "schema": {
                  "type": "integer",
                  "minimum": 1,
                  "example": 30
                }
              },
              "X-RateLimit-Limit": {
                "description": "Maximale Anzahl an Anfragen, die im aktuellen Zeitfenster zulässig sind (600 für GET-Anfragen).",
                "schema": {
                  "type": "integer",
                  "example": 600
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Im aktuellen Zeitfenster verbleibende Anfragen.",
                "schema": {
                  "type": "integer",
                  "example": 0
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix-Zeitstempel (Sekunden), zu dem das aktuelle Zeitfenster zurückgesetzt wird.",
                "schema": {
                  "type": "integer",
                  "example": 1750000000
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string",
                      "description": "Lesbare Erklärung der Rate-Limit-Überschreitung.",
                      "example": "GET request rate limit exceeded. You can make up to 600 requests per minute."
                    }
                  }
                },
                "examples": {
                  "Throttled": {
                    "summary": "Mehr als 600 GET-Anfragen in einer Minute mit denselben Zugangsdaten",
                    "value": {
                      "detail": "GET request rate limit exceeded. You can make up to 600 requests per minute."
                    }
                  }
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "sessionId",
            "in": "path",
            "required": true,
            "description": "UUID der Verifizierungssitzung, deren Entscheidung Sie abrufen möchten. Dies ist die von `POST /v3/session/` zurückgegebene `session_id`. Derselbe Pfad funktioniert sowohl für Sitzungen der Benutzerverifizierung (KYC) als auch der Unternehmensverifizierung (KYB) — der Server löst die ID für beide Sitzungstypen auf.\n\n**Muss eine gültige UUID sein.** Die Route stimmt nur mit wohlgeformten UUIDs überein, sodass ein fehlerhafter Wert vom URL-Router abgelehnt wird, bevor Anwendungscode ausgeführt wird, und die Antwort eine `404`-**HTML**-Seite anstelle des unten gezeigten JSON-Antwortobjekts `{\"detail\": ...}` ist. Validieren Sie das UUID-Format clientseitig, um einen Eingabefehler von einem echten `404` für eine fehlende Sitzung unterscheiden zu können.",
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "11111111-2222-3333-4444-555555555555"
            }
          },
          {
            "name": "include",
            "in": "query",
            "required": false,
            "description": "Kommagetrennte Liste zusätzlicher Payload-Abschnitte. Unterstützte Werte: `events` und `resubmissions`, einzeln oder zusammen (`events,resubmissions`). Wenn `include=events` übergeben wird, enthält die Antwort zusätzlich die Ereignis-Timeline der Sitzung (`events`, einschließlich der Routing-Ereignisse `WORKFLOW_BRANCH_EVALUATED` / `WORKFLOW_STATUS_NODE_REACHED`, die auf der Seite „Sitzung abrufen“ beschrieben sind), das vollständige Aktivitätsprotokoll (`activity_reviews`), Sperrlisten-Flags (`blocklisted`), eine sitzungsbezogene Kostenaufschlüsselung (`cost_breakdown`), Workflow-Metadaten (`workflow_type`, `workflow_version`, `workflow_version_id` und `workflow_terminal_node_id` – der letzte erfasste Workflow-Statusknoten, der einen Sitzungsstatus festgelegt hat, oder `null`, falls keiner erfasst wurde; historische Herkunftsinformation, die durch manuelle Genehmigungen, Ablehnungen oder erneute Einreichungen nicht gelöscht wird und durch einen späteren Workflow-Statusknoten ersetzt wird) sowie Sitzungsmetadaten (`api_service` — String oder `null`, nur für Standalone-API-Sitzungen gesetzt; `session_type` — `API`, `HOSTED` oder `MIGRATED`; `has_device_nfc_support` — Boolean). Zwei Felder ändern sich gegenüber der einfachen Struktur: Der `session_kind`-Diskriminator auf oberster Ebene wird **ausgelassen** (die Ereignisstruktur existiert nur für Benutzersitzungen) und das Array `features` wechselt von einfachen Strings zu `{feature, node_id}`-Objekten – wobei die E-Mail-Funktion als `EMAIL` statt `EMAIL_VERIFICATION` gemeldet wird. Diese erweiterte Struktur wird hauptsächlich von der Didit Console verwendet; die meisten API-Integrationen sollten den Parameter weglassen. **KYB-Einschränkung:** `include=events` gilt nur für Benutzer-(KYC-)Sitzungen. Unternehmenssitzungen (`session_kind = \"business\"`) geben immer die standardmäßige Unternehmensentscheidungsstruktur zurück – `events`, `activity_reviews`, `blocklisted`, `cost_breakdown` und die zusätzlichen `workflow_*`-/Sitzungsmetadaten werden für Unternehmenssitzungen niemals zurückgegeben, und ihr `features`-Array bleibt ein einfaches String-Array. Mit `include=resubmissions` (sowohl für Benutzer- als auch für Unternehmenssitzungen) enthält die Antwort außerdem `resubmissions`: einen Eintrag pro Anfrage auf erneute Einreichung, die älteste zuerst, jeweils mit `number`, `created_at`, `previous_status`, `nodes`, `reasons`, `requested_by` und `results` (was die erneut eingereichten Schritte vor der Anfrage unter denselben Schlüsseln und in derselben Struktur wie die aktuellen Ergebnisse zurückgegeben haben). Jeder Eintrag in `cost_breakdown` enthält `usage_type`, `price`, `details` und `created_at`: Ein erneut eingereichter Schritt, der nochmals ausgeführt wird, wird als neuer Posten abgerechnet.",
            "schema": {
              "type": "string",
              "enum": [
                "events",
                "resubmissions",
                "events,resubmissions"
              ],
              "example": "events"
            }
          }
        ],
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "cURL",
            "source": "curl -X GET 'https://verification.didit.me/v3/session/11111111-2222-3333-4444-555555555555/decision/' \\\n  -H 'x-api-key: YOUR_API_KEY' \\\n  -H 'Accept: application/json'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.sessions.retrieve_decision(\n    \"11111111-2222-3333-4444-555555555555\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.sessions.retrieveDecision(\"11111111-2222-3333-4444-555555555555\");\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Sessions.RetrieveDecision(ctx, \"11111111-2222-3333-4444-555555555555\", didit.SessionsRetrieveDecisionParams{})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.sessions().retrieveDecision(\"11111111-2222-3333-4444-555555555555\");\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->sessions->retrieveDecision('11111111-2222-3333-4444-555555555555');\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.sessions.retrieve_decision(\"11111111-2222-3333-4444-555555555555\")\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Sessions.RetrieveDecisionAsync(\"11111111-2222-3333-4444-555555555555\");\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ]
      }
    },
    "/v3/session/{sessionId}/delete/": {
      "delete": {
        "summary": "Eine Verifizierungssitzung (KYC oder KYB) löschen",
        "description": "Löschen Sie eine einzelne Verifizierungssitzung, Benutzerverifizierung (KYC) oder Unternehmensverifizierung (KYB), anhand ihrer `session_id`. Die ID wird zuerst mit KYC-Sitzungen abgeglichen, danach mit KYB-Sitzungen, sodass beide Arten über diese eine URL gelöscht werden.\n\n**Was gelöscht wird:**\n- Die Sitzung und jeder darin enthaltene Verifizierungsversuch, einschließlich der Ergebnisse, die durch ein erneutes Einreichen ersetzt wurden: die Entscheidung, extrahierte Daten, alle zugehörigen Funktionsdatensätze (Ausweisverifizierung, Gesicht, Liveness, Gesichtsabgleich, AML, Registerprüfungen, IP-Analyse usw.), ihre Prüfungen und ihr Aktivitätslog.\n- Alle gespeicherten Dateien, die zur Sitzung gehören: Fotos der Dokumentenvorder-/-rückseite (vollständige, zugeschnittene und aus Datenschutzgründen unkenntlich gemachte Varianten), Videos der Dokumentenerfassung, Porträtausschnitte, NFC-Chip-Porträt- und Signaturbilder, Gesichtsreferenzbilder, Liveness-Videos, Gesichtsabgleich-Quell-/Zielbilder, Adressnachweis-Dokumente und alle zusätzlich hochgeladenen Dateien (KYC); hochgeladene Unternehmensdokumente und zusätzliche Dateien (KYB). E-Signatur-Dokumente, signierte PDFs, Nachweis-PDFs und Signaturbilder (KYC und KYB): deren Download-Pfade funktionieren nicht mehr. Zuvor ausgestellte Medien-URLs (`https://<media-host>/...`) lassen sich nicht mehr auflösen.\n- Die Gesichtsdaten der Sitzung. Das Gesichts-Embedding der Sitzung wird ebenfalls gelöscht, es sei denn, Sie entscheiden sich dafür, ein bildfreies Template beizubehalten (siehe **Biometrische Gesichtsdaten**).\n- Webhook-Zustellungen, die sich für die Sitzung noch in der Warteschlange befinden, und deren Wiederholungsversuche. Bereits zugestellte Webhooks sind nicht betroffen.\n- Bei einer Sitzung zur Unternehmensverifizierung (KYB): die Verifizierungen, die sie für ihre Schlüsselpersonen (KYC) und ihre Unternehmenseigentümer (KYB) rekursiv erstellt hat, gemeldet als `deleted_child_verifications`. Eine Verifizierung, auf die sie lediglich verlinkt, wie etwa ein bestehendes genehmigtes KYC, das sie wiederverwendet hat, wird nicht gelöscht.\n\nDie Sitzung verschwindet sofort aus jedem Lese-Endpoint: `GET /v3/session/{sessionId}/decision/` gibt `404` zurück und `GET /v3/sessions/` führt sie nicht mehr auf. Die durch die gelöschten Verifizierungen gestartete laufende AML-Überwachung und KYB-Registerüberwachung werden beendet.\n\n**Was nicht betroffen ist:** Aus dieser Sitzung erstellte Sperrlisten-Einträge (Gesicht oder Dokument) werden **nicht** entfernt; verwalten Sie diese über die Sperrlisten-Endpoints. Für die Sitzung ausgestellte Share-Token werden nicht widerrufen, aber es gibt nichts mehr, was sie importieren könnten: Ein Import mit einem solchen Token gibt `400` mit `{\"share_token\": [\"Original session does not exist.\"]}` zurück. Bereits verbrauchte Credits werden **nicht** zurückerstattet. Die übergeordnete Benutzer- oder Unternehmens-Entität wird **nicht** gelöscht; verwenden Sie dafür `POST /v3/users/delete/` oder `POST /v3/businesses/delete/`. Wenn das Profilporträt des Benutzers aus dieser Sitzung stammt, wird das Porträt mit ihr entfernt.\n\n**Biometrische Gesichtsdaten:** Standardmäßig wird das Gesichts-Embedding der Sitzung zusammen mit der Sitzung gelöscht (`face_retention_outcome: deleted`). Eine Anwendung, die sich für die Aufbewahrung biometrischer Templates entschieden hat (`face_retention_policy: retain_until_user_deleted` bei `PATCH /v3/webhook/`), oder eine Anfrage mit `retain_face_embeddings: true` behält ein separat verwaltetes, bildfreies biometrisches Template bei, das an den Benutzer der Sitzung gebunden ist (`retained_with_user`), sodass Duplikaterkennung, Gesichtssuche und biometrische Authentifizierung weiterhin funktionieren. Das Template enthält niemals das Gesichtsbild, Medien, Identitätsfelder, die Entscheidung oder die ID der gelöschten Sitzung; es handelt sich um biometrische Daten, die bei `biometric_template_expires_at` gelöscht werden, oder früher bei Benutzerlöschung, datenschutzrechtlicher Löschung oder einer expliziten Bereinigung über `/v3/biometric-templates/`. Eine Sitzung ohne verknüpften Benutzer kann kein Template beibehalten (`ineligible_no_vendor_user`). Senden Sie `deletion_instruction: privacy_erasure` für Betroffenenanfragen: Dies bereinigt jedes beibehaltene Template für diesen Benutzer und behält niemals ein neues bei.\n\n**Unwiderruflich:** Die Löschung ist dauerhaft und es gibt keinen Wiederherstellungs-Endpoint. Exportieren Sie alles, was Sie benötigen (beispielsweise ein Entscheidungs-PDF), bevor Sie ihn aufrufen.\n\n**Nebeneffekte:** Für Löschungen wird kein Webhook ausgelöst.\n\n**Antwort:** `200 OK`, sobald die Löschung abgeschlossen ist, mit einem JSON-Body, der das `face_retention_outcome`, den Ablauf des beibehaltenen Templates und bei einer KYB-Sitzung `deleted_child_verifications` meldet. Frühere Versionen dieses Endpoints gaben `204 No Content` zurück; aktualisieren Sie Clients, die `204` voraussetzen. Bewahren Sie Ihre `instruction_id` in Ihrem eigenen Löschprotokoll auf.\n\n**Idempotenz:** Auf HTTP-Ebene nicht idempotent: Der erste Aufruf gibt `200` zurück; eine Wiederholung gibt `404` zurück, da die Sitzung nicht mehr aufgelöst werden kann. Nach einem `503` ist die Sitzung weiterhin vorhanden; wiederholen Sie dieselbe Anfrage, um das Löschen abzuschließen.\n\n**Authentifizierung:** Senden Sie den API-Schlüssel Ihrer Anwendung im `x-api-key`-Header; die Sitzung muss zu dieser Anwendung gehören. Console-Benutzer-Zugriffstoken (`Authorization: Bearer ...`) können diesen Endpoint ebenfalls aufrufen, wenn sie die Berechtigung `delete:sessions` besitzen. Authentifizierungs- und Berechtigungsfehler geben beide `403` zurück; diese API gibt niemals `401` zurück.\n\n**Rate-Limit:** Gemeinsames Schreibkontingent von 300 Anfragen/Min. pro API-Schlüssel über alle POST/PATCH/DELETE-Endpoints hinweg; ein Überschreiten gibt `429` zurück.\n\nUm KYC-Sitzungen anhand ihrer numerischen `session_number` als Massenvorgang zu löschen, verwenden Sie stattdessen `POST /v3/sessions/delete/`.\n\n**Eingereichte behördliche Berichte:** Wenn sich die ausgewählten Daten in einem finalisierten behördlichen Bericht befinden, wird die gesamte Anfrage mit `409` abgelehnt und nichts gelöscht. Der Body verwendet `code: in_filed_report` und benennt jeden Bericht mit `uuid`, `report_number`, `report_type` und `case_uuid`. Löschen Sie die Berichte und wiederholen Sie dann die Anfrage.",
        "operationId": "delete_v3_session_by_id",
        "x-didit-sdk": {
          "resource": "sessions",
          "method": "delete",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Sessions"
        ],
        "parameters": [
          {
            "in": "path",
            "name": "sessionId",
            "required": true,
            "description": "UUID (`session_id`) der zu löschenden Sitzung der Benutzerverifizierung (KYC) oder Unternehmensverifizierung (KYB), wie sie bei der Sitzungserstellung zurückgegeben wurde. Muss eine kanonische UUID mit Bindestrichen sein — ein Wert, der keine UUID ist, stimmt nicht mit der Route überein und gibt `404` zurück.",
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "11111111-2222-3333-4444-555555555555"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Sitzung gelöscht. Der Body gibt an, was mit den Gesichtsbiometriedaten der Sitzung geschehen ist und bei einer KYB-Sitzung, wie viele von ihr erstellte Verifizierungen zusammen mit ihr gelöscht wurden.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "session_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "Die gelöschte Sitzung."
                    },
                    "session_number": {
                      "type": "integer",
                      "nullable": true,
                      "description": "Die Nummer der gelöschten Sitzung."
                    },
                    "face_retention_outcome": {
                      "type": "string",
                      "enum": [
                        "retained_with_user",
                        "deleted",
                        "none",
                        "ineligible_no_vendor_user"
                      ],
                      "description": "Was mit den biometrischen Gesichtsdaten der Sitzung passiert ist. `deleted`: Das Gesichts-Embedding wurde mit der Sitzung gelöscht (Standard). `retained_with_user`: Die Sitzung wird gelöscht und ein bildfreies biometrisches Template bleibt beim Benutzer verankert; siehe `biometric_template_uuid`. `none`: Die Sitzung hatte kein Gesichts-Embedding (beispielsweise eine KYB-Sitzung oder eine KYC-Sitzung ohne Liveness-Selfie). `ineligible_no_vendor_user`: Die Aufbewahrung wurde angefordert, aber die Sitzung hat keinen verknüpften Benutzer, daher wurde das Embedding mit der Sitzung gelöscht. Ein Fehler des biometrischen Speichers wird über dieses Feld an diesem Endpoint niemals gemeldet: Er gibt `503` zurück und die Sitzung wird nicht gelöscht."
                    },
                    "biometric_template_uuid": {
                      "type": "string",
                      "format": "uuid",
                      "nullable": true,
                      "description": "ID des aufbewahrten biometrischen Templates, wenn `face_retention_outcome` gleich `retained_with_user` ist; andernfalls `null`. Verwalten Sie es über `/v3/biometric-templates/{template_uuid}/`."
                    },
                    "biometric_template_expires_at": {
                      "type": "string",
                      "format": "date-time",
                      "nullable": true,
                      "description": "Wann das aufbewahrte biometrische Template gelöscht wird, wenn `face_retention_outcome` auf `retained_with_user` steht; `null`, wenn kein Template aufbewahrt wird."
                    },
                    "deleted_child_verifications": {
                      "type": "integer",
                      "description": "Für eine Unternehmensverifizierungs-Sitzung (KYB): wie viele der von ihr erstellten Verifizierungen (die KYC-Sitzungen ihrer Schlüsselpersonen und die KYB-Sitzungen ihrer Unternehmenseigentümer, rekursiv) zusammen mit ihr gelöscht wurden. Bei einer KYC-Sitzung immer `0`."
                    }
                  }
                },
                "examples": {
                  "Deleted (default)": {
                    "value": {
                      "session_id": "4c5c7f3a-3b1d-4b7e-9c39-2b4f7e6a1d02",
                      "session_number": 1024,
                      "face_retention_outcome": "deleted",
                      "biometric_template_uuid": null,
                      "biometric_template_expires_at": null,
                      "deleted_child_verifications": 0
                    }
                  },
                  "Retained with User": {
                    "value": {
                      "session_id": "4c5c7f3a-3b1d-4b7e-9c39-2b4f7e6a1d02",
                      "session_number": 1024,
                      "face_retention_outcome": "retained_with_user",
                      "biometric_template_uuid": "9d2f4b6e-1c3a-4e8f-b7d5-0a1c2e3f4a5b",
                      "biometric_template_expires_at": "2027-10-09T10:15:00Z",
                      "deleted_child_verifications": 0
                    }
                  },
                  "Ineligible: no User": {
                    "summary": "Aufbewahrung für eine Sitzung angefordert, die ohne vendor_data erstellt wurde",
                    "value": {
                      "session_id": "7a1e9c2d-5f4b-4c3a-8e2d-1b0a9f8e7d6c",
                      "session_number": 1031,
                      "face_retention_outcome": "ineligible_no_vendor_user",
                      "biometric_template_uuid": null,
                      "biometric_template_expires_at": null,
                      "deleted_child_verifications": 0
                    }
                  },
                  "KYB session": {
                    "value": {
                      "session_id": "0f3c9b7e-2d1a-4e5f-8c6b-7a9d8e1f2c3b",
                      "session_number": 88,
                      "face_retention_outcome": "none",
                      "biometric_template_uuid": null,
                      "biometric_template_expires_at": null,
                      "deleted_child_verifications": 3
                    },
                    "summary": "Eine Unternehmensverifizierung, die zusammen mit den drei für ihre Schlüsselpersonen erstellten Verifizierungen gelöscht wurde"
                  }
                }
              }
            }
          },
          "400": {
            "description": "Validierungsfehler – es wird nichts gelöscht.",
            "content": {
              "application/json": {
                "examples": {
                  "Privacy erasure cannot retain": {
                    "value": {
                      "retain_face_embeddings": [
                        "Privacy erasure cannot retain biometric templates."
                      ]
                    }
                  },
                  "No finite retention duration": {
                    "summary": "Aufbewahrung ohne face_retention_days in der Anfrage oder der Anwendung angefordert",
                    "value": {
                      "detail": "A finite biometric-template retention duration is required."
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Authentifizierungs- oder Berechtigungsfehler. Ein fehlender Schlüssel gibt ebenfalls `403` zurück; ein falscher, widerrufener oder abgelaufener Schlüssel gibt `401` zurück. Ausnahme: Wenn die `sessionId` nicht zu einer aktiven Sitzung aufgelöst werden kann, gibt die Eigentümerprüfung vor der Authentifizierung zuerst `404` zurück, selbst bei fehlenden oder ungültigen Anmeldedaten.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string"
                    }
                  }
                },
                "examples": {
                  "Missing or invalid API key": {
                    "summary": "Kein x-api-key-Header vorhanden oder der Schlüssel ist ungültig",
                    "value": {
                      "detail": "Authentication credentials were not provided or are invalid."
                    }
                  },
                  "Insufficient permission": {
                    "summary": "Benutzer-Token ohne delete:sessions oder Anmeldedaten für eine Anwendung, die nicht Eigentümer der Sitzung ist",
                    "value": {
                      "detail": "You do not have permission to perform this action."
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Es existiert keine aktive KYC- oder KYB-Sitzung mit dieser `session_id` – die ID ist unbekannt oder die Sitzung wurde bereits gelöscht (das Wiederholen einer erfolgreichen Löschung führt hierher).",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string"
                    }
                  }
                },
                "examples": {
                  "Not Found": {
                    "summary": "Unbekannte oder bereits gelöschte Sitzung",
                    "value": {
                      "detail": "Not found."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Gemeinsames Schreib-Rate-Limit überschritten (300 POST/PATCH/DELETE-Anfragen pro Minute pro API-Schlüssel). Prüfen Sie `Retry-After` und die `X-RateLimit-*`-Antwort-Header vor einem Wiederholungsversuch.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string"
                    }
                  }
                },
                "examples": {
                  "Rate limited": {
                    "summary": "Schreibbudget aufgebraucht",
                    "value": {
                      "detail": "Write request rate limit exceeded. You can make up to 300 requests per minute."
                    }
                  }
                }
              }
            }
          },
          "503": {
            "description": "Die Löschung konnte nicht abgeschlossen werden, da ein Speicherdienst, ein biometrischer Speicher oder ein Überwachungsanbieter nicht verfügbar war. Die Sitzung bleibt bestehen; wiederholen Sie dieselbe Anfrage, bis sie `200` zurückgibt. Einige der gespeicherten Dateien oder das Gesichts-Embedding sind möglicherweise bereits gelöscht, verlassen Sie sich nach einem `503` also nicht darauf. Wiederholungsversuche konvergieren auf ein einziges biometrisches Template.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string"
                    }
                  }
                },
                "examples": {
                  "Session deletion unavailable": {
                    "summary": "Ein Speicherdienst oder ein Monitoring-Anbieter war nicht verfügbar",
                    "value": {
                      "detail": "The session could not be deleted because a storage service or a monitoring provider is unavailable. The session is still in place; repeat the request to finish deleting it."
                    }
                  },
                  "Biometric store unavailable": {
                    "summary": "Ein Biometriespeicher war während des Aufbewahrens oder Löschens einer Vorlage nicht verfügbar",
                    "value": {
                      "detail": "The biometric-template operation could not finish because an external store is unavailable. The operation is retryable."
                    }
                  }
                }
              }
            }
          },
          "409": {
            "description": "Die Sitzung ist Teil eines finalisierten behördlichen Berichts. Es wird nichts gelöscht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/InFiledReportError"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl (default policy)",
            "source": "curl -X DELETE \\\n  https://verification.didit.me/v3/session/11111111-2222-3333-4444-555555555555/delete/ \\\n  -H 'x-api-key: YOUR_API_KEY'"
          },
          {
            "lang": "curl",
            "label": "curl (retain template)",
            "source": "curl -X DELETE \\\n  https://verification.didit.me/v3/session/11111111-2222-3333-4444-555555555555/delete/ \\\n  -H 'x-api-key: YOUR_API_KEY' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\"retain_face_embeddings\": true, \"face_retention_days\": 365}'"
          },
          {
            "lang": "curl",
            "label": "curl (privacy erasure)",
            "source": "curl -X DELETE \\\n  https://verification.didit.me/v3/session/11111111-2222-3333-4444-555555555555/delete/ \\\n  -H 'x-api-key: YOUR_API_KEY' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\"deletion_instruction\": \"privacy_erasure\", \"instruction_id\": \"dsar-2026-0142\"}'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.sessions.delete(\n    \"11111111-2222-3333-4444-555555555555\",\n    retain_face_embeddings=True,\n    face_retention_days=365,\n    instruction_id=\"post-approval-cleanup-2026-08\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.sessions.delete(\"11111111-2222-3333-4444-555555555555\", {\n  retain_face_embeddings: true,\n  face_retention_days: 365,\n  instruction_id: \"post-approval-cleanup-2026-08\",\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Sessions.Delete(ctx, \"11111111-2222-3333-4444-555555555555\", didit.SessionsDeleteParams{\n\tRetainFaceEmbeddings: didit.Bool(true),\n\tFaceRetentionDays:    didit.Int(365),\n\tInstructionID:        didit.String(\"post-approval-cleanup-2026-08\"),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\nimport me.didit.types.SessionsDeleteParams;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.sessions().delete(\"11111111-2222-3333-4444-555555555555\", SessionsDeleteParams.builder()\n        .retainFaceEmbeddings(true)\n        .faceRetentionDays(365L)\n        .instructionId(\"post-approval-cleanup-2026-08\")\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->sessions->delete('11111111-2222-3333-4444-555555555555', [\n    'retain_face_embeddings' => true,\n    'face_retention_days' => 365,\n    'instruction_id' => 'post-approval-cleanup-2026-08',\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.sessions.delete(\n  \"11111111-2222-3333-4444-555555555555\",\n  retain_face_embeddings: true,\n  face_retention_days: 365,\n  instruction_id: \"post-approval-cleanup-2026-08\"\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Sessions.DeleteAsync(\"11111111-2222-3333-4444-555555555555\", new SessionsDeleteParams\n{\n    RetainFaceEmbeddings = true,\n    FaceRetentionDays = 365,\n    InstructionId = \"post-approval-cleanup-2026-08\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "requestBody": {
          "required": false,
          "description": "Optional. Lassen Sie den Payload vollständig weg, um die Datenaufbewahrungsrichtlinie der Anwendung durch eine operative Löschung zu befolgen.",
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "retain_face_embeddings": {
                    "type": "boolean",
                    "nullable": true,
                    "description": "Überschreibt die `face_retention_policy` der Anwendung für diese Löschung. `true` behält ein bildfreies biometrisches Gesichts-Template, das dem Benutzer der Sitzung zugeordnet ist, bei, nachdem die Sitzung gelöscht wurde; `false` löscht das Gesichts-Embedding mit der Sitzung; weglassen oder `null`, um der Richtlinie der Anwendung zu folgen. Wird für KYB-Sitzungen und für Sitzungen ohne Gesichts-Embedding ignoriert.",
                    "example": true
                  },
                  "face_retention_days": {
                    "type": "integer",
                    "minimum": 1,
                    "maximum": 3650,
                    "description": "Endliche Aufbewahrungsdauer in Tagen für ein aufbewahrtes Template. Erforderlich, wenn ein Template aufbewahrt wird, es sei denn, die Anwendung legt bereits `face_retention_days` fest. Das `expires_at` des Templates wird durch den frühesten der folgenden Zeitpunkte bestimmt: diese Dauer, der allgemeine Datenaufbewahrungszeitraum der Anwendung und `face_retention_deadline`.",
                    "example": 365
                  },
                  "face_retention_deadline": {
                    "type": "string",
                    "format": "date-time",
                    "description": "Optionaler fester Ablaufzeitpunkt für ein aufbewahrtes Template. Muss in der Zukunft liegen.",
                    "example": "2027-08-28T00:00:00Z"
                  },
                  "deletion_instruction": {
                    "type": "string",
                    "enum": [
                      "operational_session_delete",
                      "privacy_erasure"
                    ],
                    "default": "operational_session_delete",
                    "description": "Die Art der Anweisung, die Sie erteilen. `operational_session_delete` löscht die Sitzung und behält ein Template nur dann bei, wenn die Richtlinie oder `retain_face_embeddings` dies vorschreibt. `privacy_erasure` löscht jedes beibehaltene biometrische Template, das mit dem Benutzer der Sitzung verknüpft ist, bevor die Sitzung gelöscht wird, kann nicht durch die Anwendungsrichtlinie überschrieben werden und kann nicht mit `retain_face_embeddings: true` kombiniert werden (`400`).",
                    "example": "operational_session_delete"
                  },
                  "instruction_id": {
                    "type": "string",
                    "maxLength": 255,
                    "description": "Ihre dauerhafte Referenz für diese Löschanweisung (beispielsweise die ID eines Löschtickets). Wird im Audit-Log und auf jedem aufbewahrten Template erfasst. Wird von Didit generiert, wenn sie weggelassen wird.",
                    "example": "dsar-2026-0142"
                  }
                }
              },
              "examples": {
                "Retain a biometric template": {
                  "summary": "Die Sitzung löschen, eine bildfreie Vorlage für 365 Tage behalten",
                  "value": {
                    "retain_face_embeddings": true,
                    "face_retention_days": 365,
                    "instruction_id": "post-approval-cleanup-2026-08"
                  }
                },
                "Force deletion on an opted-in application": {
                  "summary": "Das Gesichts-Embedding unabhängig von der Anwendungsrichtlinie löschen",
                  "value": {
                    "retain_face_embeddings": false
                  }
                },
                "Privacy erasure": {
                  "summary": "Anfrage einer betroffenen Person: Sitzung löschen und jedes gespeicherte Template für diese Person endgültig entfernen",
                  "value": {
                    "deletion_instruction": "privacy_erasure",
                    "instruction_id": "dsar-2026-0142"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/v3/session/{sessionId}/generate-pdf/": {
      "get": {
        "summary": "Einen PDF-Bericht für eine Verifizierungssitzung herunterladen",
        "description": "Rendern und Herunterladen eines compliance-konformen PDF-Berichts für eine abgeschlossene Verifizierungssitzung. Derselbe Pfad bedient sowohl Sitzungen der Benutzerverifizierung (KYC) als auch der Unternehmensverifizierung (KYB) – der Server gleicht die `sessionId` mit beiden Sitzungstypen ab und wählt die passende Berichtsvorlage aus.\n\n**Gültige Status.** Die Sitzung muss bereits einen finalen oder prüfbaren Status aufweisen:\n\n- KYC-Sitzungen: `Approved`, `Declined`, `In Review` oder `Kyc Expired`.\n- KYB-Sitzungen: `Approved`, `Declined` oder `In Review`.\n\nJeder andere Status (`Not Started`, `In Progress`, `Expired`, `Abandoned`, …) gibt `403` mit einem erläuternden `detail`-String zurück – siehe die Antwort `403` unten.\n\n**Inhalt des Berichts.** Das PDF spiegelt die Sitzungsansicht der Konsole zum Zeitpunkt der Anfrage wider:\n\n- **KYC** – zusammengefasster Sitzungsstatus, die Warnungsliste und ein Abschnitt pro ausgeführter Funktion: Ausweisverifizierung (Dokumentbilder plus extrahierte Felder), NFC, Liveness, Gesichtsabgleich, E-Mail-Verifizierung, Telefonverifizierung, Adressnachweis, Fragebogen-Antworten, Datenbankvalidierung, AML-Screening und IP-Analyse – gefolgt von Sitzungs-Tags, Prüfungsaktivitäten in der Konsole (Kommentare und Statusänderungen) und der Sitzungs-Ereignis-Timeline.\n- **KYB** – Registerprüfungen (Unternehmensdaten), AML-Screenings, Verifizierungen von Unternehmensdokumenten, Prüfungen von Schlüsselpersonen, Fragebogen-Antworten, Telefon-/E-Mail-Verifizierungen, IP-Analysen und die Sitzungs-Ereignis-Timeline, gefolgt von Tags und Prüfungsaktivitäten.\n\n**Branding.** Wenn Ihre Anwendung über eine White-Label-Anpassung verfügt, wird der Bericht mit Ihrem Logo gerendert und verlinkt auf die URL Ihrer Datenschutzerklärung; andernfalls trägt er das Didit-Branding. Berichte werden auf Englisch gerendert – es gibt keinen Sprachparameter.\n\n**Kein Caching.** Jeder Aufruf rendert das PDF aus den aktuellen Sitzungsdaten neu, sodass ein nach einer manuellen Prüfung erstellter Bericht die Entscheidung des Prüfers widerspiegelt. Zwei Aufrufe für dieselbe Sitzung können Byte-unterschiedliche Dateien erzeugen – archivieren Sie die heruntergeladene Datei, wenn Sie eine unveränderliche Kopie benötigen.\n\n**Latenz.** Beim Rendern wird jedes gespeicherte Bild (Dokumentseiten, Selfies, zusätzliche Dateien) vor dem Zusammensetzen des PDFs heruntergeladen, sodass medienintensive Sitzungen mehrere Sekunden dauern können. Verwenden Sie ein großzügiges Client-Read-Timeout (60 s empfohlen) und streamen Sie den Body auf die Festplatte.\n\n**Nachgestellter Schrägstrich (Trailing Slash).** Die kanonische Route endet mit einem nachgestellten Schrägstrich (`…/generate-pdf/`). Eine Anfrage ohne diesen wird direkt mit derselben Antwort bedient – es gibt keine `301`-Weiterleitung, sodass kein Client Weiterleitungen folgen muss und `curl` kein `-L` benötigt. Verwenden Sie die URL mit Schrägstrich wie in den Beispielen.\n\nWenn Sie die zugrunde liegenden Daten als JSON anstelle eines gerenderten Berichts benötigen, verwenden Sie `GET /v3/session/{sessionId}/decision/`. Für alle berichtsfähigen Sitzungen eines Benutzers in einem einzigen Dokument verwenden Sie `GET /v3/users/{vendor_data}/generate-pdf/`.",
        "operationId": "get_v3_session_generate_pdf",
        "x-didit-sdk": {
          "resource": "sessions",
          "method": "generate_pdf",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Sessions"
        ],
        "parameters": [
          {
            "name": "sessionId",
            "in": "path",
            "required": true,
            "description": "UUID der zu rendernden Sitzung der Benutzerverifizierung (KYC) oder Unternehmensverifizierung (KYB) — die von `POST /v3/session/` zurückgegebene `session_id`. Derselbe Pfad funktioniert für beide Sitzungsarten; verwenden Sie den Dateinamen im `Content-Disposition`-Header der Antwort, um festzustellen, welchen Berichtstyp Sie erhalten haben.\n\n**Muss eine wohlgeformte UUID in Kleinbuchstaben sein.** Die Route stimmt nur mit gültigen UUIDs überein, sodass ein fehlerhafter Wert vom URL-Router abgelehnt wird, bevor jeglicher Anwendungscode ausgeführt wird, und die Antwort eine `404`-**HTML**-Seite anstelle der unten gezeigten JSON-Envelope `{\"detail\": ...}` ist. Der UUID-Konverter der Route stimmt nur mit der kanonischen Kleinschreibung überein — UUIDs mit Hexadezimal-Großbuchstaben werden mit dem HTML-404-Fehler abgelehnt.",
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "11111111-2222-3333-4444-555555555555"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Das gerenderte PDF-Dokument, direkt als binäres `application/pdf` zurückgegeben — es gibt keinen JSON-Wrapper und keine Download-URL-Umleitung. Der Body beginnt mit den Magic Bytes `%PDF` (PDF 1.7). Speichern Sie es in einer `.pdf`-Datei oder leiten Sie es per Stream an Ihren Aufrufer weiter.",
            "headers": {
              "Content-Disposition": {
                "description": "`attachment; filename=session_{sessionId}.pdf` für KYC-Sitzungen, `attachment; filename=business_{sessionId}.pdf` für KYB-Sitzungen — das Präfix gibt an, welche Berichtsvorlage gerendert wurde.",
                "schema": {
                  "type": "string",
                  "example": "attachment; filename=session_11111111-2222-3333-4444-555555555555.pdf"
                }
              },
              "Content-Length": {
                "description": "Gesamtgröße des PDFs in Bytes; der Nachrichtentext ist nicht in Chunks aufgeteilt.",
                "schema": {
                  "type": "integer",
                  "example": 25191
                }
              }
            },
            "content": {
              "application/pdf": {
                "schema": {
                  "type": "string",
                  "format": "binary"
                }
              }
            }
          },
          "403": {
            "description": "Fehler bei Authentifizierung, Autorisierung oder Sitzungsstatus. Ein fehlender Schlüssel gibt `403` zurück; ein falscher, widerrufener oder abgelaufener Schlüssel gibt `401` zurück. Unterscheiden Sie die Fehlertypen anhand des `detail`-Strings:\n\n- `\"Authentication credentials were not provided or are invalid.\"` — Kein `x-api-key`-Header (und kein `Authorization: Bearer`-Token), oder die übergebenen Anmeldedaten haben die Introspektion nicht bestanden (widerrufen, abgelaufen oder fehlerhaft formatiert).\n- `\"You do not have permission to perform this action.\"` — Die Anmeldedaten sind gültig, können diese Sitzung jedoch nicht lesen: Einem Bearer-Token eines Console-Benutzers fehlt die Berechtigung `read:sessions` oder er kann nicht auf die zuständige Anwendung zugreifen, oder ein API-Schlüssel gehört zu einer anderen Organisation als die Sitzung.\n- `\"You can only generate a PDF for sessions in review, declined, approved or kyc expired\"` — Die KYC-Sitzung existiert, befindet sich jedoch noch nicht in einem geeigneten Status (zum Beispiel `Not Started` oder `In Progress`). Warten Sie auf den Webhook `status.updated`, bevor Sie den Bericht anfordern.\n- `\"You can only generate a PDF for sessions in review, declined or approved\"` — Dieselbe Bedingung für KYB-Sitzungen.\n\nBeachten Sie, dass der Endpoint bei einer völlig unbekannten `sessionId` die zuständige Anwendung auflöst, bevor die Anmeldedaten validiert werden; daher gibt eine fehlende Sitzung selbst dann `404` zurück, wenn die Anmeldedaten fehlen oder ungültig sind.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string",
                      "example": "You can only generate a PDF for sessions in review, declined, approved or kyc expired"
                    }
                  }
                },
                "examples": {
                  "Missing or invalid credentials": {
                    "summary": "Kein x-api-key-Header vorhanden oder die Schlüssel-Introspektion ist fehlgeschlagen",
                    "value": {
                      "detail": "Authentication credentials were not provided or are invalid."
                    }
                  },
                  "Insufficient permissions": {
                    "summary": "Gültige Anmeldedaten, denen read:sessions oder der Zugriff auf die zugehörige Anwendung fehlt",
                    "value": {
                      "detail": "You do not have permission to perform this action."
                    }
                  },
                  "KYC session not finished": {
                    "summary": "KYC-Sitzung noch nicht gestartet / in Bearbeitung",
                    "value": {
                      "detail": "You can only generate a PDF for sessions in review, declined, approved or kyc expired"
                    }
                  },
                  "KYB session not finished": {
                    "summary": "KYB-Sitzung noch nicht gestartet / in Bearbeitung",
                    "value": {
                      "detail": "You can only generate a PDF for sessions in review, declined or approved"
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Es existiert keine aktive Sitzung mit dieser `sessionId` – sie wurde nie erstellt oder bereits gelöscht. Die Eigentümerauflösung erfolgt vor der Validierung der Anmeldedaten, daher wird dieser `404` auch bei nicht authentifizierten Anfragen zurückgegeben. Je nachdem, welche Abfrage fehlschlägt, lautet der `detail`-String `\"Not found.\"` (der Regelfall) oder `\"Session not found.\"`.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string",
                      "example": "Not found."
                    }
                  }
                },
                "examples": {
                  "Unknown session": {
                    "summary": "sessionId stimmt mit keiner KYC- oder KYB-Sitzung überein",
                    "value": {
                      "detail": "Not found."
                    }
                  },
                  "Recently deleted session": {
                    "summary": "Sitzung wurde zwischen den Abfragen gelöscht",
                    "value": {
                      "detail": "Session not found."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate-Limit überschritten. Die PDF-Generierung hat zusätzlich zum globalen GET-Limit von 600/Min ein dediziertes Limit von **50 Anfragen pro Minute pro Anmeldeinformation** (API-Schlüssel, Bearer-Token oder Quell-IP, wenn nicht authentifiziert). Warten Sie `Retry-After` Sekunden (wird auch in den `X-RateLimit-*`-Headern widergespiegelt) und versuchen Sie es dann erneut. Berichte werden serverseitig nicht zwischengespeichert; laden Sie daher jeden Bericht einmal herunter und speichern Sie die Datei, anstatt sie erneut abzurufen.",
            "headers": {
              "Retry-After": {
                "description": "Anzahl der Sekunden, die vor einer erneuten Anfrage gewartet werden muss.",
                "schema": {
                  "type": "integer",
                  "minimum": 1,
                  "example": 30
                }
              },
              "X-RateLimit-Limit": {
                "description": "Maximale Anzahl an PDF-Generierungen, die im aktuellen Zeitfenster zulässig sind (50).",
                "schema": {
                  "type": "integer",
                  "example": 50
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Im aktuellen Zeitfenster verbleibende Anfragen.",
                "schema": {
                  "type": "integer",
                  "example": 0
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix-Zeitstempel (Sekunden), zu dem das aktuelle Zeitfenster zurückgesetzt wird.",
                "schema": {
                  "type": "integer",
                  "example": 1750000000
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string",
                      "description": "Lesbare Erklärung der Rate-Limit-Überschreitung.",
                      "example": "Session PDF generation rate limit exceeded. You can make up to 50 requests per minute."
                    }
                  }
                },
                "examples": {
                  "Throttled": {
                    "summary": "Mehr als 50 PDF-Generierungen in einer Minute mit denselben Zugangsdaten",
                    "value": {
                      "detail": "Session PDF generation rate limit exceeded. You can make up to 50 requests per minute."
                    }
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "cURL",
            "source": "curl --fail \\\n  https://verification.didit.me/v3/session/11111111-2222-3333-4444-555555555555/generate-pdf/ \\\n  -H 'x-api-key: YOUR_API_KEY' \\\n  --output report.pdf"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\ncontent = client.sessions.generate_pdf(\n    \"11111111-2222-3333-4444-555555555555\",\n)\nwith open(\"download.pdf\", \"wb\") as file:\n    file.write(content)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import { writeFile } from \"node:fs/promises\";\nimport Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst content = await didit.sessions.generatePdf(\"11111111-2222-3333-4444-555555555555\");\nawait writeFile(\"download.pdf\", Buffer.from(await content.arrayBuffer()));"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresp, err := client.Sessions.GeneratePDF(ctx, \"11111111-2222-3333-4444-555555555555\")\nif err != nil {\n\tlog.Fatal(err)\n}\ndefer resp.Body.Close()\nfile, err := os.Create(\"download.pdf\")\nif err != nil {\n\tlog.Fatal(err)\n}\ndefer file.Close()\nif _, err := io.Copy(file, resp.Body); err != nil {\n\tlog.Fatal(err)\n}"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import java.nio.file.Path;\nimport me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nclient.sessions().generatePdf(\"11111111-2222-3333-4444-555555555555\")\n        .writeTo(Path.of(\"download.pdf\"));"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$content = $didit->sessions->generatePdf('11111111-2222-3333-4444-555555555555');\n$content->saveTo('download.pdf');"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\ncontent = didit.sessions.generate_pdf(\"11111111-2222-3333-4444-555555555555\")\nFile.binwrite(\"download.pdf\", content)"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar content = await client.Sessions.GeneratePdfAsync(\"11111111-2222-3333-4444-555555555555\");\nawait content.SaveToAsync(\"download.pdf\");"
          }
        ]
      }
    },
    "/v3/session/{sessionId}/sandbox/arm/": {
      "post": {
        "summary": "Ein Sandbox-Szenario für eine Sitzung aktivieren",
        "description": "Speichern Sie ein Sandbox-Szenario für eine Sitzung mit dem Status `Not Started` und wenden Sie dessen gebündelte Magic Values (E-Mail, Telefon oder `expected_details`-Felder) auf die Sitzung an, damit die gemockten Anbieter das Ergebnis des Szenarios reproduzieren, sobald der Flow ausgeführt wird. Dies ist der Endpoint, den die Szenarioauswahl vor dem Flow in Didits gehosteter Verifizierungsseite aufruft, wenn ein Tester vor Beginn der Erfassung ein Ergebnis auswählt. Erstellen Sie Ihre eigene Auswahl dafür oder rufen Sie ihn direkt aus einer Sandbox-Testumgebung auf.\n\nAuthentifizieren Sie sich mit dem sitzungseigenen `Session-Token` (zurückgegeben in `session_token` von [Sitzung erstellen](/de/sessions-api/create-session)), nicht mit dem `x-api-key` Ihrer Anwendung: Dieser Endpoint ist für den Aufruf vom Client aus gedacht, nicht von Ihrem Backend. Ein Szenario wird nur akzeptiert, solange `status` den Wert `Not Started` hat. Ein erneuter Aufruf im Status `Not Started` stattet die Sitzung erneut aus: Er tauscht die Magic Values des neuen Szenarios aus und löscht nur die Werte, die das *vorherige* Szenario geschrieben hat, sodass alle vom Benutzer bereits manuell eingegebenen Werte (E-Mail, Vorname usw.) das erneute Ausstatten überstehen. Das Ausstatten einer Sitzung, die über `Not Started` hinausgegangen ist oder zu einer echten (Nicht-Sandbox-)Anwendung gehört, wird abgelehnt.\n\nSiehe [Sandbox & Testdaten](/de/integration/sandbox-testing) für den vollständigen Szenariokatalog und die beiden anderen Möglichkeiten, ein Ergebnis zu steuern: `sandbox_scenario` bei der Sitzungserstellung und die direkte Eingabe von Magic Values.",
        "operationId": "post_v3_session_sandbox_arm",
        "x-didit-sdk": {
          "resource": "sessions",
          "method": "arm_sandbox",
          "auth": "device_token",
          "server": false
        },
        "tags": [
          "Sessions"
        ],
        "security": [
          {
            "SessionTokenAuth": []
          }
        ],
        "parameters": [
          {
            "in": "path",
            "name": "sessionId",
            "required": true,
            "description": "UUID der Sandbox-Verifizierungssitzung, die scharfgeschaltet werden soll. Muss mit der im zur Authentifizierung verwendeten Sitzungs-Token codierten Sitzung übereinstimmen.",
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "11111111-2222-3333-4444-555555555555"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "scenario"
                ],
                "properties": {
                  "scenario": {
                    "type": "string",
                    "description": "Slug des zu aktivierenden Szenarios. Siehe den Katalog unter GET /v1/sandbox/scenarios/ oder die Szenariotabelle in [Sandbox & Testdaten](/de/integration/sandbox-testing).",
                    "example": "decline_document_expired"
                  }
                }
              },
              "examples": {
                "Arm": {
                  "summary": "Das AML-PEP-Trefferszenario aktivieren",
                  "value": {
                    "scenario": "decline_aml_hit"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Szenario aktiviert. Seine Magic Values befinden sich jetzt in der Sitzung. `status` spiegelt den aktuellen Status der Sitzung wider, der durch diesen Aufruf nie geändert wird: Bei Erfolg ist er immer `Not Started`.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "session_id": {
                      "type": "string",
                      "format": "uuid"
                    },
                    "scenario": {
                      "type": "string",
                      "description": "Der Slug des scharfgeschalteten Szenarios (spiegelt die Anfrage wider)."
                    },
                    "status": {
                      "type": "string",
                      "example": "Not Started"
                    }
                  }
                },
                "examples": {
                  "Armed": {
                    "summary": "Szenario für eine Sitzung im Status Not Started aktiviert",
                    "value": {
                      "session_id": "11111111-2222-3333-4444-555555555555",
                      "scenario": "decline_aml_hit",
                      "status": "Not Started"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Validierungsfehler: ein unbekannter Szenario-Slug oder die Sitzung ist bereits über `Not Started` hinaus fortgeschritten.",
            "content": {
              "application/json": {
                "examples": {
                  "Unknown Scenario": {
                    "summary": "scenario ist nicht im Katalog enthalten",
                    "value": {
                      "scenario": [
                        "Unknown sandbox scenario: 'not-a-real-scenario'."
                      ]
                    }
                  },
                  "Already Started": {
                    "summary": "Sitzung hat den Status Nicht gestartet überschritten",
                    "value": [
                      "Scenario can only be armed before the verification starts."
                    ]
                  }
                }
              }
            }
          },
          "404": {
            "description": "Das Session-Token löst nicht auf diese `session_id` auf, oder die Sitzung gehört zu einer Live-Anwendung (nicht Sandbox).",
            "content": {
              "application/json": {
                "examples": {
                  "Not Found": {
                    "summary": "Aktive Sitzung oder Unstimmigkeit zwischen session_id und Token",
                    "value": {
                      "detail": "Not found."
                    }
                  }
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X POST \\\n  https://verification.didit.me/v3/session/11111111-2222-3333-4444-555555555555/sandbox/arm/ \\\n  -H 'Session-Token: YOUR_SESSION_TOKEN' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\n    \"scenario\": \"decline_aml_hit\"\n  }'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "import requests\n\nresponse = requests.post(\n    \"https://verification.didit.me/v3/session/11111111-2222-3333-4444-555555555555/sandbox/arm/\",\n    headers={\n        \"Session-Token\": \"YOUR_SESSION_TOKEN\",\n        \"Content-Type\": \"application/json\",\n    },\n    json={\"scenario\": \"decline_aml_hit\"},\n)\nresponse.raise_for_status()\nprint(response.json())  # {'session_id': '...', 'scenario': 'decline_aml_hit', 'status': 'Not Started'}"
          },
          {
            "lang": "javascript",
            "label": "JavaScript",
            "source": "const response = await fetch(\n  'https://verification.didit.me/v3/session/11111111-2222-3333-4444-555555555555/sandbox/arm/',\n  {\n    method: 'POST',\n    headers: {\n      'Session-Token': sessionToken,\n      'Content-Type': 'application/json',\n    },\n    body: JSON.stringify({ scenario: 'decline_aml_hit' }),\n  },\n);\nif (!response.ok) throw new Error(`HTTP ${response.status}`);\nconst { session_id, scenario, status } = await response.json();"
          }
        ]
      }
    },
    "/v3/session/{sessionId}/update-status/": {
      "patch": {
        "summary": "Eine Verifizierungssitzung genehmigen, ablehnen oder eine erneute Einreichung anfordern",
        "description": "Überschreiben Sie die endgültige Entscheidung einer KYC- oder KYB-Verifizierungssitzung manuell. Setzen Sie `new_status` auf `Approved` oder `Declined`, um eine manuelle Entscheidung zu erfassen, oder auf `Resubmitted`, um bestimmte Verifizierungsschritte zurückzusetzen und dem Benutzer zu ermöglichen, diese über dieselbe Verifizierungs-URL erneut durchzuführen. Der Endpoint akzeptiert sowohl Benutzer- (KYC) als auch Unternehmens-Sitzungs-IDs (KYB).\n\nRufen Sie ihn auf, sobald eine Sitzung einen überprüfbaren Status erreicht hat: Der aktuelle Status muss `Approved`, `Declined`, `In Review`, `Kyc Expired`, `Abandoned` oder `Resubmitted` sein. Sitzungen, die sich noch im Status `Not Started`, `In Progress` oder `Awaiting User` befinden oder als `Expired` beendet wurden, geben `400` zurück. Ihr API-Schlüssel benötigt die Berechtigung `write:sessions` (ein berechtigungsbeschränkter API-Schlüssel benötigt Schreibzugriff auf Entscheidungen). Die Prüfung auf einen zulässigen Status erfolgt vor der Validierung des Request-Bodys, sodass eine Sitzung in einem nicht zulässigen Status den Fehler `Wrong Current Status` zurückgibt, selbst wenn die Payload ebenfalls ungültig ist.\n\nÜbergeben Sie bei `Resubmitted` das Feld `nodes_to_resubmit`, um auszuwählen, welche Workflow-Schritte der Benutzer wiederholen muss, oder lassen Sie es weg, um vorhandene Funktionsversuche in einem wiederholbaren Status (`Declined`, `In Review`, `Not Finished`, `Expired`) automatisch auszuwählen. Funktionen, die noch nie versucht wurden, werden nicht automatisch ausgewählt: Führen Sie sie explizit in `nodes_to_resubmit` auf, andernfalls gibt die Anfrage `400` zurück, wenn kein aufgezeichneter Versuch eine erneute Einreichung erfordert. Die vorherigen Ergebnisse der ausgewählten Schritte werden in den Verlauf der erneuten Einreichung verschoben (wird von Get Decision mit `include=resubmissions` zurückgegeben), die Schritte werden gemäß dem Workflow-Graphen neu geordnet, das Ablauffenster der Sitzung wird neu gestartet und die ursprüngliche Verifizierungs-URL wird wieder nutzbar. Reine Backend-Schritte (`AML`, `DATABASE_VALIDATION`, `IP_ANALYSIS`) am Anfang der Liste werden sofort ohne Benutzerinteraktion ausgeführt; wenn jeder erneut eingereichte Schritt ein reiner Backend-Schritt ist, wird die Sitzung innerhalb derselben Anfrage erneut finalisiert. `KYB_REGISTRY` und `KYB_KEY_PEOPLE` können nicht direkt erneut eingereicht werden: Reichen Sie stattdessen die relevanten untergeordneten KYC-Sitzungen erneut ein, woraufhin die übergeordnete Unternehmenssitzung automatisch neu berechnet wird.\n\nJeder Aufruf, der den Status ändert, löst den `status.updated`-[Webhook](/de/integration/webhooks) aus, sobald die Änderung festgeschrieben ist, und fügt dem `reviews`-Feld der Sitzung einen Aktivitätseintrag (mit Angabe des Akteurs und Ihrem `comment`) hinzu, der in [Get Decision](#get-/v3/session/-sessionId-/decision/) und in der Aktivitäts-Zeitleiste der Konsole sichtbar ist. Die mit den `vendor_data` der Sitzung verknüpften Benutzerprofil-Aggregate werden ebenfalls aktualisiert. Eine Ablehnung deaktiviert die laufende AML-Überwachung für die Sitzung; eine erneute Genehmigung aktiviert sie wieder (aus `Resubmitted`, `Declined` oder `Kyc Expired`), wenn im Workflow die Überwachung aktiviert ist. Das Genehmigen oder Ablehnen eines untergeordneten KYC, das zu einer KYB-Prüfung von Schlüsselpersonen gehört, berechnet den Status der übergeordneten Unternehmenssitzung neu. Setzen Sie `send_email: true` (mit `email_address`), um den Benutzer zu benachrichtigen: eine Statusbenachrichtigung bei `Approved`/`Declined` oder eine E-Mail zur erneuten Einreichung mit dem Verifizierungslink und schrittweisen Begründungen bei `Resubmitted`. Um die E-Mail vorab zu prüfen, zeigen Sie eine Vorschau mit [Preview Decision Email](/de/sessions-api/preview-decision-email) (`Approved`, `Declined`) oder [Preview Resubmission Email](/de/sessions-api/preview-resubmission) (`Resubmitted`) an und übergeben Sie deren `preview_token` als `email_preview_token`: Die Aktualisierung sendet dann genau die in der Vorschau angezeigte E-Mail oder gibt `409` zurück, bevor Änderungen vorgenommen werden, wenn die E-Mail oder die Sitzung seit der Vorschau geändert wurde oder der Beleg älter als 15 Minuten ist.\n\nDas wiederholte Setzen von `Approved` oder `Declined` bei einer Sitzung, die diesen Status bereits hat, ändert nichts und gibt `200` zurück: kein Webhook, kein Aktivitätseintrag und keine E-Mail. Das wiederholte Setzen von `Resubmitted` gibt `400` zurück (`The new status is the same as the current status.`). Fehlende oder ungültige Anmeldedaten sowie fehlende Berechtigungen geben `403` zurück; ein abgelaufener berechtigungsbeschränkter API-Schlüssel gibt `401` zurück.",
        "operationId": "patch_v3_session_update_status",
        "x-didit-sdk": {
          "resource": "sessions",
          "method": "update_status",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Sessions"
        ],
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "parameters": [
          {
            "in": "path",
            "name": "sessionId",
            "required": true,
            "description": "UUID der zu aktualisierenden Verifizierungssitzung. Akzeptiert sowohl Benutzer- (KYC) als auch Unternehmens- (KYB) Sitzungs-IDs — der Dienst löst die ID über beide Sitzungstypen hinweg auf.",
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "11111111-2222-3333-4444-555555555555"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "new_status"
                ],
                "properties": {
                  "new_status": {
                    "type": "string",
                    "description": "Zielstatus. `Approved` und `Declined` erfassen eine endgültige manuelle Entscheidung (jede kann auch die andere aufheben). `Resubmitted` setzt die ausgewählten Schritte zurück und sendet die Sitzung an den Benutzer zurück. Jeder andere Wert gibt `400` zurück.",
                    "enum": [
                      "Approved",
                      "Declined",
                      "Resubmitted"
                    ],
                    "example": "Approved"
                  },
                  "comment": {
                    "type": "string",
                    "description": "Freitext-Begründung für die Änderung, gespeichert im Prüfpfad der Sitzung und zurückgegeben im Array `reviews` von [Get Decision](#get-/v3/session/-sessionId-/decision/). Zum Beispiel `Duplicated user`.",
                    "example": "All checks passed manual review"
                  },
                  "nodes_to_resubmit": {
                    "type": "array",
                    "description": "Workflow-Schritte, die der Benutzer wiederholen muss. Wird nur verarbeitet, wenn `new_status` den Wert `Resubmitted` hat. Für `Approved`/`Declined` werden die Einträge dennoch schemavalidiert (ein ungültiger `feature`-Wert gibt `400` zurück), aber schemagültige Einträge werden semantisch ignoriert. Wenn weggelassen, wählt der Server automatisch bestehende OCR-, Liveness-, Gesichtsabgleich-, POA-, Telefon-, E-Mail-, AML-, Datenbankvalidierungs- und Fragebogen-Versuche aus, deren Status `Declined`, `In Review`, `Not Finished` oder `Expired` lautet (NFC-, IP-Analyse-, Altersschätzungs-, Gesichtssuch- und KYB-Dokument-Versuche werden nie automatisch ausgewählt; Gesichtsversuche ohne Gesichtsabgleich werden als `LIVENESS` ausgewählt) — Funktionen, die der Benutzer nie versucht hat (kein erfasster Versuch), werden NICHT ausgewählt, sodass eine Sitzung mit null Versuchen `400` zurückgibt (\"No features found that need resubmission\"), obwohl nichts genehmigt wurde; übergeben Sie in diesem Fall `nodes_to_resubmit` explizit. Die Schritte werden in der Reihenfolge des Workflow-Graphen ausgeführt, unabhängig von der Reihenfolge, in der Sie sie senden. `KYB_REGISTRY`, `KYB_KEY_PEOPLE` und der `KYB`-Alias werden mit `400` abgelehnt — diese übergeordneten Prüfungen werden aus ihren untergeordneten KYC-Sitzungen neu berechnet.",
                    "items": {
                      "type": "object",
                      "required": [
                        "node_id",
                        "feature"
                      ],
                      "properties": {
                        "node_id": {
                          "type": "string",
                          "description": "Knotenbezeichner, wie er in der Workflow-Definition der Sitzung vorkommt (z. B. `feature_ocr`, `feature_liveness`).",
                          "example": "feature_ocr"
                        },
                        "feature": {
                          "type": "string",
                          "description": "Funktionstyp des Knotens. Die Aliase `ID_VERIFICATION`, `POA`, `PHONE` und `EMAIL` werden serverseitig zu `OCR`, `PROOF_OF_ADDRESS`, `PHONE_VERIFICATION` und `EMAIL_VERIFICATION` normalisiert. `KYB_REGISTRY`, `KYB_KEY_PEOPLE` und `KYB` bestehen die Schema-Validierung, werden jedoch immer mit dem in den Beispielen gezeigten Business-Rule-`400`-Fehler abgelehnt.",
                          "enum": [
                            "OCR",
                            "OCR_BACK",
                            "NFC",
                            "AML",
                            "FACE",
                            "LIVENESS",
                            "FACE_MATCH",
                            "IP_ANALYSIS",
                            "AGE_ESTIMATION",
                            "PROOF_OF_ADDRESS",
                            "PHONE_VERIFICATION",
                            "EMAIL_VERIFICATION",
                            "FACE_SEARCH",
                            "DATABASE_VALIDATION",
                            "QUESTIONNAIRE",
                            "DOCUMENT_AI",
                            "KYB_DOCUMENTS",
                            "ID_VERIFICATION",
                            "POA",
                            "PHONE",
                            "EMAIL",
                            "KYB_REGISTRY",
                            "KYB_KEY_PEOPLE",
                            "KYB",
                            "GEOLOCATION"
                          ],
                          "example": "OCR"
                        }
                      }
                    }
                  },
                  "send_email": {
                    "type": "boolean",
                    "description": "Gibt an, ob der Benutzer per E-Mail über die Änderung benachrichtigt werden soll. Erfordert `email_address`. Bei `Approved`/`Declined` erhält der Benutzer eine Statusbenachrichtigung; bei `Resubmitted` enthält die E-Mail den Verifizierungslink und die Gründe für die erneute Einreichung pro Schritt.",
                    "default": false,
                    "example": false
                  },
                  "email_address": {
                    "type": "string",
                    "format": "email",
                    "description": "Empfänger für die Benachrichtigungs-E-Mail. **Erforderlich, wenn `send_email` den Wert `true` hat** – das Weglassen gibt `400` zurück.",
                    "example": "user@example.com"
                  },
                  "email_language": {
                    "type": "string",
                    "description": "Sprache für die Benachrichtigungs-E-Mail. Akzeptiert auf Schemaebene beliebige Zeichenketten; bei nicht unterstützten Codes wird stillschweigend auf Englisch (`en`) zurückgegriffen.",
                    "default": "en",
                    "example": "en"
                  },
                  "email_preview_token": {
                    "type": "string",
                    "writeOnly": true,
                    "minLength": 1,
                    "maxLength": 512,
                    "description": "Optionaler Beleg aus [Vorschau der Entscheidungs-E-Mail](/de/sessions-api/preview-decision-email) (für `Approved` und `Declined`) oder [Vorschau der E-Mail zur erneuten Einreichung](/de/sessions-api/preview-resubmission) (für `Resubmitted`): dessen `preview_token`. Nur gültig mit `send_email: true`; ohne dieses Attribut gibt die Anfrage `400` zurück. Empfänger, Sprache, Sitzungsstatus, Absender und E-Mail (sowie bei einer erneuten Einreichung die ausgewählten Schritte) müssen weiterhin mit der Vorschau übereinstimmen, und der Beleg läuft nach 15 Minuten ab. Andernfalls gibt die Anfrage `409` zurück, bevor die Sitzung geändert oder eine E-Mail gesendet wird. Bestehende Integrationen können dieses Feld weglassen."
                  }
                }
              },
              "examples": {
                "Approve Session": {
                  "summary": "Eine Sitzung nach manueller Prüfung genehmigen",
                  "value": {
                    "new_status": "Approved",
                    "comment": "All checks passed manual review"
                  }
                },
                "Decline Session": {
                  "summary": "Eine Sitzung ablehnen",
                  "value": {
                    "new_status": "Declined",
                    "comment": "Suspected fraud"
                  }
                },
                "Resubmit Specific Steps": {
                  "summary": "Erneute Einreichung ausgewählter Schritte anfordern, mit E-Mail",
                  "value": {
                    "new_status": "Resubmitted",
                    "nodes_to_resubmit": [
                      {
                        "node_id": "feature_ocr",
                        "feature": "OCR"
                      },
                      {
                        "node_id": "feature_liveness",
                        "feature": "LIVENESS"
                      }
                    ],
                    "send_email": true,
                    "email_address": "user@example.com",
                    "email_language": "en"
                  }
                },
                "Resubmit Auto-select": {
                  "summary": "Erneute Einreichung anfordern (nicht genehmigte Schritte automatisch auswählen)",
                  "value": {
                    "new_status": "Resubmitted"
                  }
                },
                "Approve With Previewed Email": {
                  "summary": "Die von „Preview Decision Email“ zurückgegebene E-Mail genehmigen und senden",
                  "value": {
                    "new_status": "Approved",
                    "send_email": true,
                    "email_address": "person@example.com",
                    "email_language": "en",
                    "email_preview_token": "eyJkaWdlc3QiOiI0ZjJhIn0:1uExAm:Pl3x4mpleS1gnatureValue000000000000000"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Status aktualisiert. Die Antwort enthält nur die `session_id`; rufen Sie die aktualisierte Sitzung über [Get Decision](#get-/v3/session/-sessionId-/decision/) ab. Der `status.updated`-Webhook wird ausgelöst, sobald die Änderung übernommen wurde. Das Wiederholen von `Approved` oder `Declined` gibt denselben Body zurück und ändert nichts.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "session_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "UUID der aktualisierten Sitzung."
                    }
                  }
                },
                "examples": {
                  "Updated": {
                    "summary": "Wird für genehmigt, abgelehnt und erneut eingereicht gleichermaßen zurückgegeben",
                    "value": {
                      "session_id": "3472fb7c-8f7c-4d1a-9cf4-cf3d74ce1a60"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Validierungsfehler. Feldfehler werden als `{\"<field>\": [\"<message>\"]}` zurückgegeben (einige Geschäftsregel-Ablehnungen verwenden stattdessen einen Zeichenkettenwert: `{\"nodes_to_resubmit\": \"<message>\"}`), statusübergreifende Fehler als `{\"detail\": \"<message>\"}` und Fehler bei identischem Status als einfaches JSON-Array.",
            "content": {
              "application/json": {
                "examples": {
                  "Wrong Current Status": {
                    "summary": "Sitzung befindet sich nicht in einem aktualisierbaren Zustand",
                    "value": {
                      "detail": "Only sessions with status Approved, Declined, In Review, Kyc Expired, Abandoned, Resubmitted can be updated. Current status: In Progress"
                    }
                  },
                  "Invalid Status Value": {
                    "summary": "new_status ist ein echter Sitzungsstatus, aber nicht Approved/Declined/Resubmitted",
                    "value": {
                      "new_status": [
                        "You can only update the status to 'Approved', 'Declined', or 'Resubmitted'."
                      ]
                    }
                  },
                  "Missing new_status": {
                    "summary": "Erforderliches Feld weggelassen",
                    "value": {
                      "new_status": [
                        "This field is required."
                      ]
                    }
                  },
                  "Same Status": {
                    "summary": "Erneutes Einreichen für eine Sitzung angefordert, die bereits erneut eingereicht wurde",
                    "value": [
                      "The new status is the same as the current status."
                    ]
                  },
                  "Email Address Required": {
                    "summary": "send_email ist true ohne email_address",
                    "value": {
                      "email_address": [
                        "Email address is required when send_email is true."
                      ]
                    }
                  },
                  "Non-resubmittable Feature": {
                    "summary": "Erneutes Einreichen zielt auf eine übergeordnete KYB-Prüfung ab",
                    "value": {
                      "nodes_to_resubmit": "The following features cannot be resubmitted directly: KYB_REGISTRY. Resubmit the relevant child KYC sessions instead; the parent will recompute automatically."
                    }
                  },
                  "Nothing To Resubmit": {
                    "summary": "Automatische Auswahl fand keine nicht genehmigten Funktionen",
                    "value": {
                      "nodes_to_resubmit": "No features found that need resubmission. All features are already approved."
                    }
                  },
                  "Invalid Feature Choice": {
                    "summary": "Unbekannte Funktion in nodes_to_resubmit",
                    "value": {
                      "nodes_to_resubmit": [
                        {
                          "feature": [
                            "\"BOGUS\" is not a valid choice. Valid choices are: OCR, OCR_BACK, NFC, AML, FACE, LIVENESS, FACE_MATCH, IP_ANALYSIS, AGE_ESTIMATION, PROOF_OF_ADDRESS, PHONE_VERIFICATION, EMAIL_VERIFICATION, FACE_SEARCH, DATABASE_VALIDATION, QUESTIONNAIRE, KYB_REGISTRY, KYB_DOCUMENTS, KYB_KEY_PEOPLE, ID_VERIFICATION, POA, PHONE, EMAIL, KYB"
                          ]
                        }
                      ]
                    }
                  },
                  "Invalid Status Value (not a status at all)": {
                    "summary": "new_status ist kein gültiger StatusChoices-Wert",
                    "value": {
                      "new_status": [
                        "\"Bogus\" is not a valid choice."
                      ]
                    }
                  },
                  "Preview Receipt Without Email": {
                    "summary": "email_preview_token ohne send_email: true gesendet",
                    "value": {
                      "email_preview_token": [
                        "A preview receipt is only valid when the email is sent."
                      ]
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Der API-Schlüssel mit eingeschränktem Geltungsbereich ist abgelaufen.",
            "content": {
              "application/json": {
                "examples": {
                  "Expired API Key": {
                    "summary": "API-Schlüssel mit eingeschränktem Berechtigungsumfang nach Ablaufdatum",
                    "value": {
                      "detail": "This API key has expired."
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Fehlende Anmeldedaten oder unzureichende Berechtigungen oder eine `session_id`, die zu einer anderen Anwendung gehört.",
            "content": {
              "application/json": {
                "examples": {
                  "Invalid Credentials": {
                    "summary": "Fehlender oder ungültiger x-api-key",
                    "value": {
                      "detail": "Authentication credentials were not provided or are invalid."
                    }
                  },
                  "Missing Privilege": {
                    "summary": "Dem API-Schlüssel fehlt die Berechtigung write:sessions",
                    "value": {
                      "detail": "You do not have permission to perform this action."
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Es existiert keine KYC- oder KYB-Sitzung mit dieser `session_id` (gelöschte Sitzungen geben ebenfalls `404` zurück).",
            "content": {
              "application/json": {
                "examples": {
                  "Not Found": {
                    "summary": "Unbekannte session_id",
                    "value": {
                      "detail": "Not found."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Ein erneutes Absenden, das nur auf reine Backend-Funktionen abzielt (AML, DATABASE_VALIDATION, IP_ANALYSIS), wurde innerhalb des 30-sekündigen Cooldown-Fensters wiederholt; eine sofortige Wiederholung kann das Ergebnis nicht ändern. Warten Sie und versuchen Sie es nach dem im Header `Retry-After` angegebenen Intervall erneut.",
            "content": {
              "application/json": {
                "examples": {
                  "Backend-only resubmit throttled": {
                    "value": {
                      "detail": "This session was already resubmitted for backend-only features within the last 30 seconds; repeating it cannot change the outcome. Wait before resubmitting again."
                    }
                  }
                }
              }
            }
          },
          "409": {
            "description": "Die E-Mail-Vorschau hat sich geändert oder ist abgelaufen. Erstellen Sie vor der Bestätigung eine neue Vorschau; es erfolgen keine Sitzungsänderungen oder E-Mail-Zustellungen.",
            "content": {
              "application/json": {
                "examples": {
                  "Preview Changed": {
                    "summary": "Der Beleg stimmt nicht mehr überein oder ist älter als 15 Minuten",
                    "value": {
                      "detail": "This email preview changed or expired. Preview the message again before confirming."
                    }
                  }
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X PATCH \\\n  https://verification.didit.me/v3/session/11111111-2222-3333-4444-555555555555/update-status/ \\\n  -H 'x-api-key: YOUR_API_KEY' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\n    \"new_status\": \"Approved\",\n    \"comment\": \"All checks passed manual review\"\n  }'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.sessions.update_status(\n    \"11111111-2222-3333-4444-555555555555\",\n    new_status=\"Approved\",\n    comment=\"All checks passed manual review\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.sessions.updateStatus(\"11111111-2222-3333-4444-555555555555\", {\n  new_status: \"Approved\",\n  comment: \"All checks passed manual review\",\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Sessions.UpdateStatus(ctx, \"11111111-2222-3333-4444-555555555555\", didit.SessionsUpdateStatusParams{\n\tNewStatus: \"Approved\",\n\tComment:   didit.String(\"All checks passed manual review\"),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\nimport me.didit.types.SessionsUpdateStatusParams;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.sessions().updateStatus(\"11111111-2222-3333-4444-555555555555\", SessionsUpdateStatusParams.builder()\n        .newStatus(SessionsUpdateStatusParams.NewStatus.of(\"Approved\"))\n        .comment(\"All checks passed manual review\")\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->sessions->updateStatus('11111111-2222-3333-4444-555555555555', [\n    'new_status' => 'Approved',\n    'comment' => 'All checks passed manual review',\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.sessions.update_status(\n  \"11111111-2222-3333-4444-555555555555\",\n  new_status: \"Approved\",\n  comment: \"All checks passed manual review\"\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Sessions.UpdateStatusAsync(\"11111111-2222-3333-4444-555555555555\", new SessionsUpdateStatusParams\n{\n    NewStatus = \"Approved\",\n    Comment = \"All checks passed manual review\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ]
      }
    },
    "/v3/id-verification/": {
      "post": {
        "summary": "Ausweisverifizierung (Dokumenten-OCR + Betrugsprüfungen)",
        "description": "Führen Sie die OCR-Erfassung eines Ausweisdokuments durch und prüfen Sie es auf Dokumentenbetrug in einem einzigen Aufruf – liefert die extrahierten Inhaberfelder, die geparste MRZ, einen `status` (`Approved`/`Declined`/`In Review`) sowie eine `warnings`-Liste zurück, die jedes gefundene Problem erläutert. Unterstützt 14,000+ Dokumenttypen aus 220+ Ländern und Gebieten.\n\n**Funktionsweise.** Senden Sie das `front_image` des Dokuments (erforderlich) und bei zweiseitigen Dokumenten das `back_image`. Laden Sie unbeschnittene Fotos hoch, auf denen alle vier Ecken des Dokuments sichtbar sind – der Dienst erkennt, richtet aus und beschneidet das Dokument selbst, schneiden Sie es daher nicht vorab zu. Das Dokument wird automatisch klassifiziert (Sie müssen Land oder Dokumenttyp niemals angeben), die visuelle Zone wird per OCR ausgelesen und die MRZ sowie eventuelle Barcodes werden dekodiert. Durch Gegenprüfungen werden anschließend Datumsangaben, Zahlenformate und MRZ-Prüfziffern validiert und die visuelle Zone mit der MRZ abgeglichen. Mit `perform_document_liveness=true` werden die Bilder zusätzlich auf Bildschirmwiedergaben, gedruckte Kopien und Porträtmanipulationen geprüft.\n\n**Entscheidungslogik.** `status` ist `Approved`, sofern nicht mindestens eine Warnung zu einer Ablehnung führt. Betrugs- und Hard-Failure-Risiken führen immer zu einer Ablehnung: `DOCUMENT_EXPIRED`, `SCREEN_CAPTURE_DETECTED`, `PRINTED_COPY_DETECTED`, `PORTRAIT_MANIPULATION_DETECTED`, `PUBLIC_DOCUMENT_IMAGE_DETECTED` sowie Extraktionsfehler (`NAME_NOT_DETECTED`, `DATE_OF_BIRTH_NOT_DETECTED`, `DOCUMENT_NUMBER_NOT_DETECTED`). (`PORTRAIT_IMAGE_NOT_DETECTED`, `INVALID_DATE` und `MRZ_NOT_DETECTED` existieren in Workflow-Sitzungen, werden jedoch von diesem eigenständigen Endpoint niemals erzeugt. `COULD_NOT_DETECT_DOCUMENT_TYPE` wird hier zurückgegeben, wenn das Vorderseitenbild keinem bekannten offiziellen Dokumentendesign mit hoher Konfidenz entspricht, und lehnt die Anfrage ab.) Drei Risikogruppen sind pro Anfrage über `invalid_mrz_action`, `inconsistent_data_action` und `expiration_date_not_detected_action` konfigurierbar (`DECLINE` oder `NO_ACTION`). Alle anderen Warnungen (z. B. `POSSIBLE_DUPLICATED_USER`) sind rein informativ und führen für sich allein niemals zu einer Ablehnung. Wenn `perform_document_liveness=true` (Standardeinstellung) und die Fälschungsprüfung keinen verwertbaren Score liefert – der Anbieter ist ausgefallen, hat nicht mit 200 geantwortet oder hat HTTP 200 mit `status=\"ERR\"` zurückgegeben –, gibt der Aufruf `200` mit `status: \"In Review\"` und einer Warnung `DOCUMENT_LIVENESS_NOT_COMPUTED` (`log_type: \"warning\"`) anstelle von `Approved` zurück: Eine Prüfung, die nicht ausgeführt wurde, ist kein Beweis dafür, dass das Dokument echt ist. Diese Eskalation ist nicht konfigurierbar und setzt ein `Declined` niemals außer Kraft; mit `perform_document_liveness=false` wird die Prüfung übersprungen und der Status richtet sich wie bisher nach den verbleibenden Warnungen. Ein Dokument, das überhaupt nicht verarbeitet werden kann, gibt `400` mit `{\"error\": \"COULD_NOT_RECOGNIZE_DOCUMENT\"}` zurück; ein lesbares, aber problematisches Dokument gibt `200` mit `status: \"Declined\"` zurück – prüfen Sie stets `id_verification.status` und `id_verification.warnings`, nicht nur den HTTP-Code.\n\n**Abrechnung.** Jede `200`-Antwort verbraucht einen Ausweisverifizierungs-API-Credit (abgerechnet über Ihr Tarif-Guthaben oder Aufladeguthaben). Wenn das Guthaben der Organisation den Aufruf nicht deckt, gibt der Endpoint vor jeder Bildverarbeitung `403` mit dem Fehler für unzureichende Credits zurück.\n\n**Sitzungspersistenz (`save_api_request`, Standard `true`).** Bei `true` wird der Aufruf als Sitzung vom Typ API persistiert: Er erscheint in der Business Console, die zurückgegebene `request_id` ist eine echte Sitzungs-ID, die Sie an `GET /v3/session/{sessionId}/decision/` übergeben können, die zugeschnittenen Dokumenten-/Porträtbilder werden gespeichert und als kurzlebige Medien-URLs (`https://<media-host>/ocr/...`) zurückgegeben, und ein Webhook `status.updated` wird an Ihre konfigurierten Webhook-Ziele gesendet. Bei `false` wird nichts gespeichert, `request_id` ist eine einmalige Korrelations-UUID und `portrait_image`/`front_image`/`back_image` werden inline als base64-codierte JPEG-Strings zurückgegeben.\n\n**Sandbox.** Sandbox-API-Schlüssel überspringen sämtliche Verarbeitungen und Abrechnungen: Nach der Anfragevalidierung (fehlerhafte Eingaben geben weiterhin `400` zurück) liefert der Endpoint eine statische `Approved`-Mock-Payload zurück (einen fiktiven US-amerikanischen Personalausweis für einen „Sandbox User“), es wird keine Sitzung persistiert und es werden keine Credits verbraucht.\n\n**Authentifizierung.** Senden Sie den API-Schlüssel Ihrer Anwendung im Header `x-api-key`. Fehlende oder ungültige Anmeldedaten geben `403` zurück (`{\"detail\": \"You do not have permission to perform this action.\"}`) – diese API gibt niemals `401` zurück.\n\n**Rate-Limit.** Geteiltes Schreibkontingent von 300 Anfragen/Min. pro API-Schlüssel über alle POST/PATCH/DELETE-Endpoints hinweg; bei Überschreitung wird `429` zurückgegeben.",
        "operationId": "post_v3id-verification",
        "x-didit-sdk": {
          "resource": "id_verification",
          "method": "verify",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Standalone APIs"
        ],
        "parameters": [],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "required": [
                  "front_image"
                ],
                "properties": {
                  "front_image": {
                    "type": "string",
                    "format": "binary",
                    "description": "Vorderseite des Ausweisdokuments. Zulässige Dateiendungen: `tiff`, `jpg`, `jpeg`, `png`, `webp`, `pdf`. Maximale Upload-Größe: **10 MB** (größere Dateien werden mit `400` abgelehnt). PDFs werden vor der OCR in ein Bild gerendert; verschlüsselte PDFs erfordern `front_image_password`. Bilder werden automatisch auf ca. 0,5 MB komprimiert und die EXIF-Ausrichtung wird angewendet. Laden Sie die vollständige, unbeschnittene Aufnahme hoch, auf der alle vier Ecken des Dokuments sichtbar sind."
                  },
                  "front_image_password": {
                    "type": "string",
                    "description": "Passwort zur Entschlüsselung von `front_image`, wenn es sich um eine verschlüsselte PDF-Datei handelt. Das Senden einer verschlüsselten PDF-Datei ohne (oder mit einem falschen) Passwort gibt `400` zurück.",
                    "writeOnly": true
                  },
                  "back_image": {
                    "type": "string",
                    "format": "binary",
                    "description": "Rückseite des Dokuments – senden Sie diese immer, wenn das Dokument eine hat (viele Ausweise tragen die MRZ oder einen Barcode auf der Rückseite; das Weglassen führt lediglich dazu, dass die MRZ und Felder der Rückseite in der Antwort leer bleiben – dieser Endpoint löst keine Warnung wegen fehlender MRZ aus). Gleiche Format- und Größenbeschränkungen wie bei `front_image`. Wenn weggelassen, sind `back_image` und Felder der Rückseite in der Antwort `null`."
                  },
                  "back_image_password": {
                    "type": "string",
                    "description": "Passwort zur Entschlüsselung von `back_image`, wenn es sich um eine verschlüsselte PDF-Datei handelt.",
                    "writeOnly": true
                  },
                  "perform_document_liveness": {
                    "type": "boolean",
                    "default": true,
                    "description": "Überprüft beide Bilder auf Präsentationsbetrug: Bildschirmwiedergaben (`SCREEN_CAPTURE_DETECTED`), gedruckte Kopien (`PRINTED_COPY_DETECTED`) und Porträtmanipulation (`PORTRAIT_MANIPULATION_DETECTED`). Jeder dieser Fälle führt zur automatischen Ablehnung. Standardmäßig aktiviert; setzen Sie den Wert auf `false`, um das Betrugsscreening zu überspringen und die Latenz zu verringern. Wenn die Funktion aktiviert ist und der Anbieter keinen verwertbaren Score zurückgibt, lautet die Antwort `In Review` mit einer `DOCUMENT_LIVENESS_NOT_COMPUTED`-Warnung anstelle von `Approved`.",
                    "example": true
                  },
                  "minimum_age": {
                    "type": "integer",
                    "nullable": true,
                    "default": null,
                    "minimum": 1,
                    "maximum": 120,
                    "description": "Akzeptiert und validiert (1–120), wird jedoch **derzeit von diesem Endpoint nicht angewendet** – es erzeugt über dieses Feld niemals eine `MINIMUM_AGE_NOT_MET`-Warnung. Setzen Sie Altersregeln anhand des zurückgegebenen `date_of_birth`/`age` durch oder verwenden Sie einen Verifizierungssitzungs-Workflow mit Altersbeschränkungen."
                  },
                  "expiration_date_not_detected_action": {
                    "type": "string",
                    "enum": [
                      "NO_ACTION",
                      "DECLINE"
                    ],
                    "default": "NO_ACTION",
                    "description": "Was zu tun ist, wenn kein Ablaufdatum gelesen werden kann (`EXPIRATION_DATE_NOT_DETECTED`). Standardwert ist `NO_ACTION`, da viele Ausweisdokumente kein Ablaufdatum aufgedruckt haben. Hinweis: Ein *erkanntes und abgelaufenes* Ablaufdatum führt immer zu einer Ablehnung (`DOCUMENT_EXPIRED`), unabhängig von dieser Option."
                  },
                  "invalid_mrz_action": {
                    "type": "string",
                    "enum": [
                      "NO_ACTION",
                      "DECLINE"
                    ],
                    "default": "DECLINE",
                    "description": "Was zu tun ist, wenn die extrahierte MRZ die Prüfziffernvalidierung nicht besteht (`MRZ_VALIDATION_FAILED`). Eine fehlende MRZ löst an diesem Endpoint keine Warnung aus. Nur relevant für Dokumente, die eine MRZ enthalten. `REVIEW` wird an diesem Endpoint nicht unterstützt und gibt `400` zurück."
                  },
                  "inconsistent_data_action": {
                    "type": "string",
                    "enum": [
                      "NO_ACTION",
                      "DECLINE"
                    ],
                    "default": "DECLINE",
                    "description": "Was zu tun ist, wenn extrahierte Daten in sich inkonsistent sind: `DATA_INCONSISTENT`, `MRZ_AND_DATA_EXTRACTED_FROM_OCR_NOT_SAME` (visuelle Zone stimmt nicht mit der MRZ überein) oder `DOCUMENT_NAME_DIFFERENT_FROM_OTHER_APPROVED_DOCUMENTS`."
                  },
                  "critical_field_occlusion_action": {
                    "type": "string",
                    "enum": [
                      "NO_ACTION",
                      "DECLINE"
                    ],
                    "default": "DECLINE",
                    "description": "Was zu tun ist, wenn ein kritisches gedrucktes Feld auf der Aufnahme physisch verdeckt war (`CRITICAL_FIELD_OCCLUSION_DETECTED`) - eine Identifikationsnummer, ein Name, das Geburtsdatum oder das Ablaufdatum. Lehnt standardmäßig ab, wie die anderen Dokumentintegritätsrisiken dieses Endpoints: Das Verdecken von Nummern, mit denen ein Bericht abgeglichen wird, entspricht einem geschwärzten Dokument. Der für ein verdecktes Feld ausgelesene Wert wird bei der Extraktion ohnehin verworfen, sodass die passende Warnung `*_NOT_DETECTED` üblicherweise hinzukommt. `REVIEW` wird auf diesem Endpoint nicht unterstützt und gibt `400` zurück."
                  },
                  "document_or_personal_number_format_mismatch_action": {
                    "type": "string",
                    "enum": [
                      "NO_ACTION",
                      "DECLINE"
                    ],
                    "default": "NO_ACTION",
                    "description": "Was zu tun ist, wenn eine Nummer nicht dem Format entspricht, das die ausstellende Behörde für diesen Dokumenttyp verwendet (`DOCUMENT_NUMBER_FORMAT_MISMATCH`, `PERSONAL_NUMBER_FORMAT_MISMATCH`). Standardwert ist `NO_ACTION`, wodurch die Warnung gemeldet wird, ohne den Status zu ändern. `REVIEW` wird auf diesem Endpoint nicht unterstützt und gibt `400` zurück."
                  },
                  "preferred_characters": {
                    "type": "string",
                    "enum": [
                      "latin",
                      "non_latin"
                    ],
                    "default": "latin",
                    "description": "Bevorzugtes Schriftsystem für Namens-/Adressfelder auf Dokumenten, die sowohl lateinischen als auch nicht-lateinischen Text enthalten (Arabisch, Kyrillisch, CJK, …). `latin` gibt transliterierte/lateinische Werte zurück; `non_latin` bevorzugt das native Schriftsystem."
                  },
                  "save_api_request": {
                    "type": "boolean",
                    "default": true,
                    "description": "Wenn `true` (Standard), wird der Aufruf als Sitzung vom Typ API persistent gespeichert — sichtbar in der Business Console, abrufbar über `GET /v3/session/{sessionId}/decision/` unter Verwendung der zurückgegebenen `request_id`, angekündigt über einen `status.updated`-Webhook und mit Dokumentenbildern, die als Medien-URLs zurückgegeben werden. Wenn `false`, wird nichts gespeichert, `request_id` ist eine flüchtige UUID und Bilder werden inline als Base64-JPEG-Strings zurückgegeben.",
                    "example": true
                  },
                  "vendor_data": {
                    "type": "string",
                    "description": "Optionale opake Zeichenfolge (Ihre interne Benutzer-ID, E-Mail, UUID…), die in der gespeicherten Sitzung hinterlegt und in der Antwort zurückgegeben wird. Verwenden Sie sie, um API-Aufrufe mit Ihren eigenen Datensätzen abzugleichen und Sitzungen später zu filtern.",
                    "example": "user-123"
                  },
                  "metadata": {
                    "type": "object",
                    "additionalProperties": true,
                    "description": "Optionales JSON-Objekt, das mit der Sitzung gespeichert (wenn `save_api_request=true`) und in der Antwort zurückgegeben wird. Senden Sie es bei Multipart-Anfragen als JSON-codiertes String-Feld (z. B. `metadata={\"flow\":\"onboarding\"}`) – es wird in ein Objekt geparst.",
                    "example": {
                      "flow": "onboarding"
                    }
                  }
                }
              },
              "example": {
                "front_image": "(binary JPEG/PNG/PDF of the document front)",
                "back_image": "(binary JPEG/PNG/PDF of the document back)",
                "perform_document_liveness": true,
                "save_api_request": true,
                "vendor_data": "user-123",
                "metadata": {
                  "flow": "onboarding"
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Dokument verarbeitet. `id_verification.status` ist `Approved`, `Declined` oder `In Review`; jedes erkannte Problem wird einzeln in `id_verification.warnings` aufgeführt. `In Review` wird zurückgegeben, wenn eine angeforderte Dokumenten-Liveness-Prüfung kein verwertbares Ergebnis geliefert hat (`DOCUMENT_LIVENESS_NOT_COMPUTED`). Ein problematisches Dokument gibt dennoch `200` mit `status: \"Declined\"` zurück – prüfen Sie den Body, nicht nur den HTTP-Code. Wenn `save_api_request=true`, ist `request_id` die persistierte Sitzungs-ID und Bildfelder sind kurzlebige Medien-URLs; bei `save_api_request=false` sind sie Inline-Base64-JPEG-Strings.",
            "content": {
              "application/json": {
                "examples": {
                  "Approved": {
                    "summary": "Beidseitiger Ausweis sauber gelesen (gespeichert — Bilder als Medien-URLs)",
                    "value": {
                      "request_id": "11d219ed-d59c-4b1d-8d65-9b933f12d5b8",
                      "id_verification": {
                        "status": "Approved",
                        "document_type": "Identity Card",
                        "document_subtype": "ID_CARD_GENERIC",
                        "document_number": "CBX164224",
                        "personal_number": "20446581H",
                        "portrait_image": "https://<media-host>/ocr/11d219ed-d59c-4b1d-8d65-9b933f12d5b8-portrait_image-8c2f.jpg?signature=...",
                        "front_image": "https://<media-host>/ocr/11d219ed-d59c-4b1d-8d65-9b933f12d5b8-front_image-4a1e.jpg?signature=...",
                        "back_image": "https://<media-host>/ocr/11d219ed-d59c-4b1d-8d65-9b933f12d5b8-back_image-77b0.jpg?signature=...",
                        "front_image_camera_front": null,
                        "back_image_camera_front": null,
                        "front_image_camera_front_face_match_score": null,
                        "back_image_camera_front_face_match_score": null,
                        "front_image_quality_score": {
                          "focus_score": 78.0,
                          "brightness_score": 83.2,
                          "brightness_issue": "ok",
                          "is_document_fully_visible": true,
                          "resolution_score": 40.7,
                          "overall_score": 70.2
                        },
                        "back_image_quality_score": {
                          "focus_score": 100.0,
                          "brightness_score": 95.6,
                          "brightness_issue": "ok",
                          "is_document_fully_visible": true,
                          "resolution_score": 43.0,
                          "overall_score": 84.4
                        },
                        "date_of_birth": "1980-01-13",
                        "age": 46,
                        "expiration_date": "2032-03-31",
                        "date_of_issue": "2022-03-31",
                        "issuing_state": "ESP",
                        "issuing_state_name": "Spain",
                        "first_name": "Julio Francisco",
                        "last_name": "Fores Sena",
                        "full_name": "Julio Francisco Fores Sena",
                        "gender": "M",
                        "address": "Brda. Urb. El Cardonal 0052 52 Po3 B,Taco,San Cristobal De La Laguna,Santa Cruz De Tenerife",
                        "formatted_address": "Av. el Cardonal, 52, b, 38108 La Laguna, Santa Cruz de Tenerife, Spain",
                        "place_of_birth": "Valencia, Valencia",
                        "marital_status": "UNKNOWN",
                        "nationality": "ESP",
                        "extra_fields": {
                          "first_surname": "Fores",
                          "second_surname": "Sena"
                        },
                        "mrz": {
                          "surname": "FORES SENA",
                          "name": "JULIO FRANCISCO",
                          "country": "ESP",
                          "nationality": "ESP",
                          "birth_date": "800113",
                          "expiry_date": "320331",
                          "sex": "M",
                          "document_type": "ID",
                          "document_number": "CBX164224",
                          "optional_data": "20446581H",
                          "optional_data_2": "",
                          "birth_date_hash": "9",
                          "expiry_date_hash": "8",
                          "document_number_hash": "3",
                          "final_hash": "3",
                          "personal_number": "20446581H",
                          "warnings": [],
                          "errors": [],
                          "mrz_type": "TD1",
                          "mrz_string": "IDESPCBX164224320446581H<<<<<<\n8001139M3203318ESP<<<<<<<<<<<3\nFORES<SENA<<JULIO<FRANCISCO<<<",
                          "mrz_key": "CBX164224380011393203318"
                        },
                        "parsed_address": {
                          "street_1": "Avenida el Cardonal 52",
                          "street_2": "b",
                          "city": "La Laguna",
                          "region": "Canarias",
                          "country": "ES",
                          "postal_code": "38108",
                          "address_type": "Avenida",
                          "formatted_address": "Av. el Cardonal, 52, b, 38108 La Laguna, Santa Cruz de Tenerife, Spain",
                          "raw_results": {
                            "address_components": [
                              {
                                "long_name": "b",
                                "short_name": "b",
                                "types": [
                                  "subpremise"
                                ]
                              },
                              {
                                "long_name": "52",
                                "short_name": "52",
                                "types": [
                                  "street_number"
                                ]
                              },
                              {
                                "long_name": "Avenida el Cardonal",
                                "short_name": "Av. el Cardonal",
                                "types": [
                                  "route"
                                ]
                              },
                              {
                                "long_name": "La Laguna",
                                "short_name": "La Laguna",
                                "types": [
                                  "locality",
                                  "political"
                                ]
                              },
                              {
                                "long_name": "Spain",
                                "short_name": "ES",
                                "types": [
                                  "country",
                                  "political"
                                ]
                              },
                              {
                                "long_name": "38108",
                                "short_name": "38108",
                                "types": [
                                  "postal_code"
                                ]
                              }
                            ],
                            "formatted_address": "Av. el Cardonal, 52, b, 38108 La Laguna, Santa Cruz de Tenerife, Spain",
                            "geometry": {
                              "location": {
                                "lat": 28.4501161,
                                "lng": -16.3004407
                              },
                              "location_type": "ROOFTOP"
                            },
                            "types": [
                              "street_address",
                              "subpremise"
                            ]
                          },
                          "document_location": {
                            "latitude": 28.4501161,
                            "longitude": -16.3004407
                          },
                          "label": "Spain Identity Card Address",
                          "is_verified": true,
                          "category": "Residential"
                        },
                        "warnings": [],
                        "barcodes": []
                      },
                      "vendor_data": "user-123",
                      "metadata": {
                        "flow": "onboarding"
                      },
                      "created_at": "2026-06-12T02:21:56.013573+00:00"
                    }
                  },
                  "Declined - expired document": {
                    "summary": "Upload nur der Vorderseite eines abgelaufenen Personalausweises",
                    "value": {
                      "request_id": "f61681b8-9422-4378-ac3e-04c6a247fb45",
                      "id_verification": {
                        "status": "Declined",
                        "document_type": "Identity Card",
                        "document_subtype": "ID_CARD_GENERIC",
                        "document_number": "BNK123072",
                        "personal_number": "21771255F",
                        "portrait_image": "https://<media-host>/ocr/f61681b8-9422-4378-ac3e-04c6a247fb45-portrait_image-1d9a.jpg?signature=...",
                        "front_image": "https://<media-host>/ocr/f61681b8-9422-4378-ac3e-04c6a247fb45-front_image-5c2b.jpg?signature=...",
                        "back_image": null,
                        "front_image_camera_front": null,
                        "back_image_camera_front": null,
                        "front_image_camera_front_face_match_score": null,
                        "back_image_camera_front_face_match_score": null,
                        "front_image_quality_score": {
                          "focus_score": 100.0,
                          "brightness_score": 95.7,
                          "brightness_issue": "ok",
                          "is_document_fully_visible": true,
                          "resolution_score": 22.2,
                          "overall_score": 79.3
                        },
                        "back_image_quality_score": null,
                        "date_of_birth": "1997-01-30",
                        "age": 29,
                        "expiration_date": "2025-11-26",
                        "date_of_issue": null,
                        "issuing_state": "ESP",
                        "issuing_state_name": "Spain",
                        "first_name": "Lucia",
                        "last_name": "Marin Castro",
                        "full_name": "Lucia Marin Castro",
                        "gender": "F",
                        "address": null,
                        "formatted_address": null,
                        "place_of_birth": null,
                        "marital_status": "UNKNOWN",
                        "nationality": "ESP",
                        "extra_fields": {
                          "first_surname": "Marin",
                          "second_surname": "Castro"
                        },
                        "mrz": {},
                        "parsed_address": null,
                        "warnings": [
                          {
                            "risk": "DOCUMENT_EXPIRED",
                            "feature": "ID_VERIFICATION",
                            "additional_data": null,
                            "log_type": "error",
                            "short_description": "Document expired",
                            "long_description": "The document's expiration date has passed, rendering it no longer valid for use."
                          }
                        ],
                        "barcodes": []
                      },
                      "vendor_data": "user-123",
                      "metadata": null,
                      "created_at": "2026-06-12T02:25:48.117204+00:00"
                    }
                  }
                },
                "schema": {
                  "type": "object",
                  "properties": {
                    "request_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "Beibehaltene Sitzungs-ID, wenn `save_api_request=true` (verwendbar mit `GET /v3/session/{sessionId}/decision/`); andernfalls eine vorübergehende Korrelations-UUID."
                    },
                    "id_verification": {
                      "type": "object",
                      "properties": {
                        "status": {
                          "type": "string",
                          "enum": [
                            "Approved",
                            "Declined",
                            "In Review"
                          ],
                          "description": "`Approved`, wenn keine Warnung zu einer Ablehnung führt und die angeforderte Dokument-Liveness-Prüfung ein verwertbares Ergebnis geliefert hat; `In Review`, wenn diese angeforderte Prüfung kein verwertbares Ergebnis geliefert hat (`DOCUMENT_LIVENESS_NOT_COMPUTED`); `Declined`, wenn eine Warnung zu einer Ablehnung führt — die Liste `warnings` erklärt warum."
                        },
                        "document_type": {
                          "type": "string",
                          "nullable": true,
                          "description": "Anzeigename des erkannten Dokumententyps: `Identity Card`, `Passport`, `Driver's License`, `Residence Permit`, `Health Insurance Card` oder `Tax Card`. `null`, wenn das Dokument nicht klassifiziert werden konnte.",
                          "example": "Identity Card"
                        },
                        "document_subtype": {
                          "type": "string",
                          "nullable": true,
                          "description": "Feinerer Subtyp, sofern verfügbar (z. B. `ID_CARD_GENERIC`, `EPASSPORT`).",
                          "example": "ID_CARD_GENERIC"
                        },
                        "document_number": {
                          "type": "string",
                          "nullable": true,
                          "example": "CBX164224"
                        },
                        "personal_number": {
                          "type": "string",
                          "nullable": true,
                          "description": "Sekundäre persönliche/nationale Nummer, die auf einigen Dokumenten aufgedruckt ist.",
                          "example": "20446581H"
                        },
                        "portrait_image": {
                          "type": "string",
                          "nullable": true,
                          "description": "Zugeschnittenes Porträtfoto aus dem Dokument. Eine kurzlebige Medien-URL (`https://<media-host>/ocr/...`), wenn `save_api_request=true` (Standard); ein inline-Base64-kodierter JPEG-String, wenn `save_api_request=false`. `null`, wenn kein Porträt erkannt wurde."
                        },
                        "front_image": {
                          "type": "string",
                          "nullable": true,
                          "description": "Ausgerichteter Zuschnitt der Dokumentvorderseite. Medien-URL, wenn gespeichert, andernfalls Inline-Base64-JPEG."
                        },
                        "back_image": {
                          "type": "string",
                          "nullable": true,
                          "description": "Ausgerichteter Zuschnitt der Dokumentrückseite. `null`, wenn kein `back_image` hochgeladen wurde."
                        },
                        "front_image_camera_front": {
                          "type": "string",
                          "nullable": true,
                          "description": "Auf diesem Endpoint immer `null` (nur in Verifizierungssitzungen mit Kameraerfassung ausgefüllt)."
                        },
                        "back_image_camera_front": {
                          "type": "string",
                          "nullable": true,
                          "description": "Auf diesem Endpoint immer `null`."
                        },
                        "front_image_camera_front_face_match_score": {
                          "type": "number",
                          "nullable": true,
                          "description": "Auf diesem Endpoint immer `null`."
                        },
                        "back_image_camera_front_face_match_score": {
                          "type": "number",
                          "nullable": true,
                          "description": "Auf diesem Endpoint immer `null`."
                        },
                        "front_image_quality_score": {
                          "type": "object",
                          "nullable": true,
                          "description": "Erfassungsqualitätsdiagnose für das hochgeladene Bild (`null`, wenn die Seite nicht bereitgestellt wurde oder das Scoring fehlgeschlagen ist). Alle Werte liegen zwischen 0 und 100.",
                          "properties": {
                            "focus_score": {
                              "type": "number",
                              "format": "float",
                              "description": "Schärfe des Dokumentenzuschnitts (höher ist schärfer)."
                            },
                            "brightness_score": {
                              "type": "number",
                              "format": "float",
                              "description": "Exposure-Qualität (höher ist besser)."
                            },
                            "brightness_issue": {
                              "type": "string",
                              "nullable": true,
                              "description": "`ok`, wenn die Belichtung in Ordnung ist, andernfalls das erkannte Problem (z. B. zu dunkel / zu hell)."
                            },
                            "is_document_fully_visible": {
                              "type": "boolean",
                              "nullable": true,
                              "description": "Gibt an, ob sich alle vier Ecken des Dokuments innerhalb des Rahmens befinden."
                            },
                            "resolution_score": {
                              "type": "number",
                              "format": "float",
                              "description": "Effektive Auflösung des Dokumentbereichs."
                            },
                            "overall_score": {
                              "type": "number",
                              "format": "float",
                              "description": "Aggregierter Qualitätswert."
                            }
                          }
                        },
                        "back_image_quality_score": {
                          "type": "object",
                          "nullable": true,
                          "description": "Erfassungsqualitätsdiagnose für das hochgeladene Bild (`null`, wenn die Seite nicht bereitgestellt wurde oder das Scoring fehlgeschlagen ist). Alle Werte liegen zwischen 0 und 100.",
                          "properties": {
                            "focus_score": {
                              "type": "number",
                              "format": "float",
                              "description": "Schärfe des Dokumentenzuschnitts (höher ist schärfer)."
                            },
                            "brightness_score": {
                              "type": "number",
                              "format": "float",
                              "description": "Exposure-Qualität (höher ist besser)."
                            },
                            "brightness_issue": {
                              "type": "string",
                              "nullable": true,
                              "description": "`ok`, wenn die Belichtung in Ordnung ist, andernfalls das erkannte Problem (z. B. zu dunkel / zu hell)."
                            },
                            "is_document_fully_visible": {
                              "type": "boolean",
                              "nullable": true,
                              "description": "Gibt an, ob sich alle vier Ecken des Dokuments innerhalb des Rahmens befinden."
                            },
                            "resolution_score": {
                              "type": "number",
                              "format": "float",
                              "description": "Effektive Auflösung des Dokumentbereichs."
                            },
                            "overall_score": {
                              "type": "number",
                              "format": "float",
                              "description": "Aggregierter Qualitätswert."
                            }
                          }
                        },
                        "date_of_birth": {
                          "type": "string",
                          "format": "date",
                          "nullable": true,
                          "example": "1980-01-13"
                        },
                        "age": {
                          "type": "integer",
                          "nullable": true,
                          "description": "Alter des Inhabers in Jahren, berechnet aus `date_of_birth`.",
                          "example": 46
                        },
                        "expiration_date": {
                          "type": "string",
                          "format": "date",
                          "nullable": true,
                          "example": "2032-03-31"
                        },
                        "date_of_issue": {
                          "type": "string",
                          "format": "date",
                          "nullable": true,
                          "example": "2022-03-31"
                        },
                        "issuing_state": {
                          "type": "string",
                          "nullable": true,
                          "description": "Ausstellungsland (ISO 3166-1 Alpha-3).",
                          "example": "ESP"
                        },
                        "issuing_state_name": {
                          "type": "string",
                          "nullable": true,
                          "example": "Spain"
                        },
                        "first_name": {
                          "type": "string",
                          "nullable": true,
                          "example": "Julio Francisco"
                        },
                        "last_name": {
                          "type": "string",
                          "nullable": true,
                          "example": "Fores Sena"
                        },
                        "full_name": {
                          "type": "string",
                          "nullable": true,
                          "example": "Julio Francisco Fores Sena"
                        },
                        "gender": {
                          "type": "string",
                          "nullable": true,
                          "description": "`M`, `F` oder `null`, wenn nicht gedruckt/erkannt.",
                          "example": "M"
                        },
                        "address": {
                          "type": "string",
                          "nullable": true,
                          "description": "Adresse genau wie auf dem Dokument aufgedruckt."
                        },
                        "formatted_address": {
                          "type": "string",
                          "nullable": true,
                          "description": "Geocodierte, normalisierte Version von `address`."
                        },
                        "place_of_birth": {
                          "type": "string",
                          "nullable": true,
                          "example": "Valencia, Valencia"
                        },
                        "marital_status": {
                          "type": "string",
                          "nullable": true,
                          "description": "`UNKNOWN`, es sei denn, auf dem Dokument ist der Familienstand aufgedruckt.",
                          "example": "UNKNOWN"
                        },
                        "nationality": {
                          "type": "string",
                          "nullable": true,
                          "description": "Staatsangehörigkeit des Inhabers (ISO 3166-1 alpha-3).",
                          "example": "ESP"
                        },
                        "extra_fields": {
                          "type": "object",
                          "nullable": true,
                          "additionalProperties": true,
                          "description": "Dokumentspezifische Zusatzfelder ohne eigene Spalte (z. B. `first_surname`/`second_surname` bei spanischen Ausweisen, Führerscheinklassen bei Führerscheinen)."
                        },
                        "mrz": {
                          "type": "object",
                          "description": "Geparste maschinenlesbare Zone. Ein **leeres Objekt** (`{}`), wenn das Dokument keine MRZ aufweist oder diese nicht gelesen werden konnte — prüfen Sie in diesem Fall auch die Liste `warnings`. Datumsangaben innerhalb der MRZ verwenden das Rohformat `YYMMDD`.",
                          "properties": {
                            "surname": {
                              "type": "string",
                              "example": "FORES SENA"
                            },
                            "name": {
                              "type": "string",
                              "example": "JULIO FRANCISCO"
                            },
                            "country": {
                              "type": "string",
                              "description": "Ausstellungsland (ISO 3166-1 Alpha-3).",
                              "example": "ESP"
                            },
                            "nationality": {
                              "type": "string",
                              "description": "Staatsangehörigkeit des Inhabers (ISO 3166-1 alpha-3).",
                              "example": "ESP"
                            },
                            "birth_date": {
                              "type": "string",
                              "description": "Unverarbeitetes MRZ-Geburtsdatum (`YYMMDD`).",
                              "example": "800113"
                            },
                            "expiry_date": {
                              "type": "string",
                              "description": "Unverarbeitetes MRZ-Ablaufdatum (`YYMMDD`).",
                              "example": "320331"
                            },
                            "sex": {
                              "type": "string",
                              "example": "M"
                            },
                            "document_type": {
                              "type": "string",
                              "description": "MRZ-Dokumenttyp-Code (z. B. `ID`, `P`).",
                              "example": "ID"
                            },
                            "document_number": {
                              "type": "string",
                              "example": "CBX164224"
                            },
                            "optional_data": {
                              "type": "string",
                              "nullable": true,
                              "example": "20446581H"
                            },
                            "optional_data_2": {
                              "type": "string",
                              "nullable": true,
                              "example": ""
                            },
                            "birth_date_hash": {
                              "type": "string",
                              "description": "MRZ-Prüfziffer für das Geburtsdatum.",
                              "example": "9"
                            },
                            "expiry_date_hash": {
                              "type": "string",
                              "description": "MRZ-Prüfziffer für das Ablaufdatum.",
                              "example": "8"
                            },
                            "document_number_hash": {
                              "type": "string",
                              "description": "MRZ-Prüfziffer für die Dokumentnummer.",
                              "example": "3"
                            },
                            "final_hash": {
                              "type": "string",
                              "description": "Zusammengesetzte MRZ-Prüfziffer.",
                              "example": "3"
                            },
                            "personal_number": {
                              "type": "string",
                              "nullable": true,
                              "example": "20446581H"
                            },
                            "warnings": {
                              "type": "array",
                              "items": {
                                "type": "string"
                              },
                              "description": "Nicht-kritische MRZ-Parsing-Warnungen."
                            },
                            "errors": {
                              "type": "array",
                              "items": {
                                "type": "string"
                              },
                              "description": "MRZ-Prüfziffer-/Parsing-Fehler. Nicht-leere Fehler werden als `MRZ_VALIDATION_FAILED`-Warnung ausgewiesen."
                            },
                            "mrz_type": {
                              "type": "string",
                              "description": "MRZ-Layout: `TD1` (Personalausweise, 3 Zeilen), `TD2` oder `TD3` (Reisepässe, 2 Zeilen).",
                              "example": "TD1"
                            },
                            "mrz_string": {
                              "type": "string",
                              "description": "Unverarbeiteter MRZ-Text wie ausgelesen, Zeilen getrennt durch `\\n`."
                            },
                            "mrz_key": {
                              "type": "string",
                              "description": "Zusammengesetzter Schlüssel (Dokumentennummer + Prüfziffern), der für Querprüfungen verwendet wird."
                            }
                          }
                        },
                        "parsed_address": {
                          "type": "object",
                          "nullable": true,
                          "description": "Strukturierte, geocodierte Aufschlüsselung von `address`. `null`, wenn das Dokument keine Adresse enthält oder sie nicht analysiert werden konnte.",
                          "properties": {
                            "street_1": {
                              "type": "string",
                              "nullable": true,
                              "example": "Avenida el Cardonal 52"
                            },
                            "street_2": {
                              "type": "string",
                              "nullable": true,
                              "example": "b"
                            },
                            "city": {
                              "type": "string",
                              "nullable": true,
                              "example": "La Laguna"
                            },
                            "region": {
                              "type": "string",
                              "nullable": true,
                              "example": "Canarias"
                            },
                            "country": {
                              "type": "string",
                              "nullable": true,
                              "description": "ISO 3166-1 Alpha-2-Ländercode.",
                              "example": "ES"
                            },
                            "postal_code": {
                              "type": "string",
                              "nullable": true,
                              "example": "38108"
                            },
                            "address_type": {
                              "type": "string",
                              "nullable": true,
                              "example": "Avenida"
                            },
                            "formatted_address": {
                              "type": "string",
                              "nullable": true,
                              "description": "Kanonischer geokodierter Adress-String.",
                              "example": "Av. el Cardonal, 52, b, 38108 La Laguna, Santa Cruz de Tenerife, Spain"
                            },
                            "raw_results": {
                              "type": "object",
                              "additionalProperties": true,
                              "description": "Unverarbeitete Geocoding-Payload (`address_components`, `geometry.location`, `place_id`, …) für fortgeschrittene Nutzer."
                            },
                            "document_location": {
                              "type": "object",
                              "nullable": true,
                              "properties": {
                                "latitude": {
                                  "type": "number"
                                },
                                "longitude": {
                                  "type": "number"
                                }
                              },
                              "description": "Geocodierte Koordinaten der Dokumentadresse."
                            },
                            "label": {
                              "type": "string",
                              "nullable": true,
                              "description": "Aus welchem Dokumentenfeld die Adresse ausgelesen wurde.",
                              "example": "Spain Identity Card Address"
                            },
                            "is_verified": {
                              "type": "boolean",
                              "description": "Gibt an, ob die Geokodierung die Existenz der Adresse bestätigt hat."
                            },
                            "category": {
                              "type": "string",
                              "nullable": true,
                              "description": "Adresskategorie (z. B. `Residential`, `Commercial`).",
                              "example": "Residential"
                            }
                          }
                        },
                        "warnings": {
                          "type": "array",
                          "description": "Leer bei einer fehlerfreien Genehmigung. Jeder Eintrag erläutert ein erkanntes Risiko; Einträge mit `log_type: \"error\"` setzen `status` auf `Declined`, und `DOCUMENT_LIVENESS_NOT_COMPUTED` (`log_type: \"warning\"`) setzt ihn auf `In Review`.",
                          "items": {
                            "type": "object",
                            "properties": {
                              "risk": {
                                "type": "string",
                                "description": "Maschinenlesbarer Risiko-Code. Risiken, die immer zur Ablehnung führen: `DOCUMENT_EXPIRED`, `MINIMUM_AGE_NOT_MET`, `PORTRAIT_IMAGE_NOT_DETECTED`, `SCREEN_CAPTURE_DETECTED`, `PRINTED_COPY_DETECTED`, `PORTRAIT_MANIPULATION_DETECTED`, `PUBLIC_DOCUMENT_IMAGE_DETECTED`, `INVALID_DATE`, `COULD_NOT_RECOGNIZE_DOCUMENT` (nur 400, niemals eine Warnung), `DOCUMENT_NUMBER_NOT_DETECTED`, `COULD_NOT_DETECT_DOCUMENT_TYPE`, `NAME_NOT_DETECTED`, `DATE_OF_BIRTH_NOT_DETECTED`. Gesteuert über Anfrageoptionen: `MRZ_NOT_DETECTED` / `MRZ_VALIDATION_FAILED` (`invalid_mrz_action`), `DATA_INCONSISTENT` / `MRZ_AND_DATA_EXTRACTED_FROM_OCR_NOT_SAME` / `DOCUMENT_NAME_DIFFERENT_FROM_OTHER_APPROVED_DOCUMENTS` (`inconsistent_data_action`), `EXPIRATION_DATE_NOT_DETECTED` (`expiration_date_not_detected_action`). Andere Risiken (z. B. `POSSIBLE_DUPLICATED_USER`) sind rein informativ. `DOCUMENT_LIVENESS_NOT_COMPUTED` wird ausgelöst, wenn `perform_document_liveness=true` gesetzt ist, die Fälschungsprüfung jedoch keinen nutzbaren Wert zurückgegeben hat; dies setzt `status` auf `In Review`. `COULD_NOT_DETECT_DOCUMENT_TYPE` wird auch zurückgegeben, wenn die Vorderseite des Dokuments mit hoher Konfidenz keinem bekannten offiziellen Dokumentenmuster entspricht, beispielsweise bei einem bearbeiteten oder computergenerierten Dokument oder einem noch nicht unterstützten Muster.",
                                "example": "DOCUMENT_EXPIRED"
                              },
                              "feature": {
                                "type": "string",
                                "enum": [
                                  "ID_VERIFICATION"
                                ],
                                "description": "Funktion, die die Warnung ausgelöst hat. An diesem Endpoint immer `ID_VERIFICATION`."
                              },
                              "additional_data": {
                                "type": "object",
                                "nullable": true,
                                "additionalProperties": true,
                                "description": "Zusätzlicher Kontext für einige Risiken (z. B. enthält `POSSIBLE_DUPLICATED_USER` die `duplicated_session_id`); `null` für die meisten."
                              },
                              "log_type": {
                                "type": "string",
                                "enum": [
                                  "error",
                                  "warning",
                                  "information"
                                ],
                                "description": "Schweregrad. `error`-Warnungen setzen `status` auf `Declined`; `warning` (nur `DOCUMENT_LIVENESS_NOT_COMPUTED`, wenn die angeforderte Fälschungsprüfung keinen verwertbaren Wert geliefert hat) setzt `status` auf `In Review`; `information`-Einträge sind hinweisend und ändern den Status nie."
                              },
                              "short_description": {
                                "type": "string",
                                "description": "Für Menschen lesbare einzeilige Zusammenfassung des Risikos."
                              },
                              "long_description": {
                                "type": "string",
                                "description": "Lesbare Erklärung des Risikos."
                              }
                            }
                          }
                        },
                        "barcodes": {
                          "type": "array",
                          "description": "Aus dem Dokument dekodierte Barcodes (PDF417, QR, …). Leer, wenn das Dokument keine enthält oder keine gelesen werden konnten.",
                          "items": {
                            "type": "object",
                            "properties": {
                              "type": {
                                "type": "string",
                                "description": "Barcode-Typ (z. B. `PDF417`, `QR_CODE`, `UNKNOWN`)."
                              },
                              "position": {
                                "type": "object",
                                "nullable": true,
                                "additionalProperties": true,
                                "description": "Position des Barcodes im Bild, sofern verfügbar."
                              },
                              "data": {
                                "type": "string",
                                "description": "Dekodierte Payload."
                              },
                              "data_raw": {
                                "type": "string",
                                "description": "Unverarbeitete (nicht decodierte) Payload, sofern abweichend."
                              },
                              "side": {
                                "type": "string",
                                "nullable": true,
                                "description": "`front` oder `back`."
                              }
                            }
                          }
                        }
                      }
                    },
                    "vendor_data": {
                      "type": "string",
                      "nullable": true,
                      "description": "Rückgabe der von Ihnen gesendeten `vendor_data` oder `null`."
                    },
                    "metadata": {
                      "type": "object",
                      "nullable": true,
                      "additionalProperties": true,
                      "description": "Rückgabe des von Ihnen gesendeten `metadata`-Objekts oder `null`."
                    },
                    "created_at": {
                      "type": "string",
                      "format": "date-time",
                      "description": "ISO 8601-Zeitstempel (UTC), wann die Antwort generiert wurde."
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Validierungs- oder Verarbeitungsfehler. Probleme auf Feldebene geben das Standardantwortformat von DRF zurück (ein Array von Meldungen pro betroffenem Feld). Probleme mit verschlüsselten PDFs geben `{\"detail\": ...}` zurück. Ein Dokumentenbild, in dem überhaupt kein Dokument erkannt werden kann, gibt `{\"error\": \"COULD_NOT_RECOGNIZE_DOCUMENT\"}` zurück. PDF-Uploads können zusätzlich mit \"The submitted PDF file is corrupted or invalid.\" oder einem Fehler wegen fehlender Seiten fehlschlagen.",
            "content": {
              "application/json": {
                "examples": {
                  "Missing front image": {
                    "summary": "`front_image` ist nicht in den Formulardaten enthalten",
                    "value": {
                      "front_image": [
                        "No file was submitted."
                      ]
                    }
                  },
                  "Unsupported file extension": {
                    "summary": "Dateiendung außerhalb von tiff/jpg/jpeg/png/webp/pdf",
                    "value": {
                      "front_image": [
                        "File extension “txt” is not allowed. Allowed extensions are: tiff, jpg, jpeg, png, webp, pdf."
                      ]
                    }
                  },
                  "File too large": {
                    "summary": "Der Upload überschreitet das Limit von 10 MB",
                    "value": {
                      "front_image": [
                        "File size should not exceed 10 MB"
                      ]
                    }
                  },
                  "Invalid option value": {
                    "summary": "Optionen akzeptieren nur DECLINE oder NO_ACTION",
                    "value": {
                      "invalid_mrz_action": [
                        "\"REVIEW\" is not a valid choice."
                      ]
                    }
                  },
                  "Encrypted PDF": {
                    "summary": "PDF ohne das erforderliche Passwort hochgeladen",
                    "value": {
                      "detail": "The PDF is encrypted. Please upload a decrypted PDF or a photo instead."
                    }
                  },
                  "Wrong PDF password": {
                    "summary": "`front_image_password` / `back_image_password` entschlüsselt die PDF nicht",
                    "value": {
                      "detail": "The PDF password is incorrect. Please provide the correct password."
                    }
                  },
                  "Document not recognized": {
                    "summary": "Im Bild konnte kein Ausweisdokument erkannt werden",
                    "value": {
                      "error": "COULD_NOT_RECOGNIZE_DOCUMENT"
                    }
                  },
                  "PDF conversion failure": {
                    "summary": "Hochgeladene PDF-Datei konnte nicht in ein Bild konvertiert werden",
                    "value": {
                      "error": "Failed to convert front image PDF."
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Zugriff verweigert. Wird zurückgegeben, wenn der Header `x-api-key` fehlt sowie wenn das Guthaben der aufrufenden Organisation den Aufruf nicht decken kann; ein falscher, widerrufener oder abgelaufener Schlüssel gibt `401` zurück. Ein fehlender Schlüssel gibt `403` mit `{\"detail\": ...}` zurück; ein falscher, widerrufener oder abgelaufener Schlüssel gibt `401` zurück. Unzureichende Credits geben `403` mit `{\"error\": ...}` zurück, bevor eine Bildverarbeitung stattfindet.",
            "content": {
              "application/json": {
                "examples": {
                  "Missing or invalid API key": {
                    "summary": "Kein `x-api-key`-Header, oder der Schlüssel ist ungültig/widerrufen",
                    "value": {
                      "detail": "You do not have permission to perform this action."
                    }
                  },
                  "Not enough credits": {
                    "summary": "Das Guthaben der Organisation reicht für den Aufruf nicht aus",
                    "value": {
                      "error": "You don't have enough credits to perform this request. Please top up at https://business.didit.me"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate-Limit überschritten. POST/PATCH/DELETE-Endpoints teilen sich ein Budget von 300 Schreibanfragen pro Minute pro API-Schlüssel (Transaktionserstellungen und Ereignis-Ingestion haben ein separates Budget von 600). Die Antwort enthält die Header `X-RateLimit-Limit`, `X-RateLimit-Remaining`, `X-RateLimit-Reset` und `Retry-After`.",
            "content": {
              "application/json": {
                "examples": {
                  "Write rate limit exceeded": {
                    "summary": "Mehr als 300 Schreibanfragen in der aktuellen Minute",
                    "value": {
                      "detail": "Write request rate limit exceeded. You can make up to 300 requests per minute."
                    }
                  }
                },
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          },
          "503": {
            "$ref": "#/components/responses/DocumentProcessingBusy"
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "cURL",
            "source": "curl -X POST 'https://verification.didit.me/v3/id-verification/' \\\n  -H 'x-api-key: YOUR_API_KEY' \\\n  -F 'front_image=@./id_front.jpg' \\\n  -F 'back_image=@./id_back.jpg' \\\n  -F 'perform_document_liveness=true' \\\n  -F 'save_api_request=true' \\\n  -F 'vendor_data=user-123'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.id_verification.verify(\n    front_image=open(\"front_image.jpg\", \"rb\"),\n    back_image=open(\"back_image.jpg\", \"rb\"),\n    perform_document_liveness=True,\n    save_api_request=True,\n    vendor_data=\"user-123\",\n    metadata={\"flow\": \"onboarding\"},\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit, { fileFromPath } from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.idVerification.verify({\n  front_image: await fileFromPath(\"front_image.jpg\"),\n  back_image: await fileFromPath(\"back_image.jpg\"),\n  perform_document_liveness: true,\n  save_api_request: true,\n  vendor_data: \"user-123\",\n  metadata: { flow: \"onboarding\" },\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.IDVerification.Verify(ctx, didit.IDVerificationVerifyParams{\n\tFrontImage:              didit.FileFromPath(\"front_image.jpg\"),\n\tBackImage:               didit.Some(didit.FileFromPath(\"back_image.jpg\")),\n\tPerformDocumentLiveness: didit.Bool(true),\n\tSaveAPIRequest:          didit.Bool(true),\n\tVendorData:              didit.String(\"user-123\"),\n\tMetadata:                didit.Some(map[string]any{\"flow\": \"onboarding\"}),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import java.nio.file.Path;\nimport java.util.Map;\nimport me.didit.Didit;\nimport me.didit.types.IdVerificationVerifyParams;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.idVerification().verify(IdVerificationVerifyParams.builder()\n        .frontImage(Path.of(\"front_image.jpg\"))\n        .backImage(Path.of(\"back_image.jpg\"))\n        .performDocumentLiveness(true)\n        .saveApiRequest(true)\n        .vendorData(\"user-123\")\n        .metadata(Map.of(\"flow\", \"onboarding\"))\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\nuse Didit\\File;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->idVerification->verify([\n    'front_image' => File::fromPath('front_image.jpg'),\n    'back_image' => File::fromPath('back_image.jpg'),\n    'perform_document_liveness' => true,\n    'save_api_request' => true,\n    'vendor_data' => 'user-123',\n    'metadata' => ['flow' => 'onboarding'],\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.id_verification.verify(\n  front_image: Pathname(\"front_image.jpg\"),\n  back_image: Pathname(\"back_image.jpg\"),\n  perform_document_liveness: true,\n  save_api_request: true,\n  vendor_data: \"user-123\",\n  metadata: { flow: \"onboarding\" }\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Collections.Generic;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.IdVerification.VerifyAsync(new IdVerificationVerifyParams\n{\n    FrontImage = FileUpload.FromPath(\"front_image.jpg\"),\n    BackImage = FileUpload.FromPath(\"back_image.jpg\"),\n    PerformDocumentLiveness = true,\n    SaveApiRequest = true,\n    VendorData = \"user-123\",\n    Metadata = new Dictionary<string, object> { [\"flow\"] = \"onboarding\" },\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ]
      }
    },
    "/v3/face-match/": {
      "post": {
        "summary": "Gesichtsabgleich",
        "description": "Vergleichen Sie zwei Gesichtsbilder (1:1) und erhalten Sie einen Ähnlichkeits-`score` (0–100) sowie einen `status` von `Approved`/`Declined` zurück.\n\n**Funktionsweise.** Beide Bilder werden dekodiert und von einem biometrischen Modell analysiert (setzen Sie `rotate_image=true`, falls Aufnahmen seitlich oder auf dem Kopf stehen könnten), anschließend wird ein Ähnlichkeitswert zwischen den beiden Gesichtern berechnet. Ein Wert **strikt über** `face_match_score_decline_threshold` (Standardwert `30`) gibt `status: \"Approved\"` zurück; ein Wert gleich oder darunter gibt `Declined` mit einer `LOW_FACE_MATCH_SIMILARITY`-Warnung zurück. Wenn überhaupt kein Gesichtspaar bewertet werden kann, gibt der Aufruf dennoch `200` mit `status: \"Declined\"` und einer `NO_REFERENCE_IMAGE`-Warnung zurück – `score` ist auf dem standardmäßigen Speicherpfad `null` oder `0` bei `save_api_request=false`. Reichen Sie für beste Ergebnisse ein deutliches, nach vorne gerichtetes Gesicht pro Bild ein.\n\n**Abrechnung.** Jede `200`-Antwort verbraucht einen Gesichtsabgleich-API-Credit (bezahlt über Ihre Tarif-Credits oder Ihr aufgeladenes Guthaben). Reicht das Guthaben der Organisation für den Aufruf nicht aus, gibt der Endpoint vor jeder Bildverarbeitung `403` mit dem Fehler für unzureichendes Guthaben zurück.\n\n**Sitzungspersistenz (`save_api_request`, Standardwert `true`).** Wenn `true`, wird der Aufruf als Sitzung vom Typ API beibehalten: Er erscheint in der Business Console, die zurückgegebene `request_id` ist eine echte Sitzungs-ID, die Sie an `GET /v3/session/{sessionId}/decision/` übergeben können, beide Bilder werden als Quell-/Zielbilder für den Gesichtsabgleich der Sitzung gespeichert und ein `status.updated`-Webhook wird an Ihre konfigurierten Webhook-Endpoints gesendet. Wenn `false`, wird nichts gespeichert und `request_id` ist eine einmalige Korrelations-UUID, die später nicht nachgeschlagen werden kann.\n\n**Gesichtssuch-Index.** Dieser Endpoint nimmt niemals Gesichter in Ihren Gesichtssuch-Index auf und führt niemals Sperrlisten- oder Duplikatsprüfungen durch – verwenden Sie dafür `POST /v3/passive-liveness/` oder `POST /v3/face-search/`.\n\n**Sandbox.** Sandbox-API-Schlüssel überspringen die gesamte Verarbeitung und Abrechnung: Nach der Validierung der Anfrage (fehlerhafte Eingaben geben weiterhin `400` zurück) gibt der Endpoint eine statische `Approved`-Mock-Payload zurück, es wird keine Sitzung gespeichert und es werden keine Credits verbraucht.\n\n**Authentifizierung.** Senden Sie den API-Schlüssel Ihrer Anwendung im Header `x-api-key`. Fehlende oder ungültige Anmeldedaten geben `403` (`{\"detail\": \"You do not have permission to perform this action.\"}`) zurück – diese API gibt niemals `401` zurück.\n\n**Rate-Limit.** Geteiltes Schreibkontingent von 300 Anfragen/Min. pro API-Schlüssel über alle POST/PATCH/DELETE-Endpoints hinweg; bei Überschreitung wird `429` zurückgegeben.",
        "operationId": "post_v3face-match",
        "x-didit-sdk": {
          "resource": "face_match",
          "method": "compare",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Standalone APIs"
        ],
        "parameters": [],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "required": [
                  "user_image",
                  "ref_image"
                ],
                "properties": {
                  "user_image": {
                    "type": "string",
                    "format": "binary",
                    "description": "Zu verifizierendes Live- oder Kandidaten-Gesichtsbild (z. B. ein Selfie). Reichen Sie ein einzelnes frontales Foto ein, auf dem das Gesicht der Person deutlich sichtbar und gut ausgeleuchtet ist. Zulässige Dateiendungen: `tiff`, `jpg`, `jpeg`, `png`, `webp`. Maximale Upload-Größe: **5 MB** (größere Dateien werden mit `400` abgelehnt). Bilder werden vor der Verarbeitung automatisch auf ca. 0,5 MB komprimiert, daher verbessern sehr hohe Auflösungen die Genauigkeit nicht."
                  },
                  "ref_image": {
                    "type": "string",
                    "format": "binary",
                    "description": "Referenz-Gesichtsbild für den Abgleich (z. B. ein Ausweisdokument-Porträt oder ein zuvor registriertes Foto). Gleiche Format- und Größenbeschränkungen wie bei `user_image`."
                  },
                  "face_match_score_decline_threshold": {
                    "type": "number",
                    "format": "float",
                    "default": 30,
                    "minimum": 0,
                    "maximum": 100,
                    "description": "Ähnlichkeitsschwellenwert (0–100), der den `status` der Antwort steuert. Ein berechneter Wert **an oder unter** diesem Wert setzt `status` auf `Declined` und fügt eine `LOW_FACE_MATCH_SIMILARITY`-Warnung hinzu; ein Wert strikt darüber gibt `Approved` zurück. Der Standardwert `30` ist permissiv – erhöhen Sie ihn (z. B. auf `50`–`60`) für eine strengere Verifizierung. Werte außerhalb von 0–100 geben `400` zurück.",
                    "example": 50
                  },
                  "rotate_image": {
                    "type": "boolean",
                    "default": false,
                    "description": "Wenn `true`, testet der Dienst die Eingabebilder in 90-Grad-Schritten (0, 90, 180, 270) und verwendet die Ausrichtung, die die beste Gesichtserkennung liefert – nützlich für mobile Aufnahmen mit fehlender EXIF-Ausrichtung. Erhöht die Latenz, aktivieren Sie dies also nur, wenn Sie aufrechte Bilder nicht garantieren können.",
                    "example": false
                  },
                  "save_api_request": {
                    "type": "boolean",
                    "default": true,
                    "description": "Wenn `true` (Standard), wird der Aufruf als Sitzung vom Typ API persistent gespeichert — sichtbar in der Business Console, abrufbar über `GET /v3/session/{sessionId}/decision/` unter Verwendung der zurückgegebenen `request_id` und angekündigt über einen `status.updated`-Webhook. Wenn `false`, wird nichts gespeichert und `request_id` ist eine flüchtige UUID, die nur der Antwortkorrelation dient.",
                    "example": true
                  },
                  "vendor_data": {
                    "type": "string",
                    "description": "Optionale opake Zeichenfolge (Ihre interne Benutzer-ID, E-Mail, UUID…), die in der gespeicherten Sitzung hinterlegt und in der Antwort zurückgegeben wird. Verwenden Sie sie, um API-Aufrufe mit Ihren eigenen Datensätzen abzugleichen und Sitzungen später zu filtern.",
                    "example": "user-123"
                  },
                  "metadata": {
                    "type": "object",
                    "additionalProperties": true,
                    "description": "Optionales JSON-Objekt, das mit der Sitzung gespeichert (wenn `save_api_request=true`) und in der Antwort zurückgegeben wird. Senden Sie es bei Multipart-Anfragen als JSON-codiertes String-Feld (z. B. `metadata={\"flow\":\"login\"}`) – es wird in ein Objekt geparst.",
                    "example": {
                      "flow": "login",
                      "device_id": "abc123"
                    }
                  }
                }
              },
              "example": {
                "user_image": "(binary JPEG/PNG of the live selfie)",
                "ref_image": "(binary JPEG/PNG of the reference photo)",
                "face_match_score_decline_threshold": 50,
                "rotate_image": false,
                "save_api_request": true,
                "vendor_data": "user-123",
                "metadata": {
                  "flow": "login"
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Gesichtsabgleich wurde berechnet. `face_match.score` ist eine Gleitkommazahl von 0–100 (zwei Nachkommastellen); `status` ist `Approved`, wenn der Wert strikt über `face_match_score_decline_threshold` liegt, andernfalls `Declined` mit einer erläuternden Warnung. Ein Paar mit geringer Ähnlichkeit oder ohne Bewertungsmöglichkeit gibt dennoch `200` zurück – prüfen Sie `face_match.status` und `face_match.warnings`, nicht nur den HTTP-Code. Wenn `save_api_request=true`, ist `request_id` die persistierte Sitzungs-ID.",
            "content": {
              "application/json": {
                "examples": {
                  "Approved": {
                    "summary": "Gleiche Person — Score über dem Schwellenwert",
                    "value": {
                      "request_id": "f9f5a777-8002-44c6-baaf-128bcfd6e226",
                      "face_match": {
                        "status": "Approved",
                        "score": 99.41,
                        "user_image": {
                          "entities": [
                            {
                              "bbox": [
                                661,
                                728,
                                1688,
                                2188
                              ],
                              "confidence": 0.732973,
                              "age": 26.91,
                              "gender": "male",
                              "race": null
                            }
                          ],
                          "best_angle": 0
                        },
                        "ref_image": {
                          "entities": [
                            {
                              "bbox": [
                                653,
                                745,
                                1691,
                                2185
                              ],
                              "confidence": 0.722082,
                              "age": 27.0,
                              "gender": "male",
                              "race": null
                            }
                          ],
                          "best_angle": 0
                        },
                        "warnings": []
                      },
                      "vendor_data": "user-123",
                      "metadata": {
                        "flow": "login"
                      },
                      "created_at": "2026-06-12T01:04:42.763237+00:00"
                    }
                  },
                  "Declined - low similarity": {
                    "summary": "Score auf oder unter dem Schwellenwert für Ablehnung",
                    "value": {
                      "request_id": "7cdda24e-311a-46d3-a3bb-e5d9b564ce73",
                      "face_match": {
                        "status": "Declined",
                        "score": 24.87,
                        "user_image": {
                          "entities": [
                            {
                              "bbox": [
                                661,
                                728,
                                1688,
                                2188
                              ],
                              "confidence": 0.732973,
                              "age": 26.91,
                              "gender": "male",
                              "race": null
                            }
                          ],
                          "best_angle": 0
                        },
                        "ref_image": {
                          "entities": [
                            {
                              "bbox": [
                                156,
                                234,
                                679,
                                898
                              ],
                              "confidence": 0.717775,
                              "age": 41.2,
                              "gender": "male",
                              "race": null
                            }
                          ],
                          "best_angle": 0
                        },
                        "warnings": [
                          {
                            "risk": "LOW_FACE_MATCH_SIMILARITY",
                            "feature": "FACEMATCH",
                            "additional_data": null,
                            "log_type": "error",
                            "short_description": "Low face match similarity",
                            "long_description": "The facial features of the provided image don't closely match the reference image, suggesting a potential identity mismatch."
                          }
                        ]
                      },
                      "vendor_data": "user-123",
                      "metadata": null,
                      "created_at": "2026-06-12T01:08:19.859116+00:00"
                    }
                  }
                },
                "schema": {
                  "type": "object",
                  "properties": {
                    "request_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "Beibehaltene Sitzungs-ID, wenn `save_api_request=true` (verwendbar mit `GET /v3/session/{sessionId}/decision/`); andernfalls eine vorübergehende Korrelations-UUID."
                    },
                    "face_match": {
                      "type": "object",
                      "properties": {
                        "status": {
                          "type": "string",
                          "enum": [
                            "Approved",
                            "Declined"
                          ],
                          "description": "`Approved`, wenn der Ähnlichkeitswert strikt über `face_match_score_decline_threshold` liegt und ein Wert berechnet werden konnte; andernfalls `Declined` (eine Warnung erklärt den Grund)."
                        },
                        "score": {
                          "type": "number",
                          "format": "float",
                          "nullable": true,
                          "minimum": 0,
                          "maximum": 100,
                          "description": "Ähnlichkeitswert von 0 bis 100 – die Konfidenz des Modells, dass beide Bilder dieselbe Person darstellen. Wird nur auf zwei Dezimalstellen gerundet, wenn `save_api_request` true ist; bei `save_api_request=false` wird der unverarbeitete Float-Wert zurückgegeben. `null`, wenn kein Gesichtspaar bewertet werden konnte (bei der Standardeinstellung `save_api_request=true`); bei `save_api_request=false` kann dieselbe Bedingung als `score: 0` erscheinen. In beiden Fällen ist eine `NO_REFERENCE_IMAGE`-Warnung vorhanden und `status` ist `Declined`.",
                          "example": 99.41
                        },
                        "user_image": {
                          "type": "object",
                          "description": "Gesichtserkennungsergebnisse für die analysierten Bilder.",
                          "properties": {
                            "entities": {
                              "type": "array",
                              "items": {
                                "type": "object",
                                "properties": {
                                  "bbox": {
                                    "type": "array",
                                    "items": {
                                      "type": "integer"
                                    },
                                    "minItems": 4,
                                    "maxItems": 4,
                                    "description": "Bounding-Box des erkannten Gesichts als Pixelkoordinaten `[x_min, y_min, x_max, y_max]` im verarbeiteten Bild.",
                                    "example": [
                                      661,
                                      728,
                                      1688,
                                      2188
                                    ]
                                  },
                                  "confidence": {
                                    "type": "number",
                                    "format": "float",
                                    "minimum": 0,
                                    "maximum": 1,
                                    "description": "Konfidenz der Gesichtserkennung (0–1).",
                                    "example": 0.732973
                                  },
                                  "age": {
                                    "type": "number",
                                    "format": "float",
                                    "description": "Vom Modell geschätztes Alter des erkannten Gesichts in Jahren. Dient nur zur Information — hat keinen Einfluss auf die Entscheidung des Gesichtsabgleichs.",
                                    "example": 26.91
                                  },
                                  "gender": {
                                    "type": "string",
                                    "description": "Vom Modell vorhergesagtes Geschlecht des erkannten Gesichts (`male` oder `female`). Dient nur zur Information.",
                                    "example": "male"
                                  },
                                  "race": {
                                    "type": "string",
                                    "nullable": true,
                                    "description": "Reserviertes Feld — in Antworten dieses Endpoints immer `null`.",
                                    "example": null
                                  }
                                }
                              },
                              "description": "Ein Eintrag pro erkanntem Gesicht."
                            },
                            "best_angle": {
                              "type": "integer",
                              "description": "Drehung (Grad: 0, 90, 180 oder 270), die die beste Gesichtserkennung lieferte. Nur ungleich null, wenn `rotate_image=true` die Ausrichtung korrigiert hat.",
                              "example": 0
                            }
                          }
                        },
                        "ref_image": {
                          "type": "object",
                          "description": "Gesichtserkennungsergebnisse für das Referenzbild, gleiche Struktur wie `user_image`.",
                          "properties": {
                            "entities": {
                              "type": "array",
                              "items": {
                                "type": "object",
                                "properties": {
                                  "bbox": {
                                    "type": "array",
                                    "items": {
                                      "type": "integer"
                                    },
                                    "minItems": 4,
                                    "maxItems": 4,
                                    "description": "Bounding-Box des erkannten Gesichts als Pixelkoordinaten `[x_min, y_min, x_max, y_max]` im verarbeiteten Bild.",
                                    "example": [
                                      661,
                                      728,
                                      1688,
                                      2188
                                    ]
                                  },
                                  "confidence": {
                                    "type": "number",
                                    "format": "float",
                                    "minimum": 0,
                                    "maximum": 1,
                                    "description": "Konfidenz der Gesichtserkennung (0–1).",
                                    "example": 0.732973
                                  },
                                  "age": {
                                    "type": "number",
                                    "format": "float",
                                    "description": "Vom Modell geschätztes Alter des erkannten Gesichts in Jahren. Dient nur zur Information — hat keinen Einfluss auf die Entscheidung des Gesichtsabgleichs.",
                                    "example": 26.91
                                  },
                                  "gender": {
                                    "type": "string",
                                    "description": "Vom Modell vorhergesagtes Geschlecht des erkannten Gesichts (`male` oder `female`). Dient nur zur Information.",
                                    "example": "male"
                                  },
                                  "race": {
                                    "type": "string",
                                    "nullable": true,
                                    "description": "Reserviertes Feld — in Antworten dieses Endpoints immer `null`.",
                                    "example": null
                                  }
                                }
                              },
                              "description": "Ein Eintrag pro erkanntem Gesicht."
                            },
                            "best_angle": {
                              "type": "integer",
                              "example": 0
                            }
                          }
                        },
                        "warnings": {
                          "type": "array",
                          "description": "Leer bei einer fehlerfreien Genehmigung. `NO_REFERENCE_IMAGE` (`error`) — es konnte kein Gesichtspaar bewertet werden; `LOW_FACE_MATCH_SIMILARITY` (`error`) — Wert liegt bei oder unter dem Ablehnungsschwellenwert. Jeder dieser Fälle setzt `status` auf `Declined`.",
                          "items": {
                            "type": "object",
                            "properties": {
                              "risk": {
                                "type": "string",
                                "enum": [
                                  "NO_REFERENCE_IMAGE",
                                  "LOW_FACE_MATCH_SIMILARITY"
                                ],
                                "description": "Maschinenlesbarer Risiko-Code."
                              },
                              "feature": {
                                "type": "string",
                                "enum": [
                                  "FACEMATCH"
                                ],
                                "description": "Funktion, die die Warnung ausgelöst hat. An diesem Endpoint immer `FACEMATCH`."
                              },
                              "additional_data": {
                                "type": "object",
                                "nullable": true,
                                "additionalProperties": true,
                                "description": "Für Gesichtsabgleich-Warnungen immer `null`."
                              },
                              "log_type": {
                                "type": "string",
                                "enum": [
                                  "error",
                                  "warning",
                                  "information"
                                ],
                                "description": "Schweregrad. `error`-Warnungen setzen `status` auf `Declined`; `warning`- und `information`-Einträge sind hinweisend und führen für sich allein nie zu einer Ablehnung."
                              },
                              "short_description": {
                                "type": "string",
                                "description": "Für Menschen lesbare einzeilige Zusammenfassung des Risikos."
                              },
                              "long_description": {
                                "type": "string",
                                "description": "Lesbare Erklärung des Risikos."
                              }
                            }
                          }
                        }
                      }
                    },
                    "vendor_data": {
                      "type": "string",
                      "nullable": true,
                      "description": "Rückgabe der von Ihnen gesendeten `vendor_data` oder `null`."
                    },
                    "metadata": {
                      "type": "object",
                      "nullable": true,
                      "additionalProperties": true,
                      "description": "Rückgabe des von Ihnen gesendeten `metadata`-Objekts oder `null`."
                    },
                    "created_at": {
                      "type": "string",
                      "format": "date-time",
                      "description": "ISO 8601-Zeitstempel (UTC), wann die Antwort generiert wurde, z. B. `2026-06-12T01:04:42.763237+00:00`."
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Validierungsfehler. Wird zurückgegeben, wenn ein erforderliches Bild fehlt, 5 MB überschreitet, eine nicht unterstützte Dateiendung hat oder eine Option außerhalb des zulässigen Bereichs liegt. Der Body ist die standardmäßige Feld-Fehler-Envelope von DRF: ein Array von Meldungen pro betroffenem Feld.",
            "content": {
              "application/json": {
                "examples": {
                  "Missing required image": {
                    "summary": "`ref_image` (oder `user_image`) nicht in den Formulardaten enthalten",
                    "value": {
                      "ref_image": [
                        "No file was submitted."
                      ]
                    }
                  },
                  "Unsupported file extension": {
                    "summary": "Dateiendung außerhalb von tiff/jpg/jpeg/png/webp",
                    "value": {
                      "user_image": [
                        "File extension “txt” is not allowed. Allowed extensions are: tiff, jpg, jpeg, png, webp."
                      ]
                    }
                  },
                  "File too large": {
                    "summary": "Der Upload überschreitet das Limit von 5 MB",
                    "value": {
                      "user_image": [
                        "File size should not exceed 5 MB"
                      ]
                    }
                  },
                  "Threshold out of range": {
                    "summary": "`face_match_score_decline_threshold` liegt außerhalb von 0–100",
                    "value": {
                      "face_match_score_decline_threshold": [
                        "Ensure this value is less than or equal to 100."
                      ]
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Zugriff verweigert. Wird zurückgegeben, wenn der Header `x-api-key` fehlt sowie wenn das Guthaben der aufrufenden Organisation den Aufruf nicht decken kann; ein falscher, widerrufener oder abgelaufener Schlüssel gibt `401` zurück. Ein fehlender Schlüssel gibt `403` mit `{\"detail\": ...}` zurück; ein falscher, widerrufener oder abgelaufener Schlüssel gibt `401` zurück. Unzureichende Credits geben `403` mit `{\"error\": ...}` zurück, bevor eine Bildverarbeitung stattfindet.",
            "content": {
              "application/json": {
                "examples": {
                  "Missing or invalid API key": {
                    "summary": "Kein `x-api-key`-Header, oder der Schlüssel ist ungültig/widerrufen",
                    "value": {
                      "detail": "You do not have permission to perform this action."
                    }
                  },
                  "Not enough credits": {
                    "summary": "Das Guthaben der Organisation reicht für den Aufruf nicht aus",
                    "value": {
                      "error": "You don't have enough credits to perform this request. Please top up at https://business.didit.me"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate-Limit überschritten. POST/PATCH/DELETE-Endpoints teilen sich ein Budget von 300 Schreibanfragen pro Minute pro API-Schlüssel (Transaktionserstellungen und Ereignis-Ingestion haben ein separates Budget von 600). Die Antwort enthält die Header `X-RateLimit-Limit`, `X-RateLimit-Remaining`, `X-RateLimit-Reset` und `Retry-After`.",
            "content": {
              "application/json": {
                "examples": {
                  "Write rate limit exceeded": {
                    "summary": "Mehr als 300 Schreibanfragen in der aktuellen Minute",
                    "value": {
                      "detail": "Write request rate limit exceeded. You can make up to 300 requests per minute."
                    }
                  }
                },
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "cURL",
            "source": "curl -X POST 'https://verification.didit.me/v3/face-match/' \\\n  -H 'x-api-key: YOUR_API_KEY' \\\n  -F 'user_image=@./selfie.jpg' \\\n  -F 'ref_image=@./id_portrait.jpg' \\\n  -F 'face_match_score_decline_threshold=50' \\\n  -F 'save_api_request=true' \\\n  -F 'vendor_data=user-123'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.face_match.compare(\n    user_image=open(\"user_image.jpg\", \"rb\"),\n    ref_image=open(\"ref_image.jpg\", \"rb\"),\n    face_match_score_decline_threshold=50.0,\n    rotate_image=False,\n    save_api_request=True,\n    vendor_data=\"user-123\",\n    metadata={\"flow\": \"login\"},\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit, { fileFromPath } from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.faceMatch.compare({\n  user_image: await fileFromPath(\"user_image.jpg\"),\n  ref_image: await fileFromPath(\"ref_image.jpg\"),\n  face_match_score_decline_threshold: 50.0,\n  rotate_image: false,\n  save_api_request: true,\n  vendor_data: \"user-123\",\n  metadata: { flow: \"login\" },\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.FaceMatch.Compare(ctx, didit.FaceMatchCompareParams{\n\tUserImage:                      didit.FileFromPath(\"user_image.jpg\"),\n\tRefImage:                       didit.FileFromPath(\"ref_image.jpg\"),\n\tFaceMatchScoreDeclineThreshold: didit.Float(50.0),\n\tRotateImage:                    didit.Bool(false),\n\tSaveAPIRequest:                 didit.Bool(true),\n\tVendorData:                     didit.String(\"user-123\"),\n\tMetadata:                       didit.Some(map[string]any{\"flow\": \"login\"}),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import java.nio.file.Path;\nimport java.util.Map;\nimport me.didit.Didit;\nimport me.didit.types.FaceMatchCompareParams;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.faceMatch().compare(FaceMatchCompareParams.builder()\n        .userImage(Path.of(\"user_image.jpg\"))\n        .refImage(Path.of(\"ref_image.jpg\"))\n        .faceMatchScoreDeclineThreshold(50.0)\n        .rotateImage(false)\n        .saveApiRequest(true)\n        .vendorData(\"user-123\")\n        .metadata(Map.of(\"flow\", \"login\"))\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\nuse Didit\\File;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->faceMatch->compare([\n    'user_image' => File::fromPath('user_image.jpg'),\n    'ref_image' => File::fromPath('ref_image.jpg'),\n    'face_match_score_decline_threshold' => 50.0,\n    'rotate_image' => false,\n    'save_api_request' => true,\n    'vendor_data' => 'user-123',\n    'metadata' => ['flow' => 'login'],\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.face_match.compare(\n  user_image: Pathname(\"user_image.jpg\"),\n  ref_image: Pathname(\"ref_image.jpg\"),\n  face_match_score_decline_threshold: 50.0,\n  rotate_image: false,\n  save_api_request: true,\n  vendor_data: \"user-123\",\n  metadata: { flow: \"login\" }\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Collections.Generic;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.FaceMatch.CompareAsync(new FaceMatchCompareParams\n{\n    UserImage = FileUpload.FromPath(\"user_image.jpg\"),\n    RefImage = FileUpload.FromPath(\"ref_image.jpg\"),\n    FaceMatchScoreDeclineThreshold = 50.0,\n    RotateImage = false,\n    SaveApiRequest = true,\n    VendorData = \"user-123\",\n    Metadata = new Dictionary<string, object> { [\"flow\"] = \"login\" },\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ]
      }
    },
    "/v3/age-estimation/": {
      "post": {
        "summary": "Altersschätzung (Gesichtsalter + passive Liveness)",
        "description": "Schätzen Sie das Alter einer Person anhand eines einzelnen Gesichtsfotos und führen Sie im selben Aufruf eine passive Liveness-Prüfung durch — gibt die vom Modell vorhergesagte `age_estimation` (in Jahren), einen Liveness-`score` (0–100) und einen `status` von `Approved`/`Declined` zurück. Das Alter wird **vom Modell anhand des Gesichts vorhergesagt und nicht anhand eines Dokuments verifiziert** — nutzen Sie es für Altersgrenzen und reibungsarme Prüfungen, nicht als rechtlichen Altersnachweis.\n\n**So funktioniert es.** Das Bild wird auf Gesichter analysiert (setzen Sie `rotate_image=true`, falls Aufnahmen seitlich oder auf dem Kopf stehen können); jedes erkannte Gesicht erhält ein geschätztes Alter, und das größte Gesicht im Bildausschnitt bestimmt `age_estimation`. Parallel dazu bewertet ein passives Liveness-Modell, ob das Foto eine lebende Person zeigt (keine Benutzerinteraktion erforderlich), und erkennt Präsentationsangriffe (Fotos von Fotos, Bildschirme, Masken). Reichen Sie für optimale Ergebnisse ein klares, nach vorne gerichtetes und gut beleuchtetes Gesicht pro Bild ein.\n\n**Entscheidungslogik.** Jede Warnung führt zu einer Ablehnung: `status` ist nur dann `Approved`, wenn das Array `warnings` leer ist. Ein Liveness-`score` bei oder unter `face_liveness_score_decline_threshold` (Standardwert `30`) fügt `LOW_LIVENESS_SCORE` hinzu; ein erkannter Angriff fügt `LIVENESS_FACE_ATTACK` hinzu; wird vom Liveness-Modell kein Gesicht gefunden, wird `NO_FACE_DETECTED` hinzugefügt; kann kein Gesichtsalter geschätzt werden, wird `AGE_NOT_DETECTED` hinzugefügt (`age_estimation` ist `null`); ein geschätztes Alter unter `age_estimation_decline_threshold` (Standardwert `18`) fügt `AGE_BELOW_MINIMUM` hinzu. Bei Grenzwerten nahe Ihrem Schwellenwert empfiehlt sich ein Fallback auf eine dokumentenbasierte Verifizierung — die Fehlerrate des Modells steigt bei Gesichtern nahe der Grenze.\n\n**Abrechnung.** Jede `200`-Antwort verbraucht einen API-Credit für die Altersschätzung (abgerechnet über Ihren Tarif-Credit oder Ihr Aufladeguthaben). Reicht das Guthaben der Organisation nicht aus, um den Aufruf zu decken, gibt der Endpoint vor jeglicher Bildverarbeitung den Fehler `403` für unzureichendes Guthaben zurück.\n\n**Sitzungspersistenz (`save_api_request`, Standardwert `true`).** Wenn `true`, wird der Aufruf als Sitzung vom Typ API gespeichert: Er erscheint in der Business Console, die zurückgegebene `request_id` ist eine echte Sitzungs-ID, die Sie an `GET /v3/session/{sessionId}/decision/` übergeben können (das Ergebnis wird dort in `liveness_checks[]` mit `features: [\"AGE_ESTIMATION\"]` bereitgestellt), der Gesichtsausschnitt und das Referenzbild werden gespeichert, das Gesichts-Embedding wird zum Gesichtsindex Ihrer Anwendung hinzugefügt (genutzt für die Gesichtssuche und Duplikaterkennung) und ein `status.updated`-Webhook wird ausgelöst. Wenn `false`, wird nichts gespeichert und `request_id` ist eine einmalige Korrelations-UUID, die später nicht abgerufen werden kann.\n\n**Sandbox.** Sandbox-API-Schlüssel überspringen jegliche Verarbeitung und Abrechnung: Nach der Validierung der Anfrage (fehlerhafte Eingaben geben weiterhin `400` zurück) gibt der Endpoint eine statische `Approved`-Mock-Payload zurück (`age_estimation: 30`, keine Warnungen), es wird keine Sitzung gespeichert und es werden keine Credits verbraucht.\n\n**Authentifizierung.** Senden Sie den API-Schlüssel Ihrer Anwendung im `x-api-key`-Header. Fehlende oder ungültige Anmeldedaten geben `403` zurück (`{\"detail\": \"You do not have permission to perform this action.\"}`) — diese API gibt niemals `401` zurück.\n\n**Rate-Limit.** Geteiltes Schreibkontingent von 300 Anfragen/Min pro API-Schlüssel über alle POST/PATCH/DELETE-Endpoints hinweg; bei Überschreitung wird `429` zurückgegeben.",
        "operationId": "post_v3age-estimation",
        "x-didit-sdk": {
          "resource": "age_estimation",
          "method": "estimate",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Standalone APIs"
        ],
        "parameters": [],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "required": [
                  "user_image"
                ],
                "properties": {
                  "user_image": {
                    "type": "string",
                    "format": "binary",
                    "description": "Zu analysierendes Gesichtsfoto (z. B. ein Selfie). Reichen Sie ein einzelnes Foto von vorne ein, auf dem das Gesicht der Person deutlich sichtbar und gut ausgeleuchtet ist. Zulässige Dateiendungen: `tiff`, `jpg`, `jpeg`, `png`, `webp` (kein PDF). Maximale Upload-Größe: **5 MB** (größere Dateien werden mit `400` abgelehnt). Bilder werden vor der Verarbeitung automatisch auf ca. 0,3 MB komprimiert, sodass sehr hohe Auflösungen die Genauigkeit nicht verbessern."
                  },
                  "face_liveness_score_decline_threshold": {
                    "type": "number",
                    "format": "float",
                    "default": 30,
                    "minimum": 0,
                    "maximum": 100,
                    "description": "Liveness-Schwellenwert (0–100). Ein Liveness-`score` **bei oder unter** diesem Wert fügt eine `LOW_LIVENESS_SCORE`-Warnung hinzu und lehnt ab. Erhöhen Sie ihn für eine strengere Spoofing-Abwehr; Werte außerhalb von 0–100 geben `400` zurück.",
                    "example": 30
                  },
                  "age_estimation_decline_threshold": {
                    "type": "integer",
                    "default": 18,
                    "minimum": 0,
                    "maximum": 100,
                    "description": "Mindestwert für das geschätzte Alter in Jahren. Ein geschätztes Alter **unter** diesem Wert fügt eine `AGE_BELOW_MINIMUM`-Warnung hinzu und führt zur Ablehnung. Setzen Sie den Wert auf `0`, um die Altersprüfung zu deaktivieren (der Aufruf führt dann nur Liveness-Erkennung + Altersschätzung ohne altersbasierte Entscheidung durch).",
                    "example": 18
                  },
                  "rotate_image": {
                    "type": "boolean",
                    "default": false,
                    "description": "Wenn `true`, testet der Dienst das Eingabebild in 90-Grad-Schritten (0, 90, 180, 270) und verwendet die Ausrichtung, die die beste Gesichtserkennung liefert – nützlich für mobile Aufnahmen mit fehlender EXIF-Ausrichtung. Erhöht die Latenz, aktivieren Sie dies also nur, wenn Sie aufrechte Bilder nicht garantieren können.",
                    "example": false
                  },
                  "save_api_request": {
                    "type": "boolean",
                    "default": true,
                    "description": "Wenn `true` (Standard), wird der Aufruf als Sitzung vom Typ API persistent gespeichert — sichtbar in der Business Console, abrufbar über `GET /v3/session/{sessionId}/decision/` unter Verwendung der zurückgegebenen `request_id`, angekündigt über einen `status.updated`-Webhook und mit dem erkannten Gesicht zum Gesichtsindex Ihrer Anwendung hinzugefügt. Wenn `false`, wird nichts gespeichert und `request_id` ist eine flüchtige UUID, die nur der Antwortkorrelation dient.",
                    "example": true
                  },
                  "vendor_data": {
                    "type": "string",
                    "description": "Optionale opake Zeichenfolge (Ihre interne Benutzer-ID, E-Mail, UUID…), die in der gespeicherten Sitzung hinterlegt und in der Antwort zurückgegeben wird. Verwenden Sie sie, um API-Aufrufe mit Ihren eigenen Datensätzen abzugleichen und Sitzungen später zu filtern.",
                    "example": "user-123"
                  },
                  "metadata": {
                    "type": "object",
                    "additionalProperties": true,
                    "description": "Optionales JSON-Objekt, das mit der Sitzung gespeichert (wenn `save_api_request=true`) und in der Antwort zurückgegeben wird. Senden Sie es bei Multipart-Anfragen als JSON-codiertes String-Feld (z. B. `metadata={\"flow\":\"age-gate\"}`) – es wird in ein Objekt geparst.",
                    "example": {
                      "flow": "age-gate"
                    }
                  }
                }
              },
              "example": {
                "user_image": "(binary JPEG/PNG of the selfie)",
                "face_liveness_score_decline_threshold": 30,
                "age_estimation_decline_threshold": 18,
                "rotate_image": false,
                "save_api_request": true,
                "vendor_data": "user-123",
                "metadata": {
                  "flow": "age-gate"
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Altersschätzung und passive Liveness abgeschlossen. `age_estimation.age_estimation` ist das vom Modell vorhergesagte Alter in Jahren des größten erkannten Gesichts (`null`, falls keines vorhanden); `age_estimation.score` ist der Score für passive Liveness (0–100); `status` ist nur dann `Approved`, wenn `warnings` leer ist. Eine Erfassung einer minderjährigen Person oder ein Spoofing gibt dennoch `200` mit `status: \"Declined\"` zurück – prüfen Sie den Body, nicht nur den HTTP-Code. Wenn `save_api_request=true`, ist `request_id` die persistierte Sitzungs-ID.",
            "content": {
              "application/json": {
                "examples": {
                  "Approved": {
                    "summary": "Live-Gesicht eines Erwachsenen – beide Prüfungen bestanden",
                    "value": {
                      "request_id": "0c40ba43-64ab-4e2e-b4b8-7d1f12f81bc1",
                      "age_estimation": {
                        "status": "Approved",
                        "method": "PASSIVE",
                        "score": 97.5,
                        "user_image": {
                          "entities": [
                            {
                              "age": 27.33,
                              "bbox": [
                                40,
                                40,
                                100,
                                100
                              ],
                              "confidence": 0.7177750468254089,
                              "gender": "male"
                            }
                          ],
                          "best_angle": 0
                        },
                        "age_estimation": 27.33,
                        "warnings": []
                      },
                      "vendor_data": "user-123",
                      "metadata": {
                        "flow": "age-gate"
                      },
                      "created_at": "2026-06-12T02:24:11.512941+00:00"
                    }
                  },
                  "Declined - age below threshold": {
                    "summary": "Geschätztes Alter unter `age_estimation_decline_threshold`",
                    "value": {
                      "request_id": "9be41a6f-2f4e-4f57-92f4-b3a4f6f0a1c2",
                      "age_estimation": {
                        "status": "Declined",
                        "method": "PASSIVE",
                        "score": 95.0,
                        "user_image": {
                          "entities": [
                            {
                              "age": 16.5,
                              "bbox": [
                                40,
                                40,
                                100,
                                100
                              ],
                              "confidence": 0.7177750468254089,
                              "gender": "female"
                            }
                          ],
                          "best_angle": 0
                        },
                        "age_estimation": 16.5,
                        "warnings": [
                          {
                            "risk": "AGE_BELOW_MINIMUM",
                            "feature": "LIVENESS",
                            "additional_data": null,
                            "log_type": "error",
                            "short_description": "Age below minimum",
                            "long_description": "The age of the face is below the minimum age threshold for the application."
                          }
                        ]
                      },
                      "vendor_data": "user-123",
                      "metadata": null,
                      "created_at": "2026-06-12T02:26:40.118332+00:00"
                    }
                  },
                  "Declined - liveness too low": {
                    "summary": "Liveness-Score liegt bei oder unter dem Ablehnungsschwellenwert (möglicher Spoof)",
                    "value": {
                      "request_id": "5f6f2f1f-7c4f-43b9-8d62-0a8f4c2d9e77",
                      "age_estimation": {
                        "status": "Declined",
                        "method": "PASSIVE",
                        "score": 5.0,
                        "user_image": {
                          "entities": [
                            {
                              "age": 25.0,
                              "bbox": [
                                40,
                                40,
                                100,
                                100
                              ],
                              "confidence": 0.7177750468254089,
                              "gender": "male"
                            }
                          ],
                          "best_angle": 0
                        },
                        "age_estimation": 25.0,
                        "warnings": [
                          {
                            "risk": "LOW_LIVENESS_SCORE",
                            "feature": "LIVENESS",
                            "additional_data": null,
                            "log_type": "error",
                            "short_description": "Low liveness score",
                            "long_description": "The liveness check resulted in a low score, indicating potential use of non-live facial representations or poor-quality biometric data."
                          }
                        ]
                      },
                      "vendor_data": "user-123",
                      "metadata": null,
                      "created_at": "2026-06-12T02:27:02.901547+00:00"
                    }
                  }
                },
                "schema": {
                  "type": "object",
                  "properties": {
                    "request_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "Beibehaltene Sitzungs-ID, wenn `save_api_request=true` (verwendbar mit `GET /v3/session/{sessionId}/decision/`); andernfalls eine vorübergehende Korrelations-UUID."
                    },
                    "age_estimation": {
                      "type": "object",
                      "properties": {
                        "status": {
                          "type": "string",
                          "enum": [
                            "Approved",
                            "Declined"
                          ],
                          "description": "`Approved`, wenn keine Warnungen ausgegeben wurden; andernfalls `Declined` (jede Warnung, die dieser Endpoint erzeugt, führt zu einer Ablehnung)."
                        },
                        "method": {
                          "type": "string",
                          "enum": [
                            "PASSIVE"
                          ],
                          "description": "Liveness-Methode. An diesem Endpoint immer `PASSIVE` (Einzelbild, keine Benutzeraufforderung)."
                        },
                        "score": {
                          "type": "number",
                          "format": "float",
                          "nullable": true,
                          "minimum": 0,
                          "maximum": 100,
                          "description": "Passiver Liveness-Score von 0 bis 100 – der Konfidenzwert des Modells, dass das Foto eine lebende Person zeigt. Wird mit `face_liveness_score_decline_threshold` verglichen; bei oder unter diesem Wert wird der Aufruf mit `LOW_LIVENESS_SCORE` abgelehnt. `null`, wenn das Liveness-Modell keinen Konfidenzwert zurückgibt – der Aufruf wird dennoch mit `LOW_LIVENESS_SCORE` abgelehnt, da null beim Schwellenwertvergleich wie 0 behandelt wird.",
                          "example": 97.5
                        },
                        "user_image": {
                          "type": "object",
                          "description": "Gesichtserkennungsergebnisse für das analysierte Bild.",
                          "properties": {
                            "entities": {
                              "type": "array",
                              "description": "Ein Eintrag pro erkanntem Gesicht. Leer, wenn kein Gesicht gefunden wurde (dann ist `age_estimation` gleich `null` und es wird eine `AGE_NOT_DETECTED`-Warnung hinzugefügt).",
                              "items": {
                                "type": "object",
                                "properties": {
                                  "age": {
                                    "type": "number",
                                    "format": "float",
                                    "description": "Vom Modell geschätztes Alter dieses Gesichts in Jahren.",
                                    "example": 27.33
                                  },
                                  "bbox": {
                                    "type": "array",
                                    "items": {
                                      "type": "integer"
                                    },
                                    "minItems": 4,
                                    "maxItems": 4,
                                    "description": "Bounding-Box des erkannten Gesichts als Pixelkoordinaten `[x_min, y_min, x_max, y_max]` im verarbeiteten Bild.",
                                    "example": [
                                      40,
                                      40,
                                      100,
                                      100
                                    ]
                                  },
                                  "confidence": {
                                    "type": "number",
                                    "format": "float",
                                    "minimum": 0,
                                    "maximum": 1,
                                    "description": "Konfidenz der Gesichtserkennung (0–1).",
                                    "example": 0.7177750468254089
                                  },
                                  "gender": {
                                    "type": "string",
                                    "description": "Vom Modell vorhergesagtes Geschlecht des erkannten Gesichts (`male` oder `female`). Dient nur zur Information.",
                                    "example": "male"
                                  }
                                }
                              }
                            },
                            "best_angle": {
                              "type": "integer",
                              "nullable": true,
                              "description": "Drehung (Grad: 0, 90, 180 oder 270), die die beste Gesichtserkennung lieferte. Nur ungleich null, wenn `rotate_image=true` die Ausrichtung korrigiert hat.",
                              "example": 0
                            }
                          }
                        },
                        "age_estimation": {
                          "type": "number",
                          "format": "float",
                          "nullable": true,
                          "description": "Vom Modell vorhergesagtes Alter des **größten** erkannten Gesichts in Jahren. `null`, wenn kein Gesichtsalter geschätzt werden konnte (eine `AGE_NOT_DETECTED`-Warnung wird hinzugefügt und der Aufruf wird abgelehnt).",
                          "example": 27.33
                        },
                        "warnings": {
                          "type": "array",
                          "description": "Leer bei einer fehlerfreien Genehmigung. Jeder Eintrag setzt `status` auf `Declined`.",
                          "items": {
                            "type": "object",
                            "properties": {
                              "risk": {
                                "type": "string",
                                "enum": [
                                  "NO_FACE_DETECTED",
                                  "LOW_LIVENESS_SCORE",
                                  "LIVENESS_FACE_ATTACK",
                                  "AGE_NOT_DETECTED",
                                  "AGE_BELOW_MINIMUM"
                                ],
                                "description": "Maschinenlesbarer Risiko-Code. `NO_FACE_DETECTED` — das Liveness-Modell hat kein Gesicht gefunden; `LOW_LIVENESS_SCORE` — Liveness-`score` liegt bei oder unter `face_liveness_score_decline_threshold`; `LIVENESS_FACE_ATTACK` — ein Präsentationsangriff (Foto/Bildschirm/Maske) wurde erkannt; `AGE_NOT_DETECTED` — das Alter konnte nicht geschätzt werden; `AGE_BELOW_MINIMUM` — geschätztes Alter liegt unter `age_estimation_decline_threshold`. `NO_FACE_DETECTED` und `LOW_LIVENESS_SCORE` schließen sich gegenseitig aus — wenn kein Gesicht gefunden wird, wird nur `NO_FACE_DETECTED` ausgegeben."
                              },
                              "feature": {
                                "type": "string",
                                "enum": [
                                  "LIVENESS"
                                ],
                                "description": "Funktion, die die Warnung ausgelöst hat. An diesem Endpoint immer `LIVENESS`."
                              },
                              "additional_data": {
                                "type": "object",
                                "nullable": true,
                                "additionalProperties": true,
                                "description": "Für Warnungen zur Altersschätzung immer `null`."
                              },
                              "log_type": {
                                "type": "string",
                                "enum": [
                                  "error"
                                ],
                                "description": "Schweregrad. Jede Warnung, die dieser Endpoint erzeugt, ist ein `error` und setzt `status` auf `Declined`."
                              },
                              "short_description": {
                                "type": "string",
                                "description": "Für Menschen lesbare einzeilige Zusammenfassung des Risikos."
                              },
                              "long_description": {
                                "type": "string",
                                "description": "Lesbare Erklärung des Risikos."
                              }
                            }
                          }
                        }
                      }
                    },
                    "vendor_data": {
                      "type": "string",
                      "nullable": true,
                      "description": "Rückgabe der von Ihnen gesendeten `vendor_data` oder `null`."
                    },
                    "metadata": {
                      "type": "object",
                      "nullable": true,
                      "additionalProperties": true,
                      "description": "Rückgabe des von Ihnen gesendeten `metadata`-Objekts oder `null`."
                    },
                    "created_at": {
                      "type": "string",
                      "format": "date-time",
                      "description": "ISO 8601-Zeitstempel (UTC), wann die Antwort generiert wurde."
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Validierungsfehler. Wird zurückgegeben, wenn `user_image` fehlt, 5 MB überschreitet, eine nicht unterstützte Dateiendung hat oder ein Schwellenwert außerhalb des zulässigen Bereichs liegt. Der Body ist die standardmäßige Feld-Fehler-Envelope von DRF: ein Array von Meldungen pro betroffenem Feld.",
            "content": {
              "application/json": {
                "examples": {
                  "Missing user image": {
                    "summary": "`user_image` ist nicht in den Formulardaten enthalten",
                    "value": {
                      "user_image": [
                        "No file was submitted."
                      ]
                    }
                  },
                  "Unsupported file extension": {
                    "summary": "Dateiendung außerhalb von tiff/jpg/jpeg/png/webp",
                    "value": {
                      "user_image": [
                        "File extension “txt” is not allowed. Allowed extensions are: tiff, jpg, jpeg, png, webp."
                      ]
                    }
                  },
                  "File too large": {
                    "summary": "Der Upload überschreitet das Limit von 5 MB",
                    "value": {
                      "user_image": [
                        "File size should not exceed 5 MB"
                      ]
                    }
                  },
                  "Threshold out of range": {
                    "summary": "`face_liveness_score_decline_threshold` liegt außerhalb von 0–100",
                    "value": {
                      "face_liveness_score_decline_threshold": [
                        "Ensure this value is less than or equal to 100."
                      ]
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Zugriff verweigert. Wird zurückgegeben, wenn der Header `x-api-key` fehlt sowie wenn das Guthaben der aufrufenden Organisation den Aufruf nicht decken kann; ein falscher, widerrufener oder abgelaufener Schlüssel gibt `401` zurück. Ein fehlender Schlüssel gibt `403` mit `{\"detail\": ...}` zurück; ein falscher, widerrufener oder abgelaufener Schlüssel gibt `401` zurück. Unzureichende Credits geben `403` mit `{\"error\": ...}` zurück, bevor eine Bildverarbeitung stattfindet.",
            "content": {
              "application/json": {
                "examples": {
                  "Missing or invalid API key": {
                    "summary": "Kein `x-api-key`-Header, oder der Schlüssel ist ungültig/widerrufen",
                    "value": {
                      "detail": "You do not have permission to perform this action."
                    }
                  },
                  "Not enough credits": {
                    "summary": "Das Guthaben der Organisation reicht für den Aufruf nicht aus",
                    "value": {
                      "error": "You don't have enough credits to perform this request. Please top up at https://business.didit.me"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate-Limit überschritten. POST/PATCH/DELETE-Endpoints teilen sich ein Budget von 300 Schreibanfragen pro Minute pro API-Schlüssel (Transaktionserstellungen und Ereignis-Ingestion haben ein separates Budget von 600). Die Antwort enthält die Header `X-RateLimit-Limit`, `X-RateLimit-Remaining`, `X-RateLimit-Reset` und `Retry-After`.",
            "content": {
              "application/json": {
                "examples": {
                  "Write rate limit exceeded": {
                    "summary": "Mehr als 300 Schreibanfragen in der aktuellen Minute",
                    "value": {
                      "detail": "Write request rate limit exceeded. You can make up to 300 requests per minute."
                    }
                  }
                },
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "cURL",
            "source": "curl -X POST 'https://verification.didit.me/v3/age-estimation/' \\\n  -H 'x-api-key: YOUR_API_KEY' \\\n  -F 'user_image=@./selfie.jpg' \\\n  -F 'age_estimation_decline_threshold=18' \\\n  -F 'face_liveness_score_decline_threshold=30' \\\n  -F 'save_api_request=true' \\\n  -F 'vendor_data=user-123'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.age_estimation.estimate(\n    user_image=open(\"user_image.jpg\", \"rb\"),\n    face_liveness_score_decline_threshold=30.0,\n    age_estimation_decline_threshold=18,\n    rotate_image=False,\n    save_api_request=True,\n    vendor_data=\"user-123\",\n    metadata={\"flow\": \"age-gate\"},\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit, { fileFromPath } from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.ageEstimation.estimate({\n  user_image: await fileFromPath(\"user_image.jpg\"),\n  face_liveness_score_decline_threshold: 30.0,\n  age_estimation_decline_threshold: 18,\n  rotate_image: false,\n  save_api_request: true,\n  vendor_data: \"user-123\",\n  metadata: { flow: \"age-gate\" },\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.AgeEstimation.Estimate(ctx, didit.AgeEstimationEstimateParams{\n\tUserImage:                         didit.FileFromPath(\"user_image.jpg\"),\n\tFaceLivenessScoreDeclineThreshold: didit.Float(30.0),\n\tAgeEstimationDeclineThreshold:     didit.Int(18),\n\tRotateImage:                       didit.Bool(false),\n\tSaveAPIRequest:                    didit.Bool(true),\n\tVendorData:                        didit.String(\"user-123\"),\n\tMetadata:                          didit.Some(map[string]any{\"flow\": \"age-gate\"}),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import java.nio.file.Path;\nimport java.util.Map;\nimport me.didit.Didit;\nimport me.didit.types.AgeEstimationEstimateParams;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.ageEstimation().estimate(AgeEstimationEstimateParams.builder()\n        .userImage(Path.of(\"user_image.jpg\"))\n        .faceLivenessScoreDeclineThreshold(30.0)\n        .ageEstimationDeclineThreshold(18L)\n        .rotateImage(false)\n        .saveApiRequest(true)\n        .vendorData(\"user-123\")\n        .metadata(Map.of(\"flow\", \"age-gate\"))\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\nuse Didit\\File;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->ageEstimation->estimate([\n    'user_image' => File::fromPath('user_image.jpg'),\n    'face_liveness_score_decline_threshold' => 30.0,\n    'age_estimation_decline_threshold' => 18,\n    'rotate_image' => false,\n    'save_api_request' => true,\n    'vendor_data' => 'user-123',\n    'metadata' => ['flow' => 'age-gate'],\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.age_estimation.estimate(\n  user_image: Pathname(\"user_image.jpg\"),\n  face_liveness_score_decline_threshold: 30.0,\n  age_estimation_decline_threshold: 18,\n  rotate_image: false,\n  save_api_request: true,\n  vendor_data: \"user-123\",\n  metadata: { flow: \"age-gate\" }\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Collections.Generic;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.AgeEstimation.EstimateAsync(new AgeEstimationEstimateParams\n{\n    UserImage = FileUpload.FromPath(\"user_image.jpg\"),\n    FaceLivenessScoreDeclineThreshold = 30.0,\n    AgeEstimationDeclineThreshold = 18,\n    RotateImage = false,\n    SaveApiRequest = true,\n    VendorData = \"user-123\",\n    Metadata = new Dictionary<string, object> { [\"flow\"] = \"age-gate\" },\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ]
      }
    },
    "/v3/poa/": {
      "post": {
        "summary": "Adressnachweis (Dokumenten-OCR + Adressprüfungen)",
        "description": "Extrahieren und validieren Sie ein Adressnachweis-Dokument – Verbrauchsabrechnungen, Kontoauszüge und behördlich ausgestellte Dokumente – in einem einzigen Aufruf. Gibt den Aussteller, die Ausstellungs-/Ablaufdaten, den Namen des Inhabers, die Rohadresse und die analysierte/geokodierte Adresse, einen `status` von `Approved`/`Declined` sowie eine `warnings`-Liste zurück, die jedes gefundene Problem erläutert.\n\n**Latenz.** Die Extraktion basiert auf LLMs: Typische Aufrufe dauern **5–15 Sekunden**, mehrseitige PDFs bis zu **~30 Sekunden**. Konfigurieren Sie ein Client-Timeout von **mindestens 45 Sekunden** und führen Sie keinen Wiederholungsversuch durch, bevor der Aufruf abgeschlossen ist.\n\n**Funktionsweise.** Das Dokument (Bild oder PDF, bis zu 15 MB; verschlüsselte PDFs erfordern `document_password`) wird in einen Dokumenttyp und -subtyp klassifiziert (z. B. `UTILITY_BILL` / `WATER_BILL`), und Aussteller, Daten, Inhabername sowie Adresse werden per LLM-basierter Extraktion extrahiert. Die Adresse wird analysiert und in `poa_parsed_address` geokodiert. PDF-/EXIF-Forensik prüft auf Manipulationen – nachträgliche Änderungen nach digitaler Signatur, bekannte PDF-Editoren, Overlay-Text-Manipulationen, verdächtige Re-Exporte – und gibt `SUSPECTED_DOCUMENT_MANIPULATION` oder `DOCUMENT_METADATA_MISMATCH` aus. Ein Textfeld, das gelöscht und in einer anderen Schriftart neu eingegeben wurde, bei dem die Datei selbst keinen Beweis dafür enthält, ob sich der Inhalt geändert hat, führt zu `POA_DOCUMENT_UNPROVEN_TEXT_REPLACEMENT`. Das Dokumentenalter wird anhand von `poa_document_age_months` validiert und die Sprache anhand von `poa_languages_allowed`. Wenn Sie `expected_address`, `expected_country` oder `expected_first_name`/`expected_last_name` übergeben, werden die extrahierten Werte abgeglichen und Abweichungen markiert.\n\n**Entscheidungslogik.** Der `status` ist `Approved`, sofern nicht mindestens eine Warnung zu einer Ablehnung führt. Harte Fehler führen immer zu einer Ablehnung: `MISSING_ADDRESS_INFORMATION`, `POA_DOCUMENT_EXPIRED`, `INVALID_DOCUMENT_TYPE`, `UNABLE_TO_VALIDATE_DOCUMENT_AGE` sowie `UNABLE_TO_EXTRACT_ISSUE_DATE` und `POA_NAME_NOT_DETECTED` (auf diesem Endpoint nicht konfigurierbar). Fünf Risikogruppen sind pro Anfrage über die `poa_*_action`-Optionen konfigurierbar (`DECLINE` oder `NO_ACTION`, standardmäßig alle auf `DECLINE` gesetzt). `POA_DOCUMENT_NOT_SUPPORTED_FOR_APPLICATION` und `UNPARSABLE_OR_INVALID_ADDRESS` dienen auf diesem Endpoint nur als Information und führen nie zu einer Ablehnung. Ein Dokument, das überhaupt nicht verarbeitet werden kann, gibt `400` zurück; ein lesbares, aber problematisches Dokument gibt `200` mit `status: \"Declined\"` zurück – prüfen Sie daher stets `poa.status` und `poa.warnings`, nicht nur den HTTP-Code.\n\n**Abrechnung.** Jede `200`-Antwort verbraucht einen Adressnachweis-API-Credit (bezahlt über Ihr Tarif-Guthaben oder Aufladeguthaben). Wenn das Guthaben der Organisation den Aufruf nicht decken kann, gibt der Endpoint vor jeglicher Dokumentverarbeitung `403` mit dem Fehler für unzureichendes Guthaben zurück.\n\n**Sitzungspersistenz (`save_api_request`, Standard `true`).** Wenn `true`, wird der Aufruf als Sitzung vom Typ API beibehalten: Er erscheint in der Business Console, das hochgeladene Dokument wird gespeichert, die zurückgegebene `request_id` ist eine echte Sitzungs-ID, die Sie an `GET /v3/session/{sessionId}/decision/` übergeben können (die Entscheidung zeigt zusätzlich `document_file` und die Forensikdaten aus `document_metadata` an, die in dieser Antwort weggelassen werden), und ein `status.updated`-Webhook wird ausgelöst. Wenn `false`, wird nichts gespeichert und `request_id` ist eine einmalige Korrelations-UUID, die später nicht nachgeschlagen werden kann.\n\n**Sandbox.** Sandbox-API-Schlüssel überspringen die gesamte Verarbeitung und Abrechnung: Nach der Validierung der Anfrage (ungültige Eingaben geben weiterhin `400` zurück) gibt der Endpoint eine statische `Approved`-Mock-Payload zurück (eine fiktive Stromrechnung von „Sandbox Power Co.“), es wird keine Sitzung gespeichert und es werden keine Credits verbraucht.\n\n**Authentifizierung.** Senden Sie den API-Schlüssel Ihrer Anwendung im `x-api-key`-Header. Fehlende oder ungültige Anmeldedaten führen zu `403` (`{\"detail\": \"You do not have permission to perform this action.\"}`) – diese API gibt niemals `401` zurück.\n\n**Rate-Limit.** Geteiltes Schreibkontingent von 300 Anfragen/Min. pro API-Schlüssel über alle POST-/PATCH-/DELETE-Endpoints; bei Überschreitung wird `429` zurückgegeben.\n\nHinweis: `FUTURE_ISSUE_DATE` und `POOR_DOCUMENT_QUALITY` existieren in Workflow-Sitzungen, werden aber von diesem eigenständigen Endpoint niemals erzeugt – ein Dokument mit Ausstellungsdatum in der Zukunft wird hier nicht automatisch abgelehnt.",
        "operationId": "post_v3poa",
        "x-didit-sdk": {
          "resource": "proof_of_address",
          "method": "verify",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Standalone APIs"
        ],
        "parameters": [],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "required": [
                  "document"
                ],
                "properties": {
                  "document": {
                    "type": "string",
                    "format": "binary",
                    "description": "Das Adressnachweis-Dokument. Zulässige Dateiendungen: `tiff`, `jpg`, `jpeg`, `png`, `pdf`, `webp`. Maximale Upload-Größe: **15 MB** (größere Dateien werden mit `400` abgelehnt). Mehrseitige PDFs werden unterstützt (erhöhte Latenz zu erwarten); verschlüsselte PDFs erfordern `document_password`. Bilder werden vor der Verarbeitung automatisch komprimiert."
                  },
                  "document_password": {
                    "type": "string",
                    "description": "Passwort zur Entschlüsselung von `document`, wenn es sich um eine verschlüsselte PDF-Datei handelt. Das Senden einer verschlüsselten PDF-Datei ohne (oder mit einem falschen) Passwort gibt `400` zurück.",
                    "writeOnly": true
                  },
                  "expected_address": {
                    "type": "string",
                    "description": "Gegen das Dokument zu verifizierende Adresse. Sie wird geocodiert und mit der extrahierten Adresse verglichen; eine Nichtübereinstimmung (oder eine erwartete Adresse, die nicht geocodiert/verifiziert werden kann) fügt `ADDRESS_MISMATCH_WITH_PROVIDED` hinzu, geregelt durch `poa_address_mismatch_action`. Die geocodierte Form wird in `expected_details_formatted_address` / `expected_details_parsed_address` zurückgegeben.",
                    "example": "Av. Monseñor Tavella 1291, Salta, Argentina"
                  },
                  "expected_country": {
                    "type": "string",
                    "description": "Land, das mit dem Dokument abgeglichen werden soll (ISO 3166-1-Code, z. B. `ARG` oder `AR`). Eine Nichtübereinstimmung mit dem Land des Dokuments fügt `POA_COUNTRY_MISMATCH_WITH_PROVIDED` hinzu, gesteuert durch `poa_address_mismatch_action`.",
                    "example": "ARG"
                  },
                  "expected_first_name": {
                    "type": "string",
                    "description": "Vorname, der mit `name_on_document` abgeglichen werden soll (Fuzzy-Match, transliterationssensitiv). Ein Wert unter dem Übereinstimmungsschwellenwert fügt `NAME_MISMATCH_WITH_PROVIDED` hinzu, gesteuert durch `poa_address_mismatch_action`.",
                    "example": "Sophia"
                  },
                  "expected_last_name": {
                    "type": "string",
                    "description": "Mit `name_on_document` abzugleichender Nachname, der zusammen mit `expected_first_name` für den Übereinstimmungswert herangezogen wird.",
                    "example": "Martinez"
                  },
                  "poa_languages_allowed": {
                    "type": "string",
                    "description": "Kommagetrennte Liste der akzeptierten Dokumentensprachen als ISO 639-1-Codes (z. B. `en,es,fr`). Wenn weggelassen oder leer, werden **alle 51 unterstützten Sprachen** akzeptiert. Ein Dokument in einer Sprache außerhalb der Liste fügt `UNSUPPORTED_DOCUMENT_LANGUAGE` hinzu (gesteuert durch `poa_unsupported_language_action`); ein unbekannter Code in der Liste gibt `400` mit dem vollständigen Satz unterstützter Codes zurück.",
                    "example": "en,es"
                  },
                  "poa_document_age_months": {
                    "type": "string",
                    "description": "Kommagetrennte `key:value`-Paare, die das maximale Dokumentenalter in Monaten pro Dokumenttyp festlegen – Schlüssel: `utility_bill`, `bank_statement`, `government_issued_document`, `other_poa_document`; Werte: `1`–`120` oder `-1` für unbegrenzt (keine Altersprüfung). Standardwerte bei Auslassung: `utility_bill:3,bank_statement:3,government_issued_document:12,other_poa_document:12`. Ein Dokument, das älter als sein Grenzwert ist, wird mit `POA_DOCUMENT_EXPIRED` abgelehnt. **Achtung:** Wenn Sie dieses Feld angeben, listen Sie *jeden* Typ auf, den Sie akzeptieren – ausgelassene Typen werden als nicht akzeptiert behandelt (informatives `POA_DOCUMENT_NOT_SUPPORTED_FOR_APPLICATION`) und ihre Altersprüfung wird übersprungen.",
                    "example": "utility_bill:3,bank_statement:6"
                  },
                  "poa_name_mismatch_action": {
                    "type": "string",
                    "enum": [
                      "DECLINE",
                      "NO_ACTION"
                    ],
                    "default": "DECLINE",
                    "description": "Akzeptiert, wird jedoch **derzeit nicht angewendet** – Warnungen wegen Namensabweichungen (`NAME_MISMATCH_WITH_PROVIDED`) folgen stattdessen `poa_address_mismatch_action`. Legen Sie `poa_address_mismatch_action` fest, um das Verhalten bei Namens- und Adressabweichungen zu steuern."
                  },
                  "poa_document_issues_action": {
                    "type": "string",
                    "enum": [
                      "DECLINE",
                      "NO_ACTION"
                    ],
                    "default": "DECLINE",
                    "description": "Was bei Problemen mit der Dateiintegrität zu tun ist — in der Praxis wird von diesem Endpoint nur `DOCUMENT_METADATA_MISMATCH` erzeugt."
                  },
                  "poa_document_authenticity_action": {
                    "type": "string",
                    "enum": [
                      "DECLINE",
                      "NO_ACTION"
                    ],
                    "default": "DECLINE",
                    "description": "Was zu tun ist, wenn eine Dokumentenmanipulation vermutet wird (`SUSPECTED_DOCUMENT_MANIPULATION`) — z. B. wurde das PDF nach der digitalen Signatur geändert, mit einem bekannten PDF-Editor bearbeitet, weist eine Overlay-Text-Manipulation auf oder hat inkonsistente EXIF-Daten. Regelt auch `POA_DOCUMENT_UNPROVEN_TEXT_REPLACEMENT` (ein neu eingegebenes Textfeld, bei dem die Datei weder eine Änderung noch den Originalzustand belegen kann): `DECLINE` lehnt dies ebenfalls ab, `NO_ACTION` behält es als Warnung bei."
                  },
                  "poa_unsupported_language_action": {
                    "type": "string",
                    "enum": [
                      "DECLINE",
                      "NO_ACTION"
                    ],
                    "default": "DECLINE",
                    "description": "Was zu tun ist, wenn die Dokumentsprache außerhalb von `poa_languages_allowed` liegt (`UNSUPPORTED_DOCUMENT_LANGUAGE`)."
                  },
                  "poa_address_mismatch_action": {
                    "type": "string",
                    "enum": [
                      "DECLINE",
                      "NO_ACTION"
                    ],
                    "default": "DECLINE",
                    "description": "Was zu tun ist, wenn die extrahierten Details nicht mit den `expected_*`-Feldern übereinstimmen: `ADDRESS_MISMATCH_WITH_PROVIDED`, `NAME_MISMATCH_WITH_PROVIDED` und `POA_COUNTRY_MISMATCH_WITH_PROVIDED` folgen alle dieser Aktion."
                  },
                  "poa_issuer_not_identified_action": {
                    "type": "string",
                    "enum": [
                      "DECLINE",
                      "NO_ACTION"
                    ],
                    "default": "DECLINE",
                    "description": "Was zu tun ist, wenn kein ausstellendes Unternehmen bzw. keine ausstellende Organisation auf dem Dokument identifiziert werden kann (`ISSUER_NOT_IDENTIFIED`)."
                  },
                  "save_api_request": {
                    "type": "boolean",
                    "default": true,
                    "description": "Wenn `true` (Standard), wird der Aufruf als Sitzung vom Typ API persistent gespeichert — sichtbar in der Business Console, abrufbar über `GET /v3/session/{sessionId}/decision/` unter Verwendung der zurückgegebenen `request_id`, angekündigt über einen `status.updated`-Webhook, wobei das hochgeladene Dokument gespeichert wird. Wenn `false`, wird nichts gespeichert und `request_id` ist eine flüchtige UUID, die nur der Antwortkorrelation dient.",
                    "example": true
                  },
                  "vendor_data": {
                    "type": "string",
                    "description": "Optionale opake Zeichenfolge (Ihre interne Benutzer-ID, E-Mail, UUID…), die in der gespeicherten Sitzung hinterlegt und in der Antwort zurückgegeben wird. Verwenden Sie sie, um API-Aufrufe mit Ihren eigenen Datensätzen abzugleichen und Sitzungen später zu filtern.",
                    "example": "user-123"
                  },
                  "metadata": {
                    "type": "object",
                    "additionalProperties": true,
                    "description": "Optionales JSON-Objekt, das mit der Sitzung gespeichert (wenn `save_api_request=true`) und in der Antwort zurückgegeben wird. Senden Sie es bei Multipart-Anfragen als JSON-codiertes String-Feld (z. B. `metadata={\"flow\":\"onboarding\"}`) – es wird in ein Objekt geparst.",
                    "example": {
                      "flow": "onboarding"
                    }
                  }
                }
              },
              "example": {
                "document": "(binary JPEG/PNG/PDF of the utility bill or bank statement)",
                "expected_address": "Av. Monseñor Tavella 1291, Salta, Argentina",
                "expected_country": "ARG",
                "expected_first_name": "Sophia",
                "expected_last_name": "Martinez",
                "poa_languages_allowed": "en,es",
                "save_api_request": true,
                "vendor_data": "user-123"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Dokument verarbeitet. `poa.status` ist `Approved` oder `Declined`; jedes erkannte Problem wird einzeln in `poa.warnings` aufgeführt. Ein abgelaufenes, nicht übereinstimmendes oder verdächtiges Dokument gibt dennoch `200` mit `status: \"Declined\"` zurück – prüfen Sie den Body, nicht nur den HTTP-Code. Wenn `save_api_request=true`, ist `request_id` die persistierte Sitzungs-ID.",
            "content": {
              "application/json": {
                "examples": {
                  "Approved": {
                    "summary": "Versorgungsrechnung fehlerfrei ausgelesen, keine Prüfungen auf erwartete Details",
                    "value": {
                      "request_id": "4b523a8d-ed32-45e4-8aa8-a89eda459d88",
                      "poa": {
                        "issuing_state": "ARG",
                        "document_type": "UTILITY_BILL",
                        "document_subtype": "WATER_BILL",
                        "document_language": "es",
                        "issuer": "Aguas del Norte",
                        "issue_date": "2026-04-10",
                        "expiration_date": null,
                        "poa_address": "AVDA. MONSEÑOR TAVELLA N° 1291, B° VILLA LAVALLE CP: 4400, CAPITAL - SALTA",
                        "poa_formatted_address": "Av. Monseñor Tavella 1291 b, A4400 Salta, Argentina",
                        "poa_parsed_address": {
                          "street_1": "Avenida Monseñor Tavella 1291",
                          "street_2": "b",
                          "city": "Salta",
                          "region": "Salta",
                          "country": "AR",
                          "postal_code": "A4400",
                          "document_location": {
                            "latitude": -24.8208682,
                            "longitude": -65.4130954
                          }
                        },
                        "expected_details_address": null,
                        "expected_details_formatted_address": null,
                        "expected_details_parsed_address": null,
                        "name_on_document": "OESTE EMBOTELLADORA S.A.",
                        "extra_fields": {
                          "bank_account_number": null,
                          "bank_iban": null,
                          "bank_sort_code": null,
                          "bank_routing_number": null,
                          "bank_swift_bic": null,
                          "bank_branch_name": null,
                          "bank_branch_address": null,
                          "document_phone_number": null,
                          "additional_names": [
                            "LA EMBOTELLADORA DEL NORTE SA"
                          ]
                        },
                        "detected_codes": [
                          {
                            "type": "QR_CODE",
                            "page_number": 1,
                            "position": [
                              [
                                820,
                                1120
                              ],
                              [
                                1002,
                                1120
                              ],
                              [
                                1002,
                                1302
                              ],
                              [
                                820,
                                1302
                              ]
                            ],
                            "x": 820,
                            "y": 1120,
                            "width": 182,
                            "height": 182,
                            "page_width": 1190,
                            "page_height": 1684,
                            "raw_payload": "aHR0cHM6Ly9hZ3Vhc2RlbG5vcnRlLmNvbS9mYWN0dXJhLzk5ODgxMQ==",
                            "parsed_payload": "https://aguasdelnorte.com/factura/998811"
                          },
                          {
                            "type": "CODE_128",
                            "page_number": 1,
                            "position": [
                              [
                                112,
                                1480
                              ],
                              [
                                560,
                                1480
                              ],
                              [
                                560,
                                1540
                              ],
                              [
                                112,
                                1540
                              ]
                            ],
                            "x": 112,
                            "y": 1480,
                            "width": 448,
                            "height": 60,
                            "page_width": 1190,
                            "page_height": 1684,
                            "raw_payload": "MDA5OTg4MTEwMDA0Mg==",
                            "parsed_payload": "0099881100042"
                          }
                        ],
                        "status": "Approved",
                        "warnings": []
                      },
                      "vendor_data": "user-123",
                      "metadata": null,
                      "created_at": "2026-06-12T02:29:02.439655+00:00"
                    }
                  },
                  "Declined - document too old": {
                    "summary": "Ausstellungsdatum ist älter als der zulässige Wert für `poa_document_age_months`",
                    "value": {
                      "request_id": "f61681b8-9422-4378-ac3e-04c6a247fb45",
                      "poa": {
                        "issuing_state": "ARG",
                        "document_type": "UTILITY_BILL",
                        "document_subtype": "WATER_BILL",
                        "document_language": "es",
                        "issuer": "Aguas del Norte",
                        "issue_date": "2021-02-10",
                        "expiration_date": null,
                        "poa_address": "AVDA. MONSEÑOR TAVELLA N° 1291, B° VILLA LAVALLE CP: 4400, CAPITAL - SALTA",
                        "poa_formatted_address": "Av. Monseñor Tavella 1291 b, A4400 Salta, Argentina",
                        "poa_parsed_address": {
                          "street_1": "Avenida Monseñor Tavella 1291",
                          "street_2": "b",
                          "city": "Salta",
                          "region": "Salta",
                          "country": "AR",
                          "postal_code": "A4400",
                          "document_location": {
                            "latitude": -24.8208682,
                            "longitude": -65.4130954
                          }
                        },
                        "expected_details_address": null,
                        "expected_details_formatted_address": null,
                        "expected_details_parsed_address": null,
                        "name_on_document": "OESTE EMBOTELLADORA S.A.",
                        "extra_fields": {
                          "bank_account_number": null,
                          "bank_iban": null,
                          "bank_sort_code": null,
                          "bank_routing_number": null,
                          "bank_swift_bic": null,
                          "bank_branch_name": null,
                          "bank_branch_address": null,
                          "document_phone_number": null,
                          "additional_names": [
                            "LA EMBOTELLADORA DEL NORTE SA"
                          ]
                        },
                        "status": "Declined",
                        "warnings": [
                          {
                            "risk": "POA_DOCUMENT_EXPIRED",
                            "feature": "PROOF_OF_ADDRESS",
                            "additional_data": {
                              "expiration_reason": "age_window",
                              "max_age_months": 3,
                              "document_subtype": "WATER_BILL",
                              "document_type": "UTILITY_BILL",
                              "issue_date": "2021-02-10"
                            },
                            "log_type": "error",
                            "short_description": "Document expired",
                            "long_description": "The submitted document is older than the maximum accepted age of 3 months from its issue date, which exceeds the acceptable time period for validity."
                          }
                        ]
                      },
                      "vendor_data": "user-123",
                      "metadata": null,
                      "created_at": "2026-06-12T02:23:02.165493+00:00"
                    }
                  },
                  "Declined - name mismatch": {
                    "summary": "`expected_first_name`/`expected_last_name` stimmen nicht mit `name_on_document` überein",
                    "value": {
                      "request_id": "0a7f2f9c-58f1-4b8e-b1e3-2f6f9d4f7a21",
                      "poa": {
                        "issuing_state": "ARG",
                        "document_type": "UTILITY_BILL",
                        "document_subtype": "WATER_BILL",
                        "document_language": "es",
                        "issuer": "Aguas del Norte",
                        "issue_date": "2021-02-10",
                        "expiration_date": null,
                        "poa_address": "AVDA. MONSEÑOR TAVELLA N° 1291, B° VILLA LAVALLE CP: 4400, CAPITAL - SALTA",
                        "poa_formatted_address": "Av. Monseñor Tavella 1291 b, A4400 Salta, Argentina",
                        "poa_parsed_address": {
                          "street_1": "Avenida Monseñor Tavella 1291",
                          "street_2": "b",
                          "city": "Salta",
                          "region": "Salta",
                          "country": "AR",
                          "postal_code": "A4400",
                          "document_location": {
                            "latitude": -24.8208682,
                            "longitude": -65.4130954
                          }
                        },
                        "expected_details_address": null,
                        "expected_details_formatted_address": null,
                        "expected_details_parsed_address": null,
                        "name_on_document": "OESTE EMBOTELLADORA S.A.",
                        "extra_fields": {
                          "bank_account_number": null,
                          "bank_iban": null,
                          "bank_sort_code": null,
                          "bank_routing_number": null,
                          "bank_swift_bic": null,
                          "bank_branch_name": null,
                          "bank_branch_address": null,
                          "document_phone_number": null,
                          "additional_names": [
                            "LA EMBOTELLADORA DEL NORTE SA"
                          ]
                        },
                        "status": "Declined",
                        "warnings": [
                          {
                            "risk": "NAME_MISMATCH_WITH_PROVIDED",
                            "feature": "PROOF_OF_ADDRESS",
                            "additional_data": null,
                            "log_type": "error",
                            "short_description": "Name mismatch with provided information",
                            "long_description": "The full name on the document does not match the name from the user's verified identity documents, or the full name sent by API."
                          }
                        ]
                      },
                      "vendor_data": "user-123",
                      "metadata": null,
                      "created_at": "2026-06-12T02:27:21.330172+00:00"
                    }
                  }
                },
                "schema": {
                  "type": "object",
                  "properties": {
                    "request_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "Beibehaltene Sitzungs-ID, wenn `save_api_request=true` (verwendbar mit `GET /v3/session/{sessionId}/decision/`); andernfalls eine vorübergehende Korrelations-UUID."
                    },
                    "poa": {
                      "type": "object",
                      "properties": {
                        "status": {
                          "type": "string",
                          "enum": [
                            "Approved",
                            "Declined"
                          ],
                          "description": "`Approved`, wenn keine Warnung zu einer Ablehnung führt; andernfalls `Declined` — die Liste `warnings` erklärt warum."
                        },
                        "issuing_state": {
                          "type": "string",
                          "nullable": true,
                          "description": "Land, in dem das Dokument ausgestellt wurde, wie aus dem Dokument extrahiert – üblicherweise ISO 3166-1 Alpha-3 (z. B. `ARG`).",
                          "example": "ARG"
                        },
                        "document_type": {
                          "type": "string",
                          "enum": [
                            "UTILITY_BILL",
                            "BANK_STATEMENT",
                            "GOVERNMENT_ISSUED_DOCUMENT",
                            "OTHER_POA_DOCUMENT",
                            "UNKNOWN"
                          ],
                          "description": "Erkannte Dokumentenkategorie. `UNKNOWN` bedeutet, dass das Dokument nicht als zulässiger Adressnachweis klassifiziert werden konnte, und führt zur automatischen Ablehnung mit `INVALID_DOCUMENT_TYPE`. Niemals null — bei Klassifizierungsfehlern wird auf `UNKNOWN` zurückgegriffen."
                        },
                        "document_subtype": {
                          "type": "string",
                          "description": "Feinere Klassifizierung innerhalb von `document_type` – z. B. `ELECTRICITY_BILL`, `WATER_BILL`, `GAS_BILL`, `INTERNET_BILL`, `PHONE_BILL` (Verbrauchsabrechnungen); `ACCOUNT_STATEMENT`, `CREDIT_CARD_STATEMENT` (Kontoauszüge); `TAX_ASSESSMENT`, `RESIDENCY_CERTIFICATE` (behördliche Dokumente). `UNKNOWN`, wenn kein Subtyp bestimmt werden konnte. Niemals null – Klassifizierungsfehler fallen auf `UNKNOWN` zurück.",
                          "example": "WATER_BILL"
                        },
                        "document_language": {
                          "type": "string",
                          "nullable": true,
                          "description": "Erkannte Dokumentensprache (ISO 639-1).",
                          "example": "es"
                        },
                        "issuer": {
                          "type": "string",
                          "nullable": true,
                          "description": "Unternehmen oder Organisation, die das Dokument ausgestellt hat. `null` fügt `ISSUER_NOT_IDENTIFIED` hinzu.",
                          "example": "Aguas del Norte"
                        },
                        "issue_date": {
                          "type": "string",
                          "format": "date",
                          "nullable": true,
                          "description": "Dokumentenausstellungsdatum (`YYYY-MM-DD`). `null`, wenn es nicht extrahiert werden konnte – dies führt an diesem Endpoint zu einer Ablehnung mit `UNABLE_TO_EXTRACT_ISSUE_DATE`.",
                          "example": "2021-02-10"
                        },
                        "expiration_date": {
                          "type": "string",
                          "format": "date",
                          "nullable": true,
                          "description": "Explizites Ablauf-/Gültigkeitsdatum, das auf dem Dokument aufgedruckt ist, sofern vorhanden. Unabhängig von der Altersprüfung `poa_document_age_months`."
                        },
                        "poa_address": {
                          "type": "string",
                          "nullable": true,
                          "description": "Adresse genau wie auf dem Dokument aufgedruckt. `null` führt zur automatischen Ablehnung mit `MISSING_ADDRESS_INFORMATION`."
                        },
                        "poa_formatted_address": {
                          "type": "string",
                          "nullable": true,
                          "description": "Geocodierte, normalisierte Version von `poa_address`.",
                          "example": "Av. Monseñor Tavella 1291 b, A4400 Salta, Argentina"
                        },
                        "poa_parsed_address": {
                          "type": "object",
                          "nullable": true,
                          "description": "Strukturierte, geocodierte Aufschlüsselung der Dokumentadresse. `null`, wenn die Adresse nicht analysiert werden konnte.",
                          "properties": {
                            "street_1": {
                              "type": "string",
                              "nullable": true,
                              "example": "Avenida Monseñor Tavella 1291"
                            },
                            "street_2": {
                              "type": "string",
                              "nullable": true
                            },
                            "city": {
                              "type": "string",
                              "nullable": true,
                              "example": "Salta"
                            },
                            "region": {
                              "type": "string",
                              "nullable": true,
                              "example": "Salta"
                            },
                            "country": {
                              "type": "string",
                              "nullable": true,
                              "description": "ISO 3166-1 Alpha-2-Ländercode.",
                              "example": "AR"
                            },
                            "postal_code": {
                              "type": "string",
                              "nullable": true,
                              "example": "A4400"
                            },
                            "document_location": {
                              "type": "object",
                              "nullable": true,
                              "properties": {
                                "latitude": {
                                  "type": "number"
                                },
                                "longitude": {
                                  "type": "number"
                                }
                              },
                              "description": "Geocodierte Koordinaten der Dokumentadresse."
                            }
                          }
                        },
                        "expected_details_address": {
                          "type": "string",
                          "nullable": true,
                          "description": "Rückgabe der von Ihnen gesendeten `expected_address` oder `null`."
                        },
                        "expected_details_formatted_address": {
                          "type": "string",
                          "nullable": true,
                          "description": "Geocodierte, normalisierte Version von `expected_address`; `null`, wenn nicht angegeben oder nicht geocodierbar."
                        },
                        "expected_details_parsed_address": {
                          "type": "object",
                          "nullable": true,
                          "additionalProperties": true,
                          "description": "Vollständiges Geocoding-Ergebnis für `expected_address` (Straße/Stadt/Region/Land/Postleitzahl plus Rohdaten des Geocoders und ein `is_verified`-Flag). `null`, wenn `expected_address` nicht angegeben wurde."
                        },
                        "name_on_document": {
                          "type": "string",
                          "nullable": true,
                          "description": "Aus dem Dokument extrahierter Name des primären Inhabers; wird mit `expected_first_name`/`expected_last_name` abgeglichen, sofern angegeben. Bei `null` wird an diesem Endpoint mit `POA_NAME_NOT_DETECTED` abgelehnt.",
                          "example": "OESTE EMBOTELLADORA S.A."
                        },
                        "extra_fields": {
                          "type": "object",
                          "description": "Dokumentspezifische Zusatzfelder. Bankfelder werden für Kontoauszüge ausgefüllt, wenn sie auf dem Dokument aufgedruckt sind; andernfalls `null`.",
                          "properties": {
                            "bank_account_number": {
                              "type": "string",
                              "nullable": true
                            },
                            "bank_iban": {
                              "type": "string",
                              "nullable": true
                            },
                            "bank_sort_code": {
                              "type": "string",
                              "nullable": true
                            },
                            "bank_routing_number": {
                              "type": "string",
                              "nullable": true
                            },
                            "bank_swift_bic": {
                              "type": "string",
                              "nullable": true
                            },
                            "bank_branch_name": {
                              "type": "string",
                              "nullable": true
                            },
                            "bank_branch_address": {
                              "type": "string",
                              "nullable": true
                            },
                            "document_phone_number": {
                              "type": "string",
                              "nullable": true,
                              "description": "Auf dem Dokument aufgedruckte Telefonnummer des Kontakts."
                            },
                            "additional_names": {
                              "type": "array",
                              "items": {
                                "type": "string"
                              },
                              "description": "Andere auf dem Dokument gefundene Inhabernamen (z. B. Kontomitinhaber, frühere Kontonamen)."
                            }
                          }
                        },
                        "warnings": {
                          "type": "array",
                          "description": "Leer bei einer fehlerfreien Genehmigung. Jeder Eintrag erläutert ein erkanntes Risiko; Einträge mit `log_type: \"error\"` setzen `status` auf `Declined`.",
                          "items": {
                            "type": "object",
                            "properties": {
                              "risk": {
                                "type": "string",
                                "description": "Maschinenlesbarer Risiko-Code. Führt immer zur Ablehnung: `MISSING_ADDRESS_INFORMATION`, `POA_DOCUMENT_EXPIRED`, `INVALID_DOCUMENT_TYPE`, `UNABLE_TO_VALIDATE_DOCUMENT_AGE` sowie `UNABLE_TO_EXTRACT_ISSUE_DATE` und `POA_NAME_NOT_DETECTED` (an diesem Endpoint fest auf Ablehnung eingestellt). Gesteuert über Anfrageoptionen: `NAME_MISMATCH_WITH_PROVIDED` / `ADDRESS_MISMATCH_WITH_PROVIDED` / `POA_COUNTRY_MISMATCH_WITH_PROVIDED` (`poa_address_mismatch_action`), `POOR_DOCUMENT_QUALITY` (wird an diesem Endpoint nie erzeugt) / `DOCUMENT_METADATA_MISMATCH` (`poa_document_issues_action`), `SUSPECTED_DOCUMENT_MANIPULATION` und `POA_DOCUMENT_UNPROVEN_TEXT_REPLACEMENT` (`poa_document_authenticity_action`), `UNSUPPORTED_DOCUMENT_LANGUAGE` (`poa_unsupported_language_action`), `ISSUER_NOT_IDENTIFIED` (`poa_issuer_not_identified_action`). An diesem Endpoint rein informativ: `POA_DOCUMENT_NOT_SUPPORTED_FOR_APPLICATION`, `UNPARSABLE_OR_INVALID_ADDRESS`.",
                                "example": "POA_DOCUMENT_EXPIRED"
                              },
                              "feature": {
                                "type": "string",
                                "enum": [
                                  "PROOF_OF_ADDRESS"
                                ],
                                "description": "Funktion, die die Warnung ausgelöst hat. An diesem Endpoint immer `PROOF_OF_ADDRESS`."
                              },
                              "additional_data": {
                                "type": "object",
                                "nullable": true,
                                "additionalProperties": true,
                                "description": "Zusätzlicher Kontext für einige Risiken — z. B. enthält `POA_DOCUMENT_EXPIRED` den `expiration_reason` (`printed_expiration` oder `age_window`), `document_type`, `document_subtype` und `issue_date` sowie `expiration_date` beim Pfad `printed_expiration` oder `max_age_months` beim Pfad `age_window`; `SUSPECTED_DOCUMENT_MANIPULATION` enthält `reason` und `detection_method`; `POA_DOCUMENT_UNPROVEN_TEXT_REPLACEMENT` enthält `reason`, `detection_method` (`unproven_text_replacement`), `replaced_text`, `manipulated_regions` und `manipulated_blocks`. `null` für die meisten Risiken."
                              },
                              "log_type": {
                                "type": "string",
                                "enum": [
                                  "error",
                                  "information"
                                ],
                                "description": "Schweregrad. `error`-Warnungen setzen `status` auf `Declined`; `information`-Einträge sind hinweisend und führen für sich allein nie zu einer Ablehnung. (`warning` wird von diesem Endpoint nicht erzeugt — seine Optionen akzeptieren nur `DECLINE` oder `NO_ACTION`.)"
                              },
                              "short_description": {
                                "type": "string",
                                "description": "Für Menschen lesbare einzeilige Zusammenfassung des Risikos."
                              },
                              "long_description": {
                                "type": "string",
                                "description": "Lesbare Erklärung des Risikos."
                              }
                            }
                          }
                        },
                        "detected_codes": {
                          "type": "array",
                          "description": "Auf jeder verarbeiteten Seite des Dokuments erkannte QR-Codes und Barcodes. Leer, wenn keine gefunden wurden. Ein lokalisierter, aber nicht decodierbarer QR-Code weist `parsed_payload: null` auf.",
                          "items": {
                            "$ref": "#/components/schemas/DocumentAIDetectedCode"
                          }
                        }
                      }
                    },
                    "vendor_data": {
                      "type": "string",
                      "nullable": true,
                      "description": "Rückgabe der von Ihnen gesendeten `vendor_data` oder `null`."
                    },
                    "metadata": {
                      "type": "object",
                      "nullable": true,
                      "additionalProperties": true,
                      "description": "Rückgabe des von Ihnen gesendeten `metadata`-Objekts oder `null`."
                    },
                    "created_at": {
                      "type": "string",
                      "format": "date-time",
                      "description": "ISO 8601-Zeitstempel (UTC), wann die Antwort generiert wurde."
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Validierungs- oder Verarbeitungsfehler. Probleme auf Feldebene geben das Standardantwortformat von DRF zurück (ein Array von Meldungen pro betroffenem Feld). Probleme mit verschlüsselten PDFs geben `{\"detail\": ...}` zurück. Ein Dokument, das die Extraktions-Pipeline nicht verarbeiten kann, gibt `{\"error\": [\"Error extracting POA information\"]}` zurück.",
            "content": {
              "application/json": {
                "examples": {
                  "Missing document": {
                    "summary": "`document` ist nicht in den Formulardaten enthalten",
                    "value": {
                      "document": [
                        "No file was submitted."
                      ]
                    }
                  },
                  "Unsupported file extension": {
                    "summary": "Dateiendung außerhalb von tiff/jpg/jpeg/png/pdf/webp",
                    "value": {
                      "document": [
                        "File extension “txt” is not allowed. Allowed extensions are: tiff, jpg, jpeg, png, pdf, webp."
                      ]
                    }
                  },
                  "File too large": {
                    "summary": "Der Upload überschreitet das Limit von 15 MB",
                    "value": {
                      "document": [
                        "File size should not exceed 15 MB"
                      ]
                    }
                  },
                  "Encrypted PDF": {
                    "summary": "PDF ohne das erforderliche Passwort hochgeladen",
                    "value": {
                      "detail": "The PDF is encrypted. Please upload a decrypted PDF or a photo instead."
                    }
                  },
                  "Wrong PDF password": {
                    "summary": "`document_password` entschlüsselt die PDF nicht",
                    "value": {
                      "detail": "The PDF password is incorrect. Please provide the correct password."
                    }
                  },
                  "Invalid language code": {
                    "summary": "`poa_languages_allowed` enthält einen nicht unterstützten Code",
                    "value": {
                      "poa_languages_allowed": [
                        "Invalid language code: 'xx'. Must be one of the supported languages: ['ar', 'bn', 'hy', 'bg', 'bs', 'ca', 'cnr', 'sq', 'zh', 'hr', 'cs', 'da', 'nl', 'en', 'et', 'fi', 'fr', 'ka', 'kk', 'de', 'el', 'he', 'hi', 'hu', 'id', 'it', 'ja', 'ko', 'ky', 'lv', 'lt', 'mk', 'mn', 'ms', 'no', 'fa', 'pl', 'pt', 'ro', 'ru', 'sr', 'sk', 'sl', 'so', 'es', 'sv', 'th', 'tr', 'uk', 'uz', 'vi']."
                      ]
                    }
                  },
                  "Invalid document age value": {
                    "summary": "`poa_document_age_months`-Wert außerhalb von 1–120 / -1",
                    "value": {
                      "poa_document_age_months": [
                        "Invalid integer value for 'utility_bill': '999'. Must be -1 (unlimited) or a positive integer between 1 and 120."
                      ]
                    }
                  },
                  "Extraction failure": {
                    "summary": "Das Dokument konnte von der Extraktions-Pipeline nicht verarbeitet werden",
                    "value": {
                      "error": [
                        "Error extracting POA information"
                      ]
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Zugriff verweigert. Wird zurückgegeben, wenn der Header `x-api-key` fehlt sowie wenn das Guthaben der aufrufenden Organisation den Aufruf nicht decken kann; ein falscher, widerrufener oder abgelaufener Schlüssel gibt `401` zurück. Ein fehlender Schlüssel gibt `403` mit `{\"detail\": ...}` zurück; ein falscher, widerrufener oder abgelaufener Schlüssel gibt `401` zurück. Unzureichende Credits geben `403` mit `{\"error\": ...}` zurück, bevor eine Dokumentenverarbeitung stattfindet.",
            "content": {
              "application/json": {
                "examples": {
                  "Missing or invalid API key": {
                    "summary": "Kein `x-api-key`-Header, oder der Schlüssel ist ungültig/widerrufen",
                    "value": {
                      "detail": "You do not have permission to perform this action."
                    }
                  },
                  "Not enough credits": {
                    "summary": "Das Guthaben der Organisation reicht für den Aufruf nicht aus",
                    "value": {
                      "error": "You don't have enough credits to perform this request. Please top up at https://business.didit.me"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate-Limit überschritten. POST/PATCH/DELETE-Endpoints teilen sich ein Budget von 300 Schreibanfragen pro Minute pro API-Schlüssel (Transaktionserstellungen und Ereignis-Ingestion haben ein separates Budget von 600). Die Antwort enthält die Header `X-RateLimit-Limit`, `X-RateLimit-Remaining`, `X-RateLimit-Reset` und `Retry-After`.",
            "content": {
              "application/json": {
                "examples": {
                  "Write rate limit exceeded": {
                    "summary": "Mehr als 300 Schreibanfragen in der aktuellen Minute",
                    "value": {
                      "detail": "Write request rate limit exceeded. You can make up to 300 requests per minute."
                    }
                  }
                },
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          },
          "503": {
            "$ref": "#/components/responses/DocumentProcessingBusy"
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "cURL",
            "source": "curl -X POST 'https://verification.didit.me/v3/poa/' \\\n  -H 'x-api-key: YOUR_API_KEY' \\\n  -F 'document=@./utility-bill.pdf' \\\n  -F 'expected_address=Av. Monseñor Tavella 1291, Salta, Argentina' \\\n  -F 'expected_country=ARG' \\\n  -F 'expected_first_name=Sophia' \\\n  -F 'expected_last_name=Martinez' \\\n  -F 'poa_languages_allowed=en,es' \\\n  -F 'vendor_data=user-123' \\\n  --max-time 45"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.proof_of_address.verify(\n    document=open(\"document.pdf\", \"rb\"),\n    expected_address=\"Av. Monseñor Tavella 1291, Salta, Argentina\",\n    expected_country=\"ARG\",\n    expected_first_name=\"Sophia\",\n    expected_last_name=\"Martinez\",\n    poa_languages_allowed=\"en,es\",\n    save_api_request=True,\n    vendor_data=\"user-123\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit, { fileFromPath } from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.proofOfAddress.verify({\n  document: await fileFromPath(\"document.pdf\"),\n  expected_address: \"Av. Monseñor Tavella 1291, Salta, Argentina\",\n  expected_country: \"ARG\",\n  expected_first_name: \"Sophia\",\n  expected_last_name: \"Martinez\",\n  poa_languages_allowed: \"en,es\",\n  save_api_request: true,\n  vendor_data: \"user-123\",\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.ProofOfAddress.Verify(ctx, didit.ProofOfAddressVerifyParams{\n\tDocument:            didit.FileFromPath(\"document.pdf\"),\n\tExpectedAddress:     didit.String(\"Av. Monseñor Tavella 1291, Salta, Argentina\"),\n\tExpectedCountry:     didit.String(\"ARG\"),\n\tExpectedFirstName:   didit.String(\"Sophia\"),\n\tExpectedLastName:    didit.String(\"Martinez\"),\n\tPOALanguagesAllowed: didit.String(\"en,es\"),\n\tSaveAPIRequest:      didit.Bool(true),\n\tVendorData:          didit.String(\"user-123\"),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import java.nio.file.Path;\nimport me.didit.Didit;\nimport me.didit.types.ProofOfAddressVerifyParams;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.proofOfAddress().verify(ProofOfAddressVerifyParams.builder()\n        .document(Path.of(\"document.pdf\"))\n        .expectedAddress(\"Av. Monseñor Tavella 1291, Salta, Argentina\")\n        .expectedCountry(\"ARG\")\n        .expectedFirstName(\"Sophia\")\n        .expectedLastName(\"Martinez\")\n        .poaLanguagesAllowed(\"en,es\")\n        .saveApiRequest(true)\n        .vendorData(\"user-123\")\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\nuse Didit\\File;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->proofOfAddress->verify([\n    'document' => File::fromPath('document.pdf'),\n    'expected_address' => 'Av. Monseñor Tavella 1291, Salta, Argentina',\n    'expected_country' => 'ARG',\n    'expected_first_name' => 'Sophia',\n    'expected_last_name' => 'Martinez',\n    'poa_languages_allowed' => 'en,es',\n    'save_api_request' => true,\n    'vendor_data' => 'user-123',\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.proof_of_address.verify(\n  document: Pathname(\"document.pdf\"),\n  expected_address: \"Av. Monseñor Tavella 1291, Salta, Argentina\",\n  expected_country: \"ARG\",\n  expected_first_name: \"Sophia\",\n  expected_last_name: \"Martinez\",\n  poa_languages_allowed: \"en,es\",\n  save_api_request: true,\n  vendor_data: \"user-123\"\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.ProofOfAddress.VerifyAsync(new ProofOfAddressVerifyParams\n{\n    Document = FileUpload.FromPath(\"document.pdf\"),\n    ExpectedAddress = \"Av. Monseñor Tavella 1291, Salta, Argentina\",\n    ExpectedCountry = \"ARG\",\n    ExpectedFirstName = \"Sophia\",\n    ExpectedLastName = \"Martinez\",\n    PoaLanguagesAllowed = \"en,es\",\n    SaveApiRequest = true,\n    VendorData = \"user-123\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ]
      }
    },
    "/v3/document-ai/": {
      "post": {
        "summary": "Document AI (benutzerdefinierte Feldextraktion + Manipulationsprüfungen)",
        "description": "Extrahieren Sie die Felder, die **Sie** definieren, aus jedem beliebigen Beleg – Gehaltsabrechnungen, Kapitalnachweisen, Schreiben zur Vermögensherkunft, Steuerbescheinigungen, Verträgen, Rechnungen – in einem einzigen Aufruf. Senden Sie die Datei sowie eine `fields`-Definition (Key, Name, Extraktionsanweisung, Typ) und erhalten Sie typisierte Werte (`text`, `number`, `date` im Format `YYYY-MM-DD`), einen optionalen Übereinstimmungswert beim Namensabgleich mit der erwarteten Person oder dem erwarteten Unternehmen, PDF/EXIF-Manipulationssignale, einen `status` von `Approved`/`Declined`/`In Review` sowie eine `warnings`-Liste zurück, die jedes gefundene Problem erläutert. Dies ist das Server-zu-Server-Gegenstück zum gehosteten Document AI-Workflow-Schritt (siehe `/core-technology/document-ai/overview`); es verwendet Didits Standard-Extraktionsmodell und bietet keine Anbieterauswahl.\n\n**Latenz.** Die Extraktion ist LLM-basiert: Typische Aufrufe dauern **5–15 Sekunden**, mehrseitige PDFs bis zu **~30 Sekunden**. Konfigurieren Sie ein Client-Timeout von **mindestens 45 Sekunden** und führen Sie vor Abschluss des Aufrufs keinen Wiederholungsversuch durch.\n\n**Anfrageformat.** Nur `multipart/form-data`. `fields` ist **ein einzelner JSON-codierter Array-String** (1–30 Elemente, maximal 16 KB); Formular-Arrays in eckigen Klammern werden mit `400` abgewiesen. Jedes Element ist `{key, name, instruction, type, required, is_full_name}` – `key` ist der JSON-Schlüssel, den Sie zurückerhalten (`^[a-z0-9_]{1,64}$`, eindeutig), `instruction` teilt dem Modell mit, was gelesen werden soll, `type` ist `text` (Standard) | `number` | `date`, `required` löst `DOCUMENT_AI_MISSING_REQUIRED_FIELDS` aus, wenn der Wert nicht gelesen werden kann, und höchstens ein Feld darf `is_full_name: true` setzen, um den Wert zu markieren, der mit dem erwarteten Namen verglichen wird.\n\n**Namensabgleich.** Übergeben Sie `expected_first_name` + `expected_last_name` (Person) **oder** `expected_company_name` (+ optional `expected_company_country`) – nicht beides. Der Wert des Feldes `is_full_name` (oder, falls keines markiert ist, das erste Textfeld, dessen Schlüssel wie ein Name aussieht) wird per Fuzzy-Matching verglichen; `name_match_score` (0–100) und `name_on_document` werden immer zurückgegeben, wenn beide Seiten vorhanden sind, und ein Wert unter `document_ai_name_match_score_threshold` (Standard 80) fügt `DOCUMENT_AI_NAME_MISMATCH` hinzu, gesteuert durch `document_ai_name_mismatch_action`.\n\n**Entscheidungslogik.** Jedes Risiko wird einer konfigurierbaren Aktion zugeordnet: `DECLINE` → `status: \"Declined\"`, `REVIEW` → `status: \"In Review\"`, `NO_ACTION` → rein informativ. Die Standardwerte entsprechen dem Workflow-Schritt: unlesbares Dokument `REVIEW`, fehlende erforderliche Felder `REVIEW`, Manipulationsverdacht `DECLINE`, Namensabweichung `NO_ACTION`, nicht unterstützte Datei `REVIEW`. Ein Dokument, das überhaupt nicht verarbeitet werden kann, gibt `400` zurück; ein lesbares, aber problematisches Dokument gibt `200` mit `Declined`/`In Review` zurück – prüfen Sie immer `document_ai.status` und `document_ai.warnings`, nicht nur den HTTP-Code.\n\n**Abrechnung.** Jede `200`-Antwort verbraucht einen Document AI-API-Credit – **$0.20 pro Dokument** laut Preisliste, bezahlt aus Ihrem Tarifguthaben oder Ihrem Aufladeguthaben. Wenn das Guthaben der Organisation den Aufruf nicht decken kann, gibt der Endpoint vor jeglicher Verarbeitung `403` zurück. Sandbox-API-Schlüssel geben eine deterministische Mock-Antwort zurück und werden nicht berechnet.\n\n**Persistenz.** Mit `save_api_request=true` (Standard) wird der Aufruf als Sitzung vom Typ API gespeichert: Das Dokument, die extrahierten Werte, die Felddefinitionen und der Snapshot des Namensabgleichs werden aufbewahrt, die Sitzung wird in der Business Console angezeigt und `request_id` funktioniert mit `GET /v3/session/{sessionId}/decision/`.",
        "operationId": "post_v3document-ai",
        "x-didit-sdk": {
          "resource": "document_ai",
          "method": "analyze",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Standalone APIs"
        ],
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "required": [
                  "document",
                  "fields"
                ],
                "properties": {
                  "document": {
                    "type": "string",
                    "format": "binary",
                    "description": "Das zu lesende Dokument. Zulässige Dateiendungen: `tiff`, `jpg`, `jpeg`, `png`, `pdf`, `webp`, `zip`. Maximale Upload-Größe: **30 MB** (größere Dateien werden mit `400` abgelehnt). Mehrseitige PDFs werden unterstützt (rechnen Sie mit höherer Latenz); verschlüsselte PDFs werden mit `400` abgelehnt. Bilder werden vor der Verarbeitung automatisch komprimiert."
                  },
                  "fields": {
                    "type": "string",
                    "description": "Ein JSON-codierter Array-String mit **1–30** Felddefinitionen (maximal 16 KB). Jedes Element: `key` (erforderlich, `^[a-z0-9_]{1,64}$`, eindeutig – der in `extracted_data` zurückgegebene Schlüssel), `name` (≤100 Zeichen, in Nachrichten angezeigt), `instruction` (≤500 Zeichen, was das Modell lesen soll), `type` (`text` Standard | `number` | `date`), `required` (Boolean, Standard `false`), `is_full_name` (Boolean, Standard `false`, maximal eines pro Anfrage). Formular-Arrays in Klammerschreibweise, ungültiges JSON, doppelte Schlüssel oder mehr als ein `is_full_name` geben vor jeglicher Verarbeitung oder Abrechnung `400` zurück.",
                    "example": "[{\"key\": \"employer_name\", \"name\": \"Employer name\", \"instruction\": \"The employer or company issuing the payslip.\", \"type\": \"text\", \"required\": true, \"is_full_name\": false}, {\"key\": \"employee_name\", \"name\": \"Employee name\", \"instruction\": \"The full name of the employee as printed on the payslip.\", \"type\": \"text\", \"required\": true, \"is_full_name\": true}, {\"key\": \"net_pay\", \"name\": \"Net pay\", \"instruction\": \"The net amount paid to the employee for the period.\", \"type\": \"number\", \"required\": true, \"is_full_name\": false}, {\"key\": \"pay_date\", \"name\": \"Pay date\", \"instruction\": \"The payment date shown on the payslip.\", \"type\": \"date\", \"required\": false, \"is_full_name\": false}]"
                  },
                  "expected_first_name": {
                    "type": "string",
                    "description": "Vorname, der mit dem Namensfeld des Dokuments abgeglichen werden soll (Fuzzy-Match, transliterationssensitiv). Zusammen mit `expected_last_name` verwenden; kann nicht mit `expected_company_name` kombiniert werden.",
                    "example": "Sophia"
                  },
                  "expected_last_name": {
                    "type": "string",
                    "description": "Mit dem Namensfeld des Dokuments abzugleichender Nachname, der zusammen mit `expected_first_name` für `name_match_score` herangezogen wird.",
                    "example": "Martinez"
                  },
                  "expected_company_name": {
                    "type": "string",
                    "description": "Unternehmensname zum Abgleich mit dem Namensfeld des Dokuments (für Unternehmensdokumente). Kann nicht mit `expected_first_name` / `expected_last_name` kombiniert werden (absichtlich kein Beispielwert – das generierte Anfragebeispiel verwendet die Personenfelder; ersetzen Sie diese durch diesen Wert bei der Verifizierung eines Unternehmensdokuments)."
                  },
                  "expected_company_country": {
                    "type": "string",
                    "description": "Optionaler ISO 3166-1 alpha-2 Ländercode (zwei ASCII-Buchstaben, z. B. `FR`), der die Normalisierung von Firmennamen für `expected_company_name` anpasst. Wird nur mit `expected_company_name` verwendet."
                  },
                  "document_ai_name_match_score_threshold": {
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 100,
                    "default": 80,
                    "description": "Minimaler `name_match_score` (0–100), ab dem der Name als übereinstimmend gilt. Ein niedrigerer Wert fügt `DOCUMENT_AI_NAME_MISMATCH` hinzu, gesteuert durch `document_ai_name_mismatch_action`.",
                    "example": 80
                  },
                  "document_ai_unreadable_document_action": {
                    "type": "string",
                    "enum": [
                      "DECLINE",
                      "REVIEW",
                      "NO_ACTION"
                    ],
                    "default": "REVIEW",
                    "description": "Was zu tun ist, wenn kein Feld aus dem Dokument gelesen werden konnte (`DOCUMENT_AI_UNREADABLE_DOCUMENT`)."
                  },
                  "document_ai_missing_required_fields_action": {
                    "type": "string",
                    "enum": [
                      "DECLINE",
                      "REVIEW",
                      "NO_ACTION"
                    ],
                    "default": "REVIEW",
                    "description": "Was zu tun ist, wenn mindestens ein `required`-Feld nicht gelesen werden konnte (`DOCUMENT_AI_MISSING_REQUIRED_FIELDS`; `additional_data.missing_fields` listet diese auf)."
                  },
                  "document_ai_document_tampering_action": {
                    "type": "string",
                    "enum": [
                      "DECLINE",
                      "REVIEW",
                      "NO_ACTION"
                    ],
                    "default": "DECLINE",
                    "description": "Was zu tun ist, wenn die PDF-/EXIF-Forensik eine Manipulation vermutet — nach digitaler Signatur geändert, bekannter PDF-Editor, Overlay-Text-Manipulation, verdächtiger Re-Export, Bildanomalien (`DOCUMENT_AI_SUSPECTED_MANIPULATION`)."
                  },
                  "document_ai_name_mismatch_action": {
                    "type": "string",
                    "enum": [
                      "DECLINE",
                      "REVIEW",
                      "NO_ACTION"
                    ],
                    "default": "NO_ACTION",
                    "description": "Was zu tun ist, wenn `name_match_score` unter dem Schwellenwert liegt (`DOCUMENT_AI_NAME_MISMATCH`)."
                  },
                  "document_ai_unsupported_file_action": {
                    "type": "string",
                    "enum": [
                      "DECLINE",
                      "REVIEW",
                      "NO_ACTION"
                    ],
                    "default": "REVIEW",
                    "description": "Was zu tun ist, wenn der Upload leer oder keine verarbeitbare Datei ist (`DOCUMENT_AI_UNSUPPORTED_FILE`)."
                  },
                  "save_api_request": {
                    "type": "boolean",
                    "default": true,
                    "description": "Wenn `true` (Standard), wird der Aufruf als Sitzung vom Typ API persistent gespeichert — sichtbar in der Business Console, abrufbar über `GET /v3/session/{sessionId}/decision/` unter Verwendung der zurückgegebenen `request_id`, wobei das hochgeladene Dokument, die extrahierten Werte, die Felddefinitionen und der Namensabgleich-Snapshot gespeichert werden. Wenn `false`, wird nichts gespeichert und `request_id` ist eine flüchtige UUID, die nur der Antwortkorrelation dient; der Aufruf wird dennoch abgerechnet.",
                    "example": true
                  },
                  "vendor_data": {
                    "type": "string",
                    "description": "Optionale opake Zeichenfolge (Ihre interne Benutzer-ID, E-Mail, UUID…), die in der gespeicherten Sitzung hinterlegt und in der Antwort zurückgegeben wird. Verwenden Sie sie, um API-Aufrufe mit Ihren eigenen Datensätzen abzugleichen und Sitzungen später zu filtern.",
                    "example": "user-123"
                  },
                  "metadata": {
                    "type": "object",
                    "additionalProperties": true,
                    "description": "Optionales JSON-Objekt, das mit der Sitzung gespeichert (wenn `save_api_request=true`) und in der Antwort zurückgegeben wird. Senden Sie es bei Multipart-Anfragen als JSON-codiertes String-Feld (z. B. `metadata={\"flow\":\"onboarding\"}`) – es wird in ein Objekt geparst.",
                    "example": {
                      "flow": "onboarding"
                    }
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Dokument verarbeitet. `document_ai.status` ist `Approved`, `Declined` oder `In Review`; jedes erkannte Problem wird einzeln in `document_ai.warnings` aufgeführt. Ein problematisches Dokument gibt dennoch `200` zurück – prüfen Sie den Body, nicht nur den HTTP-Code. Wenn `save_api_request=true`, ist `request_id` die persistierte Sitzungs-ID.",
            "content": {
              "application/json": {
                "examples": {
                  "Approved": {
                    "summary": "Gehaltsabrechnung fehlerfrei gelesen, Name stimmte überein",
                    "value": {
                      "request_id": "9d6a3b1e-2f0c-4a8e-9b7d-1c2e3f4a5b6c",
                      "document_ai": {
                        "status": "Approved",
                        "extracted_data": {
                          "employer_name": "Acme Payments Ltd",
                          "employee_name": "Sophia Martinez",
                          "net_pay": 3120.5,
                          "pay_date": "2026-07-31"
                        },
                        "detected_codes": [
                          {
                            "type": "CODE_128",
                            "page_number": 1,
                            "position": [
                              [
                                96,
                                456
                              ],
                              [
                                96,
                                616
                              ],
                              [
                                1012,
                                611
                              ],
                              [
                                1015,
                                456
                              ]
                            ],
                            "x": 96,
                            "y": 456,
                            "width": 919,
                            "height": 160,
                            "page_width": 1200,
                            "page_height": 1700,
                            "raw_payload": "SU5WLTIwMjYtMDA0Mg==",
                            "parsed_payload": "INV-2026-0042"
                          }
                        ],
                        "fields": [
                          {
                            "key": "employer_name",
                            "name": "Employer name",
                            "instruction": "The employer or company issuing the payslip.",
                            "type": "text",
                            "required": true,
                            "is_full_name": false
                          },
                          {
                            "key": "employee_name",
                            "name": "Employee name",
                            "instruction": "The full name of the employee as printed on the payslip.",
                            "type": "text",
                            "required": true,
                            "is_full_name": true
                          },
                          {
                            "key": "net_pay",
                            "name": "Net pay",
                            "instruction": "The net amount paid to the employee for the period.",
                            "type": "number",
                            "required": true,
                            "is_full_name": false
                          },
                          {
                            "key": "pay_date",
                            "name": "Pay date",
                            "instruction": "The payment date shown on the payslip.",
                            "type": "date",
                            "required": false,
                            "is_full_name": false
                          }
                        ],
                        "name_match_score": 100.0,
                        "name_on_document": "Sophia Martinez",
                        "warnings": []
                      },
                      "vendor_data": "user-123",
                      "metadata": {
                        "flow": "onboarding"
                      },
                      "created_at": "2026-08-19T16:40:12.318Z"
                    }
                  },
                  "In Review — missing required field": {
                    "summary": "`net_pay` konnte nicht gelesen werden; Standardaktion REVIEW",
                    "value": {
                      "request_id": "3f2a9c7b-5d4e-4b1a-8c6f-0e9d8c7b6a5f",
                      "document_ai": {
                        "status": "In Review",
                        "extracted_data": {
                          "employer_name": "Acme Payments Ltd",
                          "employee_name": "Sophia Martinez",
                          "net_pay": null,
                          "pay_date": "2026-07-31"
                        },
                        "detected_codes": [],
                        "fields": [
                          {
                            "key": "employer_name",
                            "name": "Employer name",
                            "instruction": "The employer or company issuing the payslip.",
                            "type": "text",
                            "required": true,
                            "is_full_name": false
                          },
                          {
                            "key": "employee_name",
                            "name": "Employee name",
                            "instruction": "The full name of the employee as printed on the payslip.",
                            "type": "text",
                            "required": true,
                            "is_full_name": true
                          },
                          {
                            "key": "net_pay",
                            "name": "Net pay",
                            "instruction": "The net amount paid to the employee for the period.",
                            "type": "number",
                            "required": true,
                            "is_full_name": false
                          },
                          {
                            "key": "pay_date",
                            "name": "Pay date",
                            "instruction": "The payment date shown on the payslip.",
                            "type": "date",
                            "required": false,
                            "is_full_name": false
                          }
                        ],
                        "name_match_score": 100.0,
                        "name_on_document": "Sophia Martinez",
                        "warnings": [
                          {
                            "risk": "DOCUMENT_AI_MISSING_REQUIRED_FIELDS",
                            "feature": "DOCUMENT_AI",
                            "additional_data": {
                              "missing_fields": [
                                "Net pay"
                              ]
                            },
                            "log_type": "warning",
                            "short_description": "Required fields could not be extracted",
                            "long_description": "One or more fields configured as required could not be extracted from the uploaded document."
                          }
                        ]
                      },
                      "vendor_data": null,
                      "metadata": null,
                      "created_at": "2026-08-19T16:41:05.002Z"
                    }
                  },
                  "Declined — suspected manipulation": {
                    "summary": "PDF-Forensik hat einen bekannten Editor erkannt; Standardaktion DECLINE",
                    "value": {
                      "request_id": "7c1d2e3f-4a5b-4c6d-8e9f-0a1b2c3d4e5f",
                      "document_ai": {
                        "status": "Declined",
                        "extracted_data": {
                          "employer_name": "Acme Payments Ltd",
                          "employee_name": "Sophia Martinez",
                          "net_pay": 3120.5,
                          "pay_date": "2026-07-31"
                        },
                        "detected_codes": [],
                        "fields": [
                          {
                            "key": "employer_name",
                            "name": "Employer name",
                            "instruction": "The employer or company issuing the payslip.",
                            "type": "text",
                            "required": true,
                            "is_full_name": false
                          },
                          {
                            "key": "employee_name",
                            "name": "Employee name",
                            "instruction": "The full name of the employee as printed on the payslip.",
                            "type": "text",
                            "required": true,
                            "is_full_name": true
                          },
                          {
                            "key": "net_pay",
                            "name": "Net pay",
                            "instruction": "The net amount paid to the employee for the period.",
                            "type": "number",
                            "required": true,
                            "is_full_name": false
                          },
                          {
                            "key": "pay_date",
                            "name": "Pay date",
                            "instruction": "The payment date shown on the payslip.",
                            "type": "date",
                            "required": false,
                            "is_full_name": false
                          }
                        ],
                        "name_match_score": null,
                        "name_on_document": "Sophia Martinez",
                        "warnings": [
                          {
                            "risk": "DOCUMENT_AI_SUSPECTED_MANIPULATION",
                            "feature": "DOCUMENT_AI",
                            "additional_data": {
                              "detection_method": "known_editor",
                              "processed_by_known_editor": "ilovepdf"
                            },
                            "log_type": "error",
                            "short_description": "Suspected document manipulation",
                            "long_description": "The system detected signs of potential manipulation or editing in the uploaded document."
                          }
                        ]
                      },
                      "vendor_data": null,
                      "metadata": null,
                      "created_at": "2026-08-19T16:42:40.771Z"
                    }
                  }
                },
                "schema": {
                  "type": "object",
                  "properties": {
                    "request_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "Beibehaltene Sitzungs-ID, wenn `save_api_request=true` (verwendbar mit `GET /v3/session/{sessionId}/decision/`); andernfalls eine vorübergehende Korrelations-UUID."
                    },
                    "document_ai": {
                      "type": "object",
                      "properties": {
                        "status": {
                          "type": "string",
                          "enum": [
                            "Approved",
                            "Declined",
                            "In Review"
                          ],
                          "description": "`Approved`, wenn keine Warnung zu einer Ablehnung oder Prüfung führt; `Declined`, wenn mindestens ein Risiko `DECLINE` entspricht; andernfalls `In Review`, wenn mindestens eines `REVIEW` entspricht. Die Liste `warnings` erklärt warum."
                        },
                        "extracted_data": {
                          "type": "object",
                          "additionalProperties": true,
                          "description": "Ein Eintrag pro angefordertem Feldschlüssel. Die Werte sind entsprechend dem `type` des Felds typisiert — Zeichenfolgen für `text`, Zahlen für `number`, `YYYY-MM-DD`-Zeichenfolgen für `date` — oder `null`, wenn der Wert nicht gelesen werden konnte.",
                          "example": {
                            "employer_name": "Acme Payments Ltd",
                            "employee_name": "Sophia Martinez",
                            "net_pay": 3120.5,
                            "pay_date": "2026-07-31"
                          }
                        },
                        "detected_codes": {
                          "type": "array",
                          "description": "Auf jeder verarbeiteten Seite erkannte QR-Codes und Barcodes. Leer, wenn keine gefunden wurden. Ein lokalisierter, aber nicht decodierbarer QR-Code weist `parsed_payload: null` auf.",
                          "items": {
                            "$ref": "#/components/schemas/DocumentAIDetectedCode"
                          }
                        },
                        "fields": {
                          "type": "array",
                          "description": "Die normalisierten Felddefinitionen, die für diese Extraktion verwendet wurden, als Echo zurückgegeben (auch mit der Sitzung gespeichert, wenn `save_api_request=true`).",
                          "items": {
                            "type": "object",
                            "properties": {
                              "key": {
                                "type": "string"
                              },
                              "name": {
                                "type": "string"
                              },
                              "instruction": {
                                "type": "string"
                              },
                              "type": {
                                "type": "string",
                                "enum": [
                                  "text",
                                  "number",
                                  "date"
                                ]
                              },
                              "required": {
                                "type": "boolean"
                              },
                              "is_full_name": {
                                "type": "boolean"
                              }
                            }
                          }
                        },
                        "name_match_score": {
                          "type": "number",
                          "nullable": true,
                          "minimum": 0,
                          "maximum": 100,
                          "description": "Fuzzy-Ähnlichkeit (0–100) zwischen `name_on_document` und dem erwarteten Personen-/Unternehmensnamen. Wird zurückgegeben, sobald sowohl ein Namenswert als auch ein erwarteter Name existieren – bei Übereinstimmungen **und** Abweichungen; andernfalls `null`.",
                          "example": 96.0
                        },
                        "name_on_document": {
                          "type": "string",
                          "nullable": true,
                          "description": "Der aus dem Dokument entnommene Namenswert (das Feld `is_full_name` oder das erste namensähnliche Textfeld), der mit dem erwarteten Namen verglichen wurde. `null`, wenn kein Namenswert verfügbar war.",
                          "example": "Sophia Martinez"
                        },
                        "warnings": {
                          "type": "array",
                          "description": "Leer bei einer fehlerfreien Genehmigung. Jeder Eintrag erläutert ein erkanntes Risiko; Einträge mit `log_type: \"error\"` setzen `status` auf `Declined`, Einträge mit `log_type: \"warning\"` setzen ihn auf `In Review`.",
                          "items": {
                            "type": "object",
                            "properties": {
                              "risk": {
                                "type": "string",
                                "enum": [
                                  "DOCUMENT_AI_UNREADABLE_DOCUMENT",
                                  "DOCUMENT_AI_MISSING_REQUIRED_FIELDS",
                                  "DOCUMENT_AI_SUSPECTED_MANIPULATION",
                                  "DOCUMENT_AI_NAME_MISMATCH",
                                  "DOCUMENT_AI_UNSUPPORTED_FILE"
                                ],
                                "description": "Maschinenlesbarer Risiko-Code. Jeder Code wird durch die entsprechende `document_ai_*_action`-Anfrageoption gesteuert.",
                                "example": "DOCUMENT_AI_MISSING_REQUIRED_FIELDS"
                              },
                              "feature": {
                                "type": "string",
                                "enum": [
                                  "DOCUMENT_AI"
                                ],
                                "description": "Funktion, die die Warnung ausgelöst hat. An diesem Endpoint immer `DOCUMENT_AI`."
                              },
                              "additional_data": {
                                "type": "object",
                                "nullable": true,
                                "additionalProperties": true,
                                "description": "Zusätzlicher Kontext für das Risiko: `{\"missing_fields\": [\"Net pay\"]}` bei fehlenden Pflichtfeldern, `{\"name_on_document\", \"score\", \"threshold\"}` bei Namensabweichungen und der forensische Befund (`detection_method`, Ersteller-/Bearbeiter-Details) bei Manipulationsverdacht. `null`, wenn nichts hinzuzufügen ist.",
                                "example": {
                                  "missing_fields": [
                                    "Net pay"
                                  ]
                                }
                              },
                              "log_type": {
                                "type": "string",
                                "enum": [
                                  "error",
                                  "warning",
                                  "information"
                                ],
                                "description": "Schweregrad, der aus der konfigurierten Aktion abgeleitet wird: `error` (DECLINE), `warning` (REVIEW), `information` (NO_ACTION)."
                              },
                              "short_description": {
                                "type": "string",
                                "description": "Für Menschen lesbare einzeilige Zusammenfassung des Risikos.",
                                "example": "Required fields could not be extracted"
                              },
                              "long_description": {
                                "type": "string",
                                "description": "Lesbare Erklärung, gegebenenfalls mit `additional_data` interpoliert."
                              }
                            }
                          }
                        }
                      }
                    },
                    "vendor_data": {
                      "type": "string",
                      "nullable": true,
                      "description": "Rückgabe der von Ihnen gesendeten `vendor_data` oder `null`."
                    },
                    "metadata": {
                      "type": "object",
                      "nullable": true,
                      "additionalProperties": true,
                      "description": "Rückgabe des von Ihnen gesendeten `metadata`-Objekts oder `null`."
                    },
                    "created_at": {
                      "type": "string",
                      "format": "date-time",
                      "description": "Wann die Anfrage verarbeitet wurde (UTC, ISO 8601)."
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Validierungs- oder Verarbeitungsfehler. Probleme auf Feldebene geben das Standard-Antwortformat von DRF zurück (ein Array von Meldungen pro betroffenem Feld). Verschlüsselte oder unlesbare Dokumente sowie Extraktionsfehler geben `{\"error\": ...}` zurück.",
            "content": {
              "application/json": {
                "examples": {
                  "Missing document": {
                    "summary": "`document` ist nicht in den Formulardaten enthalten",
                    "value": {
                      "document": [
                        "No file was submitted."
                      ]
                    }
                  },
                  "Invalid fields payload": {
                    "summary": "`fields` ist kein einzelner JSON-codierter Array-String",
                    "value": {
                      "fields": [
                        "fields must be a valid JSON array string."
                      ]
                    }
                  },
                  "Duplicate field keys": {
                    "summary": "Zwei Elemente teilen denselben `key`",
                    "value": {
                      "fields": [
                        "Every fields item must have a unique key."
                      ]
                    }
                  },
                  "Conflicting expectations": {
                    "summary": "Erwartungen für Person und Unternehmen gemeinsam gesendet",
                    "value": {
                      "non_field_errors": [
                        "Provide either person expected-name fields or expected_company_name, not both."
                      ]
                    }
                  },
                  "Invalid metadata": {
                    "summary": "`metadata` ist kein JSON-Objekt (oder enthält ein NUL-Zeichen)",
                    "value": {
                      "metadata": [
                        "Metadata must be a JSON object."
                      ]
                    }
                  },
                  "Oversized vendor_data": {
                    "summary": "`vendor_data` überschreitet die Obergrenze von 2.000 Bytes",
                    "value": {
                      "vendor_data": [
                        "vendor_data is too long (maximum 2000 bytes)."
                      ]
                    }
                  },
                  "Encrypted PDF": {
                    "summary": "Passwortgeschützte PDF-Datei",
                    "value": {
                      "error": "The PDF is encrypted. Please upload a decrypted PDF or a photo instead."
                    }
                  },
                  "Extraction failed": {
                    "summary": "Die Extraktions-Pipeline konnte das Dokument nicht verarbeiten",
                    "value": {
                      "error": [
                        "Error extracting Document AI information"
                      ]
                    }
                  }
                },
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "403": {
            "description": "Zugriff verweigert. Wird zurückgegeben, wenn der Header `x-api-key` fehlt sowie wenn das Guthaben der aufrufenden Organisation den Aufruf nicht decken kann; ein falscher, widerrufener oder abgelaufener Schlüssel gibt `401` zurück. Ein fehlender Schlüssel gibt `403` mit `{\"detail\": ...}` zurück; ein falscher, widerrufener oder abgelaufener Schlüssel gibt `401` zurück. Unzureichende Credits – sowie Organisationen mit Vertragsabrechnung, deren Preisliste keinen Eintrag für die Document AI API enthält – geben `403` mit `{\"error\": ...}` zurück, bevor eine Dokumentenverarbeitung stattfindet.",
            "content": {
              "application/json": {
                "examples": {
                  "Missing or invalid API key": {
                    "summary": "Kein `x-api-key`-Header, oder der Schlüssel ist ungültig/widerrufen",
                    "value": {
                      "detail": "You do not have permission to perform this action."
                    }
                  },
                  "Not enough credits": {
                    "summary": "Das Guthaben der Organisation reicht für den Aufruf nicht aus",
                    "value": {
                      "error": "You don't have enough credits to perform this request. Please top up at https://business.didit.me"
                    }
                  },
                  "Contract rate missing": {
                    "summary": "Über Vertrag abgerechnete Organisation, deren Preisliste keinen Document AI API-Eintrag enthält",
                    "value": {
                      "error": "Document AI API is not included in your contract rate card. Contact support@didit.me to enable it."
                    }
                  }
                },
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string"
                    },
                    "error": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate-Limit überschritten. POST/PATCH/DELETE-Endpoints teilen sich ein Budget von 300 Schreibanfragen pro Minute pro API-Schlüssel (Transaktionserstellungen und Ereignis-Ingestion haben ein separates Budget von 600). Die Antwort enthält die Header `X-RateLimit-Limit`, `X-RateLimit-Remaining`, `X-RateLimit-Reset` und `Retry-After`.",
            "content": {
              "application/json": {
                "examples": {
                  "Write rate limit exceeded": {
                    "summary": "Mehr als 300 Schreibanfragen in der aktuellen Minute",
                    "value": {
                      "detail": "Write request rate limit exceeded. You can make up to 300 requests per minute."
                    }
                  }
                },
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          },
          "503": {
            "$ref": "#/components/responses/DocumentProcessingBusy"
          }
        },
        "x-codeSamples": [
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.document_ai.analyze(\n    document=open(\"document.pdf\", \"rb\"),\n    fields=\"[{\\\"key\\\": \\\"employer_name\\\", \\\"name\\\": \\\"Employer name\\\", \\\"instruction\\\": \\\"The employer or company issuing the payslip.\\\", \\\"type\\\": \\\"text\\\", \\\"required\\\": true, \\\"is_full_name\\\": false}, {\\\"key\\\": \\\"employee_name\\\", \\\"name\\\": \\\"Employee name\\\", \\\"instruction\\\": \\\"The full name of the employee as printed on the payslip.\\\", \\\"type\\\": \\\"text\\\", \\\"required\\\": true, \\\"is_full_name\\\": true}, {\\\"key\\\": \\\"net_pay\\\", \\\"name\\\": \\\"Net pay\\\", \\\"instruction\\\": \\\"The net amount paid to the employee for the period.\\\", \\\"type\\\": \\\"number\\\", \\\"required\\\": true, \\\"is_full_name\\\": false}, {\\\"key\\\": \\\"pay_date\\\", \\\"name\\\": \\\"Pay date\\\", \\\"instruction\\\": \\\"The payment date shown on the payslip.\\\", \\\"type\\\": \\\"date\\\", \\\"required\\\": false, \\\"is_full_name\\\": false}]\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit, { fileFromPath } from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.documentAi.analyze({\n  document: await fileFromPath(\"document.pdf\"),\n  fields: \"[{\\\"key\\\": \\\"employer_name\\\", \\\"name\\\": \\\"Employer name\\\", \\\"instruction\\\": \\\"The employer or company issuing the payslip.\\\", \\\"type\\\": \\\"text\\\", \\\"required\\\": true, \\\"is_full_name\\\": false}, {\\\"key\\\": \\\"employee_name\\\", \\\"name\\\": \\\"Employee name\\\", \\\"instruction\\\": \\\"The full name of the employee as printed on the payslip.\\\", \\\"type\\\": \\\"text\\\", \\\"required\\\": true, \\\"is_full_name\\\": true}, {\\\"key\\\": \\\"net_pay\\\", \\\"name\\\": \\\"Net pay\\\", \\\"instruction\\\": \\\"The net amount paid to the employee for the period.\\\", \\\"type\\\": \\\"number\\\", \\\"required\\\": true, \\\"is_full_name\\\": false}, {\\\"key\\\": \\\"pay_date\\\", \\\"name\\\": \\\"Pay date\\\", \\\"instruction\\\": \\\"The payment date shown on the payslip.\\\", \\\"type\\\": \\\"date\\\", \\\"required\\\": false, \\\"is_full_name\\\": false}]\",\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.DocumentAi.Analyze(ctx, didit.DocumentAiAnalyzeParams{\n\tDocument: didit.FileFromPath(\"document.pdf\"),\n\tFields:   \"[{\\\"key\\\": \\\"employer_name\\\", \\\"name\\\": \\\"Employer name\\\", \\\"instruction\\\": \\\"The employer or company issuing the payslip.\\\", \\\"type\\\": \\\"text\\\", \\\"required\\\": true, \\\"is_full_name\\\": false}, {\\\"key\\\": \\\"employee_name\\\", \\\"name\\\": \\\"Employee name\\\", \\\"instruction\\\": \\\"The full name of the employee as printed on the payslip.\\\", \\\"type\\\": \\\"text\\\", \\\"required\\\": true, \\\"is_full_name\\\": true}, {\\\"key\\\": \\\"net_pay\\\", \\\"name\\\": \\\"Net pay\\\", \\\"instruction\\\": \\\"The net amount paid to the employee for the period.\\\", \\\"type\\\": \\\"number\\\", \\\"required\\\": true, \\\"is_full_name\\\": false}, {\\\"key\\\": \\\"pay_date\\\", \\\"name\\\": \\\"Pay date\\\", \\\"instruction\\\": \\\"The payment date shown on the payslip.\\\", \\\"type\\\": \\\"date\\\", \\\"required\\\": false, \\\"is_full_name\\\": false}]\",\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import java.nio.file.Path;\nimport me.didit.Didit;\nimport me.didit.types.DocumentAiAnalyzeParams;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.documentAi().analyze(DocumentAiAnalyzeParams.builder()\n        .document(Path.of(\"document.pdf\"))\n        .fields(\"[{\\\"key\\\": \\\"employer_name\\\", \\\"name\\\": \\\"Employer name\\\", \\\"instruction\\\": \\\"The employer or company issuing the payslip.\\\", \\\"type\\\": \\\"text\\\", \\\"required\\\": true, \\\"is_full_name\\\": false}, {\\\"key\\\": \\\"employee_name\\\", \\\"name\\\": \\\"Employee name\\\", \\\"instruction\\\": \\\"The full name of the employee as printed on the payslip.\\\", \\\"type\\\": \\\"text\\\", \\\"required\\\": true, \\\"is_full_name\\\": true}, {\\\"key\\\": \\\"net_pay\\\", \\\"name\\\": \\\"Net pay\\\", \\\"instruction\\\": \\\"The net amount paid to the employee for the period.\\\", \\\"type\\\": \\\"number\\\", \\\"required\\\": true, \\\"is_full_name\\\": false}, {\\\"key\\\": \\\"pay_date\\\", \\\"name\\\": \\\"Pay date\\\", \\\"instruction\\\": \\\"The payment date shown on the payslip.\\\", \\\"type\\\": \\\"date\\\", \\\"required\\\": false, \\\"is_full_name\\\": false}]\")\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\nuse Didit\\File;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->documentAi->analyze([\n    'document' => File::fromPath('document.pdf'),\n    'fields' => '[{\"key\": \"employer_name\", \"name\": \"Employer name\", \"instruction\": \"The employer or company issuing the payslip.\", \"type\": \"text\", \"required\": true, \"is_full_name\": false}, {\"key\": \"employee_name\", \"name\": \"Employee name\", \"instruction\": \"The full name of the employee as printed on the payslip.\", \"type\": \"text\", \"required\": true, \"is_full_name\": true}, {\"key\": \"net_pay\", \"name\": \"Net pay\", \"instruction\": \"The net amount paid to the employee for the period.\", \"type\": \"number\", \"required\": true, \"is_full_name\": false}, {\"key\": \"pay_date\", \"name\": \"Pay date\", \"instruction\": \"The payment date shown on the payslip.\", \"type\": \"date\", \"required\": false, \"is_full_name\": false}]',\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.document_ai.analyze(\n  document: Pathname(\"document.pdf\"),\n  fields: \"[{\\\"key\\\": \\\"employer_name\\\", \\\"name\\\": \\\"Employer name\\\", \\\"instruction\\\": \\\"The employer or company issuing the payslip.\\\", \\\"type\\\": \\\"text\\\", \\\"required\\\": true, \\\"is_full_name\\\": false}, {\\\"key\\\": \\\"employee_name\\\", \\\"name\\\": \\\"Employee name\\\", \\\"instruction\\\": \\\"The full name of the employee as printed on the payslip.\\\", \\\"type\\\": \\\"text\\\", \\\"required\\\": true, \\\"is_full_name\\\": true}, {\\\"key\\\": \\\"net_pay\\\", \\\"name\\\": \\\"Net pay\\\", \\\"instruction\\\": \\\"The net amount paid to the employee for the period.\\\", \\\"type\\\": \\\"number\\\", \\\"required\\\": true, \\\"is_full_name\\\": false}, {\\\"key\\\": \\\"pay_date\\\", \\\"name\\\": \\\"Pay date\\\", \\\"instruction\\\": \\\"The payment date shown on the payslip.\\\", \\\"type\\\": \\\"date\\\", \\\"required\\\": false, \\\"is_full_name\\\": false}]\"\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.DocumentAi.AnalyzeAsync(new DocumentAiAnalyzeParams\n{\n    Document = FileUpload.FromPath(\"document.pdf\"),\n    Fields = \"[{\\\"key\\\": \\\"employer_name\\\", \\\"name\\\": \\\"Employer name\\\", \\\"instruction\\\": \\\"The employer or company issuing the payslip.\\\", \\\"type\\\": \\\"text\\\", \\\"required\\\": true, \\\"is_full_name\\\": false}, {\\\"key\\\": \\\"employee_name\\\", \\\"name\\\": \\\"Employee name\\\", \\\"instruction\\\": \\\"The full name of the employee as printed on the payslip.\\\", \\\"type\\\": \\\"text\\\", \\\"required\\\": true, \\\"is_full_name\\\": true}, {\\\"key\\\": \\\"net_pay\\\", \\\"name\\\": \\\"Net pay\\\", \\\"instruction\\\": \\\"The net amount paid to the employee for the period.\\\", \\\"type\\\": \\\"number\\\", \\\"required\\\": true, \\\"is_full_name\\\": false}, {\\\"key\\\": \\\"pay_date\\\", \\\"name\\\": \\\"Pay date\\\", \\\"instruction\\\": \\\"The payment date shown on the payslip.\\\", \\\"type\\\": \\\"date\\\", \\\"required\\\": false, \\\"is_full_name\\\": false}]\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ]
      }
    },
    "/v3/aml/": {
      "post": {
        "summary": "AML-Screening (eigenständig)",
        "operationId": "post_v3aml",
        "x-didit-sdk": {
          "resource": "aml",
          "method": "screen",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Standalone APIs"
        ],
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": false,
            "description": "Optionaler Schlüssel zur Absicherung von Wiederholungsversuchen, bis zu 255 Zeichen. Die erneute Verwendung desselben Schlüssels mit demselben Request-Body gibt die ursprüngliche Antwort zurück, ohne ein zweites Screening durchzuführen oder abzurechnen. Die erneute Verwendung des Schlüssels mit einem anderen Body gibt `409` zurück.",
            "schema": {
              "type": "string",
              "maxLength": 255
            }
          }
        ],
        "description": "Überprüfen Sie eine Person oder ein Unternehmen in einem einzigen Aufruf anhand von PEP-, Sanktions-, Warn-/Beobachtungslisten- und Negativmedien-Datensätzen.\n\n**Zwei-Score-Modell.** Jeder Treffer enthält einen `match_score` (0–100, Identitätskonfidenz) und einen `risk_score` (0–100, Entitätsrisiko). Treffer, deren `match_score` unter `aml_match_score_threshold` (Standard **93**) liegt, werden mit `review_status: \"False Positive\"` versehen und für Risikozwecke ignoriert; der höchste `risk_score` unter den verbleibenden Treffern wird zu `aml.score`. Der finale `aml.status` richtet sich nach Ihren Schwellenwerten: `score` > `aml_score_review_threshold` (Standard **100**) → `Declined`; `score` > `aml_score_approve_threshold` (Standard **80**) → `In Review`; andernfalls `Approved`. Immer wenn `score` ungleich null und ≥ dem Genehmigungsschwellenwert ist, wird eine `POSSIBLE_MATCH_FOUND`-Warnung hinzugefügt (ein Score von exakt 0 löst nie eine Warnung aus).\n\n**Gewichtung des Übereinstimmungswerts.** `aml_name_weight` + `aml_dob_weight` + `aml_country_weight` müssen in der Summe exakt 100 ergeben (Standardwerte 60/25/15). Komponenten, die in der Anfrage fehlen, werden herausrenormiert; eine übereinstimmende `document_number` fungiert als Masterschlüssel, der den `match_score` auf 100 überschreibt.\n\n**Latenz.** Einfache Screenings sind typischerweise in wenigen Sekunden abgeschlossen. Bei `include_adverse_media=true` wartet die API auf die Anreicherung durch negative Medienberichte (eine anfängliche Pause von ~5 s plus bis zu ~25 s Polling) – konfigurieren Sie ein Client-Timeout von **mindestens 60 Sekunden**.\n\n**Persistenz.** `save_api_request` ist standardmäßig **true**: Das Screening wird als Sitzung gespeichert (`request_id` funktioniert mit `GET /v3/session/{sessionId}/decision/`), es erscheint in der Konsole, ein `status.updated`-Webhook wird ausgelöst und der Prüfstatus von Treffern kann später aktualisiert werden. Bei `save_api_request=false` wird nichts gespeichert und `request_id` ist eine temporäre Korrelations-ID. `include_ongoing_monitoring=true` führt fortlaufend erneute Screenings des Profils durch und erfordert `save_api_request=true` (wird mit `400` erzwungen).\n\n**Idempotenz.** Senden Sie bei Wiederholungsversuchen nach einem Timeout oder vorübergehenden Fehler einen `Idempotency-Key`-Header. Der Schlüssel ist an Ihre Anwendung und den exakten Request-Body gebunden. Die erste abgeschlossene Anfrage speichert ihre Antwort; spätere identische Wiederholungsversuche geben dieselbe Antwort zurück und führen kein weiteres AML-Screening durch bzw. stellen keines in Rechnung. Wenn die ursprüngliche Anfrage noch läuft, versuchen Sie es später mit demselben Schlüssel erneut. Wird derselbe Schlüssel mit einem anderen Body wiederverwendet, gibt die API `409` zurück.\n\n**Abrechnung.** Nach dem ersten erfolgreichen Screening wird ein AML-API-Credit berechnet. Wiederholte idempotente Antworten werden nicht erneut berechnet; ein unzureichendes Guthaben gibt `403` zurück, bevor ein neues Screening stattfindet.\n\n**Sandbox.** Schlüssel von Sandbox-Anwendungen überspringen Screening und Abrechnung vollständig und geben ein Mock-Ergebnis zurück – `Approved` mit null Treffern, sofern Sie nicht `sandbox_scenario` übergeben. `save_api_request` funktioniert genauso wie bei Live-Schlüsseln, sodass ein gespeichertes Sandbox-Screening über `GET /v3/session/{sessionId}/decision/` und `GET /v3/session/{sessionId}/generate-pdf/` abrufbar ist.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "full_name"
                ],
                "properties": {
                  "full_name": {
                    "type": "string",
                    "minLength": 2,
                    "description": "Vollständiger Name der zu überprüfenden Person oder des zu überprüfenden Unternehmens. Mindestens **2 Zeichen** – die Mindestanforderung des Screening-Anbieters. Ein kürzerer oder leerer Name führt bei diesem Feld zu einem `400`-Fehler, bevor ein Screening durchgeführt wird, sodass keine Kosten anfallen.",
                    "example": "Antonio Ejemplo Modelo"
                  },
                  "entity_type": {
                    "type": "string",
                    "enum": [
                      "person",
                      "company"
                    ],
                    "default": "person",
                    "description": "Art der zu screenenden Entität. Standardwert ist `person`."
                  },
                  "date_of_birth": {
                    "type": "string",
                    "format": "date",
                    "description": "Geburtsdatum (Personen) oder Gründungsdatum (Unternehmen), `YYYY-MM-DD`. Verbessert die Übereinstimmungsgenauigkeit über die Gewichtung des Geburtsdatums.",
                    "example": "1972-02-29"
                  },
                  "nationality": {
                    "type": "string",
                    "description": "ISO 3166-1-**Alpha-2**-Ländercode (z. B. `ES`). Ungültige Codes geben `400` zurück. Verbessert die Genauigkeit der Übereinstimmung über die Ländergewichtung.",
                    "example": "ES"
                  },
                  "document_number": {
                    "type": "string",
                    "description": "Ausweisnummer. Nicht gewichtet – fungiert als eindeutiger Schlüssel: Eine exakte Übereinstimmung überschreibt den `match_score` des Treffers auf 100, eine harte Nichtübereinstimmung straft ihn ab. Wird nur dann als Suchfilter an den Screening-Anbieter gesendet, wenn sie **2-50 Zeichen** lang ist; ein Wert außerhalb dieses Bereichs wird akzeptiert und gespeichert, und das Screening wird weiterhin ausgeführt und abgerechnet, jedoch nicht nach Ausweisnummer eingegrenzt."
                  },
                  "aml_score_approve_threshold": {
                    "type": "number",
                    "minimum": 0,
                    "maximum": 100,
                    "default": 80,
                    "description": "Risiko-Score-Schwellenwert, bei oder unter dem das Ergebnis `Approved` ist. Muss ≤ `aml_score_review_threshold` sein (andernfalls `400`)."
                  },
                  "aml_score_review_threshold": {
                    "type": "number",
                    "minimum": 0,
                    "maximum": 100,
                    "default": 100,
                    "description": "Risiko-Score-Schwellenwert, über dem das Ergebnis `Declined` ist. Scores zwischen den beiden Schwellenwerten führen zu `In Review`."
                  },
                  "aml_name_weight": {
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 100,
                    "default": 60,
                    "description": "Gewichtung der Namensähnlichkeit im Übereinstimmungswert pro Treffer. Die drei Gewichtungen müssen in der Summe genau 100 ergeben (andernfalls `400`)."
                  },
                  "aml_dob_weight": {
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 100,
                    "default": 25,
                    "description": "Gewichtung des Geburtsdatums im Übereinstimmungswert pro Treffer."
                  },
                  "aml_country_weight": {
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 100,
                    "default": 15,
                    "description": "Gewichtung von Land/Staatsangehörigkeit im Übereinstimmungswert pro Treffer."
                  },
                  "aml_match_score_threshold": {
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 100,
                    "default": 93,
                    "description": "Schwellenwert pro Treffer: Treffer mit einem `match_score` darunter gelten als `False Positive` (von der Risikobewertung ausgeschlossen); bei oder darüber gelten sie als mögliche `Unreviewed`-Treffer."
                  },
                  "include_adverse_media": {
                    "type": "boolean",
                    "default": false,
                    "description": "Auch Nachrichtenmedien nach negativen Berichten durchsuchen. Erhöht die Latenz um bis zu ~30 s, während Ergebnisse gesammelt werden – verwenden Sie ein Client-Timeout von ≥60 s."
                  },
                  "include_ongoing_monitoring": {
                    "type": "boolean",
                    "default": false,
                    "description": "Dieses Profil kontinuierlich erneut screenen und Änderungen per Webhook übertragen. Erfordert `save_api_request=true` (andernfalls `400`)."
                  },
                  "save_api_request": {
                    "type": "boolean",
                    "default": true,
                    "description": "Das Screening als Sitzung beibehalten (Sichtbarkeit in der Konsole, Entscheidungs-Endpoint, Webhooks, Trefferprüfung). Für eine zustandslose Prüfung auf `false` setzen."
                  },
                  "vendor_data": {
                    "type": "string",
                    "description": "Ihre Kennung für den geprüften Benutzer; wird zurückgegeben und mit der Sitzung gespeichert."
                  },
                  "metadata": {
                    "type": "object",
                    "nullable": true,
                    "description": "Freiform-JSON, das mit der Anfrage gespeichert und zurückgegeben wird."
                  },
                  "sandbox_scenario": {
                    "type": "string",
                    "description": "Nur für die Sandbox gültiger Szenario-Slug. Wird nur akzeptiert, wenn der API-Schlüssel zu einer Anwendung im Sandbox-Modus gehört; bei Live-Anwendungen abgelehnt. Ein eigenständiges Screening verfügt über keine Sitzung, die vorbereitet werden könnte, daher wird der Slug direkt in der Screening-Anfrage angegeben: `decline_aml_hit` gibt einen Treffer in Produktionsform zurück und schließt das Screening mit `Declined` ab, `review_aml_possible_match` schließt es mit `In Review` ab, und ein Szenario, das kein AML-Ergebnis vorbereitet, lässt das Screening ohne Treffer. Den Szenarienkatalog finden Sie unter GET /v1/sandbox/scenarios/ oder [Sandbox & Test Data](/de/integration/sandbox-testing).",
                    "example": "decline_aml_hit"
                  }
                }
              },
              "example": {
                "full_name": "Antonio Ejemplo Modelo",
                "entity_type": "person",
                "date_of_birth": "1972-02-29",
                "nationality": "ES",
                "include_adverse_media": false,
                "vendor_data": "user-1234"
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X POST https://verification.didit.me/v3/aml/ \\\n  -H 'x-api-key: YOUR_API_KEY' \\\n  -H 'Content-Type: application/json' \\\n  -H 'Idempotency-Key: aml-user-1234-2026-08-20' \\\n  -d '{\n    \"full_name\": \"Antonio Ejemplo Modelo\",\n    \"entity_type\": \"person\",\n    \"date_of_birth\": \"1972-02-29\",\n    \"nationality\": \"ES\",\n    \"include_adverse_media\": false,\n    \"vendor_data\": \"user-1234\"\n  }'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.aml.screen(\n    full_name=\"Antonio Ejemplo Modelo\",\n    entity_type=\"person\",\n    date_of_birth=\"1972-02-29\",\n    nationality=\"ES\",\n    include_adverse_media=False,\n    vendor_data=\"user-1234\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.aml.screen({\n  full_name: \"Antonio Ejemplo Modelo\",\n  entity_type: \"person\",\n  date_of_birth: \"1972-02-29\",\n  nationality: \"ES\",\n  include_adverse_media: false,\n  vendor_data: \"user-1234\",\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.AML.Screen(ctx, didit.AMLScreenParams{\n\tFullName:            \"Antonio Ejemplo Modelo\",\n\tEntityType:          didit.Some(didit.AMLScreenParamsEntityType(\"person\")),\n\tDateOfBirth:         didit.String(\"1972-02-29\"),\n\tNationality:         didit.String(\"ES\"),\n\tIncludeAdverseMedia: didit.Bool(false),\n\tVendorData:          didit.String(\"user-1234\"),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import java.time.LocalDate;\nimport me.didit.Didit;\nimport me.didit.types.AmlScreenParams;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.aml().screen(AmlScreenParams.builder()\n        .fullName(\"Antonio Ejemplo Modelo\")\n        .entityType(AmlScreenParams.EntityType.of(\"person\"))\n        .dateOfBirth(LocalDate.parse(\"1972-02-29\"))\n        .nationality(\"ES\")\n        .includeAdverseMedia(false)\n        .vendorData(\"user-1234\")\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->aml->screen([\n    'full_name' => 'Antonio Ejemplo Modelo',\n    'entity_type' => 'person',\n    'date_of_birth' => '1972-02-29',\n    'nationality' => 'ES',\n    'include_adverse_media' => false,\n    'vendor_data' => 'user-1234',\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.aml.screen(\n  full_name: \"Antonio Ejemplo Modelo\",\n  entity_type: \"person\",\n  date_of_birth: \"1972-02-29\",\n  nationality: \"ES\",\n  include_adverse_media: false,\n  vendor_data: \"user-1234\"\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Aml.ScreenAsync(new AmlScreenParams\n{\n    FullName = \"Antonio Ejemplo Modelo\",\n    EntityType = new AmlScreenParamsEntityType(\"person\"),\n    DateOfBirth = \"1972-02-29\",\n    Nationality = \"ES\",\n    IncludeAdverseMedia = false,\n    VendorData = \"user-1234\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "responses": {
          "200": {
            "description": "Screening abgeschlossen. `aml.status` spiegelt Ihre Schwellenwerte wider; jeder Treffer, der den internen Mindestwert erreicht oder überschreitet, wird in `aml.hits` mit seinem Identitäts-`match_score`, Entitäts-`risk_score` und einer `score_breakdown` zur Erklärung der Übereinstimmung aufgeführt.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "request_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "Beibehaltene Sitzungs-ID, wenn `save_api_request=true` (verwendbar mit `GET /v3/session/{sessionId}/decision/`); andernfalls eine vorübergehende Korrelations-UUID."
                    },
                    "aml": {
                      "type": "object",
                      "properties": {
                        "status": {
                          "type": "string",
                          "enum": [
                            "Approved",
                            "In Review",
                            "Declined"
                          ],
                          "description": "`Declined`, wenn `score` > `aml_score_review_threshold`; `In Review`, wenn `score` > `aml_score_approve_threshold`; andernfalls `Approved` (auch wenn kein Score verfügbar ist)."
                        },
                        "total_hits": {
                          "type": "integer",
                          "description": "Anzahl der Einträge in `hits`."
                        },
                        "entity_type": {
                          "type": "string",
                          "enum": [
                            "person",
                            "company"
                          ],
                          "description": "Wiedergabe des geprüften Entitätstyps."
                        },
                        "hits": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "description": "Ein Screening-Treffer. `match_score` (0–100) misst die Identitätskonfidenz – Treffer unter `aml_match_score_threshold` werden mit `review_status: \"False Positive\"` gekennzeichnet und von der Risikobewertung ausgeschlossen; Treffer ab diesem Wert gelten als `\"Unreviewed\"` mögliche Übereinstimmungen. `risk_score` (0–100) misst, wie risikoreich die übereinstimmende Entität ist, und steuert den übergeordneten `aml.score`.",
                            "properties": {
                              "id": {
                                "type": "string",
                                "nullable": true,
                                "description": "Didits stabiler Bezeichner für den Treffer: `hit_`, gefolgt von 24 Hexadezimalzeichen. Dieselbe übereinstimmende Entität behält dieselbe `id`, wenn die betreffende Entität erneut überprüft wird. Übergeben Sie sie als `hit_id` an die Endpoints zur AML-Trefferprüfung."
                              },
                              "url": {
                                "type": "string",
                                "nullable": true,
                                "description": "Quell-URL für die übereinstimmende Entität, sofern verfügbar."
                              },
                              "match": {
                                "type": "boolean",
                                "nullable": true,
                                "description": "Veraltetes Flag für exakte Übereinstimmung. Verwenden Sie stattdessen `match_score` + `review_status`."
                              },
                              "score": {
                                "type": "number",
                                "nullable": true,
                                "description": "VERALTET: Gewichteter Übereinstimmungswert im Bereich 0–1. Verwenden Sie stattdessen `match_score`."
                              },
                              "match_score": {
                                "type": "number",
                                "nullable": true,
                                "description": "Identitätskonfidenz (0–100). Wird mit `aml_match_score_threshold` verglichen, um falsch positive Treffer von möglichen Übereinstimmungen zu trennen."
                              },
                              "risk_score": {
                                "type": "number",
                                "nullable": true,
                                "description": "Risiko-Score der Entität (0–100). Der höchste `risk_score` unter den Treffern, die nicht falsch positiv sind, wird zum übergeordneten `aml.score`."
                              },
                              "target": {
                                "type": "boolean",
                                "nullable": true
                              },
                              "caption": {
                                "type": "string",
                                "nullable": true,
                                "description": "Anzeigename der übereinstimmenden Entität."
                              },
                              "datasets": {
                                "type": "array",
                                "nullable": true,
                                "items": {
                                  "type": "string",
                                  "enum": [
                                    "PEP",
                                    "PEP Level 1",
                                    "PEP Level 2",
                                    "PEP Level 3",
                                    "PEP Level 4",
                                    "Sanctions",
                                    "Adverse Media",
                                    "Warnings and Regulatory Enforcement",
                                    "Fitness and Probity",
                                    "SIP",
                                    "SIE",
                                    "Insolvency",
                                    "Other Lists"
                                  ]
                                },
                                "description": "Risikokategorien, unter denen die Entität gelistet ist: `PEP` (mit Stufe, `PEP Level 1` bis `PEP Level 4`), `Sanctions`, `Adverse Media`, `Warnings and Regulatory Enforcement`, `Fitness and Probity`, `SIP`, `SIE` oder `Insolvency`. `Other Lists`, wenn die Quelle der Entität keine dieser Kategorien angibt."
                              },
                              "features": {
                                "type": "object",
                                "nullable": true
                              },
                              "properties": {
                                "type": "object",
                                "nullable": true,
                                "description": "Entitätsprofil: `name`, `alias`, `notes`, `gender`, `birthDate`, `birthPlace`, `nationality`, `position` und weitere biografische Arrays (jeweils nullable)."
                              },
                              "rca_name": {
                                "type": "string",
                                "nullable": true,
                                "description": "Name der nahestehenden Person, über die der Treffer für die Entität erzielt wurde, wenn es sich bei dem Treffer um eine RCA handelt."
                              },
                              "pep_matches": {
                                "type": "array",
                                "description": "Einträge auf PEP-Listen, die diesen Treffer belegen.",
                                "items": {
                                  "type": "object",
                                  "properties": {
                                    "list_name": {
                                      "type": "string"
                                    },
                                    "publisher": {
                                      "type": "string"
                                    },
                                    "source_url": {
                                      "type": "string"
                                    },
                                    "description": {
                                      "type": "string"
                                    },
                                    "matched_name": {
                                      "type": "string"
                                    },
                                    "pep_position": {
                                      "type": "string"
                                    },
                                    "date_of_birth": {
                                      "type": "string"
                                    },
                                    "place_of_birth": {
                                      "type": "string"
                                    },
                                    "aliases": {
                                      "type": "array",
                                      "items": {
                                        "type": "string"
                                      }
                                    },
                                    "education": {
                                      "type": "array",
                                      "items": {
                                        "type": "string"
                                      }
                                    },
                                    "other_sources": {
                                      "type": "array",
                                      "items": {
                                        "type": "string"
                                      }
                                    }
                                  }
                                }
                              },
                              "sanction_matches": {
                                "type": "array",
                                "items": {
                                  "type": "object"
                                },
                                "description": "Einträge in Sanktionslisten, die diesem Treffer zugrunde liegen (gleiche Struktur der zugrunde liegenden Liste wie bei `pep_matches`, zuzüglich sanktionsspezifischer Felder)."
                              },
                              "warning_matches": {
                                "type": "array",
                                "items": {
                                  "type": "object"
                                },
                                "description": "Warnungs-/Beobachtungslisteneinträge, die diesem Treffer zugrunde liegen."
                              },
                              "adverse_media_matches": {
                                "type": "array",
                                "description": "Artikel zu negativen Medienberichten. Wird nur ausgefüllt, wenn `include_adverse_media=true`.",
                                "items": {
                                  "type": "object",
                                  "properties": {
                                    "headline": {
                                      "type": "string"
                                    },
                                    "summary": {
                                      "type": "string"
                                    },
                                    "sentiment": {
                                      "type": "string"
                                    },
                                    "sentiment_score": {
                                      "type": "number"
                                    },
                                    "source_url": {
                                      "type": "string"
                                    },
                                    "thumbnail": {
                                      "type": "string",
                                      "nullable": true
                                    },
                                    "country": {
                                      "type": "string",
                                      "nullable": true
                                    },
                                    "author_name": {
                                      "type": "string",
                                      "nullable": true
                                    },
                                    "publication_date": {
                                      "type": "string",
                                      "nullable": true
                                    },
                                    "adverse_keywords": {
                                      "type": "array",
                                      "items": {
                                        "type": "string"
                                      }
                                    },
                                    "other_sources": {
                                      "type": "array",
                                      "items": {
                                        "type": "string"
                                      }
                                    }
                                  }
                                }
                              },
                              "adverse_media_details": {
                                "type": "object",
                                "nullable": true,
                                "description": "Aggregiertes Sentiment zu negativen Medienberichten für die Entität (`sentiment`, `sentiment_score`, Häufigkeitsverteilung von `adverse_keywords`). Wird nur ausgefüllt, wenn `include_adverse_media=true`."
                              },
                              "first_seen": {
                                "type": "string",
                                "format": "date-time",
                                "nullable": true,
                                "description": "Wann die Entität erstmals in den Datensätzen erschienen ist."
                              },
                              "last_seen": {
                                "type": "string",
                                "format": "date-time",
                                "nullable": true,
                                "description": "Neueste Aktualisierung des Datensatzes, die die Entität enthalten hat."
                              },
                              "linked_entities": {
                                "type": "array",
                                "description": "Bekannte Beziehungen der übereinstimmenden Entität (Familie, Geschäftspartner, Unternehmen).",
                                "items": {
                                  "type": "object",
                                  "properties": {
                                    "name": {
                                      "type": "array",
                                      "items": {
                                        "type": "string"
                                      }
                                    },
                                    "relation": {
                                      "type": "array",
                                      "items": {
                                        "type": "string"
                                      }
                                    },
                                    "status": {
                                      "type": "array",
                                      "items": {
                                        "type": "string"
                                      }
                                    },
                                    "details": {
                                      "type": "array",
                                      "items": {
                                        "type": "string"
                                      }
                                    },
                                    "active": {
                                      "type": "array",
                                      "items": {
                                        "type": "string"
                                      }
                                    }
                                  }
                                }
                              },
                              "risk_view": {
                                "type": "object",
                                "nullable": true,
                                "description": "Risikoaufschlüsselung pro Dimension (`crimes`, `countries`, `categories`, `custom_list`), jeweils mit `score`, `weightage`, `risk_level` und einer `risk_scores`-Zuordnung."
                              },
                              "additional_information": {
                                "type": "object",
                                "nullable": true,
                                "description": "Zusätzlicher Kontext in Freiform, z. B. ein `flag_summary`-Array, das erklärt, warum die Entität markiert ist."
                              },
                              "review_status": {
                                "type": "string",
                                "nullable": true,
                                "enum": [
                                  "False Positive",
                                  "Unreviewed",
                                  "Confirmed Match",
                                  "Inconclusive"
                                ],
                                "description": "`False Positive` – `match_score` unter `aml_match_score_threshold`, von der Risikobewertung ausgeschlossen. `Unreviewed` – mögliche Übereinstimmung, die auf Prüfung wartet. `Confirmed Match` / `Inconclusive` – manuell von einem Prüfer (über die Business Console) für gespeicherte Sitzungen festgelegt; diese Prüfungsfunktion ist nicht Bestandteil dieser Spezifikation."
                              },
                              "score_breakdown": {
                                "type": "object",
                                "nullable": true,
                                "description": "Wie der `match_score` berechnet wurde. Name, Geburtsdatum und Land tragen jeweils `<component>_score` × `<component>_weight_normalized` Punkte bei; die Gewichtungen werden neu normalisiert, wenn eine Komponente in den überprüften Daten fehlt. Die Dokumentennummer wird nicht gewichtet – sie fungiert als „Golden Key“: `MATCH` überschreibt den Wert auf 100, `NEUTRAL` belässt ihn unverändert, `HARD_MISMATCH` verhängt einen Punktabzug.",
                                "properties": {
                                  "name_score": {
                                    "type": "integer",
                                    "nullable": true,
                                    "description": "Unverarbeitete Namensähnlichkeit (0–100)."
                                  },
                                  "name_weight": {
                                    "type": "integer",
                                    "nullable": true,
                                    "description": "Konfigurierte Gewichtung des Namens (`aml_name_weight`)."
                                  },
                                  "name_weight_normalized": {
                                    "type": "number",
                                    "nullable": true,
                                    "description": "Namensgewichtung nach Renormierung (0–100)."
                                  },
                                  "name_contribution": {
                                    "type": "number",
                                    "nullable": true,
                                    "description": "Punkte, die der Name zu `total_score` beigetragen hat."
                                  },
                                  "dob_score": {
                                    "type": "integer",
                                    "nullable": true,
                                    "description": "Score für das Geburtsdatum als Prozentsatz seiner Gewichtung (−100 bis 100)."
                                  },
                                  "dob_weight": {
                                    "type": "integer",
                                    "nullable": true,
                                    "description": "Konfigurierte Gewichtung des Geburtsdatums (`aml_dob_weight`)."
                                  },
                                  "dob_weight_normalized": {
                                    "type": "number",
                                    "nullable": true,
                                    "description": "Gewichtung des Geburtsdatums nach der Neunormalisierung (0–100)."
                                  },
                                  "dob_contribution": {
                                    "type": "number",
                                    "nullable": true,
                                    "description": "Punkte, die das Geburtsdatum zu `total_score` beigetragen hat."
                                  },
                                  "country_score": {
                                    "type": "integer",
                                    "nullable": true,
                                    "description": "Länder-Score als Prozentsatz seiner Gewichtung (−100 bis 100)."
                                  },
                                  "country_weight": {
                                    "type": "integer",
                                    "nullable": true,
                                    "description": "Konfigurierte Gewichtung des Landes (`aml_country_weight`)."
                                  },
                                  "country_weight_normalized": {
                                    "type": "number",
                                    "nullable": true,
                                    "description": "Ländergewichtung nach der Renormalisierung (0–100)."
                                  },
                                  "country_contribution": {
                                    "type": "number",
                                    "nullable": true,
                                    "description": "Punkte, die das Land zu `total_score` beigetragen hat."
                                  },
                                  "document_number_match_type": {
                                    "type": "string",
                                    "nullable": true,
                                    "enum": [
                                      "MATCH",
                                      "NEUTRAL",
                                      "HARD_MISMATCH"
                                    ],
                                    "description": "Golden-Key-Ergebnis für den Abgleich der Dokumentennummer."
                                  },
                                  "document_number_effect": {
                                    "type": "string",
                                    "nullable": true,
                                    "description": "Lesbare Beschreibung der Auswirkung der Dokumentennummer."
                                  },
                                  "total_score": {
                                    "type": "integer",
                                    "nullable": true,
                                    "description": "Endgültiger gewichteter Übereinstimmungswert (0–100) – spiegelt `match_score` wider."
                                  }
                                }
                              }
                            }
                          }
                        },
                        "score": {
                          "type": "number",
                          "nullable": true,
                          "description": "Gesamter AML-Risiko-Score (0–100): der höchste `risk_score` unter Treffern, die nicht falsch positiv sind. Steuert den `status` über die zwei Schwellenwerte."
                        },
                        "screened_data": {
                          "type": "object",
                          "description": "Wiedergabe der überprüften Daten: `full_name`, `date_of_birth`, `nationality`, `document_number` (nicht vorhandene Felder sind `null`).",
                          "properties": {
                            "full_name": {
                              "type": "string"
                            },
                            "date_of_birth": {
                              "type": "string",
                              "nullable": true
                            },
                            "nationality": {
                              "type": "string",
                              "nullable": true
                            },
                            "document_number": {
                              "type": "string",
                              "nullable": true
                            }
                          }
                        },
                        "warnings": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "feature": {
                                "type": "string",
                                "description": "Funktion, die die Warnung ausgelöst hat."
                              },
                              "risk": {
                                "type": "string",
                                "description": "Maschinenlesbare Risiko-Kennung."
                              },
                              "additional_data": {
                                "type": "object",
                                "nullable": true,
                                "description": "Zusätzlicher Kontext für die Warnung, sofern verfügbar."
                              },
                              "log_type": {
                                "type": "string",
                                "description": "`warning`, `information` oder `error` – wie sich das Risiko auf das Ergebnis ausgewirkt hat."
                              },
                              "short_description": {
                                "type": "string",
                                "description": "Einzeilige, lesbare Zusammenfassung."
                              },
                              "long_description": {
                                "type": "string",
                                "description": "Vollständige menschenlesbare Erklärung."
                              }
                            }
                          },
                          "description": "Enthält eine `POSSIBLE_MATCH_FOUND`-Warnung, wann immer `score` ungleich null und ≥ `aml_score_approve_threshold` ist (ein Score von genau 0 erzeugt nie eine Warnung); andernfalls leer."
                        }
                      }
                    },
                    "vendor_data": {
                      "type": "string",
                      "nullable": true,
                      "description": "Wiedergabe der von Ihnen gesendeten `vendor_data`."
                    },
                    "metadata": {
                      "type": "object",
                      "nullable": true,
                      "description": "Rückgabe der von Ihnen gesendeten `metadata`."
                    },
                    "created_at": {
                      "type": "string",
                      "format": "date-time"
                    }
                  }
                },
                "examples": {
                  "No hits (Approved)": {
                    "summary": "Unauffälliges Screening — null Treffer",
                    "value": {
                      "request_id": "d27c5509-7a66-45a9-b05e-d69d9f4c336a",
                      "aml": {
                        "status": "Approved",
                        "total_hits": 0,
                        "entity_type": "person",
                        "hits": [],
                        "score": 0,
                        "screened_data": {
                          "full_name": "Maximilian Mustermann-Doe",
                          "date_of_birth": "1992-03-14",
                          "nationality": "DE",
                          "document_number": null
                        },
                        "warnings": []
                      },
                      "vendor_data": "user-1234",
                      "metadata": {
                        "internal_ref": "abc-123"
                      },
                      "created_at": "2026-06-11T10:21:07.013938+00:00"
                    }
                  },
                  "PEP hit (Approved — risk below approve threshold)": {
                    "summary": "Ein möglicher PEP-Treffer; der Risiko-Score von 73 bleibt unter dem standardmäßigen Genehmigungsschwellenwert von 80",
                    "value": {
                      "request_id": "0b7e7a3e-65a1-4f3d-9c7a-1de2f9a40111",
                      "aml": {
                        "status": "Approved",
                        "total_hits": 1,
                        "entity_type": "person",
                        "hits": [
                          {
                            "id": "hit_7c1e9a40b2d35f86e0a4c912",
                            "url": "https://news.example.org/articles/sample",
                            "match": false,
                            "score": 0.93,
                            "match_score": 93.0,
                            "risk_score": 73.0,
                            "target": null,
                            "caption": "Antonio Ejemplo Modelo",
                            "datasets": [
                              "PEP Level 1",
                              "PEP"
                            ],
                            "features": null,
                            "rca_name": "",
                            "first_seen": "2026-01-07T00:00:00",
                            "last_seen": "2026-01-07T00:00:00",
                            "review_status": "Unreviewed",
                            "properties": {
                              "name": [
                                "Antonio Ejemplo Modelo",
                                "Antonio Ejemplo"
                              ],
                              "alias": [
                                "Antonio Ejemplo Modelo",
                                "Ejemplo Modelo, Pedro"
                              ],
                              "notes": [
                                "Prime Minister of Spain"
                              ],
                              "gender": [
                                "male"
                              ],
                              "birthDate": [
                                "1972-02-29"
                              ],
                              "birthPlace": [
                                "Madrid, Spain"
                              ],
                              "nationality": null,
                              "position": null
                            },
                            "risk_view": {
                              "crimes": {
                                "score": 0.0,
                                "weightage": 20,
                                "risk_level": "Low",
                                "risk_scores": {}
                              },
                              "countries": {
                                "score": 9.64,
                                "weightage": 30,
                                "risk_level": "Low",
                                "risk_scores": {
                                  "Spain": 25.71
                                }
                              },
                              "categories": {
                                "score": 62.5,
                                "weightage": 50,
                                "risk_level": "High",
                                "risk_scores": {
                                  "PEP": 100.0,
                                  "PEP Level 1": 100.0
                                }
                              },
                              "custom_list": {}
                            },
                            "score_breakdown": {
                              "name_score": 89,
                              "name_weight": 60,
                              "name_weight_normalized": 60.0,
                              "name_contribution": 53.4,
                              "dob_score": 100,
                              "dob_weight": 25,
                              "dob_weight_normalized": 25.0,
                              "dob_contribution": 25.0,
                              "country_score": 100,
                              "country_weight": 15,
                              "country_weight_normalized": 15.0,
                              "country_contribution": 15.0,
                              "document_number_match_type": "NEUTRAL",
                              "document_number_effect": "No document number provided for screening",
                              "total_score": 93
                            },
                            "pep_matches": [
                              {
                                "aliases": [],
                                "education": [],
                                "list_name": "Presidency of the Government of Spain",
                                "publisher": "Presidency of the Government of Spain",
                                "source_url": "https://news.example.org/articles/sample",
                                "description": "The Presidency of the Government is the central institutional body in Spain that supports the Prime Minister and coordinates the general action of the central government.",
                                "matched_name": "Antonio Ejemplo Modelo",
                                "pep_position": "",
                                "date_of_birth": "1972-02-29",
                                "other_sources": [],
                                "place_of_birth": "Madrid, Spain"
                              }
                            ],
                            "sanction_matches": [],
                            "warning_matches": [],
                            "adverse_media_matches": [],
                            "adverse_media_details": null,
                            "linked_entities": [
                              {
                                "name": [
                                  "Maria Begona Gomez Fernandez"
                                ],
                                "active": [],
                                "status": [],
                                "details": [],
                                "relation": [
                                  "spouse"
                                ]
                              }
                            ],
                            "additional_information": {
                              "flag_summary": [
                                "Antonio Ejemplo Modelo has been flagged as a Level 1 Politically Exposed Person (PEP) from Spain, serving as the President of the Government of Spain."
                              ]
                            }
                          }
                        ],
                        "score": 73.0,
                        "screened_data": {
                          "full_name": "Pedro Sanchez Perez-Castejon",
                          "date_of_birth": "1972-02-29",
                          "nationality": "ES",
                          "document_number": null
                        },
                        "warnings": []
                      },
                      "vendor_data": null,
                      "metadata": null,
                      "created_at": "2026-06-11T10:23:44.812000+00:00"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Validierungsfehler. Probleme auf Feldebene geben die Standard-Envelope von DRF zurück (ein Array von Meldungen pro fehlerhaftem Feld); feldübergreifende Regeln (Gewichtungssumme, Schwellenwert-Reihenfolge, Überwachung ohne Speichern) geben `{\"error\": [...]}` zurück.",
            "content": {
              "application/json": {
                "examples": {
                  "Missing full_name": {
                    "summary": "`full_name` ist das einzige Pflichtfeld",
                    "value": {
                      "full_name": [
                        "This field is required."
                      ]
                    }
                  },
                  "Short full_name": {
                    "summary": "`full_name` muss mindestens 2 Zeichen lang sein",
                    "value": {
                      "full_name": [
                        "Ensure this field has at least 2 characters."
                      ]
                    }
                  },
                  "Invalid nationality": {
                    "summary": "`nationality` muss ISO 3166-1 Alpha-2 sein",
                    "value": {
                      "nationality": [
                        "Invalid ISO 3166-1 alpha-2 country code."
                      ]
                    }
                  },
                  "Weights do not sum to 100": {
                    "summary": "`aml_name_weight` + `aml_dob_weight` + `aml_country_weight` ≠ 100",
                    "value": {
                      "error": [
                        "AML weights must sum to 100. Current sum: 90 (name: 50, dob: 25, country: 15)"
                      ]
                    }
                  },
                  "Thresholds out of order": {
                    "summary": "Genehmigungsschwellenwert über dem Prüfungsschwellenwert",
                    "value": {
                      "error": [
                        "Approve threshold (90.0) cannot be greater than review threshold (80.0)"
                      ]
                    }
                  },
                  "Monitoring without saving": {
                    "summary": "`include_ongoing_monitoring=true` mit `save_api_request=false`",
                    "value": {
                      "error": [
                        "Ongoing monitoring can only be enabled when the API request is saved."
                      ]
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Zugriff verweigert. Wird zurückgegeben, wenn der Header `x-api-key` fehlt sowie wenn das Guthaben der aufrufenden Organisation den Aufruf nicht decken kann; ein falscher, widerrufener oder abgelaufener Schlüssel gibt `401` zurück. Ein fehlender Schlüssel gibt `403` mit `{\"detail\": ...}` zurück; ein falscher, widerrufener oder abgelaufener Schlüssel gibt `401` zurück. Unzureichende Credits geben `403` mit `{\"error\": ...}` zurück, bevor ein Screening- oder Anbieteraufruf stattfindet.",
            "content": {
              "application/json": {
                "examples": {
                  "Missing or invalid API key": {
                    "summary": "Kein `x-api-key`-Header, oder der Schlüssel ist ungültig/widerrufen",
                    "value": {
                      "detail": "You do not have permission to perform this action."
                    }
                  },
                  "Not enough credits": {
                    "summary": "Das Guthaben der Organisation reicht für den Aufruf nicht aus",
                    "value": {
                      "error": "You don't have enough credits to perform this request. Please top up at https://business.didit.me"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate-Limit überschritten. POST/PATCH/DELETE-Endpoints teilen sich ein Budget von 300 Schreibanfragen pro Minute pro API-Schlüssel (Transaktionserstellungen und Ereignis-Ingestion haben ein separates Budget von 600). Die Antwort enthält die Header `X-RateLimit-Limit`, `X-RateLimit-Remaining`, `X-RateLimit-Reset` und `Retry-After`.",
            "content": {
              "application/json": {
                "examples": {
                  "Write rate limit exceeded": {
                    "summary": "Mehr als 300 Schreibanfragen in der aktuellen Minute",
                    "value": {
                      "detail": "Write request rate limit exceeded. You can make up to 300 requests per minute."
                    }
                  }
                },
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/v3/face-search/": {
      "post": {
        "summary": "Gesichtssuche",
        "description": "Durchsuchen Sie den Gesichtssuchindex Ihrer Anwendung (1:N) anhand eines Gesichtsbilds – Gesichter, die aus Verifizierungssitzungen registriert wurden, gespeicherte eigenständige API-Aufrufe, direkte Uploads von Gesichtern aus Benutzerprofilen sowie Ihre Sperr-/Freigabelisten – und erhalten Sie nach Ähnlichkeit geordnete Treffer sowie Sperrlisten- und Duplikatwarnungen zurück.\n\n**Funktionsweise.** Das größte erkannte Gesicht in `user_image` wird eingebettet und im für Ihre Anwendung isolierten Index gesucht. Bis zu **5 Treffer** oberhalb des Ähnlichkeits-Schwellenwerts werden in `matches` zurückgegeben, jeweils mit `similarity_percentage`, der Ursprungssitzung (`session_id`, `session_number`, `status`, `vendor_data`), während der Dokumentenverifizierung dieser Sitzung extrahierten `user_details`, den Flags `is_blocklisted` / `is_allowlisted` sowie einem Unterscheidungsmerkmal `source` (`session`, `imported` oder `list_entry`).\n\n- `search_type=most_similar` (Standard) ordnet jedes registrierte Gesicht nach Ähnlichkeit – nutzen Sie dies zur Deduplizierung und Untersuchung von Betrugsringen.\n- `search_type=blocklisted_or_approved` beschränkt die Kandidaten auf Gesichter auf der Sperrliste, Gesichter auf der Freigabeliste, Gesichter aus genehmigten Sitzungen und importierte Gesichter aus Benutzerprofilen, wobei Einträge auf der Sperrliste zuerst sortiert werden – nutzen Sie dies, wenn das Hauptziel das Sperrlisten-Screening ist.\n\n`status` ist nur dann `Declined`, wenn eine Warnung `FACE_IN_BLOCKLIST` oder `POSSIBLE_FACE_IN_BLOCKLIST` ausgelöst wird; `DUPLICATED_FACE` / `POSSIBLE_DUPLICATED_FACE` (`information`) und `MULTIPLE_FACES_DETECTED` (`warning`) führen nie zu einer Ablehnung. Im Gegensatz zur passiven Liveness-Erkennung schließt dieser Endpoint vorherige Sitzungen mit denselben `vendor_data` **nicht** vom Abgleich aus. Eine passive Liveness-Erkennungsanalyse läuft intern ebenfalls ab und wird mit der persistenten Sitzung gespeichert, ihr Ergebnis ist jedoch nicht Teil dieser Antwort.\n\n**Abrechnung.** Jede `200`-Antwort verbraucht einen Credit der Gesichtssuche-API (bezahlt aus Ihrem Tarif-Guthaben oder Aufladeguthaben). Bei unzureichendem Guthaben wird vor jeglicher Bildverarbeitung ein `403` zurückgegeben.\n\n**Sitzungspersistenz und Gesichtsregistrierung (`save_api_request`, standardmäßig `true`).** Wenn `true`, wird der Aufruf als Sitzung vom Typ API persistent gespeichert (Business Console, `GET /v3/session/{sessionId}/decision/` über die zurückgegebene `request_id`, Webhook `status.updated`) und das gesuchte Gesicht wird in Ihren Gesichtssuchindex aufgenommen. Gesichter, die durch Aufrufe der Gesichtssuche registriert wurden, werden von zukünftigen Ergebnissen der Gesichtssuche ausgeschlossen, sodass wiederholte Suchen nie miteinander übereinstimmen. Wenn `false`, ist der Aufruf einmalig: Es wird nichts gespeichert, das Gesicht wird nicht registriert und `match_image_url`-Werte sind interne Speicherpfade statt herunterladbarer URLs.\n\n**Sandbox.** Sandbox-API-Schlüssel überspringen jegliche Verarbeitung und Abrechnung: Nach der Validierung der Anfrage (fehlerhafte Eingaben geben weiterhin `400` zurück) gibt der Endpoint eine statische `Approved`-Mock-Payload zurück, es wird keine Sitzung gespeichert und es werden keine Credits verbraucht.\n\n**Authentifizierung.** Senden Sie den API-Schlüssel Ihrer Anwendung im Header `x-api-key`. Bei fehlenden oder ungültigen Anmeldedaten wird `403` zurückgegeben (`{\"detail\": \"You do not have permission to perform this action.\"}`) – diese API gibt niemals `401` zurück.\n\n**Rate-Limit.** Geteiltes Schreibkontingent von 300 Anfragen/Min. pro API-Schlüssel über alle POST/PATCH/DELETE-Endpoints hinweg; bei Überschreitung wird `429` zurückgegeben.",
        "operationId": "post_v3face-search",
        "x-didit-sdk": {
          "resource": "face_search",
          "method": "search",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Standalone APIs"
        ],
        "parameters": [],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "required": [
                  "user_image"
                ],
                "properties": {
                  "user_image": {
                    "type": "string",
                    "format": "binary",
                    "description": "Frontales Gesichtsbild für die Suche. Zulässige Dateiendungen: `tiff`, `jpg`, `jpeg`, `png`, `webp`. Maximale Upload-Größe: **5 MB** (größere Dateien werden mit `400` abgelehnt). Bilder werden vor der Verarbeitung automatisch auf ca. 0,5 MB komprimiert, sodass sehr hohe Auflösungen die Genauigkeit nicht verbessern. Das Bild muss mindestens ein erkennbares Gesicht enthalten – andernfalls gibt der Endpoint `400` zurück. Sind mehrere Gesichter vorhanden, wird nach dem größten gesucht und eine Warnung `MULTIPLE_FACES_DETECTED` hinzugefügt."
                  },
                  "search_type": {
                    "type": "string",
                    "default": "most_similar",
                    "enum": [
                      "most_similar",
                      "blocklisted_or_approved"
                    ],
                    "description": "Suchrichtlinie. `most_similar` (Standard) sortiert jedes in Ihrer Anwendung registrierte Gesicht nach Ähnlichkeit. `blocklisted_or_approved` beschränkt die Kandidaten auf Gesichter auf der Sperrliste, Gesichter auf der Zulassungsliste, Gesichter aus genehmigten Sitzungen und importierte Benutzerprofil-Gesichter — wobei Einträge auf der Sperrliste an erster Stelle stehen.",
                    "example": "most_similar"
                  },
                  "rotate_image": {
                    "type": "boolean",
                    "default": false,
                    "description": "Wenn `true`, versucht der Dienst 90-Grad-Drehungen der Eingabe und verwendet die Ausrichtung, die die beste Gesichtserkennung liefert. Nützlich, wenn die EXIF-Ausrichtung fehlt. Erhöht die Latenz.",
                    "example": false
                  },
                  "save_api_request": {
                    "type": "boolean",
                    "default": true,
                    "description": "Wenn `true` (Standard), wird der Aufruf als Sitzung vom Typ API persistent gespeichert, ein Webhook `status.updated` ausgegeben, `match_image_url`-Werte vorsigniert und das gesuchte Gesicht in Ihrem Gesichtssuchindex registriert (Gesichtssuch-Registrierungen sind von zukünftigen Suchen ausgeschlossen). Wenn `false`, erfolgt die Suche einmalig – es wird keine Sitzung gespeichert und das Gesicht wird nicht registriert.",
                    "example": true
                  },
                  "vendor_data": {
                    "type": "string",
                    "description": "Optionaler opaker Bezeichner (Ihre Benutzer-ID, E-Mail, UUID…), der in der gespeicherten Sitzung hinterlegt und zurückgegeben wird. Schließt Gesichter desselben Benutzers nicht aus den Suchergebnissen aus.",
                    "example": "user-123"
                  },
                  "metadata": {
                    "type": "object",
                    "additionalProperties": true,
                    "description": "Optionales JSON-Objekt, das mit der Sitzung gespeichert (wenn `save_api_request=true`) und zurückgegeben wird. Senden Sie es bei Multipart-Anfragen als JSON-codiertes String-Feld – es wird in ein Objekt geparst.",
                    "example": {
                      "flow": "dedup_check"
                    }
                  }
                }
              },
              "example": {
                "user_image": "(binary JPEG/PNG selfie)",
                "search_type": "most_similar",
                "rotate_image": false,
                "save_api_request": true,
                "vendor_data": "user-123",
                "metadata": {
                  "flow": "dedup_check"
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Gesichtssuche abgeschlossen. `face_search.matches` enthält bis zu 5 ähnliche Gesichter, sortiert nach Ähnlichkeit; ein leeres Array bedeutet, dass kein registriertes Gesicht den Mindestähnlichkeitswert überschritten hat. `status` ist nur bei Treffern auf der Sperrliste `Declined` – reine Duplikattreffer geben `Approved` zurück, prüfen Sie daher `matches` und `warnings`, nicht nur `status`. Wenn `save_api_request=true`, ist `request_id` die persistierte Sitzungs-ID. Jeder Treffer enthält `source` (`session`, `imported`, `list_entry` oder `retained_template`), `vendor_user_id` und `biometric_template_id`; ein Treffer mit `retained_template` stammt von einem bildfreien biometrischen Template, das nach dem Löschen der Quellsitzung aufbewahrt wurde, und weist `null` für Sitzungsfelder, `match_image_url` und `user_details` auf.",
            "content": {
              "application/json": {
                "examples": {
                  "Blocklist hit (Declined)": {
                    "summary": "Das Gesicht stimmt mit einem Gesicht auf der Sperrliste überein",
                    "value": {
                      "request_id": "a1b2c3d4-e5f6-7890-1234-567890abcdef",
                      "face_search": {
                        "status": "Declined",
                        "total_matches": 1,
                        "matches": [
                          {
                            "session_id": "882c42d5-8a4d-4d20-8080-a22f57822c86",
                            "session_number": 323442,
                            "similarity_percentage": 99.99,
                            "source": "session",
                            "vendor_data": "user-1",
                            "verification_date": "2025-01-01T00:00:00Z",
                            "user_details": {
                              "full_name": "Jane Marie Doe",
                              "document_type": "ID",
                              "document_number": "X1234567"
                            },
                            "match_image_url": "https://<media-host>/face/3f6a1c2e/reference.jpg",
                            "status": "Approved",
                            "is_blocklisted": true,
                            "is_allowlisted": false,
                            "api_service": null,
                            "vendor_user_id": "2f7c1a9e-8b4d-4c6a-9e1f-3d5b7a9c1e2f",
                            "biometric_template_id": null
                          }
                        ],
                        "user_image": {
                          "entities": [
                            {
                              "bbox": [
                                40,
                                40,
                                120,
                                120
                              ],
                              "confidence": 0.732973
                            }
                          ],
                          "best_angle": 0
                        },
                        "warnings": [
                          {
                            "risk": "FACE_IN_BLOCKLIST",
                            "feature": "LIVENESS",
                            "additional_data": {
                              "blocklisted_session_id": "882c42d5-8a4d-4d20-8080-a22f57822c86",
                              "blocklisted_session_number": 323442,
                              "api_service": null
                            },
                            "log_type": "error",
                            "short_description": "Face in blocklist",
                            "long_description": "The system identified a face in the blocklist, which means the face is not allowed to be verified."
                          }
                        ]
                      },
                      "vendor_data": "user-123",
                      "metadata": null,
                      "created_at": "2026-06-12T01:04:42.763237+00:00"
                    }
                  },
                  "Duplicate found (Approved)": {
                    "summary": "Das Gesicht ist bereits in einer anderen genehmigten Sitzung aufgetaucht – rein informativ, keine Ablehnung",
                    "value": {
                      "request_id": "5e0c3a1f-7b2d-4c8e-9f10-2a3b4c5d6e7f",
                      "face_search": {
                        "status": "Approved",
                        "total_matches": 1,
                        "matches": [
                          {
                            "session_id": "1f2e3d4c-5b6a-7980-1122-334455667788",
                            "session_number": 1024,
                            "similarity_percentage": 87.42,
                            "source": "session",
                            "vendor_data": "user-9",
                            "verification_date": "2025-11-20T09:15:00Z",
                            "user_details": null,
                            "match_image_url": "https://<media-host>/face/9c8b7a6d/reference.jpg",
                            "status": "Approved",
                            "is_blocklisted": false,
                            "is_allowlisted": false,
                            "api_service": "PASSIVE_LIVENESS",
                            "vendor_user_id": "2f7c1a9e-8b4d-4c6a-9e1f-3d5b7a9c1e2f",
                            "biometric_template_id": null
                          }
                        ],
                        "user_image": {
                          "entities": [
                            {
                              "bbox": [
                                40,
                                40,
                                120,
                                120
                              ],
                              "confidence": 0.732973
                            }
                          ],
                          "best_angle": 0
                        },
                        "warnings": [
                          {
                            "risk": "DUPLICATED_FACE",
                            "feature": "LIVENESS",
                            "additional_data": {
                              "duplicated_session_id": "1f2e3d4c-5b6a-7980-1122-334455667788",
                              "duplicated_session_number": 1024,
                              "api_service": "PASSIVE_LIVENESS"
                            },
                            "log_type": "information",
                            "short_description": "Duplicated face from other approved session",
                            "long_description": "The system identified a duplicated face from another approved session, requiring further investigation."
                          }
                        ]
                      },
                      "vendor_data": "user-123",
                      "metadata": null,
                      "created_at": "2026-06-12T01:04:42.763237+00:00"
                    }
                  },
                  "No matches (Approved)": {
                    "summary": "Kein registriertes Gesicht überschritt die Ähnlichkeitsuntergrenze",
                    "value": {
                      "request_id": "9d8c7b6a-5f4e-3d2c-1b0a-998877665544",
                      "face_search": {
                        "status": "Approved",
                        "total_matches": 0,
                        "matches": [],
                        "user_image": {
                          "entities": [
                            {
                              "bbox": [
                                40,
                                40,
                                120,
                                120
                              ],
                              "confidence": 0.732973
                            }
                          ],
                          "best_angle": 0
                        },
                        "warnings": []
                      },
                      "vendor_data": "user-123",
                      "metadata": null,
                      "created_at": "2026-06-12T01:04:42.763237+00:00"
                    }
                  }
                },
                "schema": {
                  "type": "object",
                  "properties": {
                    "request_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "Beibehaltene Sitzungs-ID, wenn `save_api_request=true` (verwendbar mit `GET /v3/session/{sessionId}/decision/`); andernfalls eine vorübergehende Korrelations-UUID."
                    },
                    "face_search": {
                      "type": "object",
                      "properties": {
                        "status": {
                          "type": "string",
                          "enum": [
                            "Approved",
                            "Declined"
                          ],
                          "description": "`Declined` nur dann, wenn eine `FACE_IN_BLOCKLIST`- oder `POSSIBLE_FACE_IN_BLOCKLIST`-Warnung ausgelöst wurde. Duplikatübereinstimmungen und Warnungen zu mehreren Gesichtern führen nie zu einer Ablehnung."
                        },
                        "total_matches": {
                          "type": "integer",
                          "description": "Anzahl der Einträge in `matches` (0–5).",
                          "example": 1
                        },
                        "matches": {
                          "type": "array",
                          "maxItems": 5,
                          "description": "Bis zu 5 Gesichter aus Ihrem Gesichtssuchindex, die den Ähnlichkeitsschwellenwert überschreiten, sortiert nach Ähnlichkeit (wobei gesperrte Einträge an erster Stelle stehen, wenn `search_type=blocklisted_or_approved`). Leer, wenn kein registriertes Gesicht ausreichend ähnlich ist.",
                          "items": {
                            "type": "object",
                            "properties": {
                              "session_id": {
                                "type": "string",
                                "format": "uuid",
                                "nullable": true,
                                "description": "ID der Verifizierungssitzung, zu der das übereinstimmende Gesicht gehört. `null`, wenn `source` den Wert `imported`, `list_entry` oder `retained_template` hat.",
                                "example": "882c42d5-8a4d-4d20-8080-a22f57822c86"
                              },
                              "session_number": {
                                "type": "integer",
                                "nullable": true,
                                "description": "Benutzerfreundliche Sitzungsnummer, die in der Business Console angezeigt wird. `null` für Übereinstimmungen ohne Sitzung.",
                                "example": 323442
                              },
                              "similarity_percentage": {
                                "type": "number",
                                "format": "float",
                                "minimum": 0,
                                "maximum": 100,
                                "description": "Ähnlichkeit zwischen dem übermittelten Gesicht und dem abgeglichenen Gesicht (0–100).",
                                "example": 99.99
                              },
                              "source": {
                                "type": "string",
                                "enum": [
                                  "session",
                                  "imported",
                                  "list_entry",
                                  "retained_template"
                                ],
                                "description": "Woher das übereinstimmende Gesicht registriert wurde: `session` – eine Verifizierungssitzung oder ein gespeicherter eigenständiger API-Aufruf; `imported` – ein direkt in ein Benutzerprofil hochgeladenes Gesicht; `list_entry` – ein Gesicht, das einer Ihrer Listen angehängt ist; `retained_template` – ein bildfreies biometrisches Template, das bei einem Benutzer gespeichert ist und unter `/v3/biometric-templates/` aufgeführt wird."
                              },
                              "vendor_data": {
                                "type": "string",
                                "nullable": true,
                                "description": "`vendor_data` der übereinstimmenden Sitzung oder des verknüpften Benutzers für importierte Gesichter und Gesichter aus aufbewahrten Vorlagen.",
                                "example": "user-1"
                              },
                              "vendor_user_id": {
                                "type": "string",
                                "format": "uuid",
                                "nullable": true,
                                "description": "Verknüpfte Benutzer-ID. `null` für Listeneinträge und Sitzungstreffer ohne Benutzer.",
                                "example": "2f7c1a9e-4b28-4a6d-97f1-83576f80e1b4"
                              },
                              "biometric_template_id": {
                                "type": "string",
                                "format": "uuid",
                                "nullable": true,
                                "description": "ID des aufbewahrten biometrischen Templates. Wird nur gesetzt, wenn `source` den Wert `retained_template` hat; andernfalls `null`.",
                                "example": null
                              },
                              "verification_date": {
                                "type": "string",
                                "format": "date-time",
                                "nullable": true,
                                "description": "Wann das abgeglichene Gesicht ursprünglich erfasst wurde oder wann eine aufbewahrte Vorlage erstellt wurde (`YYYY-MM-DDThh:mm:ssZ`). `null` für Treffer mit `list_entry`.",
                                "example": "2025-01-01T00:00:00Z"
                              },
                              "user_details": {
                                "type": "object",
                                "nullable": true,
                                "description": "Identitätsdaten, die während der Dokumentenprüfung der übereinstimmenden Sitzung extrahiert wurden. `null`, wenn die übereinstimmende Sitzung keine Dokumentendaten enthält (z. B. reine Liveness-Sitzungen), und immer `null` bei Übereinstimmungen mit `retained_template`. Bei Übereinstimmungen mit `source: imported` werden sie stattdessen aus dem Benutzerprofil befüllt: `full_name` gesetzt, `document_type`/`document_number` null.",
                                "properties": {
                                  "full_name": {
                                    "type": "string",
                                    "nullable": true,
                                    "example": "Jane Marie Doe"
                                  },
                                  "document_type": {
                                    "type": "string",
                                    "nullable": true,
                                    "example": "ID"
                                  },
                                  "document_number": {
                                    "type": "string",
                                    "nullable": true,
                                    "example": "X1234567"
                                  }
                                }
                              },
                              "match_image_url": {
                                "type": "string",
                                "nullable": true,
                                "description": "Zeitlich begrenzte URL (`https://<media-host>/...`) des Referenzbildes des übereinstimmenden Gesichts, wenn `save_api_request=true`. Bei `save_api_request=false` ist dies ein interner Speicherpfad, der nicht direkt heruntergeladen werden kann. Immer `null` bei `retained_template`-Übereinstimmungen, da gespeicherte Vorlagen kein Bild enthalten.",
                                "example": "https://<media-host>/face/3f6a1c2e/reference.jpg"
                              },
                              "status": {
                                "type": "string",
                                "nullable": true,
                                "description": "Status der übereinstimmenden Sitzung (`Approved`, `Declined`, `In Review`, …). `null` für Treffer aus `imported`/`list_entry`.",
                                "example": "Approved"
                              },
                              "is_blocklisted": {
                                "type": "boolean",
                                "description": "`true`, wenn sich das übereinstimmende Gesicht auf Ihrer Gesichts-Sperrliste befindet. Jeder hinreichend ähnliche Treffer auf der Sperrliste führt zur Ablehnung der Suche."
                              },
                              "is_allowlisted": {
                                "type": "boolean",
                                "description": "`true`, wenn sich das übereinstimmende Gesicht auf einer Ihrer Positivlisten befindet. Treffer auf der Positivliste unterdrücken Duplikatswarnungen."
                              },
                              "api_service": {
                                "type": "string",
                                "nullable": true,
                                "description": "Wird gesetzt, wenn das abgeglichene Gesicht über einen Standalone-API-Aufruf registriert wurde (z. B. `PASSIVE_LIVENESS`); `null` für reguläre Verifizierungssitzungen und importierte Gesichter.",
                                "example": null
                              }
                            }
                          }
                        },
                        "user_image": {
                          "type": "object",
                          "description": "Gesichtserkennungsergebnisse für das übermittelte Bild. Einträge hier enthalten nur `bbox` und `confidence`.",
                          "properties": {
                            "entities": {
                              "type": "array",
                              "description": "Ein Eintrag pro erkanntem Gesicht. Das größte Gesicht ist dasjenige, nach dem gesucht wird.",
                              "items": {
                                "type": "object",
                                "properties": {
                                  "bbox": {
                                    "type": "array",
                                    "items": {
                                      "type": "integer"
                                    },
                                    "minItems": 4,
                                    "maxItems": 4,
                                    "description": "Bounding-Box `[x_min, y_min, x_max, y_max]` in Pixeln.",
                                    "example": [
                                      40,
                                      40,
                                      120,
                                      120
                                    ]
                                  },
                                  "confidence": {
                                    "type": "number",
                                    "format": "float",
                                    "minimum": 0,
                                    "maximum": 1,
                                    "description": "Konfidenz der Gesichtserkennung (0–1).",
                                    "example": 0.732973
                                  }
                                }
                              }
                            },
                            "best_angle": {
                              "type": "integer",
                              "description": "Drehung (Grad), die die beste Gesichtserkennung lieferte; nur ungleich null, wenn `rotate_image=true` die Ausrichtung korrigiert hat. An diesem Endpoint niemals null (standardmäßig 0, wenn das Modell den Wert weglässt).",
                              "example": 0
                            }
                          }
                        },
                        "warnings": {
                          "type": "array",
                          "description": "Risikosignale. `FACE_IN_BLOCKLIST` / `POSSIBLE_FACE_IN_BLOCKLIST` (`error`) lehnen die Suche ab; `MULTIPLE_FACES_DETECTED` (`warning`) und `DUPLICATED_FACE` / `POSSIBLE_DUPLICATED_FACE` (`information`) dienen als Hinweis.",
                          "items": {
                            "type": "object",
                            "properties": {
                              "risk": {
                                "type": "string",
                                "enum": [
                                  "MULTIPLE_FACES_DETECTED",
                                  "FACE_IN_BLOCKLIST",
                                  "POSSIBLE_FACE_IN_BLOCKLIST",
                                  "DUPLICATED_FACE",
                                  "POSSIBLE_DUPLICATED_FACE"
                                ],
                                "description": "Maschinenlesbarer Risiko-Code."
                              },
                              "feature": {
                                "type": "string",
                                "enum": [
                                  "LIVENESS"
                                ],
                                "description": "Funktion, die die Warnung ausgelöst hat. An diesem Endpoint immer `LIVENESS`."
                              },
                              "additional_data": {
                                "type": "object",
                                "nullable": true,
                                "additionalProperties": true,
                                "description": "`null` für `MULTIPLE_FACES_DETECTED`. Treffer auf der Sperrliste enthalten `{blocklisted_session_id, blocklisted_session_number, api_service}`; Duplikat-Treffer enthalten `{duplicated_session_id, duplicated_session_number, api_service}`, die auf die erste übereinstimmende Sitzung verweisen."
                              },
                              "log_type": {
                                "type": "string",
                                "enum": [
                                  "error",
                                  "warning",
                                  "information"
                                ],
                                "description": "Schweregrad. `error`-Warnungen setzen `status` auf `Declined`; `warning`- und `information`-Einträge sind hinweisend und führen für sich allein nie zu einer Ablehnung."
                              },
                              "short_description": {
                                "type": "string",
                                "description": "Für Menschen lesbare einzeilige Zusammenfassung des Risikos."
                              },
                              "long_description": {
                                "type": "string",
                                "description": "Lesbare Erklärung des Risikos."
                              }
                            }
                          }
                        }
                      }
                    },
                    "vendor_data": {
                      "type": "string",
                      "nullable": true,
                      "description": "Rückgabe der von Ihnen gesendeten `vendor_data` oder `null`."
                    },
                    "metadata": {
                      "type": "object",
                      "nullable": true,
                      "additionalProperties": true,
                      "description": "Rückgabe des von Ihnen gesendeten `metadata`-Objekts oder `null`."
                    },
                    "created_at": {
                      "type": "string",
                      "format": "date-time",
                      "description": "ISO 8601-Zeitstempel (UTC), wann die Antwort generiert wurde, z. B. `2026-06-12T01:04:42.763237+00:00`."
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Validierungsfehler. Wird zurückgegeben, wenn `user_image` fehlt, 5 MB überschreitet, eine nicht unterstützte Dateiendung hat oder im übermittelten Bild **kein Gesicht erkannt wird**. Feldfehler verwenden die DRF-Envelope `{field: [messages]}`; Fehler bei der Gesichtserkennung verwenden `{\"error\": ...}`.",
            "content": {
              "application/json": {
                "examples": {
                  "No face detected": {
                    "summary": "Das Bild lässt sich fehlerfrei decodieren, enthält jedoch kein erkennbares Gesicht",
                    "value": {
                      "error": "No face detected in the image"
                    }
                  },
                  "Missing image": {
                    "summary": "`user_image` ist nicht in den Formulardaten enthalten",
                    "value": {
                      "user_image": [
                        "No file was submitted."
                      ]
                    }
                  },
                  "Unsupported file extension": {
                    "summary": "Dateiendung außerhalb von tiff/jpg/jpeg/png/webp",
                    "value": {
                      "user_image": [
                        "File extension “txt” is not allowed. Allowed extensions are: tiff, jpg, jpeg, png, webp."
                      ]
                    }
                  },
                  "File too large": {
                    "summary": "Der Upload überschreitet das Limit von 5 MB",
                    "value": {
                      "user_image": [
                        "File size should not exceed 5 MB"
                      ]
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Zugriff verweigert. Wird zurückgegeben, wenn der Header `x-api-key` fehlt sowie wenn das Guthaben der aufrufenden Organisation den Aufruf nicht decken kann; ein falscher, widerrufener oder abgelaufener Schlüssel gibt `401` zurück. Ein fehlender Schlüssel gibt `403` mit `{\"detail\": ...}` zurück; ein falscher, widerrufener oder abgelaufener Schlüssel gibt `401` zurück. Unzureichende Credits geben `403` mit `{\"error\": ...}` zurück, bevor eine Bildverarbeitung stattfindet.",
            "content": {
              "application/json": {
                "examples": {
                  "Missing or invalid API key": {
                    "summary": "Kein `x-api-key`-Header, oder der Schlüssel ist ungültig/widerrufen",
                    "value": {
                      "detail": "You do not have permission to perform this action."
                    }
                  },
                  "Not enough credits": {
                    "summary": "Das Guthaben der Organisation reicht für den Aufruf nicht aus",
                    "value": {
                      "error": "You don't have enough credits to perform this request. Please top up at https://business.didit.me"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate-Limit überschritten. POST/PATCH/DELETE-Endpoints teilen sich ein Budget von 300 Schreibanfragen pro Minute pro API-Schlüssel (Transaktionserstellungen und Ereignis-Ingestion haben ein separates Budget von 600). Die Antwort enthält die Header `X-RateLimit-Limit`, `X-RateLimit-Remaining`, `X-RateLimit-Reset` und `Retry-After`.",
            "content": {
              "application/json": {
                "examples": {
                  "Write rate limit exceeded": {
                    "summary": "Mehr als 300 Schreibanfragen in der aktuellen Minute",
                    "value": {
                      "detail": "Write request rate limit exceeded. You can make up to 300 requests per minute."
                    }
                  }
                },
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "cURL",
            "source": "curl -X POST 'https://verification.didit.me/v3/face-search/' \\\n  -H 'x-api-key: YOUR_API_KEY' \\\n  -F 'user_image=@./selfie.jpg' \\\n  -F 'search_type=most_similar' \\\n  -F 'save_api_request=true' \\\n  -F 'vendor_data=user-123'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.face_search.search(\n    user_image=open(\"user_image.jpg\", \"rb\"),\n    search_type=\"most_similar\",\n    rotate_image=False,\n    save_api_request=True,\n    vendor_data=\"user-123\",\n    metadata={\"flow\": \"dedup_check\"},\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit, { fileFromPath } from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.faceSearch.search({\n  user_image: await fileFromPath(\"user_image.jpg\"),\n  search_type: \"most_similar\",\n  rotate_image: false,\n  save_api_request: true,\n  vendor_data: \"user-123\",\n  metadata: { flow: \"dedup_check\" },\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.FaceSearch.Search(ctx, didit.FaceSearchSearchParams{\n\tUserImage:      didit.FileFromPath(\"user_image.jpg\"),\n\tSearchType:     didit.Some(didit.FaceSearchSearchParamsSearchType(\"most_similar\")),\n\tRotateImage:    didit.Bool(false),\n\tSaveAPIRequest: didit.Bool(true),\n\tVendorData:     didit.String(\"user-123\"),\n\tMetadata:       didit.Some(map[string]any{\"flow\": \"dedup_check\"}),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import java.nio.file.Path;\nimport java.util.Map;\nimport me.didit.Didit;\nimport me.didit.types.FaceSearchSearchParams;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.faceSearch().search(FaceSearchSearchParams.builder()\n        .userImage(Path.of(\"user_image.jpg\"))\n        .searchType(FaceSearchSearchParams.SearchType.of(\"most_similar\"))\n        .rotateImage(false)\n        .saveApiRequest(true)\n        .vendorData(\"user-123\")\n        .metadata(Map.of(\"flow\", \"dedup_check\"))\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\nuse Didit\\File;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->faceSearch->search([\n    'user_image' => File::fromPath('user_image.jpg'),\n    'search_type' => 'most_similar',\n    'rotate_image' => false,\n    'save_api_request' => true,\n    'vendor_data' => 'user-123',\n    'metadata' => ['flow' => 'dedup_check'],\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.face_search.search(\n  user_image: Pathname(\"user_image.jpg\"),\n  search_type: \"most_similar\",\n  rotate_image: false,\n  save_api_request: true,\n  vendor_data: \"user-123\",\n  metadata: { flow: \"dedup_check\" }\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Collections.Generic;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.FaceSearch.SearchAsync(new FaceSearchSearchParams\n{\n    UserImage = FileUpload.FromPath(\"user_image.jpg\"),\n    SearchType = new FaceSearchSearchParamsSearchType(\"most_similar\"),\n    RotateImage = false,\n    SaveApiRequest = true,\n    VendorData = \"user-123\",\n    Metadata = new Dictionary<string, object> { [\"flow\"] = \"dedup_check\" },\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ]
      }
    },
    "/v3/sessions/": {
      "get": {
        "summary": "Verifizierungssitzungen (KYC und/oder KYB) mit Filtern und Paginierung auflisten",
        "description": "Gibt eine paginierte Liste von Verifizierungssitzungen für die durch Ihren API-Schlüssel identifizierte Anwendung zurück, die neuesten zuerst (absteigende `session_number`).\n\n**Kanonische URL:** Die Route lautet `/v3/sessions/` (abschließender Schrägstrich). Anfragen an `/v3/sessions` ohne Schrägstrich erhalten eine `301`-Weiterleitung zur URL mit Schrägstrich, wobei der Query-String erhalten bleibt; die meisten HTTP-Clients folgen dieser bei GET automatisch.\n\n**Wann dieser Endpoint im Vergleich zu Webhooks verwendet werden sollte.** Verwenden Sie diesen Endpoint für Dashboards, Back-Office-Suchen, Abgleiche und Batch-Exporte. Führen Sie kein Polling durch, um den Fortschritt einzelner Verifizierungen zu verfolgen – konfigurieren Sie stattdessen [Webhooks](/de/integration/webhooks), die `status.updated`-Ereignisse übertragen, sobald sich eine Sitzung ändert. Um das vollständige Ergebnis einer Sitzung abzurufen, rufen Sie `GET /v3/session/{sessionId}/decision/` auf.\n\n**KYC- und KYB-Sitzungen.** `session_kind` wählt aus, welche Arten aufgelistet werden:\n- `user` (Standard) – Nur Sitzungen zur Benutzerverifizierung (KYC). Abwärtskompatibles Verhalten.\n- `business` – Nur Sitzungen zur Unternehmensverifizierung (KYB). Zeilen weisen eine andere, kompaktere Struktur auf (siehe Antwort-Schema).\n- `all` – Beide Arten in einer einzigen Antwort: Die KYC-Seite und die KYB-Seite für dieselben Werte von `limit`/`offset` werden in `results` aneinandergehängt (KYC-Zeilen zuerst), sodass eine Seite bis zu `2 x limit` Zeilen enthalten kann. `count` ist die Summe beider Arten und `next`/`previous` spiegeln die Paginierung auf KYC-Seite wider. Für eine strikte Paginierung gemischter Daten rufen Sie `user` und `business` separat auf.\n\nJede Zeile enthält einen `session_kind`-Diskriminator (`\"user\"` oder `\"business\"`).\n\n**Paginierung.** Standardmäßiges Limit/Offset: `limit` (Standard 50) und `offset` (Standard 0), mit vorgefertigten Seiten-URLs für `next`/`previous`. Bei KYC-Zeilen ist `count` exakt. Bei KYB-Zeilen wird `count` über einen begrenzten Scan berechnet und ist auf 100 begrenzt – gibt es mehr als 100 Treffer, bleibt der Wert bei 100. Iterieren Sie daher über `next` (oder prüfen Sie, ob eine vollständige Seite zurückgegeben wurde), anstatt die Gesamtzahl der Seiten anhand von `count` zu berechnen.\n\n**Filtersemantik.** Alle Filter werden mit UND verknüpft und gelten für KYC-Zeilen. Wenn `session_kind` auf `business` oder `all` gesetzt ist, berücksichtigt die KYB-Seite die gemeinsamen Parameter `vendor_data`, `status`, `workflow_id`, `country` (Ländercode des Registerunternehmens), `date_from`, `date_to`, `search` (Unternehmensname, Registernummer – geben Sie Registernummern ohne Trennzeichen ein, z. B. `DPC001` statt `DPC-001` –, vendor_data, Sitzungsnummer oder Sitzungs-UUID), `warning` und `organization_name`; die übrigen reinen KYC-Filter werden für KYB-Zeilen ignoriert. Kommagetrennte Parameter (`status`, `country`, `document_type`, `region`, `workflow_id`, `document_name`, `warning`, `organization_name`, `session_type`) stimmen mit jedem der aufgeführten Werte überein (ODER innerhalb des Parameters). `vendor_data` ist eine exakte Übereinstimmung – verwenden Sie `search` für Teilübereinstimmungen. Unbekannte Werte in Listenfiltern geben einfach keine Zeilen zurück (kein Fehler); fehlerhafte typisierte Werte (`date_from`, `date_to`, `didit_internal_id`, `api_service`, `session_kind`) geben `400` mit einem feldspezifischen Fehlerobjekt zurück.\n\n**Suche.** `search` passt sich der Eingabe an: Eine vollständige UUID schlägt `session_id` nach; Ziffern (optional mit `+ - . space`) stimmen mit dem Präfix der Sitzungsnummer, Dokumenten-/Personennummern, dem Präfix der Telefonnummer oder `vendor_data` überein; Werte, die `@` enthalten, stimmen mit E-Mail-Präfixen überein; jeder andere Text stimmt mit Namen (unabhängig von Akzenten) und `vendor_data` überein.\n\nEs wird kein festes Rate-Limit pro Endpoint erzwungen, aber halten Sie das Polling von Listen gering und verlassen Sie sich bei Echtzeit-Updates auf Webhooks.",
        "operationId": "get_v3_sessions",
        "x-didit-sdk": {
          "resource": "sessions",
          "method": "list",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Sessions"
        ],
        "parameters": [
          {
            "name": "session_kind",
            "in": "query",
            "required": false,
            "description": "Welche Art von Sitzungen aufgelistet werden soll: `user` (nur KYC, Standard), `business` (nur KYB) oder `all` (beide verkettet - siehe Beschreibung für die Semantik der zusammengeführten Paginierung). Beim Abgleich wird die Groß-/Kleinschreibung nicht berücksichtigt (`BUSINESS` funktioniert); jeder andere Wert als eine Schreibweisenvariante von `user`/`business`/`all` gibt `400` zurück.",
            "schema": {
              "type": "string",
              "enum": [
                "user",
                "business",
                "all"
              ],
              "default": "user"
            },
            "example": "all"
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Maximale Anzahl an Zeilen pro Seite (pro Art, wenn `session_kind=all`). Standardmäßig 50.",
            "schema": {
              "type": "integer",
              "default": 50,
              "minimum": 1,
              "maximum": 1000000
            },
            "example": 20
          },
          {
            "name": "offset",
            "in": "query",
            "required": false,
            "description": "Anzahl der vor der ersten zurückgegebenen Zeile zu überspringenden Zeilen. Standardmäßig 0. Folgen Sie vorzugsweise den `next`/`previous`-URLs aus der Antwort.",
            "schema": {
              "type": "integer",
              "default": 0,
              "minimum": 0,
              "maximum": 1000000
            },
            "example": 20
          },
          {
            "name": "status",
            "in": "query",
            "required": false,
            "description": "Kommagetrennte Liste der einzuschließenden Sitzungsstatus, z. B. `Approved,In Review`. Bei den Werten wird zwischen Groß- und Kleinschreibung unterschieden; siehe [Verifizierungsstatus](/de/integration/verification-statuses). Unbekannte Werte stimmen mit nichts überein.",
            "schema": {
              "type": "string"
            },
            "example": "Approved,In Review"
          },
          {
            "name": "vendor_data",
            "in": "query",
            "required": false,
            "description": "Exakter Übereinstimmungsfilter für die `vendor_data`, die Sie bei der Sitzungserstellung übermittelt haben (Ihre eigene Benutzer-/Unternehmenskennung). Für Teilübereinstimmungen verwenden Sie stattdessen `search`.",
            "schema": {
              "type": "string"
            },
            "example": "your-user-id-123"
          },
          {
            "name": "search",
            "in": "query",
            "required": false,
            "description": "Eine vollständige angezeigte Referenz wie `S-0001` (Benutzer) oder `B-0001` (Unternehmen) stimmt nur mit dieser Sitzungsnummer und Art überein; führende Nullen und Groß-/Kleinschreibung haben keinen Einfluss auf die Übereinstimmung. Intelligente Freitextsuche. Eine vollständige UUID stimmt mit `session_id` überein; numerische Eingaben stimmen mit Sitzungsnummern-Präfixen, Dokumenten-/persönlichen Nummern, Telefonvorwahlen oder `vendor_data` überein; Eingaben mit `@` stimmen mit E-Mail-Präfixen überein; anderer Text stimmt mit Namen (ohne Berücksichtigung von Akzenten) und `vendor_data` überein. Freitext mit Ziffern stimmt zusätzlich mit Suchfeldern für Dokumenten-/persönliche Nummern und Sitzungsnummern-Präfixen überein.",
            "schema": {
              "type": "string"
            },
            "example": "jane doe"
          },
          {
            "name": "workflow_id",
            "in": "query",
            "required": false,
            "description": "Kommagetrennte Workflow-UUIDs (Sie finden sie auf der Seite „Workflows“ in der Console). Ungültig formatierte UUIDs in der Liste werden ignoriert; wenn keine gültig ist, ist das Ergebnis leer.",
            "schema": {
              "type": "string"
            },
            "example": "9f9b1234-aaaa-bbbb-cccc-1234567890ab"
          },
          {
            "name": "date_from",
            "in": "query",
            "required": false,
            "description": "Nur Sitzungen, die an oder nach diesem Datum (UTC) erstellt wurden, Format `YYYY-MM-DD`. Fehlerhafte Datumsangaben geben `400` zurück.",
            "schema": {
              "type": "string",
              "format": "date"
            },
            "example": "2026-06-01"
          },
          {
            "name": "date_to",
            "in": "query",
            "required": false,
            "description": "Nur Sitzungen, die bis zu diesem Datum (UTC) erstellt wurden, Format `YYYY-MM-DD`. Für KYC-Zeilen wird der gesamte Tag einbezogen; für KYB-Zeilen lautet der Vergleich `created_at <= date_to` (Mitternacht), verwenden Sie daher das Datum des nächsten Tages, um einen vollständigen Tag mit KYB-Sitzungen einzuschließen.",
            "schema": {
              "type": "string",
              "format": "date"
            },
            "example": "2026-06-30"
          },
          {
            "name": "tags",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "Kommagetrennte Tag-IDs (`tags` Ihrer Anwendung). Gibt die Sitzungen zurück, die eines davon enthalten. IDs, die keine gültigen UUIDs sind, werden ignoriert, und wenn keine gültig ist, ist die Liste leer."
          },
          {
            "name": "decided_from",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "date-time"
            },
            "description": "ISO 8601-Datum/Uhrzeit. Gibt die Sitzungen zurück, deren Status sich zuletzt zu diesem Zeitpunkt oder danach geändert hat. Filtert nach dem Zeitpunkt der letzten Statusänderung, nicht nach dem Erstellungszeitpunkt."
          },
          {
            "name": "decided_to",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "date-time"
            },
            "description": "ISO 8601-Datum/Uhrzeit. Gibt die Sitzungen zurück, deren Status sich zuletzt davor geändert hat. Kombinieren Sie dies mit `decided_from` für ein halboffenes Intervall."
          },
          {
            "name": "country",
            "in": "query",
            "required": false,
            "description": "Kommagetrennter Länderfilter. Für KYC-Zeilen: ISO 3166-1-Alpha-3-Codes des Ausstellungsstaates des Ausweisdokuments (z. B. `ESP,USA`), der von der Staatsangehörigkeit abweichen kann. Für KYB-Zeilen: der Ländercode des im Unternehmensregister eingetragenen Unternehmens.",
            "schema": {
              "type": "string"
            },
            "example": "ESP,USA"
          },
          {
            "name": "document_type",
            "in": "query",
            "required": false,
            "description": "Kommagetrennte Codes der in der Sitzung verifizierten Ausweisdokumenttypen (nur KYC-Zeilen): `P` (Reisepass), `ID` (Personalausweis), `DL` (Führerschein), `RP` (Aufenthaltstitel), `SSC` (Sozialversicherungsausweis), `HIC` (Krankenversicherungskarte), `WP` (Arbeitserlaubnis), `TC` (Steuerkarte), `VISA`, `PSC` (Public Service Card), `BC` (Geburtsurkunde), `OTHER`. Beachten Sie, dass das Antwortfeld `document_type` den Anzeigenamen enthält, nicht den Code.",
            "schema": {
              "type": "string"
            },
            "example": "P,ID"
          },
          {
            "name": "document_name",
            "in": "query",
            "required": false,
            "description": "Exakte Dokumentnamen; mehrere Namen können kommagetrennt übergeben werden, der Wert wird jedoch nur an Kommas aufgeteilt, wenn er mehr als ein Trennzeichen ` - ` enthält (ein einzelner Name mit einem eingebetteten Komma wird als Ganzes abgeglichen). Namen, wie sie von der Dokumentenprüfung erkannt werden (Vorder- oder Rückseite), z. B. `Spain - Id Card (2021)`. Nur KYC-Zeilen.",
            "schema": {
              "type": "string"
            },
            "example": "Spain - Id Card (2021)"
          },
          {
            "name": "region",
            "in": "query",
            "required": false,
            "description": "Kommagetrennte Werte für Dokumentregion/-bundesstaat (für Dokumente, die pro Region ausgestellt werden, wie etwa US-Führerscheine). Nur KYC-Zeilen.",
            "schema": {
              "type": "string"
            },
            "example": "CA,TX"
          },
          {
            "name": "didit_internal_id",
            "in": "query",
            "required": false,
            "description": "Filtern Sie nach Didits internem Benutzerbezeichner (dem Antwortfeld `didit_internal_id`), um alle Sitzungen eines verifizierten Benutzers aufzulisten. Muss eine gültige UUID sein; fehlerhafte Werte geben `400` zurück. Nur KYC-Zeilen.",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "example": "d9e78474-6c8d-4f2a-bb90-6f5c2f3a1147"
          },
          {
            "name": "session_type",
            "in": "query",
            "required": false,
            "description": "Kommagetrennte Kanäle zur Sitzungserstellung: `API`, `HOSTED`, `MIGRATED`. Der spezielle Wert `ALL` (oder das Weglassen des Parameters) deaktiviert den Filter. Nur für KYC-Zeilen.",
            "schema": {
              "type": "string"
            },
            "example": "HOSTED"
          },
          {
            "name": "api_service",
            "in": "query",
            "required": false,
            "description": "Eigenständige API-Sitzungen nach Dienst filtern. Ungültige Werte geben `400` zurück. Nur KYC-Zeilen.",
            "schema": {
              "type": "string",
              "enum": [
                "ID_VERIFICATION",
                "FACE_MATCH",
                "AGE_ESTIMATION",
                "FACE_SEARCH",
                "POA",
                "AML",
                "KYB_REGISTRY",
                "PASSIVE_LIVENESS",
                "DATABASE_VALIDATION",
                "PHONE_VERIFICATION",
                "EMAIL_VERIFICATION"
              ]
            },
            "example": "AML"
          },
          {
            "name": "screened_full_name",
            "in": "query",
            "required": false,
            "description": "Namenssuche ohne Berücksichtigung von Akzenten innerhalb der durch AML und Datenbankvalidierung geprüften Daten. In Kombination mit `api_service=AML` oder `api_service=DATABASE_VALIDATION` wird die Suche auf die geprüften Daten dieser Funktion beschränkt. Nur KYC-Zeilen.",
            "schema": {
              "type": "string"
            },
            "example": "Jane Doe"
          },
          {
            "name": "warning",
            "in": "query",
            "required": false,
            "description": "Kommagetrennte Risiko-Codes für Warnungen; gibt Sitzungen zurück, die einen davon ausgelöst haben (z. B. `POSSIBLE_FRAUD`). Risiko-Codes sind pro Funktion in der [Warnungsdokumentation](/de/integration/webhooks) aufgeführt. Gilt für KYC-Zeilen und, mit Warnungs-Codes für Unternehmen, für KYB-Zeilen.",
            "schema": {
              "type": "string"
            },
            "example": "POSSIBLE_FRAUD"
          },
          {
            "name": "status_initialized_as_in_review",
            "in": "query",
            "required": false,
            "description": "Wenn `true`, nur Sitzungen, deren Entscheidung anfänglich auf `In Review` fiel (nützlich zur Überprüfung des Volumens manueller Prüfungen). Nur KYC-Zeilen.",
            "schema": {
              "type": "boolean"
            },
            "example": true
          },
          {
            "name": "is_kyc_to_be_reviewed",
            "in": "query",
            "required": false,
            "description": "`true` gibt Sitzungen zurück, deren Dokumentenprüfung für eine manuelle Prüfung markiert ist; `false` gibt Sitzungen zurück, bei denen die Dokumentenprüfung ausdrücklich nicht markiert ist. Weglassen zum Deaktivieren. Nur KYC-Zeilen.",
            "schema": {
              "type": "boolean"
            },
            "example": true
          },
          {
            "name": "euuid",
            "in": "query",
            "required": false,
            "description": "Nach der euuid des Endbenutzers filtern (dem zu verifizierenden Benutzer zugewiesene UUID, die von Console-Deeplinks verwendet wird). Muss eine gültige UUID sein; fehlerhafte Werte geben einen 400-Feldfehler zurück. Nur KYC-Zeilen.",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "example": "0f8fad5b-d9cb-469f-a165-70867728950e"
          },
          {
            "name": "organization_name",
            "in": "query",
            "required": false,
            "description": "Kommagetrennte Organisationsnamen. Für die Console vorgesehen; mit einem API-Schlüssel (der bereits auf eine Anwendung beschränkt ist) stimmt dies nur mit dem Namen Ihrer eigenen Organisation überein.",
            "schema": {
              "type": "string"
            },
            "example": "Acme Inc"
          }
        ],
        "responses": {
          "200": {
            "description": "Paginierte Sitzungsliste. `results`-Einträge sind je nach `session_kind` KYC-Zeilen, KYB-Zeilen oder beides; unterscheiden Sie anhand des Felds `session_kind` jeder Zeile.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "count",
                    "next",
                    "previous",
                    "results"
                  ],
                  "properties": {
                    "count": {
                      "type": "integer",
                      "description": "Anzahl der den Filtern entsprechenden Sitzungen: exakt bis 100 und darüber auf 100 begrenzt, verwenden Sie sie daher nicht als Gesamtsumme. Nutzen Sie `next`, um zu erfahren, ob weitere Seiten vorhanden sind. Bei `session_kind=all` ist es die Summe beider Arten, jeweils auf 100 begrenzt.",
                      "example": 2
                    },
                    "next": {
                      "type": "string",
                      "format": "uri",
                      "nullable": true,
                      "description": "Absolute URL der nächsten Seite oder `null` auf der letzten Seite.",
                      "example": "https://verification.didit.me/v3/sessions/?limit=20&offset=20"
                    },
                    "previous": {
                      "type": "string",
                      "format": "uri",
                      "nullable": true,
                      "description": "Absolute URL der vorherigen Seite oder `null` auf der ersten Seite.",
                      "example": null
                    },
                    "results": {
                      "type": "array",
                      "description": "Sitzungszeilen, neueste zuerst. Bei `session_kind=all` stehen KYC-Zeilen an erster Stelle, gefolgt von KYB-Zeilen.",
                      "items": {
                        "oneOf": [
                          {
                            "$ref": "#/components/schemas/UserSessionListItem"
                          },
                          {
                            "$ref": "#/components/schemas/BusinessSessionListItem"
                          }
                        ],
                        "discriminator": {
                          "propertyName": "session_kind",
                          "mapping": {
                            "user": "#/components/schemas/UserSessionListItem",
                            "business": "#/components/schemas/BusinessSessionListItem"
                          }
                        }
                      }
                    }
                  }
                },
                "examples": {
                  "KYC sessions (default)": {
                    "summary": "session_kind=user - eine abgeschlossene und eine nicht gestartete Sitzung",
                    "value": {
                      "count": 2,
                      "next": null,
                      "previous": null,
                      "results": [
                        {
                          "session_id": "5b3720ed-d429-42ef-b67f-37ea805f48ee",
                          "session_kind": "user",
                          "session_number": 720,
                          "session_url": "https://verify.didit.me/session/CuXoBYCYVO5Y",
                          "portrait_image": "https://<media-host>/portraits/5b3720ed.jpg?X-Amz-Expires=3600&X-Amz-Signature=...",
                          "document_type": "Passport",
                          "full_name": "Jane Marie Doe",
                          "country": "ESP",
                          "status": "Approved",
                          "vendor_data": "your-user-id-123",
                          "didit_internal_id": "d9e78474-6c8d-4f2a-bb90-6f5c2f3a1147",
                          "created_at": "2026-06-09T12:26:54.328364Z",
                          "features": [
                            {
                              "feature": "ID_VERIFICATION",
                              "status": "Approved"
                            },
                            {
                              "feature": "LIVENESS",
                              "status": "Approved"
                            },
                            {
                              "feature": "FACE_MATCH",
                              "status": "Approved"
                            },
                            {
                              "feature": "AML",
                              "status": "Approved"
                            },
                            {
                              "feature": "IP_ANALYSIS",
                              "status": "Approved"
                            }
                          ],
                          "phone_number": {
                            "number": "+14155552671",
                            "is_verified": true
                          },
                          "email_address": {
                            "email": "jane@example.com",
                            "is_verified": true
                          },
                          "additional_details": {
                            "aml": {
                              "total_hits": 0,
                              "entity_type": "person",
                              "is_adverse_media_fetched": false
                            },
                            "liveness": {
                              "method": "PASSIVE",
                              "score": 0.98
                            },
                            "face_match": {
                              "score": 0.95
                            }
                          }
                        },
                        {
                          "session_id": "038ad62f-5ebd-46c2-afe9-4b2956bf687f",
                          "session_kind": "user",
                          "session_number": 719,
                          "session_url": "https://verify.didit.me/session/7RGKiO6ioGH6",
                          "portrait_image": null,
                          "document_type": null,
                          "full_name": null,
                          "country": null,
                          "status": "Not Started",
                          "vendor_data": "your-user-id-124",
                          "didit_internal_id": "eb4e679d-ca4b-461f-9685-687bac29ebdb",
                          "created_at": "2026-06-09T08:02:23.343053Z",
                          "features": [
                            {
                              "feature": "ID_VERIFICATION",
                              "status": "Not Finished"
                            },
                            {
                              "feature": "LIVENESS",
                              "status": "Not Finished"
                            },
                            {
                              "feature": "FACE_MATCH",
                              "status": "Not Finished"
                            },
                            {
                              "feature": "AML",
                              "status": "Not Finished"
                            },
                            {
                              "feature": "IP_ANALYSIS",
                              "status": "Not Finished"
                            }
                          ],
                          "phone_number": null,
                          "email_address": null,
                          "additional_details": null
                        }
                      ]
                    }
                  },
                  "Mixed KYC + KYB (session_kind=all)": {
                    "summary": "session_kind=all - KYC-Zeile gefolgt von einer KYB-Zeile",
                    "value": {
                      "count": 2,
                      "next": null,
                      "previous": null,
                      "results": [
                        {
                          "session_id": "5b3720ed-d429-42ef-b67f-37ea805f48ee",
                          "session_kind": "user",
                          "session_number": 720,
                          "session_url": "https://verify.didit.me/session/CuXoBYCYVO5Y",
                          "portrait_image": null,
                          "document_type": "Identity Card",
                          "full_name": "Jane Marie Doe",
                          "country": "ESP",
                          "status": "In Review",
                          "vendor_data": "your-user-id-123",
                          "didit_internal_id": "d9e78474-6c8d-4f2a-bb90-6f5c2f3a1147",
                          "created_at": "2026-06-09T12:26:54.328364Z",
                          "features": [
                            {
                              "feature": "ID_VERIFICATION",
                              "status": "In Review"
                            },
                            {
                              "feature": "LIVENESS",
                              "status": "Approved"
                            }
                          ],
                          "phone_number": null,
                          "email_address": null,
                          "additional_details": {
                            "liveness": {
                              "method": "PASSIVE",
                              "score": 0.98
                            }
                          }
                        },
                        {
                          "session_id": "8a1f63c2-1b9e-4f3a-9c41-2f6a1f0b7d52",
                          "session_kind": "business",
                          "session_number": 42,
                          "status": "Approved",
                          "vendor_data": "your-company-id-77",
                          "created_at": "2026-06-08T09:14:02.118450Z",
                          "workflow_id": "9f9b1234-aaaa-bbbb-cccc-1234567890ab",
                          "workflow_type": "kyb",
                          "workflow_label": "Standard KYB",
                          "company_name": "Acme Holdings S.L.",
                          "registration_number": "B12345678",
                          "country": "ES"
                        }
                      ]
                    }
                  }
                }
              }
            }
          },
          "301": {
            "description": "Weiterleitung zur kanonischen URL mit abschließendem Schrägstrich. Wird zurückgegeben, wenn der Anfragepfad `/v3/sessions` lautet (ohne abschließenden Schrägstrich); der `Location`-Header verweist auf `/v3/sessions/` unter Beibehaltung des Query-Strings. GET-Clients folgen dieser Weiterleitung typischerweise automatisch."
          },
          "400": {
            "description": "Ungültiger Abfrageparameter. Der Body ist ein Objekt mit dem fehlerhaften Parameter als Schlüssel.",
            "content": {
              "application/json": {
                "examples": {
                  "Invalid session_kind": {
                    "summary": "session_kind ist nicht user/business/all",
                    "value": {
                      "session_kind": "Must be \"user\", \"business\", or \"all\"."
                    }
                  },
                  "Invalid date": {
                    "summary": "Ungültiges Format für date_from/date_to",
                    "value": {
                      "date_from": [
                        "Enter a valid date."
                      ]
                    }
                  },
                  "Invalid didit_internal_id": {
                    "summary": "didit_internal_id ist keine UUID",
                    "value": {
                      "didit_internal_id": [
                        "Enter a valid UUID."
                      ]
                    }
                  },
                  "Invalid api_service": {
                    "summary": "api_service gehört nicht zu den zulässigen Optionen",
                    "value": {
                      "api_service": [
                        "Select a valid choice. FOO is not one of the available choices."
                      ]
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Fehlender, fehlerhafter oder widerrufener API-Schlüssel. Ein fehlender Schlüssel gibt `403` zurück; ein falscher, widerrufener oder abgelaufener Schlüssel gibt `401` zurück.\n\n**Gelöschte Anwendung:** Für einige Minuten nach dem Löschen einer Anwendung kann eine mit einem ihrer API-Schlüssel gesendete Anfrage mit `{\"detail\": \"This application was deleted.\", \"code\": \"application_deleted\"}` antworten. Versuchen Sie es nicht erneut: Die Anwendung und ihre API-Schlüssel existieren nicht mehr. Nach diesen wenigen Minuten wird der Schlüssel wie jeder andere ungültige Schlüssel abgelehnt.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string",
                      "example": "You do not have permission to perform this action."
                    },
                    "code": {
                      "type": "string",
                      "description": "Maschinenlesbarer Grund, nur bei bestimmten Fehlern vorhanden. `application_deleted`: Der API-Schlüssel gehört zu einer Anwendung, die gelöscht wurde.",
                      "example": "application_deleted"
                    }
                  },
                  "required": [
                    "detail"
                  ]
                },
                "examples": {
                  "Forbidden": {
                    "summary": "Fehlender oder ungültiger x-api-key",
                    "value": {
                      "detail": "You do not have permission to perform this action."
                    }
                  },
                  "ApplicationDeleted": {
                    "summary": "API-Schlüssel einer gelöschten Anwendung",
                    "value": {
                      "detail": "This application was deleted.",
                      "code": "application_deleted"
                    }
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -s 'https://verification.didit.me/v3/sessions/?status=Approved,In%20Review&date_from=2026-06-01&limit=20' \\\n  -H 'x-api-key: YOUR_API_KEY'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nfor item in client.sessions.list():\n    print(item)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nfor await (const item of didit.sessions.list()) {\n  console.log(item);\n}"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\niter := client.Sessions.ListAutoPaging(ctx, didit.SessionsListParams{})\nfor iter.Next() {\n\tfmt.Printf(\"%+v\\n\", iter.Current())\n}\nif err := iter.Err(); err != nil {\n\tlog.Fatal(err)\n}"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nfor (var item : client.sessions().list()) {\n    System.out.println(item);\n}"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\nforeach ($didit->sessions->list() as $item) {\n    print_r($item);\n}"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\ndidit.sessions.list.auto_paging_each do |item|\n  puts item.to_h\nend"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nawait foreach (var item in await client.Sessions.ListAsync())\n{\n    Console.WriteLine(JsonSerializer.Serialize(item));\n}"
          }
        ]
      }
    },
    "/v3/session/{sessionId}/share/": {
      "post": {
        "summary": "Erstellen Sie ein Freigabe-Token für eine abgeschlossene Verifizierungssitzung",
        "description": "Erstellen Sie ein kurzlebiges JWT, mit dem eine bestimmte Didit-Anwendung diese abgeschlossene Sitzung importieren kann. In Kombination mit `POST /v3/session/import-shared/` verwenden.",
        "operationId": "post_v3_session_share",
        "x-didit-sdk": {
          "resource": "sessions",
          "method": "share",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Sessions"
        ],
        "responses": {
          "200": {
            "description": "Share-Token erstellt.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "share_token": {
                      "type": "string",
                      "description": "HS256-signiertes JWT. Übergeben Sie dies unverändert als `share_token` an [`POST /v3/session/import-shared/`](/sessions-api/import-shared-session) in der Zielanwendung.",
                      "example": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
                    },
                    "for_application_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "Gibt die Ziel-Anwendungs-UUID wieder, an die das Token gebunden ist.",
                      "example": "a5f3bca2-46e2-411e-90ef-a580900a57ee"
                    },
                    "session_kind": {
                      "type": "string",
                      "enum": [
                        "user",
                        "business"
                      ],
                      "description": "Gibt an, ob die Quellsitzung eine Sitzung der Benutzerverifizierung (KYC) oder der Unternehmensverifizierung (KYB) ist."
                    }
                  }
                },
                "examples": {
                  "User session": {
                    "summary": "Eine KYC-Sitzung teilen",
                    "value": {
                      "share_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzZXNzaW9uX2lkIjoiMjBiYjNjM2ItNjE0Ni00MzlmLTg0YTQtYmQzMGQwMGFjNmEyIiwiZnJvbV9hcHBsaWNhdGlvbl9pZCI6ImRiZDIwZTM0LTQyZTktNGYyYy1iYTkxLWNmMDc2MjAxNmY2NCIsImZvcl9hcHBsaWNhdGlvbl9pZCI6ImE1ZjNiY2EyLTQ2ZTItNDExZS05MGVmLWE1ODA5MDBhNTdlZSIsImlhdCI6MTc1MzYzMDY2NiwiZXhwIjoxNzUzNjM0MjY2fQ.JJ9pNE_hqZsOtbR0XYZIWw4JzidjdEl279iUrsIkhGE",
                      "for_application_id": "a5f3bca2-46e2-411e-90ef-a580900a57ee",
                      "session_kind": "user"
                    }
                  },
                  "Business session": {
                    "summary": "Eine KYB-Sitzung teilen",
                    "value": {
                      "share_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
                      "for_application_id": "a5f3bca2-46e2-411e-90ef-a580900a57ee",
                      "session_kind": "business"
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Fehlende oder ungültige Anmeldedaten. Im Gegensatz zu den meisten v3-Endpoints authentifiziert dieser Endpoint über den Berechtigungs-Decorator und gibt `401` zurück, wenn kein gültiges Token bzw. kein gültiger Schlüssel übergeben wird.",
            "content": {
              "application/json": {
                "examples": {
                  "Unauthorized": {
                    "summary": "Nicht autorisiert",
                    "value": {
                      "detail": "Authentication credentials were not provided or are invalid."
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "In Ihrer Anwendung existiert keine Sitzung mit der angegebenen `session_id`.",
            "content": {
              "application/json": {
                "examples": {
                  "Not Found": {
                    "summary": "Sitzung nicht gefunden",
                    "value": {
                      "detail": "Not found."
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Validierungsfehler. Feldfehler werden nach Feldname aufgeschlüsselt; der Fehler wegen nicht abgeschlossener Verarbeitung wird unter einem `detail`-Schlüssel (als Array) zurückgegeben.",
            "content": {
              "application/json": {
                "examples": {
                  "Wrong status": {
                    "summary": "Quellsitzung ist nicht beendet",
                    "value": {
                      "detail": [
                        "Only finished sessions (\"Approved\", \"Declined\", \"In Review\") can be shared."
                      ]
                    }
                  },
                  "Target missing": {
                    "summary": "Zielanwendung existiert nicht",
                    "value": {
                      "for_application_id": [
                        "Target application does not exist."
                      ]
                    }
                  },
                  "Self-share": {
                    "summary": "Ziel ist die aufrufende Anwendung",
                    "value": {
                      "for_application_id": [
                        "Cannot share a session with the same application."
                      ]
                    }
                  },
                  "TTL bounds": {
                    "summary": "ttl_in_seconds außerhalb des zulässigen Bereichs",
                    "value": {
                      "ttl_in_seconds": [
                        "Ensure this value is greater than or equal to 60."
                      ]
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Die Anmeldedaten sind gültig, verfügen jedoch nicht über die Berechtigung `write:sessions` für diese Anwendung.",
            "content": {
              "application/json": {
                "examples": {
                  "No Permission": {
                    "value": {
                      "detail": "You do not have permission to perform this action."
                    },
                    "summary": "Keine Berechtigung"
                  }
                }
              }
            }
          }
        },
        "parameters": [
          {
            "in": "path",
            "name": "sessionId",
            "required": true,
            "description": "UUID der Quell-Verifizierungssitzung, für die ein Token ausgestellt werden soll.",
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "11111111-2222-3333-4444-555555555555"
            }
          }
        ],
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "for_application_id"
                ],
                "properties": {
                  "for_application_id": {
                    "type": "string",
                    "format": "uuid",
                    "description": "UUID der Didit-Anwendung, die das Token einlösen wird. Muss existieren, darf nicht gelöscht sein und muss sich von der aufrufenden Anwendung unterscheiden. Sie finden sie in der Business Console unter **Settings → Application**.",
                    "example": "a5f3bca2-46e2-411e-90ef-a580900a57ee"
                  },
                  "ttl_in_seconds": {
                    "type": "integer",
                    "description": "Token-Lebensdauer in Sekunden. Minimum `60`, Maximum `86400` (24 Std.). Standardmäßig `3600` (1 Std.).",
                    "minimum": 60,
                    "maximum": 86400,
                    "default": 3600,
                    "example": 3600
                  }
                }
              },
              "example": {
                "for_application_id": "a5f3bca2-46e2-411e-90ef-a580900a57ee",
                "ttl_in_seconds": 7200
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X POST \\\n  https://verification.didit.me/v3/session/11111111-2222-3333-4444-555555555555/share/ \\\n  -H 'x-api-key: YOUR_API_KEY' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\n    \"for_application_id\": \"a5f3bca2-46e2-411e-90ef-a580900a57ee\",\n    \"ttl_in_seconds\": 7200\n  }'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.sessions.share(\n    \"11111111-2222-3333-4444-555555555555\",\n    for_application_id=\"a5f3bca2-46e2-411e-90ef-a580900a57ee\",\n    ttl_in_seconds=7200,\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.sessions.share(\"11111111-2222-3333-4444-555555555555\", {\n  for_application_id: \"a5f3bca2-46e2-411e-90ef-a580900a57ee\",\n  ttl_in_seconds: 7200,\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Sessions.Share(ctx, \"11111111-2222-3333-4444-555555555555\", didit.SessionsShareParams{\n\tForApplicationID: \"a5f3bca2-46e2-411e-90ef-a580900a57ee\",\n\tTTLInSeconds:     didit.Int(7200),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\nimport me.didit.types.SessionsShareParams;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.sessions().share(\"11111111-2222-3333-4444-555555555555\", SessionsShareParams.builder()\n        .forApplicationId(\"a5f3bca2-46e2-411e-90ef-a580900a57ee\")\n        .ttlInSeconds(7200L)\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->sessions->share('11111111-2222-3333-4444-555555555555', [\n    'for_application_id' => 'a5f3bca2-46e2-411e-90ef-a580900a57ee',\n    'ttl_in_seconds' => 7200,\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.sessions.share(\n  \"11111111-2222-3333-4444-555555555555\",\n  for_application_id: \"a5f3bca2-46e2-411e-90ef-a580900a57ee\",\n  ttl_in_seconds: 7200\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Sessions.ShareAsync(\"11111111-2222-3333-4444-555555555555\", new SessionsShareParams\n{\n    ForApplicationId = \"a5f3bca2-46e2-411e-90ef-a580900a57ee\",\n    TtlInSeconds = 7200,\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ]
      }
    },
    "/v3/session/import-shared/": {
      "post": {
        "summary": "Ein Share-Token einlösen, um eine Verifizierungssitzung in Ihre Anwendung zu klonen",
        "description": "Lösen Sie ein Share-Token ein, um eine KYC- oder KYB-Sitzung mit einer neuen `session_id` in die aufrufende Anwendung zu klonen. Nicht idempotent – ein Token wird einmal pro Empfänger eingelöst.",
        "operationId": "post_v3_session_import_shared",
        "x-didit-sdk": {
          "resource": "sessions",
          "method": "import_shared",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Sessions"
        ],
        "responses": {
          "201": {
            "description": "Sitzung geklont. Der Body ist die V3-Entscheidungs-Payload für beide Arten, unterschieden durch `session_kind`: `\"user\"` (KYC) mit listenbasierten Funktionsblöcken wie `id_verifications`, `liveness_checks`, `aml_screenings`; `\"business\"` (KYB) mit Blöcken wie `registry_checks` und `key_people_checks`. Beide enthalten `shared_from_session` — die `session_id` der ursprünglichen Sitzung in der Quellanwendung. Mit `trust_review: false` wird der `status` der geklonten Sitzung zwangsweise auf `In Review` gesetzt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SessionDecision"
                },
                "examples": {
                  "User session imported": {
                    "summary": "Geklonte KYC-Sitzung (gekürzt — in der Realität vollständige V3-Entscheidungs-Payload)",
                    "value": {
                      "session_id": "11111111-2222-3333-4444-555555555555",
                      "session_kind": "user",
                      "shared_from_session": "99999999-8888-7777-6666-555555555555",
                      "session_number": 43762,
                      "session_url": null,
                      "status": "In Review",
                      "workflow_id": "9f9b1234-aaaa-bbbb-cccc-1234567890ab",
                      "vendor_data": "user-1",
                      "created_at": "2026-05-17T08:42:11Z",
                      "expires_at": "2026-05-24T08:42:11Z"
                    }
                  },
                  "Business session imported": {
                    "summary": "Geklonte KYB-Sitzung (gekürzt — in der Realität vollständige V3-KYB-Entscheidungs-Payload)",
                    "value": {
                      "session_id": "22222222-3333-4444-5555-666666666666",
                      "session_kind": "business",
                      "shared_from_session": "88888888-7777-6666-5555-444444444444",
                      "session_number": 982,
                      "session_url": null,
                      "status": "Approved",
                      "workflow_id": "9f9b1234-aaaa-bbbb-cccc-1234567890ab",
                      "vendor_data": "company-1"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Validierungsfehler (Token ungültig, abgelaufen, falsches Ziel oder Verweis auf eine nicht mehr existierende Sitzung).",
            "content": {
              "application/json": {
                "examples": {
                  "Invalid Share Token": {
                    "summary": "Ungültiges JWT",
                    "value": {
                      "share_token": [
                        "Invalid share token."
                      ]
                    }
                  },
                  "Expired Share Token": {
                    "summary": "Token nach `exp` abgelaufen",
                    "value": {
                      "share_token": [
                        "Share token has expired."
                      ]
                    }
                  },
                  "Wrong audience": {
                    "summary": "Token ist nicht an diese Anwendung gebunden",
                    "value": {
                      "share_token": [
                        "This token is not valid for this application."
                      ]
                    }
                  },
                  "Original missing": {
                    "summary": "Quellsitzung wurde gelöscht",
                    "value": {
                      "share_token": [
                        "Original session does not exist."
                      ]
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Fehlender API-Schlüssel (ein falscher, widerrufener oder abgelaufener Schlüssel führt zu einer `401`-Antwort) oder diese Quellsitzung wurde bereits in die aufrufende Anwendung importiert (eine Einlösung pro Empfänger).",
            "content": {
              "application/json": {
                "examples": {
                  "Forbidden": {
                    "summary": "Verboten",
                    "value": {
                      "detail": "You do not have permission to perform this action."
                    }
                  },
                  "Already imported": {
                    "summary": "Quelle bereits einmal importiert",
                    "value": {
                      "detail": "This session has already been shared with your application."
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "`workflow_id` gehört nicht zur aufrufenden Anwendung.",
            "content": {
              "application/json": {
                "examples": {
                  "Workflow not found": {
                    "summary": "Workflow unbekannt",
                    "value": {
                      "detail": "Workflow does not exist for this application."
                    }
                  }
                }
              }
            }
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "share_token",
                  "trust_review",
                  "workflow_id"
                ],
                "properties": {
                  "share_token": {
                    "type": "string",
                    "description": "JWT-Share-Token, ausgestellt von [`POST /v3/session/{sessionId}/share/`](/sessions-api/share-session).",
                    "example": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
                  },
                  "trust_review": {
                    "type": "boolean",
                    "description": "Wenn `true`, behält die geklonte Sitzung den endgültigen `status` der Quelle bei. Wenn `false`, wird sie in `In Review` versetzt.",
                    "example": false
                  },
                  "workflow_id": {
                    "type": "string",
                    "format": "uuid",
                    "description": "UUID eines Workflows in der aufrufenden Anwendung. Anwendungsübergreifende IDs werden mit `404` abgelehnt.",
                    "example": "9f9b1234-aaaa-bbbb-cccc-1234567890ab"
                  },
                  "vendor_data": {
                    "type": "string",
                    "nullable": true,
                    "description": "Optionaler Überschreibungswert für `vendor_data` der geklonten Sitzung.",
                    "example": "user-1"
                  }
                }
              },
              "example": {
                "share_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
                "trust_review": false,
                "workflow_id": "9f9b1234-aaaa-bbbb-cccc-1234567890ab",
                "vendor_data": "user-1"
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X POST \\\n  https://verification.didit.me/v3/session/import-shared/ \\\n  -H 'x-api-key: YOUR_API_KEY' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\n    \"share_token\": \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...\",\n    \"trust_review\": false,\n    \"workflow_id\": \"9f9b1234-aaaa-bbbb-cccc-1234567890ab\",\n    \"vendor_data\": \"user-1\"\n  }'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.sessions.import_shared(\n    share_token=\"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...\",\n    trust_review=False,\n    workflow_id=\"9f9b1234-aaaa-bbbb-cccc-1234567890ab\",\n    vendor_data=\"user-1\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.sessions.importShared({\n  share_token: \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...\",\n  trust_review: false,\n  workflow_id: \"9f9b1234-aaaa-bbbb-cccc-1234567890ab\",\n  vendor_data: \"user-1\",\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Sessions.ImportShared(ctx, didit.SessionsImportSharedParams{\n\tShareToken:  \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...\",\n\tTrustReview: false,\n\tWorkflowID:  \"9f9b1234-aaaa-bbbb-cccc-1234567890ab\",\n\tVendorData:  didit.String(\"user-1\"),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\nimport me.didit.types.SessionsImportSharedParams;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.sessions().importShared(SessionsImportSharedParams.builder()\n        .shareToken(\"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...\")\n        .trustReview(false)\n        .workflowId(\"9f9b1234-aaaa-bbbb-cccc-1234567890ab\")\n        .vendorData(\"user-1\")\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->sessions->importShared([\n    'share_token' => 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...',\n    'trust_review' => false,\n    'workflow_id' => '9f9b1234-aaaa-bbbb-cccc-1234567890ab',\n    'vendor_data' => 'user-1',\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.sessions.import_shared(\n  share_token: \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...\",\n  trust_review: false,\n  workflow_id: \"9f9b1234-aaaa-bbbb-cccc-1234567890ab\",\n  vendor_data: \"user-1\"\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Sessions.ImportSharedAsync(new SessionsImportSharedParams\n{\n    ShareToken = \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...\",\n    TrustReview = false,\n    WorkflowId = \"9f9b1234-aaaa-bbbb-cccc-1234567890ab\",\n    VendorData = \"user-1\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ]
      }
    },
    "/v3/kyb/search/": {
      "post": {
        "summary": "KYB-Unternehmenssuche im Register (eigenständig)",
        "operationId": "post_v3_kyb_search",
        "x-didit-sdk": {
          "resource": "kyb",
          "method": "search",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Standalone APIs"
        ],
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "parameters": [],
        "description": "Durchsuchen Sie offizielle Unternehmensregister nach potenziellen Unternehmen anhand des Namens und/oder der Registernummer. Dies ist Schritt 1 des zweistufigen Register-Ablaufs: **search** gibt leichtgewichtige Kandidaten zurück, anschließend ruft `POST /v3/kyb/select/` das vollständige Profil eines Kandidaten ab.\n\n**Abrechnung der Suche.** Erfolgreiche Suchen über eine kostenpflichtige Unternehmensdatenquelle kosten USD 0.50 pro Anfrage, unabhängig von der Anzahl der gefundenen Kandidaten. Leere Ergebnisse, Fehler und Ergebnisse, die ausschließlich aus anderen Quellen stammen, werden nicht berechnet. Der fällige Betrag wird vor der Suche reserviert; unzureichendes Guthaben führt zu einem 403-Fehler mit dem Code `insufficient_credits`. Sofern vereinbart, gelten Vertragstarife; ein nicht konfigurierter Vertragstarif für Suchen gibt 403 zurück. Suchen in der Sandbox sind kostenlos. Das Wiederholen einer erfolgreichen Suche kann erneute Kosten verursachen; die Zustellung von Callbacks erzeugt keine zusätzlichen Kosten. Der Abruf von Profilen wird separat abgerechnet. Diese Suchgebühr gilt auch für v2. Kandidaten werden immer mit `fetch_status: \"pending\"` zurückgegeben: Die vollständigen Unternehmensdaten werden erst bei der Auswahl abgerufen (und abgerechnet).\n\n**`kyb_response_id` ist flüchtig.** Es handelt sich um ein suchspezifisches Handle und nicht um eine dauerhafte Unternehmens-ID. Wählen Sie den Kandidaten zeitnah nach der Suche aus und führen Sie bei Bedarf eine erneute Suche durch, um ein neues Handle zu erhalten, anstatt es zu speichern.\n\n**`tier` bestimmt die Anbieterkette.** `tier` gibt die Registerstufe an, auf der die Suche ausgeführt wird: `basic` (Standard, die Lite-Kette), `shareholders` oder `ubo`. Die Suche verwendet die Anbieterkette, die diese Stufe bedient. Dies ist nicht immer dieselbe Kette, die von der Lite-Suche abgefragt wird; ein leeres Ergebnis bei einer Lite-Suche ist daher kein Beweis dafür, dass das Unternehmen nicht im Register vorhanden ist — suchen Sie erneut auf der Stufe, die Sie benötigen. Für ein Land, das die angegebene Stufe nicht anbietet, wird die Suche auf der höchsten verfügbaren Stufe bis zu diesem Wert ausgeführt. Rufen Sie den Kandidaten über den Endpoint ab, der die entsprechende Stufe bereitstellt: `POST /v3/kyb/select/` (Lite), `POST /v3/kyb/shareholders/` oder `POST /v3/kyb/ubo/`.\n\n**Authentifizierung.** `POST /v3/kyb/search/` (und `/v2/`) erfordert den API-Schlüssel Ihrer Anwendung im Header `x-api-key`. Der gehostete Endpoint `POST /v1/kyb/search/` ist die sitzungsauthentifizierte Route, die von einem gehosteten Verifizierungsablauf aufgerufen wird: Er antwortet bei Verwendung eines API-Schlüssels mit `403` und akzeptiert keinen `tier`-Parameter — die KYB-Registerkonfiguration des Workflows wählt die entsprechende Kette aus.\n\n**Zwei Modi.**\n- *Synchron (Standard):* Die API fragt das Register ab, bis die Suche abgeschlossen ist, und gibt die endgültige Kandidatenliste zurück (`search_resolved: true`).\n- *Asynchron:* Übergeben Sie `webhook_url`, und die API antwortet sofort — üblicherweise mit `search_status: \"pending\"` und einer leeren Kandidatenliste — und sendet anschließend per POST einen Callback vom Typ `kyb.registry_search.resolved` an Ihre URL, sobald das Register die Verarbeitung abgeschlossen hat. Der Callback-Body lautet `{\"event_id\", \"event_type\": \"kyb.registry_search.resolved\", \"request_id\", \"vendor_data\", \"metadata\", \"search_status\", \"search_resolved\", \"kyb_registry\", \"timestamp\", \"created_at\"}` — beachten Sie, dass `timestamp` und `created_at` im Callback Epoch-Ganzzahlen sind, im Gegensatz zum ISO-Format von `created_at` dieses Endpoints — und wird **unsigniert** gesendet (Header `X-Didit-Unsigned-Callback: true`, kein `X-Signature`).\n\n**Ländercodes.** ISO 3166-1 alpha-2 (`GB`, `DE`), sowie `XX-YY`-Unterteilungscodes für regionale Register — z. B. `US-CA` für Kalifornien.\n\n**Sandbox.** Schlüssel von Sandbox-Anwendungen geben einen einzelnen statischen Kandidaten zurück, ohne ein Register zu kontaktieren.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "country_code"
                ],
                "properties": {
                  "country_code": {
                    "type": "string",
                    "maxLength": 10,
                    "description": "ISO 3166-1 Alpha-2-Code des Landes, dessen Unternehmensregister durchsucht werden soll. Zum Beispiel `GB`. Wenn Unternehmensregister auf Bundesstaat- oder Provinzebene geführt werden, hängen Sie den ISO 3166-2-Unterteilungscode als `XX-YY` an: `US-CA` durchsucht das kalifornische Register. Suchanfragen in den Vereinigten Staaten erfordern immer die Unterteilung — ein einfaches `US` wird abgelehnt. Groß-/Kleinschreibung wird nicht beachtet; wird in Großbuchstaben normalisiert.",
                    "example": "GB"
                  },
                  "name": {
                    "type": "string",
                    "maxLength": 255,
                    "description": "Zu suchender Unternehmensname. Entweder `name` oder `registration_number` ist erforderlich.",
                    "example": "Tesco"
                  },
                  "registration_number": {
                    "type": "string",
                    "maxLength": 100,
                    "description": "Zu suchende Registernummer. Entweder `name` oder `registration_number` ist erforderlich."
                  },
                  "tier": {
                    "type": "string",
                    "enum": [
                      "basic",
                      "shareholders",
                      "ubo"
                    ],
                    "default": "basic",
                    "description": "Register-Stufe, auf deren Provider-Kette diese Suche ausgeführt wird. `basic` (Standard) durchsucht die Lite-Kette des Landes; `shareholders` und `ubo` durchsuchen die Eigentümerstruktur-Kette dieser Stufe, bei der es sich um eine andere Quelle handeln kann, sodass eine leere Lite-Suche nicht beweist, dass das Unternehmen im Register fehlt. Ein Land, das die genannte Stufe nicht anbietet, wird auf der höchsten Stufe durchsucht, die es bis zu dieser anbietet. Rufen Sie den Treffer über den Endpoint ab, der die von Ihnen gesuchte Stufe bereitstellt: `POST /v3/kyb/select/` (Lite), `POST /v3/kyb/shareholders/` oder `POST /v3/kyb/ubo/`.",
                    "example": "basic"
                  },
                  "search_type": {
                    "type": "string",
                    "enum": [
                      "contains"
                    ],
                    "default": "contains",
                    "description": "Strategie für den Namensabgleich, die bei der Registersuche angewendet wird. `contains` ist der einzige zulässige Wert: Keine Registerquelle hinter der Suche bietet einen Präfix- oder Fuzzy-Modus, daher werden `start_with` und `fuzzy` mit `400` (`not a valid choice`) abgelehnt."
                  },
                  "vendor_data": {
                    "type": "string",
                    "description": "Ihre Kennung für diese Abfrage; wird zurückgegeben und im Webhook-Callback enthalten sein."
                  },
                  "metadata": {
                    "type": "object",
                    "nullable": true,
                    "description": "Freiform-JSON; wird zurückgegeben und im Webhook-Callback enthalten."
                  },
                  "webhook_url": {
                    "type": "string",
                    "format": "uri",
                    "maxLength": 500,
                    "description": "Schaltet die Suche in den asynchronen Modus um: Die API antwortet sofort und sendet einen nicht signierten `kyb.registry_search.resolved`-Callback per POST an diese URL, sobald die Kandidatenliste bereitsteht."
                  }
                }
              },
              "example": {
                "country_code": "GB",
                "name": "Tesco",
                "search_type": "contains",
                "vendor_data": "company-1234"
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X POST https://verification.didit.me/v3/kyb/search/ \\\n  -H 'x-api-key: YOUR_API_KEY' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\n    \"country_code\": \"GB\",\n    \"name\": \"Tesco\",\n    \"search_type\": \"contains\",\n    \"vendor_data\": \"company-1234\"\n  }'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.kyb.search(\n    country_code=\"GB\",\n    name=\"Tesco\",\n    search_type=\"contains\",\n    vendor_data=\"company-1234\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.kyb.search({\n  country_code: \"GB\",\n  name: \"Tesco\",\n  search_type: \"contains\",\n  vendor_data: \"company-1234\",\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.KYB.Search(ctx, didit.KYBSearchParams{\n\tCountryCode: \"GB\",\n\tName:        didit.String(\"Tesco\"),\n\tSearchType:  didit.Some(didit.KYBSearchParamsSearchType(\"contains\")),\n\tVendorData:  didit.String(\"company-1234\"),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\nimport me.didit.types.KybSearchParams;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.kyb().search(KybSearchParams.builder()\n        .countryCode(\"GB\")\n        .name(\"Tesco\")\n        .searchType(KybSearchParams.SearchType.of(\"contains\"))\n        .vendorData(\"company-1234\")\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->kyb->search([\n    'country_code' => 'GB',\n    'name' => 'Tesco',\n    'search_type' => 'contains',\n    'vendor_data' => 'company-1234',\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.kyb.search(\n  country_code: \"GB\",\n  name: \"Tesco\",\n  search_type: \"contains\",\n  vendor_data: \"company-1234\"\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Kyb.SearchAsync(new KybSearchParams\n{\n    CountryCode = \"GB\",\n    Name = \"Tesco\",\n    SearchType = new KybSearchParamsSearchType(\"contains\"),\n    VendorData = \"company-1234\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "responses": {
          "200": {
            "description": "Suche angenommen. Der synchrone Modus gibt die ermittelte Kandidatenliste zurück; der Webhook-Modus antwortet sofort (häufig `search_status: \"pending\"`) und stellt die endgültige Liste über den Callback `kyb.registry_search.resolved` zu.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "request_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "Mit `webhook_url`: Die persistierte Suchanfrage-ID, die im `kyb.registry_search.resolved`-Callback als `request_id` zurückgegeben wird. Ohne `webhook_url`: Eine vorübergehende Korrelations-UUID (die Suche wird nicht gespeichert)."
                    },
                    "kyb_registry": {
                      "$ref": "#/components/schemas/KYBRegistrySearchResults"
                    },
                    "vendor_data": {
                      "type": "string",
                      "nullable": true,
                      "description": "Wiedergabe der von Ihnen gesendeten `vendor_data`."
                    },
                    "metadata": {
                      "type": "object",
                      "nullable": true,
                      "description": "Rückgabe der von Ihnen gesendeten `metadata`."
                    },
                    "created_at": {
                      "type": "string",
                      "format": "date-time"
                    }
                  }
                },
                "examples": {
                  "Resolved search": {
                    "summary": "Synchroner Modus — endgültige Kandidatenliste",
                    "value": {
                      "request_id": "0c7e9a40-3a13-4f7e-8a44-9d2e2f1c5b6a",
                      "kyb_registry": {
                        "companies": [
                          {
                            "kyb_response_id": "69aeeb95febb0f1704042259",
                            "name": "Tesco PLC",
                            "registration_number": "00445790",
                            "status": "active",
                            "type": "Public Limited Company",
                            "risk_level": null,
                            "fetch_status": "pending"
                          },
                          {
                            "kyb_response_id": "69aeeb95febb0f170404225a",
                            "name": "E-TESCO LTD",
                            "registration_number": "15168476",
                            "status": "active",
                            "type": "Private Limited Company",
                            "risk_level": null,
                            "fetch_status": "pending"
                          }
                        ],
                        "pagination": {
                          "total": 2,
                          "page": 1,
                          "per_page": 25
                        },
                        "search_status": "resolved",
                        "search_resolved": true
                      },
                      "vendor_data": "company-1234",
                      "metadata": null,
                      "created_at": "2026-06-11T10:40:00.000000+00:00"
                    }
                  },
                  "Pending search (webhook mode)": {
                    "summary": "`webhook_url` angegeben – Kandidaten treffen über den Callback kyb.registry_search.resolved ein",
                    "value": {
                      "request_id": "5f2d8c1b-7e4a-4b9c-9f0d-3a6e8c2b1d4f",
                      "kyb_registry": {
                        "companies": [],
                        "pagination": {
                          "total": 0,
                          "page": 1,
                          "per_page": 25
                        },
                        "search_status": "pending",
                        "search_resolved": false
                      },
                      "vendor_data": "company-1234",
                      "metadata": {
                        "source": "onboarding"
                      },
                      "created_at": "2026-06-11T10:41:00.000000+00:00"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Validierungsfehler. Probleme auf Feldebene verwenden die Standard-Envelope von DRF; die Regel für Name/Registernummer meldet unter `non_field_errors`. Ein Land, das die Register nicht abdecken, antwortet mit `400` und `code: kyb_registry_country_unsupported`.",
            "content": {
              "application/json": {
                "examples": {
                  "Missing search criteria": {
                    "summary": "Weder `name` noch `registration_number` angegeben",
                    "value": {
                      "non_field_errors": [
                        "Either 'name' or 'registration_number' is required."
                      ]
                    }
                  },
                  "Invalid country_code": {
                    "summary": "Muss `XX` (Alpha-2) oder eine Unterteilung im Format `XX-YY` sein",
                    "value": {
                      "country_code": [
                        "country_code must be a 2-letter ISO code."
                      ]
                    }
                  },
                  "Invalid search_type": {
                    "summary": "Nur `contains` wird akzeptiert",
                    "value": {
                      "search_type": [
                        "\"start_with\" is not a valid choice."
                      ]
                    }
                  },
                  "Invalid webhook_url": {
                    "summary": "`webhook_url` muss eine gültige URL sein",
                    "value": {
                      "webhook_url": [
                        "Enter a valid URL."
                      ]
                    }
                  },
                  "Country not covered": {
                    "summary": "Kein Unternehmensregister deckt das Land ab",
                    "value": {
                      "detail": "Company registry search is not available for this country. Enter the company details manually to continue.",
                      "code": "kyb_registry_country_unsupported"
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Zugriff verweigert. Wird zurückgegeben, wenn der Header `x-api-key` fehlt; ein falscher, widerrufener oder abgelaufener Schlüssel gibt `401` zurück. Ein fehlender Schlüssel gibt `403` mit `{\"detail\": ...}` zurück; ein falscher, widerrufener oder abgelaufener Schlüssel gibt `401` zurück. Wird auch vor der Suche zurückgegeben, wenn die anfallende Suchgebühr nicht gedeckt werden kann (`code: \"insufficient_credits\"`) oder wenn ein vertraglicher Suchtarif fehlt.",
            "content": {
              "application/json": {
                "examples": {
                  "Missing or invalid API key": {
                    "summary": "Kein `x-api-key`-Header, oder der Schlüssel ist ungültig/widerrufen",
                    "value": {
                      "detail": "You do not have permission to perform this action."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate-Limit überschritten oder das Suchkontingent ist aufgebraucht. POST/PATCH/DELETE-Endpoints teilen sich ein Budget von 300 Schreibanfragen pro Minute pro API-Schlüssel (Transaktionserstellungen und Ereignis-Ingestion haben ein separates Budget von 600), mit `X-RateLimit-*`- und `Retry-After`-Headern. Davon abgesehen sind kostenpflichtige Registersuchen auf 600 pro Anwendung pro Stunde begrenzt: Darüber hinaus lautet die Antwort `429` mit `code: kyb_registry_search_limit_reached`, und Suchen, die ausschließlich über kostenlose Quellen bedient werden, funktionieren weiterhin. Warten Sie und suchen Sie später erneut.",
            "content": {
              "application/json": {
                "examples": {
                  "Write rate limit exceeded": {
                    "summary": "Mehr als 300 Schreibanfragen in der aktuellen Minute",
                    "value": {
                      "detail": "Write request rate limit exceeded. You can make up to 300 requests per minute."
                    }
                  },
                  "Search allowance spent": {
                    "summary": "Mehr als 600 kostenpflichtige Suchen in der letzten Stunde",
                    "value": {
                      "detail": "The maximum number of company registry searches for this session has been reached. Enter the company details manually to continue.",
                      "code": "kyb_registry_search_limit_reached"
                    }
                  }
                },
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string"
                    },
                    "code": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          },
          "502": {
            "description": "Der KYB-Registeranbieter ist vorübergehend nicht verfügbar – eine 5xx-Antwort, ein Timeout oder ein Verbindungsfehler des vorgelagerten Registers. Die Suche wird nicht abgerechnet. Versuchen Sie es später erneut, oder im gehosteten Verifizierungsablauf von Didit wird dem Benutzer automatisch eine manuelle Unternehmenseingabe anstelle eines Fehlers angeboten, der nur wiederholt werden kann.",
            "content": {
              "application/json": {
                "examples": {
                  "Registry provider outage": {
                    "summary": "Der Register-Provider hat die Suche nicht beantwortet",
                    "value": {
                      "detail": "The KYB registry provider is temporarily unavailable. Please try again shortly.",
                      "code": "kyb_registry_provider_unavailable"
                    }
                  }
                },
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string"
                    },
                    "code": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/v3/kyb/select/": {
      "post": {
        "summary": "KYB-Unternehmensauswahl im Register – Lite-Stufe (eigenständig)",
        "operationId": "post_v3_kyb_select",
        "x-didit-sdk": {
          "resource": "kyb",
          "method": "select",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Standalone APIs"
        ],
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "parameters": [],
        "description": "Rufen Sie das **Lite**-Registerprofil eines durch `POST /v3/kyb/search/` zurückgegebenen Kandidaten ab – Unternehmensdetails, registrierte Adresse, Kennungen, Status, Geschäftsaktivität und die Amtsträger sowie die Rohdaten-Payload des Unternehmensregisters. Gesellschafter und wirtschaftlich Berechtigte können über `POST /v3/kyb/shareholders/` und `POST /v3/kyb/ubo/` erworben werden.\n\n**Zuordnung zur Suche.** Übergeben Sie die `kyb_response_id` des Kandidaten genau so, wie sie von einer Suche derselben Anwendung zurückgegeben wurde. Das Handle ist kurzlebig und an diese Suche gebunden – wählen Sie es zeitnah aus und führen Sie lieber eine erneute Suche nach einem neuen Handle durch, anstatt es zu speichern.\n\n**Abrechnung.** Jede Auswahl wird zum Lite-Preis des jeweiligen Landes abgerechnet (eine etwaige Suchgebühr ist separat); siehe [KYB-Register-Preise](/de/getting-started/kyb-registry-pricing). Das Guthaben wird vor jedem Registeraufruf geprüft (`403` bei unzureichendem Guthaben) und die Gebühr wird für die erstellte Unternehmenssitzung erfasst.\n\n**Persistenz ist obligatorisch.** Jede Auswahl erstellt eine Unternehmenssitzung (deren ID die `request_id` ist), damit Abrechnung und Abruf nachverfolgt werden können; sie erscheint in der Console. `save_api_request` wird aus Symmetriegründen akzeptiert, muss jedoch `true` sein (Standardwert) – das Senden von `false` gibt `400` zurück.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/KYBRegistryCandidateRequest"
              },
              "example": {
                "kyb_response_id": "69aeeb95febb0f1704042259",
                "vendor_data": "company-1234"
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X POST https://verification.didit.me/v3/kyb/select/ \\\n  -H 'x-api-key: YOUR_API_KEY' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\n    \"kyb_response_id\": \"69aeeb95febb0f1704042259\",\n    \"vendor_data\": \"company-1234\"\n  }'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.kyb.select(\n    kyb_response_id=\"69aeeb95febb0f1704042259\",\n    vendor_data=\"company-1234\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.kyb.select({\n  kyb_response_id: \"69aeeb95febb0f1704042259\",\n  vendor_data: \"company-1234\",\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.KYB.Select(ctx, didit.KYBRegistryCandidateRequest{\n\tKYBResponseID: \"69aeeb95febb0f1704042259\",\n\tVendorData:    didit.String(\"company-1234\"),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\nimport me.didit.types.KYBRegistryCandidateRequest;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.kyb().select(KYBRegistryCandidateRequest.builder()\n        .kybResponseId(\"69aeeb95febb0f1704042259\")\n        .vendorData(\"company-1234\")\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->kyb->select([\n    'kyb_response_id' => '69aeeb95febb0f1704042259',\n    'vendor_data' => 'company-1234',\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.kyb.select(\n  kyb_response_id: \"69aeeb95febb0f1704042259\",\n  vendor_data: \"company-1234\"\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Kyb.SelectAsync(new KYBRegistryCandidateRequest\n{\n    KybResponseId = \"69aeeb95febb0f1704042259\",\n    VendorData = \"company-1234\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "responses": {
          "200": {
            "description": "Unternehmen abgerufen und abgerechnet. `kyb_registry` enthält das vollständige Profil; prüfen Sie `data_resolved` – wenn `false`, verarbeitete das Unternehmensregister die Anfrage noch und der gespeicherte Datensatz wird automatisch vervollständigt, sobald er aufgelöst ist.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "request_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "ID der Unternehmenssitzung, die für diesen Abruf erstellt wurde. Der gespeicherte Datensatz (in der Konsole sichtbar) wird weiter aktualisiert, falls das Register die Abfrage erst nach der Antwort auflöst."
                    },
                    "registry_tier_requested": {
                      "type": "string",
                      "enum": [
                        "basic",
                        "shareholders",
                        "ubo"
                      ],
                      "description": "Die Stufe, die dieser Endpoint bereitstellt: `basic` (Lite) für ausgewählte, `shareholders`, `ubo`."
                    },
                    "registry_tier_delivered": {
                      "type": "string",
                      "enum": [
                        "basic",
                        "shareholders",
                        "ubo"
                      ],
                      "description": "Die tatsächlich gelieferte und abgerechnete Stufe. Niedriger als angefordert, wenn die Register des Landes keine Eigentümerdaten enthalten oder das Register keinen Eigentümereintrag für dieses Unternehmen führt."
                    },
                    "kyb_registry": {
                      "type": "object",
                      "description": "Vollständiges Unternehmensprofil aus dem Register.",
                      "properties": {
                        "uuid": {
                          "type": "string",
                          "format": "uuid",
                          "description": "Didits ID für diesen Unternehmensdatensatz."
                        },
                        "node_id": {
                          "type": "string",
                          "example": "feature_kyb_registry"
                        },
                        "status": {
                          "type": "string",
                          "enum": [
                            "Not Finished",
                            "Approved",
                            "Declined",
                            "In Review"
                          ],
                          "description": "Didits Bewertung der Registerprüfung (z. B. `In Review`, wenn das Unternehmen im Register nicht aktiv ist oder die Daten zur Eigentümerstruktur nicht abgeleitet werden konnten)."
                        },
                        "registry_status": {
                          "type": "string",
                          "nullable": true,
                          "enum": [
                            "active",
                            "dissolved",
                            "deregistered",
                            "see full details",
                            "authorised",
                            "appointed representative",
                            "unauthorised",
                            "inactive",
                            "no longer authorised",
                            "closed",
                            "struck off"
                          ],
                          "description": "Normalisierter Unternehmensstatus gemäß den Angaben des Registers."
                        },
                        "data_resolved": {
                          "type": "boolean",
                          "description": "`true`, sobald das Register das vollständige Profil zurückgegeben hat. `false`, wenn das Register nach dem Polling noch in Bearbeitung war – der gespeicherte Datensatz wird automatisch vervollständigt, sobald das Register den Vorgang abgeschlossen hat."
                        },
                        "company_name": {
                          "type": "string",
                          "example": "Tesco PLC"
                        },
                        "registration_number": {
                          "type": "string",
                          "nullable": true,
                          "example": "00445790"
                        },
                        "country_code": {
                          "type": "string",
                          "description": "ISO 3166-1-Alpha-2.",
                          "example": "GB"
                        },
                        "region": {
                          "type": "string",
                          "nullable": true,
                          "description": "Unterteilungscode, wenn das Register regional ist (z. B. `CA` für `US-CA`); andernfalls leer."
                        },
                        "company_type": {
                          "type": "string",
                          "nullable": true,
                          "example": "Public Limited Company"
                        },
                        "incorporation_date": {
                          "type": "string",
                          "format": "date",
                          "nullable": true,
                          "example": "1947-11-27"
                        },
                        "registered_address": {
                          "type": "string",
                          "nullable": true,
                          "example": "Tesco House, Shire Park, Kestrel Way, Welwyn Garden City, United Kingdom, AL7 1GA"
                        },
                        "tax_number": {
                          "type": "string",
                          "nullable": true,
                          "example": "GB412 8925 93"
                        },
                        "risk_level": {
                          "type": "string",
                          "nullable": true,
                          "description": "Vom Register gemeldete Risikostufe, sofern verfügbar."
                        },
                        "verification_status": {
                          "type": "string",
                          "enum": [
                            "verified",
                            "failed",
                            "unknown"
                          ],
                          "nullable": true,
                          "description": "Status der jurisdiktionsübergreifenden Verifizierung: `verified`, wenn der Registerstatus den Fortbestand bestätigt (`active`), `failed`, wenn das Unternehmen laut Register nicht mehr besteht (z. B. `dissolved`), andernfalls `unknown`. `null` bei einem Unternehmen, das nicht aus einem Register stammt, sowie solange eine Auswahl noch `pending` ist."
                        },
                        "is_from_registry": {
                          "type": "boolean",
                          "description": "Für diesen Endpoint immer `true` – das Profil wurde aus einem offiziellen Register abgerufen."
                        },
                        "fetch_status": {
                          "type": "string",
                          "enum": [
                            "pending",
                            "resolved"
                          ],
                          "description": "Lebenszyklus des Registerabrufs. Gespiegelt durch `data_resolved`."
                        },
                        "alternative_names": {
                          "type": "string",
                          "nullable": true,
                          "description": "Alternative Namen, Handelsnamen, frühere Namen oder Unternehmensnamen in der Originalsprache als Text, sofern gemeldet."
                        },
                        "nature_of_business": {
                          "type": "string",
                          "nullable": true,
                          "description": "Tätigkeitsbeschreibung oder Klassifizierungscode, sofern gemeldet."
                        },
                        "registered_capital": {
                          "type": "string",
                          "nullable": true
                        },
                        "registered_capital_amount": {
                          "type": "string",
                          "nullable": true,
                          "description": "Dezimalbetrag als Zeichenkette, sofern gemeldet."
                        },
                        "registered_capital_currency": {
                          "type": "string",
                          "nullable": true,
                          "description": "ISO 4217-Code, sofern gemeldet."
                        },
                        "website": {
                          "type": "string",
                          "nullable": true,
                          "example": "https://www.tesco.com/"
                        },
                        "email": {
                          "type": "string",
                          "nullable": true,
                          "example": "customer.service@tesco.co.uk"
                        },
                        "phone": {
                          "type": "string",
                          "nullable": true,
                          "example": "03301231688"
                        },
                        "legal_entity_identifier": {
                          "type": "string",
                          "nullable": true,
                          "description": "LEI, sofern gemeldet."
                        },
                        "location_of_registration": {
                          "type": "string",
                          "nullable": true,
                          "description": "Register/Jurisdiktion, bei dem/der das Unternehmen eingetragen ist, sofern gemeldet."
                        },
                        "vat_number": {
                          "type": "string",
                          "nullable": true,
                          "description": "EU-USt-IdNr., wenn während des gehosteten Registerschritts erfasst oder nachträglich bearbeitet. Zum Zeitpunkt der Auswahl ist dies normalerweise noch nicht festgelegt – die Validierung von USt-IdNr. und Steuernummer wird ausgeführt, wenn der Endbenutzer den Registerschritt im gehosteten Ablauf übermittelt."
                        },
                        "vat_validation_status": {
                          "type": "string",
                          "enum": [
                            "valid",
                            "invalid",
                            "format_valid",
                            "invalid_format",
                            "could_not_validate",
                            "not_applicable"
                          ],
                          "description": "Ergebnis der Validierung der USt-IdNr. oder, falls keine vorhanden ist, der `tax_number` bei der Registerübermittlung. `valid` / `invalid`: entschieden durch das offizielle Register des Landes (EU-VIES, Norwegen, Schweiz, Brasilien, Kolumbien, Costa Rica, Ecuador, Paraguay; Polen auch über sein nationales USt-Register). `format_valid` / `invalid_format`: entschieden durch die Format- und Prüfzifferregeln des Landes, wenn kein Register abgefragt werden kann. `could_not_validate`: das Register war nicht verfügbar. `not_applicable`: keine Nummer, ein Land ohne Register oder Regeln oder eine Sandbox-Sitzung."
                        },
                        "vat_validated_number": {
                          "type": "string",
                          "nullable": true,
                          "description": "Die geprüfte Nummer, wie sie der Quelle bekannt ist (beispielsweise die aus einer französischen SIREN oder einer niederländischen RSIN abgeleitete Umsatzsteuer-Identifikationsnummer). `null`, wenn keine Prüfung durchgeführt wurde."
                        },
                        "vat_validation_source": {
                          "type": "string",
                          "nullable": true,
                          "enum": [
                            "eu_vies",
                            "pl_vat_white_list",
                            "no_brreg",
                            "ch_uid_register",
                            "br_receita_federal",
                            "co_rues",
                            "cr_hacienda",
                            "ec_sri",
                            "py_dnit",
                            "format_rules",
                            null
                          ],
                          "description": "Die Quelle, die `vat_validation_status` festgelegt hat: ein offizielles Register oder `format_rules`. `null`, wenn keine Prüfung durchgeführt wurde."
                        },
                        "vat_validated_name": {
                          "type": "string",
                          "nullable": true,
                          "description": "Name, der bei der Quelle registriert ist, die die Nummer validiert hat, sofern sie einen offenlegt. Wird nur gesetzt, wenn der Status `valid` ist."
                        },
                        "vat_validated_address": {
                          "type": "string",
                          "nullable": true,
                          "description": "Bei der Quelle registrierte Adresse, die die Nummer validiert hat, sofern diese eine offenlegt. Wird nur festgelegt, wenn der Status `valid` ist."
                        },
                        "vat_checked_at": {
                          "type": "string",
                          "format": "date-time",
                          "nullable": true,
                          "description": "Zeitstempel der Prüfung. `null`, wenn keine Prüfung durchgeführt wurde."
                        },
                        "financial_summary": {
                          "type": "object",
                          "nullable": true,
                          "description": "Vom Register gemeldete Anteils-/Kapitaldetails (Währung, Gesamtaktien, Anteilsklassen), sofern verfügbar."
                        },
                        "officers": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "uuid": {
                                "type": "string",
                                "format": "uuid"
                              },
                              "name": {
                                "type": "string",
                                "example": "MELISSA BETHELL"
                              },
                              "designation": {
                                "type": "string",
                                "nullable": true,
                                "description": "Unverarbeitete Registerbezeichnung (z. B. `Director`, `Secretary`)."
                              },
                              "role": {
                                "type": "string",
                                "description": "Normalisierte Rolle, abgeleitet aus der Bezeichnung. Vollständiges Modellset mit 17 Werten; das Register-Parsing an diesem Endpoint gibt typischerweise director, non_executive_director, secretary, chairman oder company_officer aus.",
                                "enum": [
                                  "director",
                                  "non_executive_director",
                                  "secretary",
                                  "chairman",
                                  "ubo",
                                  "shareholder",
                                  "representative",
                                  "founder",
                                  "legal_advisor",
                                  "authorized_signatory",
                                  "trustee",
                                  "beneficiary",
                                  "company_officer",
                                  "settlor",
                                  "protector",
                                  "investor",
                                  "other"
                                ]
                              },
                              "nationality": {
                                "type": "string",
                                "nullable": true
                              },
                              "is_active": {
                                "type": "boolean",
                                "description": "`false`, wenn das Register vermerkt, dass die Bestellung niedergelegt wurde."
                              },
                              "kyc_status": {
                                "type": "string",
                                "nullable": true,
                                "enum": [
                                  "Approved",
                                  "Declined",
                                  "Pending"
                                ],
                                "description": "Status einer zugehörigen KYC-Sitzung, sofern für diesen Officer eine gestartet wurde. Andernfalls `null`."
                              },
                              "kyc_session_url": {
                                "type": "string",
                                "nullable": true,
                                "description": "Verifizierungs-URL der zugehörigen KYC-Sitzung, sofern vorhanden."
                              },
                              "first_name": {
                                "type": "string",
                                "nullable": true,
                                "description": "Vorname, wenn vom Register ausdrücklich gemeldet; nicht aus dem vollständigen Namen abgeleitet."
                              },
                              "last_name": {
                                "type": "string",
                                "nullable": true,
                                "description": "Nachname, sofern vom Register explizit gemeldet."
                              },
                              "address": {
                                "type": "string",
                                "nullable": true,
                                "description": "Vom Register gemeldete Adresse des Amtsträgers."
                              },
                              "appointment_date": {
                                "type": "string",
                                "nullable": true,
                                "description": "Datum, an dem die Führungskraft bestellt wurde.",
                                "format": "date"
                              },
                              "termination_date": {
                                "type": "string",
                                "nullable": true,
                                "description": "Datum, an dem die Bestellung endete, sofern gemeldet.",
                                "format": "date"
                              },
                              "date_of_birth": {
                                "type": "string",
                                "nullable": true,
                                "description": "Vollständiges, vom Unternehmensregister gemeldetes Geburtsdatum. Null, wenn nur ein Geburtsjahr oder -monat bekannt ist.",
                                "format": "date"
                              },
                              "date_of_birth_year": {
                                "type": "integer",
                                "nullable": true,
                                "minimum": 1,
                                "maximum": 9999,
                                "description": "Vom Register gemeldetes Geburtsjahr, auch wenn das vollständige Datum nicht verfügbar ist."
                              },
                              "date_of_birth_month": {
                                "type": "integer",
                                "nullable": true,
                                "minimum": 1,
                                "maximum": 12,
                                "description": "Vom Register gemeldeter Geburtsmonat. Null, wenn nur das Jahr bekannt ist."
                              }
                            }
                          },
                          "description": "Geschäftsführer, Sekretäre und andere Funktionsträger, die aus dem Register extrahiert wurden."
                        },
                        "beneficial_owners": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "uuid": {
                                "type": "string",
                                "format": "uuid"
                              },
                              "name": {
                                "type": "string"
                              },
                              "first_name": {
                                "type": "string",
                                "nullable": true
                              },
                              "last_name": {
                                "type": "string",
                                "nullable": true
                              },
                              "entity_type": {
                                "type": "string",
                                "enum": [
                                  "person",
                                  "company"
                                ],
                                "description": "Gibt an, ob der Eigentümer eine natürliche Person oder eine juristische Person ist."
                              },
                              "roles": {
                                "type": "array",
                                "items": {
                                  "type": "string"
                                },
                                "description": "Normalisierte Rollen (z. B. `ubo`, `shareholder`)."
                              },
                              "ownership_min_shares": {
                                "type": "string",
                                "nullable": true,
                                "description": "Untergrenze der vom Register gemeldeten Eigentumsspanne (z. B. `25%`)."
                              },
                              "ownership_max_shares": {
                                "type": "string",
                                "nullable": true,
                                "description": "Obergrenze des vom Register gemeldeten Eigentumsbereichs."
                              },
                              "is_active": {
                                "type": "boolean"
                              },
                              "kyc_status": {
                                "type": "string",
                                "nullable": true,
                                "enum": [
                                  "Approved",
                                  "Declined",
                                  "Pending"
                                ]
                              },
                              "kyc_session_url": {
                                "type": "string",
                                "nullable": true
                              },
                              "effective_ownership_percent": {
                                "type": "number",
                                "nullable": true,
                                "description": "Geparster Eigentumsanteil (Obergrenze, mit Fallback auf Untergrenze)."
                              },
                              "company_name": {
                                "type": "string",
                                "nullable": true
                              },
                              "registration_number": {
                                "type": "string",
                                "nullable": true
                              },
                              "country_of_birth": {
                                "type": "string",
                                "nullable": true
                              },
                              "email": {
                                "type": "string",
                                "nullable": true
                              },
                              "nationality": {
                                "type": "string",
                                "nullable": true
                              },
                              "designation": {
                                "type": "string",
                                "nullable": true
                              },
                              "voting_min_shares": {
                                "type": "string",
                                "nullable": true
                              },
                              "voting_max_shares": {
                                "type": "string",
                                "nullable": true
                              },
                              "date_of_birth": {
                                "type": "string",
                                "nullable": true,
                                "description": "Vollständiges Geburtsdatum, sofern gemeldet.",
                                "format": "date"
                              },
                              "appointment_date": {
                                "type": "string",
                                "nullable": true,
                                "description": "Datum der Bestellung, sofern gemeldet.",
                                "format": "date"
                              },
                              "shareholding": {
                                "$ref": "#/components/schemas/KYBRegistryShareholding"
                              }
                            }
                          },
                          "description": "Aus dem Register extrahierte wirtschaftlich Berechtigte / Personen mit maßgeblichem Einfluss. Kann leer sein, wenn das Register die Eigentümerstruktur nicht offenlegt."
                        },
                        "addresses": {
                          "type": "array",
                          "nullable": true,
                          "description": "Jede vom Register angegebene Adresse in einheitlicher Form. Null, wenn keine angegeben ist.",
                          "items": {
                            "$ref": "#/components/schemas/KYBRegistryAddress"
                          }
                        },
                        "industries": {
                          "type": "array",
                          "nullable": true,
                          "description": "Die Tätigkeiten, unter denen das Register das Unternehmen einstuft, in einem kanonischen Format. Null, wenn keine angegeben sind.",
                          "items": {
                            "$ref": "#/components/schemas/KYBRegistryIndustry"
                          }
                        },
                        "accounts": {
                          "type": "object",
                          "nullable": true,
                          "additionalProperties": true,
                          "description": "Register-Einreichungsdaten, sofern verfügbar. Jahresmeldungen und Hauptversammlungen verwenden last_annual_return_date und last_agm_date; sie unterscheiden sich von Finanzabschlüssen."
                        },
                        "registry_data": {
                          "$ref": "#/components/schemas/KYBRegistryData"
                        },
                        "user_provided_data": {
                          "type": "object",
                          "nullable": true,
                          "description": "Auf diesem Endpoint immer `null` (wird vom gehosteten KYB-Workflow verwendet, wenn Endbenutzer Registerdaten bearbeiten)."
                        },
                        "confirmed_by_user_at": {
                          "type": "string",
                          "format": "date-time",
                          "nullable": true,
                          "description": "Auf diesem Endpoint immer `null`."
                        },
                        "last_console_edit_at": {
                          "type": "string",
                          "format": "date-time",
                          "nullable": true,
                          "description": "Wird gesetzt, wenn ein Prüfer in der Konsole den Datensatz später bearbeitet."
                        },
                        "is_editable": {
                          "type": "boolean",
                          "description": "Gibt an, ob die aus Registern stammenden Daten im gehosteten Ablauf bzw. der Konsole noch bearbeitet werden können."
                        },
                        "registry_tier_delivered": {
                          "type": "string",
                          "enum": [
                            "basic",
                            "shareholders",
                            "ubo"
                          ],
                          "description": "Identisch mit dem `registry_tier_delivered` auf oberster Ebene."
                        },
                        "registry_ownership_status": {
                          "type": "string",
                          "nullable": true,
                          "enum": [
                            "not_requested",
                            "delivered",
                            "not_held",
                            "unavailable"
                          ],
                          "description": "`delivered`, wenn die Daten zur Eigentümerstruktur zurückgegeben wurden; `not_held`, wenn das Unternehmensregister geantwortet hat und dieses Unternehmen nicht führt (siehe `registry_data.ownership_error`); `unavailable`, wenn eine Eigentümerstruktur-Stufe angefordert wurde, das Register jedoch keine Daten für dieses Unternehmen hatte oder nicht abgefragt werden konnte (siehe `registry_data.ownership_error`); `not_requested` in der Stufe Lite."
                        },
                        "ownership": {
                          "$ref": "#/components/schemas/KYBRegistryOwnership"
                        },
                        "registry_tier": {
                          "type": "string",
                          "nullable": true,
                          "description": "Die vom Workflow angeforderte Register-Stufe: `basic`, `shareholders` oder `ubo`. Auch in `ownership.tier_requested`."
                        },
                        "registry_monitoring": {
                          "type": "object",
                          "nullable": true,
                          "description": "Der neueste Register-Monitor für das Unternehmen oder `null`, wenn keiner vorhanden ist.",
                          "properties": {
                            "uuid": {
                              "type": "string",
                              "format": "uuid"
                            },
                            "status": {
                              "type": "string"
                            },
                            "unavailable_reason": {
                              "type": "string",
                              "nullable": true
                            },
                            "enrolled_at": {
                              "type": "string",
                              "format": "date-time",
                              "nullable": true
                            },
                            "cancelled_at": {
                              "type": "string",
                              "format": "date-time",
                              "nullable": true
                            },
                            "last_bill_date": {
                              "type": "string",
                              "format": "date",
                              "nullable": true
                            },
                            "next_bill_date": {
                              "type": "string",
                              "format": "date",
                              "nullable": true
                            },
                            "last_event_at": {
                              "type": "string",
                              "format": "date-time",
                              "nullable": true
                            },
                            "events_count": {
                              "type": "integer"
                            },
                            "watched_fields": {
                              "description": "Die Unternehmensfelder, die der Monitor überwacht."
                            }
                          }
                        }
                      }
                    },
                    "vendor_data": {
                      "type": "string",
                      "nullable": true,
                      "description": "Wiedergabe der von Ihnen gesendeten `vendor_data`."
                    },
                    "metadata": {
                      "type": "object",
                      "nullable": true,
                      "description": "Rückgabe der von Ihnen gesendeten `metadata`."
                    },
                    "created_at": {
                      "type": "string",
                      "format": "date-time"
                    }
                  }
                },
                "examples": {
                  "Resolved company": {
                    "summary": "Vollständiges Registerprofil (Liste der Funktionsträger aus Platzgründen gekürzt)",
                    "value": {
                      "request_id": "9d4f2c7a-1b3e-4a5c-8d6f-0e9a8b7c6d5e",
                      "kyb_registry": {
                        "uuid": "f1e2d3c4-b5a6-4789-9c0d-1e2f3a4b5c6d",
                        "node_id": "feature_kyb_registry",
                        "status": "In Review",
                        "registry_status": "active",
                        "data_resolved": true,
                        "company_name": "Tesco PLC",
                        "registration_number": "00445790",
                        "country_code": "GB",
                        "region": "",
                        "company_type": "Public Limited Company",
                        "incorporation_date": "1947-11-27",
                        "registered_address": "Tesco House, Shire Park, Kestrel Way, Welwyn Garden City, United Kingdom, AL7 1GA",
                        "tax_number": "GB412 8925 93",
                        "risk_level": "low risk",
                        "verification_status": "verified",
                        "is_from_registry": true,
                        "fetch_status": "resolved",
                        "alternative_names": "TESCO STORES (HOLDINGS) PUBLIC LIMITED COMPANY",
                        "nature_of_business": null,
                        "registered_capital": null,
                        "registered_capital_amount": null,
                        "registered_capital_currency": null,
                        "website": "https://www.tesco.com/",
                        "email": "customer.service@tesco.co.uk",
                        "phone": "03301231688",
                        "legal_entity_identifier": null,
                        "location_of_registration": null,
                        "financial_summary": {
                          "currency": "Pound (£)",
                          "total_number_of_shares": "8174378721",
                          "meta_detail": {
                            "Class_Of_Share": "Ordinary"
                          }
                        },
                        "officers": [
                          {
                            "uuid": "a1b2c3d4-e5f6-4789-9a0b-1c2d3e4f5a6b",
                            "name": "CHRISTOPHER JON TAYLOR",
                            "designation": "Secretary",
                            "role": "secretary",
                            "nationality": null,
                            "is_active": true,
                            "kyc_status": null,
                            "kyc_session_url": null
                          },
                          {
                            "uuid": "b2c3d4e5-f6a7-4890-8b1c-2d3e4f5a6b7c",
                            "name": "MELISSA BETHELL",
                            "designation": "Director",
                            "role": "director",
                            "nationality": "British",
                            "is_active": true,
                            "kyc_status": null,
                            "kyc_session_url": null
                          }
                        ],
                        "beneficial_owners": [],
                        "addresses": [
                          {
                            "address": "Tesco House, Shire Park, Kestrel Way, Welwyn Garden City, United Kingdom, AL7 1GA",
                            "type": "legal_entity_registry_address",
                            "description": "registered office address"
                          }
                        ],
                        "industries": null,
                        "accounts": {
                          "last_account": "26 February 2025",
                          "next_account": "26 February 2026",
                          "due_by_date": "26 August 2026"
                        },
                        "registry_data": {},
                        "user_provided_data": null,
                        "confirmed_by_user_at": null,
                        "last_console_edit_at": null,
                        "is_editable": true
                      },
                      "vendor_data": "company-1234",
                      "metadata": null,
                      "created_at": "2026-06-11T10:45:00.000000+00:00"
                    }
                  },
                  "Pending (registry still resolving)": {
                    "summary": "Auswahl blieb nach dem Polling ausstehend – spärliche Felder, serverseitige automatische Vervollständigung",
                    "value": {
                      "request_id": "9d4f2c7a-1b3e-4a5c-8d6f-0e9a8b7c6d5e",
                      "kyb_registry": {
                        "uuid": "7c0a4f7e-2b1d-4f6a-9c3e-8d5b2a1f0e9d",
                        "node_id": "feature_kyb_registry",
                        "status": "Not Finished",
                        "registry_status": null,
                        "data_resolved": false,
                        "company_name": "Tesco PLC",
                        "registration_number": "00445790",
                        "country_code": "GB",
                        "region": null,
                        "company_type": null,
                        "incorporation_date": null,
                        "registered_address": null,
                        "tax_number": null,
                        "risk_level": null,
                        "verification_status": null,
                        "is_from_registry": true,
                        "fetch_status": "pending",
                        "alternative_names": null,
                        "nature_of_business": null,
                        "registered_capital": null,
                        "registered_capital_amount": null,
                        "registered_capital_currency": null,
                        "website": null,
                        "email": null,
                        "phone": null,
                        "legal_entity_identifier": null,
                        "location_of_registration": null,
                        "financial_summary": {},
                        "officers": [],
                        "beneficial_owners": [],
                        "addresses": null,
                        "industries": null,
                        "accounts": null,
                        "registry_data": {},
                        "user_provided_data": null,
                        "confirmed_by_user_at": null,
                        "last_console_edit_at": null,
                        "is_editable": true
                      },
                      "vendor_data": "company-1234",
                      "metadata": null,
                      "created_at": "2026-06-11T10:45:00.000000+00:00"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Validierungsfehler. Probleme auf Feldebene verwenden die Standard-Envelope von DRF. Ein Land, das die Register nicht abdecken, antwortet mit `400` und `code: kyb_registry_country_unsupported`.",
            "content": {
              "application/json": {
                "examples": {
                  "Missing kyb_response_id": {
                    "summary": "`kyb_response_id` ist erforderlich",
                    "value": {
                      "kyb_response_id": [
                        "This field is required."
                      ]
                    }
                  },
                  "save_api_request=false rejected": {
                    "summary": "Auswahlen werden immer persistent gespeichert",
                    "value": {
                      "save_api_request": [
                        "KYB registry select must be saved so billing and retrieval can be tracked."
                      ]
                    }
                  },
                  "Country not covered": {
                    "summary": "Kein Unternehmensregister deckt das Land ab",
                    "value": {
                      "detail": "Company registry search is not available for this country. Enter the company details manually to continue.",
                      "code": "kyb_registry_country_unsupported"
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Zugriff verweigert. Wird zurückgegeben, wenn der Header `x-api-key` fehlt sowie wenn das Guthaben der aufrufenden Organisation den Aufruf nicht decken kann; ein falscher, widerrufener oder abgelaufener Schlüssel gibt `401` zurück. Ein fehlender Schlüssel gibt `403` mit `{\"detail\": ...}` zurück; ein falscher, widerrufener oder abgelaufener Schlüssel gibt `401` zurück. Unzureichende Credits geben `403` mit `{\"error\": ...}` zurück, bevor ein Screening- oder Anbieteraufruf stattfindet.",
            "content": {
              "application/json": {
                "examples": {
                  "Missing or invalid API key": {
                    "summary": "Kein `x-api-key`-Header, oder der Schlüssel ist ungültig/widerrufen",
                    "value": {
                      "detail": "You do not have permission to perform this action."
                    }
                  },
                  "Not enough credits": {
                    "summary": "Das Guthaben der Organisation reicht für den Aufruf nicht aus",
                    "value": {
                      "error": "You don't have enough credits to perform this request. Please top up at https://business.didit.me"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate-Limit überschritten. POST/PATCH/DELETE-Endpoints teilen sich ein Budget von 300 Schreibanfragen pro Minute pro API-Schlüssel (Transaktionserstellungen und Ereignis-Ingestion haben ein separates Budget von 600). Die Antwort enthält die Header `X-RateLimit-Limit`, `X-RateLimit-Remaining`, `X-RateLimit-Reset` und `Retry-After`.",
            "content": {
              "application/json": {
                "examples": {
                  "Write rate limit exceeded": {
                    "summary": "Mehr als 300 Schreibanfragen in der aktuellen Minute",
                    "value": {
                      "detail": "Write request rate limit exceeded. You can make up to 300 requests per minute."
                    }
                  }
                },
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/v3/passive-liveness/": {
      "post": {
        "summary": "Passive Liveness-Erkennung",
        "description": "Erkennen Sie Präsentationsangriffe — gedruckte Fotos, Bildschirmwiedergaben, Masken, Deepfakes — anhand eines einzelnen Gesichtsbildes. Kein Video, keine Bewegung oder Benutzerinteraktion erforderlich.\n\n**Funktionsweise.** Das Bild wird von einem biometrischen Modell analysiert; das größte erkannte Gesicht wird ausgewertet und ein Liveness-`score` (0–100) berechnet. `status` ist `Declined`, wenn eine Warnung mit dem Schweregrad `error` ausgelöst wird:\n- `NO_FACE_DETECTED` — das Liveness-Modell hat kein Gesicht gefunden,\n- `LOW_LIVENESS_SCORE` — Score liegt bei oder unter `face_liveness_score_decline_threshold` (Standardwert `30`),\n- `LIVENESS_FACE_ATTACK` — das Modell hat einen Präsentationsangriff erkannt,\n- `FACE_IN_BLOCKLIST` / `POSSIBLE_FACE_IN_BLOCKLIST` — das Gesicht stimmt mit einem Eintrag auf Ihrer Gesichtssperrliste überein.\n\n`MULTIPLE_FACES_DETECTED` ist ein Signal mit dem Schweregrad `warning` (führt nicht zur Ablehnung), und `DUPLICATED_FACE` / `POSSIBLE_DUPLICATED_FACE` sind Signale mit dem Schweregrad `information`, dass dasselbe Gesicht bereits in einer anderen genehmigten Sitzung aufgetreten ist (sie führen niemals zur Ablehnung). `face_quality` und `face_luminance` (0–100, nullfähig) beschreiben die Aufnahmequalität.\n\n**Sperrlisten- und Duplikatsprüfung.** Wird bei **jedem** Aufruf ausgeführt — mit oder ohne `save_api_request` —, indem das erkannte Gesicht mit dem Gesichtssuchindex Ihrer Anwendung abgeglichen wird. Frühere Gesichter mit denselben `vendor_data` werden von der gesamten Indexsuche ausgeschlossen — eine erneute Ausführung der Liveness-Erkennung für denselben Benutzer löst also kein `DUPLICATED_FACE` aus, und ein auf der Sperrliste stehendes Gesicht, das aus einer Sitzung mit den eigenen `vendor_data` des Aufrufers stammt, wird ebenfalls NICHT markiert (die `FACE_IN_BLOCKLIST`-Prüfung wird für Gesichter mit denselben `vendor_data` umgangen).\n\n**Abrechnung.** Jede `200`-Antwort verbraucht einen Passive Liveness API-Credit (bezahlt aus Ihrem Tarif-Guthaben oder Aufladeguthaben). Bei unzureichendem Guthaben wird vor jeglicher Bildverarbeitung `403` zurückgegeben.\n\n**Sitzungspersistenz und Gesichtsregistrierung (`save_api_request`, Standardwert `true`).** Wenn `true`, wird der Aufruf als Sitzung vom Typ API persistiert (Business Console, `GET /v3/session/{sessionId}/decision/` über die zurückgegebene `request_id`, `status.updated`-Webhook), das Referenzbild und der Gesichtsausschnitt werden gespeichert und das erkannte Gesicht wird **in Ihren Gesichtssuchindex registriert**, sodass spätere Gesichtssuche-Aufrufe und Duplikatsprüfungen darauf abgleichen können. Wenn `false`, ist der Aufruf einmalig: Es wird nichts gespeichert und das Gesicht wird nicht registriert (die Sperrlisten-/Duplikatsprüfung wird weiterhin ausgeführt).\n\n**Sandbox.** Sandbox-API-Schlüssel überspringen jegliche Verarbeitung und Abrechnung: Nach der Anfragevalidierung (fehlerhafte Eingaben geben weiterhin `400` zurück) gibt der Endpoint eine statische `Approved`-Mock-Payload zurück, es wird keine Sitzung persistiert und es werden keine Credits verbraucht.\n\n**Authentifizierung.** Senden Sie den API-Schlüssel Ihrer Anwendung im Header `x-api-key`. Bei fehlenden oder ungültigen Anmeldedaten wird `403` zurückgegeben (`{\"detail\": \"You do not have permission to perform this action.\"}`) — diese API gibt niemals `401` zurück.\n\n**Rate-Limit.** Geteiltes Schreibkontingent von 300 Anfragen/Min. pro API-Schlüssel über alle POST/PATCH/DELETE-Endpoints; bei Überschreitung wird `429` zurückgegeben.",
        "operationId": "post_v3passive-liveness",
        "x-didit-sdk": {
          "resource": "passive_liveness",
          "method": "check",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Standalone APIs"
        ],
        "parameters": [],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "required": [
                  "user_image"
                ],
                "properties": {
                  "user_image": {
                    "type": "string",
                    "format": "binary",
                    "description": "Frontales Gesichtsbild (z. B. ein Selfie). Zulässige Dateiendungen: `tiff`, `jpg`, `jpeg`, `png`, `webp`. Maximale Upload-Größe: **5 MB** (größere Dateien werden mit `400` abgelehnt). Bilder werden vor der Verarbeitung automatisch auf ca. 0,5 MB komprimiert, sodass sehr hohe Auflösungen die Genauigkeit nicht verbessern. Das Bild sollte eine einzelne Person enthalten – sind mehrere Gesichter vorhanden, wird das größte ausgewertet und eine Warnung `MULTIPLE_FACES_DETECTED` hinzugefügt."
                  },
                  "face_liveness_score_decline_threshold": {
                    "type": "number",
                    "format": "float",
                    "default": 30,
                    "minimum": 0,
                    "maximum": 100,
                    "description": "Schwellenwert für den Liveness-Score (0–100). Ein berechneter Score **bei oder unter** diesem Wert gibt eine `LOW_LIVENESS_SCORE`-Warnung aus und setzt `status` auf `Declined`. Standardwert ist `30`; erhöhen Sie ihn für eine strengere Spoofing-Abwehr. Werte außerhalb von 0–100 geben `400` zurück.",
                    "example": 30
                  },
                  "rotate_image": {
                    "type": "boolean",
                    "default": false,
                    "description": "Wenn `true`, versucht der Dienst 90-Grad-Drehungen der Eingabe und verwendet die Ausrichtung, die die beste Gesichtserkennung liefert. Nützlich, wenn die EXIF-Ausrichtung fehlt. Erhöht die Latenz.",
                    "example": false
                  },
                  "save_api_request": {
                    "type": "boolean",
                    "default": true,
                    "description": "Wenn `true` (Standard), wird der Aufruf als Sitzung vom Typ API persistent gespeichert, die Gesichtsbilder gespeichert, ein Webhook `status.updated` ausgegeben und das erkannte Gesicht in Ihrem Gesichtssuchindex registriert. Wenn `false`, erfolgt der Aufruf einmalig – es wird nichts gespeichert und das Gesicht wird nicht registriert. Das Screening auf Sperrlisten und Duplikate wird in beiden Fällen ausgeführt.",
                    "example": true
                  },
                  "vendor_data": {
                    "type": "string",
                    "description": "Optionaler opaker Bezeichner (Ihre Benutzer-ID, E-Mail, UUID…), der in der gespeicherten Sitzung hinterlegt und zurückgegeben wird. Wird auch verwendet, um vorherige Sitzungen mit denselben `vendor_data` von der Prüfung auf doppelte Gesichter auszuschließen, sodass eine erneute Verifizierung desselben Benutzers kein `DUPLICATED_FACE` auslöst.",
                    "example": "user-123"
                  },
                  "metadata": {
                    "type": "object",
                    "additionalProperties": true,
                    "description": "Optionales JSON-Objekt, das mit der Sitzung gespeichert (wenn `save_api_request=true`) und zurückgegeben wird. Senden Sie es bei Multipart-Anfragen als JSON-codiertes String-Feld – es wird in ein Objekt geparst.",
                    "example": {
                      "flow": "withdrawal"
                    }
                  }
                }
              },
              "example": {
                "user_image": "(binary JPEG/PNG selfie)",
                "face_liveness_score_decline_threshold": 30,
                "rotate_image": false,
                "save_api_request": true,
                "vendor_data": "user-123",
                "metadata": {
                  "flow": "withdrawal"
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Passive Liveness-Erkennung abgeschlossen. `liveness.score` ist der Konfidenzwert des Modells von 0–100, dass das Bild eine lebende Person zeigt; `status` ist `Approved`, sofern keine Warnung mit der Schwere `error` ausgelöst wurde. Ein gefälschtes oder auf der Sperrliste stehendes Gesicht gibt dennoch `200` zurück – prüfen Sie `liveness.status` und `liveness.warnings`, nicht nur den HTTP-Code. Wenn `save_api_request=true`, ist `request_id` die persistierte Sitzungs-ID.",
            "content": {
              "application/json": {
                "examples": {
                  "Approved": {
                    "summary": "Live-Gesicht – keine Warnungen",
                    "value": {
                      "request_id": "a1b2c3d4-e5f6-7890-1234-567890abcdef",
                      "liveness": {
                        "status": "Approved",
                        "method": "PASSIVE",
                        "score": 95.0,
                        "user_image": {
                          "entities": [
                            {
                              "bbox": [
                                661,
                                728,
                                1688,
                                2188
                              ],
                              "confidence": 0.732973,
                              "age": 26.91,
                              "gender": "male",
                              "race": null
                            }
                          ],
                          "best_angle": 0
                        },
                        "warnings": [],
                        "face_quality": 84.21,
                        "face_luminance": 50.33
                      },
                      "vendor_data": "user-123",
                      "metadata": null,
                      "created_at": "2026-06-12T01:04:42.763237+00:00"
                    }
                  },
                  "Declined - presentation attack": {
                    "summary": "Das Modell hat ein Spoofing erkannt (Druck, Replay, Maske…)",
                    "value": {
                      "request_id": "f1c8c9b2-d3e4-4f5a-9b8c-7d6e5f4a3b2c",
                      "liveness": {
                        "status": "Declined",
                        "method": "PASSIVE",
                        "score": 12.5,
                        "user_image": {
                          "entities": [
                            {
                              "bbox": [
                                100,
                                120,
                                420,
                                540
                              ],
                              "confidence": 0.81,
                              "age": 30.1,
                              "gender": "female",
                              "race": null
                            }
                          ],
                          "best_angle": 0
                        },
                        "warnings": [
                          {
                            "risk": "LOW_LIVENESS_SCORE",
                            "feature": "LIVENESS",
                            "additional_data": null,
                            "log_type": "error",
                            "short_description": "Low liveness score",
                            "long_description": "The liveness check resulted in a low score, indicating potential use of non-live facial representations or poor-quality biometric data."
                          },
                          {
                            "risk": "LIVENESS_FACE_ATTACK",
                            "feature": "LIVENESS",
                            "additional_data": null,
                            "log_type": "error",
                            "short_description": "Liveness Face Attack",
                            "long_description": "The system detected a potential attempt to bypass the liveness check."
                          }
                        ],
                        "face_quality": 72.4,
                        "face_luminance": 48.2
                      },
                      "vendor_data": "user-123",
                      "metadata": null,
                      "created_at": "2026-06-12T01:04:42.763237+00:00"
                    }
                  },
                  "Declined - face on blocklist": {
                    "summary": "Live-Gesicht, stimmt jedoch mit einem Sperrlisteneintrag überein",
                    "value": {
                      "request_id": "0b54a1de-22aa-4e0f-9c84-5a2b1f3c4d5e",
                      "liveness": {
                        "status": "Declined",
                        "method": "PASSIVE",
                        "score": 93.75,
                        "user_image": {
                          "entities": [
                            {
                              "bbox": [
                                40,
                                40,
                                100,
                                100
                              ],
                              "confidence": 0.722082,
                              "age": 27.0,
                              "gender": "male",
                              "race": null
                            }
                          ],
                          "best_angle": 0
                        },
                        "warnings": [
                          {
                            "risk": "FACE_IN_BLOCKLIST",
                            "feature": "LIVENESS",
                            "additional_data": {
                              "blocklisted_session_id": "882c42d5-8a4d-4d20-8080-a22f57822c86",
                              "blocklisted_session_number": 3242,
                              "api_service": null
                            },
                            "log_type": "error",
                            "short_description": "Face in blocklist",
                            "long_description": "The system identified a face in the blocklist, which means the face is not allowed to be verified."
                          }
                        ],
                        "face_quality": null,
                        "face_luminance": null
                      },
                      "vendor_data": "user-123",
                      "metadata": null,
                      "created_at": "2026-06-12T01:04:42.763237+00:00"
                    }
                  }
                },
                "schema": {
                  "type": "object",
                  "properties": {
                    "request_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "Beibehaltene Sitzungs-ID, wenn `save_api_request=true` (verwendbar mit `GET /v3/session/{sessionId}/decision/`); andernfalls eine vorübergehende Korrelations-UUID."
                    },
                    "liveness": {
                      "type": "object",
                      "properties": {
                        "status": {
                          "type": "string",
                          "enum": [
                            "Approved",
                            "Declined"
                          ],
                          "description": "`Declined`, wenn mindestens eine Warnung mit dem Schweregrad `error` ausgelöst wurde (kein Gesicht, niedriger Score, Präsentationsangriff oder ein Sperrlistentreffer); andernfalls `Approved`. `warning`- oder `information`-Einträge (mehrere Gesichter, Duplikate) führen für sich allein nie zu einer Ablehnung."
                        },
                        "method": {
                          "type": "string",
                          "enum": [
                            "PASSIVE"
                          ],
                          "description": "Für diesen Endpoint immer `PASSIVE`."
                        },
                        "score": {
                          "type": "number",
                          "format": "float",
                          "nullable": true,
                          "minimum": 0,
                          "maximum": 100,
                          "description": "Liveness-Konfidenz (0–100, zwei Nachkommastellen), dass das Bild eine lebende Person und keinen Spoof darstellt. `null`, wenn das Modell keine Konfidenz zurückgegeben hat.",
                          "example": 95.0
                        },
                        "user_image": {
                          "type": "object",
                          "description": "Gesichtserkennungsergebnisse für das übermittelte Bild.",
                          "properties": {
                            "entities": {
                              "type": "array",
                              "items": {
                                "type": "object",
                                "properties": {
                                  "bbox": {
                                    "type": "array",
                                    "items": {
                                      "type": "integer"
                                    },
                                    "minItems": 4,
                                    "maxItems": 4,
                                    "description": "Bounding-Box des erkannten Gesichts als Pixelkoordinaten `[x_min, y_min, x_max, y_max]` im verarbeiteten Bild.",
                                    "example": [
                                      661,
                                      728,
                                      1688,
                                      2188
                                    ]
                                  },
                                  "confidence": {
                                    "type": "number",
                                    "format": "float",
                                    "minimum": 0,
                                    "maximum": 1,
                                    "description": "Konfidenz der Gesichtserkennung (0–1).",
                                    "example": 0.732973
                                  },
                                  "age": {
                                    "type": "number",
                                    "format": "float",
                                    "description": "Vom Modell geschätztes Alter des erkannten Gesichts in Jahren. Dient nur zur Information — hat keinen Einfluss auf die Liveness-Entscheidung.",
                                    "example": 26.91
                                  },
                                  "gender": {
                                    "type": "string",
                                    "description": "Vom Modell vorhergesagtes Geschlecht des erkannten Gesichts (`male` oder `female`). Dient nur zur Information.",
                                    "example": "male"
                                  },
                                  "race": {
                                    "type": "string",
                                    "nullable": true,
                                    "description": "Reserviertes Feld — in Antworten dieses Endpoints immer `null`.",
                                    "example": null
                                  }
                                }
                              },
                              "description": "Ein Eintrag pro erkanntem Gesicht. Das größte Gesicht ist dasjenige, das ausgewertet wird."
                            },
                            "best_angle": {
                              "type": "integer",
                              "nullable": true,
                              "description": "Drehung (Grad), die die beste Gesichtserkennung lieferte; nur ungleich null, wenn `rotate_image=true` die Ausrichtung korrigiert hat.",
                              "example": 0
                            }
                          }
                        },
                        "warnings": {
                          "type": "array",
                          "description": "Risikosignale. Schweregrad `error` (führt zur Ablehnung): `NO_FACE_DETECTED`, `LOW_LIVENESS_SCORE` (Score liegt am oder unter dem Schwellenwert), `LIVENESS_FACE_ATTACK`, `FACE_IN_BLOCKLIST`, `POSSIBLE_FACE_IN_BLOCKLIST`. Schweregrad `warning` (Prüfung, keine Ablehnung): `MULTIPLE_FACES_DETECTED`. Schweregrad `information` (keine Ablehnung): `DUPLICATED_FACE`, `POSSIBLE_DUPLICATED_FACE` – dasselbe Gesicht erschien bereits in einer anderen genehmigten Sitzung.",
                          "items": {
                            "type": "object",
                            "properties": {
                              "risk": {
                                "type": "string",
                                "enum": [
                                  "NO_FACE_DETECTED",
                                  "LOW_LIVENESS_SCORE",
                                  "LIVENESS_FACE_ATTACK",
                                  "MULTIPLE_FACES_DETECTED",
                                  "FACE_IN_BLOCKLIST",
                                  "POSSIBLE_FACE_IN_BLOCKLIST",
                                  "DUPLICATED_FACE",
                                  "POSSIBLE_DUPLICATED_FACE"
                                ],
                                "description": "Maschinenlesbarer Risiko-Code."
                              },
                              "feature": {
                                "type": "string",
                                "enum": [
                                  "LIVENESS"
                                ],
                                "description": "Funktion, die die Warnung ausgelöst hat. An diesem Endpoint immer `LIVENESS`."
                              },
                              "additional_data": {
                                "type": "object",
                                "nullable": true,
                                "additionalProperties": true,
                                "description": "`null` für die meisten Warnungen. Treffer auf Sperrlisten enthalten `{blocklisted_session_id, blocklisted_session_number, api_service}`; Duplikate enthalten `{duplicated_session_id, duplicated_session_number, api_service}`, die auf die übereinstimmende Sitzung verweisen."
                              },
                              "log_type": {
                                "type": "string",
                                "enum": [
                                  "error",
                                  "warning",
                                  "information"
                                ],
                                "description": "Schweregrad. `error`-Warnungen setzen `status` auf `Declined`; `warning`- und `information`-Einträge sind hinweisend und führen für sich allein nie zu einer Ablehnung."
                              },
                              "short_description": {
                                "type": "string",
                                "description": "Für Menschen lesbare einzeilige Zusammenfassung des Risikos."
                              },
                              "long_description": {
                                "type": "string",
                                "description": "Lesbare Erklärung des Risikos."
                              }
                            }
                          }
                        },
                        "face_quality": {
                          "type": "number",
                          "format": "float",
                          "nullable": true,
                          "minimum": 0,
                          "maximum": 100,
                          "description": "Erfassungsqualitätswert des erkannten Gesichts, normalisiert auf 0–100. `null`, wenn das Modell keinen verlässlichen Wert ermitteln konnte.",
                          "example": 84.21
                        },
                        "face_luminance": {
                          "type": "number",
                          "format": "float",
                          "nullable": true,
                          "minimum": 0,
                          "maximum": 100,
                          "description": "Helligkeit des erkannten Gesichts, normiert auf 0–100. `null`, wenn nicht verfügbar.",
                          "example": 50.33
                        }
                      }
                    },
                    "vendor_data": {
                      "type": "string",
                      "nullable": true,
                      "description": "Rückgabe der von Ihnen gesendeten `vendor_data` oder `null`."
                    },
                    "metadata": {
                      "type": "object",
                      "nullable": true,
                      "additionalProperties": true,
                      "description": "Rückgabe des von Ihnen gesendeten `metadata`-Objekts oder `null`."
                    },
                    "created_at": {
                      "type": "string",
                      "format": "date-time",
                      "description": "ISO 8601-Zeitstempel (UTC), wann die Antwort generiert wurde, z. B. `2026-06-12T01:04:42.763237+00:00`."
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Validierungsfehler. Wird zurückgegeben, wenn `user_image` fehlt, 5 MB überschreitet, eine nicht unterstützte Dateiendung hat, die serverseitige Bilddecodierung fehlschlägt oder eine Option außerhalb des zulässigen Bereichs liegt. Feldfehler verwenden die DRF-Envelope `{field: [messages]}`; Fehler bei der Bilddecodierung verwenden `{\"error\": ...}`.",
            "content": {
              "application/json": {
                "examples": {
                  "Missing image": {
                    "summary": "`user_image` ist nicht in den Formulardaten enthalten",
                    "value": {
                      "user_image": [
                        "No file was submitted."
                      ]
                    }
                  },
                  "Invalid image format": {
                    "summary": "Zulässige Dateiendung, aber nicht dekodierbarer Bildinhalt",
                    "value": {
                      "error": "Invalid user image format.",
                      "code": "invalid_image"
                    }
                  },
                  "Unsupported file extension": {
                    "summary": "Dateiendung außerhalb von tiff/jpg/jpeg/png/webp",
                    "value": {
                      "user_image": [
                        "File extension “txt” is not allowed. Allowed extensions are: tiff, jpg, jpeg, png, webp."
                      ]
                    }
                  },
                  "File too large": {
                    "summary": "Der Upload überschreitet das Limit von 5 MB",
                    "value": {
                      "user_image": [
                        "File size should not exceed 5 MB"
                      ]
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Zugriff verweigert. Wird zurückgegeben, wenn der Header `x-api-key` fehlt sowie wenn das Guthaben der aufrufenden Organisation den Aufruf nicht decken kann; ein falscher, widerrufener oder abgelaufener Schlüssel gibt `401` zurück. Ein fehlender Schlüssel gibt `403` mit `{\"detail\": ...}` zurück; ein falscher, widerrufener oder abgelaufener Schlüssel gibt `401` zurück. Unzureichende Credits geben `403` mit `{\"error\": ...}` zurück, bevor eine Bildverarbeitung stattfindet.",
            "content": {
              "application/json": {
                "examples": {
                  "Missing or invalid API key": {
                    "summary": "Kein `x-api-key`-Header, oder der Schlüssel ist ungültig/widerrufen",
                    "value": {
                      "detail": "You do not have permission to perform this action."
                    }
                  },
                  "Not enough credits": {
                    "summary": "Das Guthaben der Organisation reicht für den Aufruf nicht aus",
                    "value": {
                      "error": "You don't have enough credits to perform this request. Please top up at https://business.didit.me"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate-Limit überschritten. POST/PATCH/DELETE-Endpoints teilen sich ein Budget von 300 Schreibanfragen pro Minute pro API-Schlüssel (Transaktionserstellungen und Ereignis-Ingestion haben ein separates Budget von 600). Die Antwort enthält die Header `X-RateLimit-Limit`, `X-RateLimit-Remaining`, `X-RateLimit-Reset` und `Retry-After`.",
            "content": {
              "application/json": {
                "examples": {
                  "Write rate limit exceeded": {
                    "summary": "Mehr als 300 Schreibanfragen in der aktuellen Minute",
                    "value": {
                      "detail": "Write request rate limit exceeded. You can make up to 300 requests per minute."
                    }
                  }
                },
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "cURL",
            "source": "curl -X POST 'https://verification.didit.me/v3/passive-liveness/' \\\n  -H 'x-api-key: YOUR_API_KEY' \\\n  -F 'user_image=@./selfie.jpg' \\\n  -F 'face_liveness_score_decline_threshold=30' \\\n  -F 'save_api_request=true' \\\n  -F 'vendor_data=user-123'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.passive_liveness.check(\n    user_image=open(\"user_image.jpg\", \"rb\"),\n    face_liveness_score_decline_threshold=30.0,\n    rotate_image=False,\n    save_api_request=True,\n    vendor_data=\"user-123\",\n    metadata={\"flow\": \"withdrawal\"},\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit, { fileFromPath } from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.passiveLiveness.check({\n  user_image: await fileFromPath(\"user_image.jpg\"),\n  face_liveness_score_decline_threshold: 30.0,\n  rotate_image: false,\n  save_api_request: true,\n  vendor_data: \"user-123\",\n  metadata: { flow: \"withdrawal\" },\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.PassiveLiveness.Check(ctx, didit.PassiveLivenessCheckParams{\n\tUserImage:                         didit.FileFromPath(\"user_image.jpg\"),\n\tFaceLivenessScoreDeclineThreshold: didit.Float(30.0),\n\tRotateImage:                       didit.Bool(false),\n\tSaveAPIRequest:                    didit.Bool(true),\n\tVendorData:                        didit.String(\"user-123\"),\n\tMetadata:                          didit.Some(map[string]any{\"flow\": \"withdrawal\"}),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import java.nio.file.Path;\nimport java.util.Map;\nimport me.didit.Didit;\nimport me.didit.types.PassiveLivenessCheckParams;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.passiveLiveness().check(PassiveLivenessCheckParams.builder()\n        .userImage(Path.of(\"user_image.jpg\"))\n        .faceLivenessScoreDeclineThreshold(30.0)\n        .rotateImage(false)\n        .saveApiRequest(true)\n        .vendorData(\"user-123\")\n        .metadata(Map.of(\"flow\", \"withdrawal\"))\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\nuse Didit\\File;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->passiveLiveness->check([\n    'user_image' => File::fromPath('user_image.jpg'),\n    'face_liveness_score_decline_threshold' => 30.0,\n    'rotate_image' => false,\n    'save_api_request' => true,\n    'vendor_data' => 'user-123',\n    'metadata' => ['flow' => 'withdrawal'],\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.passive_liveness.check(\n  user_image: Pathname(\"user_image.jpg\"),\n  face_liveness_score_decline_threshold: 30.0,\n  rotate_image: false,\n  save_api_request: true,\n  vendor_data: \"user-123\",\n  metadata: { flow: \"withdrawal\" }\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Collections.Generic;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.PassiveLiveness.CheckAsync(new PassiveLivenessCheckParams\n{\n    UserImage = FileUpload.FromPath(\"user_image.jpg\"),\n    FaceLivenessScoreDeclineThreshold = 30.0,\n    RotateImage = false,\n    SaveApiRequest = true,\n    VendorData = \"user-123\",\n    Metadata = new Dictionary<string, object> { [\"flow\"] = \"withdrawal\" },\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ]
      }
    },
    "/v3/database-validation/": {
      "post": {
        "summary": "Datenbankvalidierung (eigenständig)",
        "operationId": "post_v3database-validation",
        "x-didit-sdk": {
          "resource": "database_validation",
          "method": "validate",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Standalone APIs"
        ],
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "parameters": [],
        "description": "Validieren Sie die Identitätsdaten einer Person anhand offizieller Behörden- und Registerquellen – CPF in Brasilien, RENAPER in Argentinien, DNI-Register in Spanien und Peru, INE in Mexiko und 100+ weitere Dienste in 60+ Ländern.\n\n**Dienstauswahl.** Jedes Land stellt einen oder mehrere Katalogdienste bereit, die durch eine `service_id` identifiziert werden (z. B. `bra_cpf`, `arg_renaper`, `pan_cedula_sib`). Legen Sie die gewünschten Dienste mit dem Array `services` fest – wenn Sie es weglassen, wird genau **ein** Standarddienst ausgeführt (der am längsten etablierte Live-Dienst für das jeweilige Land). Das Senden von `services` schaltet die Antwort zudem auf das erweiterte Format mit `services_used` und `match_score` um. Dienste, ihre erforderlichen Felder und Preise können Sie über `GET /v1/organization/database-validation-countries/` (ein Katalog-Endpoint, der nicht in dieser Spezifikation dokumentiert ist) oder den Workflow-Editor der Business Console abrufen. Einige Dienste sind im Katalog mit `requires_consent=true` markiert und erfordern `consent=true`; andere erfordern ein Onboarding für Ihre Organisation, bevor sie aufgerufen werden können.\n\n**Eingabefelder.** `identification_number` ist ein universelles Feld, das automatisch dem passenden länderspezifischen Feld zugeordnet wird (siehe Beschreibung). Formatregeln der Länder werden durchgesetzt, bevor ein Anbieter aufgerufen wird (z. B. muss BRA CPF genau 11 Ziffern lang sein), und Formatfehler werden niemals in Rechnung gestellt. Biometrische Dienste erfordern den Upload eines `selfie` (nur als Multipart); Argentinien RENAPER erfordert zusätzlich `gender`.\n\n**Ergebnisse.** Jeder Dienst gibt ein feldweises `validation`-Mapping sowie einen anbieterneutralen `outcome_code` zurück (`MATCH`, `PARTIAL_MATCH`, `NO_MATCH`, `DOCUMENT_NOT_FOUND`, `INVALID_DOCUMENT_FORMAT`, `INVALID_INPUT`, `MINOR_BLOCKED`, `DECEASED`, `BIOMETRIC_NO_MATCH`, `BIOMETRIC_IMAGE_UNUSABLE`, `INCONCLUSIVE`, `DOCUMENT_SUPERSEDED`, `REGISTRY_UNAVAILABLE`, `REGISTRY_ERROR`). Beachten Sie die Unterschiede: `NO_MATCH` ist eine definitive Nichtübereinstimmung, `INCONCLUSIVE` bedeutet, dass das Register weder bestätigen noch verwerfen konnte (manuelle Prüfung, keine Ablehnung), und `BIOMETRIC_IMAGE_UNUSABLE` ist ein technisches Problem mit dem Selfie (erneut aufnehmen), im Gegensatz zum definitiven `BIOMETRIC_NO_MATCH`. Der übergeordnete `match_type` aggregiert über alle Dienste (jede vollständige → `full_match`, sonst jede teilweise → `partial_match`, sonst `no_match`), und `no_match_action`/`partial_match_action` übersetzen ihn in den endgültigen `status`. `validation_type` wird abgeleitet: `two_by_two`, wenn zwei oder mehr unterschiedliche Dienste eine vollständige Übereinstimmung geliefert haben (bei der Identifikationsnummer, bei vollständigem Namen + Geburtsdatum zusammen oder bei der Adresse ohne Widersprüche), andernfalls `one_by_one`.\n\n**Persistenz.** `save_api_request` ist standardmäßig **true**: Das Ergebnis wird als Sitzung gespeichert (`request_id` funktioniert mit `GET /v3/session/{sessionId}/decision/`), erscheint in der Console und löst ein `status.updated`-Webhook-Ereignis aus. Es steuert auch das Format von `validations` – dienstspezifische Objekte beim Speichern, ein zusammengeführtes `{field: match}`-Mapping, wenn nicht gespeichert wird.\n\n**Abrechnung.** Pro Dienst: Jedem Dienst, der ein abrechenbares Ergebnis zurückgibt, wird sein eigener Katalogpreis berechnet. Fehlgeschlagene oder übersprungene Dienste werden nicht abgerechnet, und mit `400` abgewiesene Anfragen kosten nichts. Die vorab durchgeführte Guthabenprüfung deckt die Summe der Preise der ausgewählten Dienste ab (`403` bei unzureichendem Guthaben).\n\n**Fehler.** Wenn kein ausgewählter Dienst ein nutzbares Ergebnis zurückgibt, gibt die API `400` mit `validation_errors` zurück, sofern jeder unbeantwortete Versuch die Eingabe explizit abgelehnt hat (`provider_rejected_input`, `retryable: false`). Korrigieren Sie die Eingabe, bevor Sie es erneut versuchen. Andernfalls gibt sie `502` mit `validation_errors` zurück (`empty_provider_response`, `retryable: true`), einschließlich gemischter Eingabeablehnungen und nicht verfügbarer Fallback-Versuche; es wird nichts abgerechnet (eine Sitzung wird weiterhin mit dem Status `Not Finished` erfasst, wenn `save_api_request=true`). Wenn nur einige Dienste fehlschlagen, enthält die `200`-Antwort deren Fehler in `database_validation.errors`.\n\n**Sandbox.** Schlüssel aus Sandbox-Anwendungen überspringen die Registeraufrufe sowie die Abrechnung und geben eine statische `full_match`-Antwort zurück – die Sandbox-Payload enthält immer `services_used` und `match_score: 100`, unabhängig davon, wie `services` übermittelt wurde. Validieren Sie daher weder die Aktivierung des erweiterten Live-Formats noch den `match_score`-Bruchwert im Bereich von 0.0–1.0 anhand von Sandbox-Antworten.\n\nSenden Sie die Anfrage als `application/json`, oder als `multipart/form-data`, wenn Sie ein `selfie` hochladen.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "issuing_state"
                ],
                "properties": {
                  "issuing_state": {
                    "type": "string",
                    "description": "ISO 3166-1-**Alpha-3**-Ländercode des Registers, anhand dessen validiert werden soll (z. B. `BRA`, `ESP`, `COL`). Bestimmt, welche Dienste verfügbar sind. Nicht unterstützte Codes geben `400` mit der vollständigen Liste der gültigen Optionen zurück.",
                    "example": "BRA"
                  },
                  "services": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    },
                    "description": "Katalog-`service_id`s, die für dieses Land ausgeführt werden sollen (z. B. `[\"bra_cpf\"]`). Akzeptiert auch eine einzelne Zeichenkette oder eine kommagetrennte/JSON-codierte Zeichenkette. **Wird sie weggelassen oder ist sie leer, wird genau ein Standarddienst ausgeführt** — der am längsten etablierte Live-Dienst für das Land; neuere, biometrische und nutzungsbasierte Dienste müssen explizit benannt werden. Das Senden von `services` stellt die Antwort auf die erweiterte Struktur um (fügt `services_used` und `match_score` hinzu). Jede ID muss für den `issuing_state` existieren und live sein; Dienste, die ein Onboarding erfordern, geben `400` zurück, bis sie für Ihre Organisation aktiviert sind. Entdecken Sie verfügbare Dienste pro Land über `GET /v1/organization/database-validation-countries/` (ein Katalog-Endpoint, der in dieser Spezifikation nicht dokumentiert ist) oder den Workflow-Editor der Business Console.",
                    "example": [
                      "bra_cpf"
                    ]
                  },
                  "validation_type": {
                    "type": "string",
                    "deprecated": true,
                    "description": "VERALTET. Aus Gründen der Abwärtskompatibilität akzeptiert, aber ignoriert – der `validation_type` der Antwort wird jetzt daraus abgeleitet, wie viele Dienste eine vollständige Übereinstimmung ergaben. Verwenden Sie `services`, um bestimmte Dienste festzulegen."
                  },
                  "consent": {
                    "type": "boolean",
                    "default": false,
                    "description": "Auf `true` setzen, wenn der Endbenutzer ausdrücklich in die ausgewählten Validierungsdienste eingewilligt hat. Erforderlich für Dienste, die im Katalog mit `requires_consent=true` gekennzeichnet sind – ohne dies geben diese Dienste `400` mit `services_requiring_consent` zurück."
                  },
                  "identification_number": {
                    "type": "string",
                    "description": "Universelle Identifikationsnummer — wird automatisch dem korrekten länderspezifischen Feld zugeordnet, sodass Sie sie anstelle von `personal_number`/`tax_number`/`document_number` verwenden können: ARG→document_number (DNI), BOL→document_number (CI), BRA→tax_number (CPF, 11 Ziffern), CHL→personal_number (RUT), COL→personal_number (Cédula), CRI→personal_number (Cédula), DOM→personal_number (Cédula, 11 Ziffern), ECU→personal_number (Cédula, 10 Ziffern), ESP→personal_number (DNI/NIE), GTM→document_number (DPI), HND→document_number (DNI), MEX→personal_number (CURP, 18 Zeichen), PAN→personal_number (Cédula), PER→personal_number (DNI, 8 Ziffern), PRY→document_number (CI), SLV→document_number (DUI), URY→personal_number (CI), VEN→document_number (Cédula). Sie überschreibt niemals ein explizit angegebenes länderspezifisches Feld."
                  },
                  "first_name": {
                    "type": "string",
                    "description": "Der Vorname der Person. Von einigen Diensten/Ländern erforderlich.",
                    "example": "John"
                  },
                  "last_name": {
                    "type": "string",
                    "description": "Der Nachname der Person. Von einigen Diensten/Ländern erforderlich.",
                    "example": "Doe"
                  },
                  "middle_name": {
                    "type": "string",
                    "description": "Zweitname, der von einigen Länderdiensten verwendet wird (AUS, NZL, …)."
                  },
                  "full_name": {
                    "type": "string",
                    "description": "Vollständiger Name – einige Dienste akzeptieren diesen anstelle von Vor-/Nachname (z. B. CHN-Dienste, die den Namen im nativen Schriftsystem abgleichen)."
                  },
                  "date_of_birth": {
                    "type": "string",
                    "format": "date",
                    "description": "Geburtsdatum, `YYYY-MM-DD`. Von vielen Diensten verlangt.",
                    "example": "1980-01-01"
                  },
                  "personal_number": {
                    "type": "string",
                    "description": "Staatlich ausgestellte eindeutige Personen-ID. Verwendet von: CHL (RUT), COL (Cédula), CRI, DOM, ECU, ESP (DNI/NIE), MEX (CURP), PAN (Cédula), PER (DNI), URY. Ziehen Sie stattdessen `identification_number` in Betracht."
                  },
                  "tax_number": {
                    "type": "string",
                    "description": "Steueridentifikationsnummer. Verwendet von: BRA (CPF, 11 Ziffern). Ziehen Sie stattdessen `identification_number` in Betracht."
                  },
                  "document_number": {
                    "type": "string",
                    "description": "Dokumentennummer. Verwendet von: ARG (DNI), BOL (CI), GTM (DPI), HND (DNI), PRY (CI), SLV (DUI), VEN (Cédula). Ziehen Sie stattdessen `identification_number` in Betracht."
                  },
                  "document_type": {
                    "type": "string",
                    "enum": [
                      "P",
                      "DL",
                      "ID",
                      "RP",
                      "SSC",
                      "HIC",
                      "WP",
                      "TC",
                      "VISA",
                      "PSC",
                      "BC",
                      "OTHER"
                    ],
                    "description": "Art des validierten Dokuments: `P` Reisepass, `DL` Führerschein, `ID` Personalausweis, `RP` Aufenthaltstitel (sowie `SSC`, `HIC`, `WP`, `TC`, `VISA`, `PSC`, `BC`, `OTHER`). Erforderlich für einige Dienste (z. B. ESP)."
                  },
                  "expiration_date": {
                    "type": "string",
                    "format": "date",
                    "description": "Dokumentenablaufdatum, `YYYY-MM-DD`. Erforderlich für die ESP-Validierung (Spanien).",
                    "example": "2030-01-15"
                  },
                  "date_of_issue": {
                    "type": "string",
                    "format": "date",
                    "description": "Dokumentenausstellungsdatum, `YYYY-MM-DD` (fecha de expedición). Erforderlich für die COL-Validierung der Cédula (Kolumbien).",
                    "example": "2015-06-20"
                  },
                  "nationality": {
                    "type": "string",
                    "description": "Staatsangehörigkeit nach ISO 3166-1 alpha-3. Von einigen Diensten benötigt."
                  },
                  "gender": {
                    "type": "string",
                    "enum": [
                      "M",
                      "F",
                      "X"
                    ],
                    "description": "Geschlecht: `M`, `F` oder `X` (sonstiges/unbekannt). Erforderlich für die argentinische RENAPER-Validierung (`arg_renaper`)."
                  },
                  "address": {
                    "description": "Wohnadresse. Bevorzugen Sie das strukturierte Objekt `{\"street_1\":\"123 Main St\",\"street_2\":\"Apt 4B\",\"city\":\"Springfield\",\"region\":\"IL\",\"postal_code\":\"62701\",\"country\":\"US\"}`; ein vollständiger einzeiliger String wird weiterhin akzeptiert. Erforderlich für Adressverifizierungsdienste; wenn ein Dienst Adressanforderungen definiert, geben fehlende Teile `400` mit `address_fields_required_by` zurück.",
                    "oneOf": [
                      {
                        "type": "object",
                        "properties": {
                          "street_1": {
                            "type": "string"
                          },
                          "street_2": {
                            "type": "string"
                          },
                          "city": {
                            "type": "string"
                          },
                          "region": {
                            "type": "string"
                          },
                          "postal_code": {
                            "type": "string"
                          },
                          "country": {
                            "type": "string"
                          }
                        }
                      },
                      {
                        "type": "string",
                        "description": "Vollständige einzeilige Adresse (Legacy)."
                      }
                    ]
                  },
                  "address_element_1": {
                    "type": "string",
                    "description": "Straßenadresse einschließlich Hausnummer und Straßentyp. Falls weggelassen, wird sie aus `address` abgeleitet."
                  },
                  "address_element_2": {
                    "type": "string",
                    "description": "Wohnung, Einheit, Gebäude, Etage oder zusätzliche Adresszeile. Nur senden, wenn explizit vorhanden."
                  },
                  "address_element_3": {
                    "type": "string",
                    "description": "Stadt, Vorort, Bezirk, Ortschaft oder Stadtteil. Falls weggelassen, wird der Wert aus `address` abgeleitet."
                  },
                  "address_element_4": {
                    "type": "string",
                    "description": "Bundesland, Provinz, Region oder Ort. Falls weggelassen, abgeleitet aus `address`."
                  },
                  "address_element_5": {
                    "type": "string",
                    "description": "Postleitzahl. `postal_code` wird als Alias akzeptiert."
                  },
                  "postal_code": {
                    "type": "string",
                    "description": "Postleitzahl für adressbasierte Dienste (Alias von `address_element_5`)."
                  },
                  "driver_license_number": {
                    "type": "string",
                    "description": "Führerscheinnummer für staatliche Dokumentenprüfungsdienste (AUS, NZL, IND)."
                  },
                  "driver_license_card_number": {
                    "type": "string",
                    "description": "Physische Führerscheinkartennummer, sofern separat von der Führerscheinnummer erforderlich (AUS)."
                  },
                  "driver_license_state": {
                    "type": "string",
                    "description": "Ausstellungsstaat oder -territorium des Führerscheins (AUS)."
                  },
                  "driver_license_version": {
                    "type": "string",
                    "description": "Führerschein-Versionscode (NZL)."
                  },
                  "passport_number": {
                    "type": "string",
                    "description": "Reisepassnummer für behördliche Reisepass-Verifizierungsdienste (AUS, NZL, IND, CHN)."
                  },
                  "passport_expiration_date": {
                    "type": "string",
                    "format": "date",
                    "description": "Ablaufdatum des Reisepasses, `YYYY-MM-DD`, für Reisepass-Verifizierungsdienste."
                  },
                  "passport_file_number": {
                    "type": "string",
                    "description": "Reisepass-Aktenzeichen (IND)."
                  },
                  "passport_issue_country": {
                    "type": "string",
                    "description": "Ausstellungsland des Reisepasses (ISO 3166-1 Alpha-3) für Passverifizierungsdienste."
                  },
                  "medicare_card_number": {
                    "type": "string",
                    "description": "Medicare-Kartennummer (AUS)."
                  },
                  "immi_card_number": {
                    "type": "string",
                    "description": "Nummer der australischen ImmiCard."
                  },
                  "immi_card_expiry_date": {
                    "type": "string",
                    "format": "date",
                    "description": "Ablaufdatum der australischen ImmiCard."
                  },
                  "citizenship_certificate_number": {
                    "type": "string",
                    "description": "Staatsbürgerschaftszertifikatsnummer (AUS)."
                  },
                  "birth_registration_number": {
                    "type": "string",
                    "description": "Registrierungsnummer der Geburtsurkunde (AUS)."
                  },
                  "birth_registration_date": {
                    "type": "string",
                    "format": "date",
                    "description": "Registrierungsdatum der Geburtsurkunde (AUS)."
                  },
                  "birth_registration_state": {
                    "type": "string",
                    "description": "Registrierungsstaat der Geburtsurkunde (AUS)."
                  },
                  "marriage_certificate_number": {
                    "type": "string",
                    "description": "Nummer der Heiratsurkunde (AUS)."
                  },
                  "change_of_name_certificate_number": {
                    "type": "string",
                    "description": "Nummer der Namensänderungsurkunde (AUS)."
                  },
                  "first_partner_name": {
                    "type": "string",
                    "description": "Vorname des Partners auf einer Heiratsurkunde (AUS)."
                  },
                  "last_partner_name": {
                    "type": "string",
                    "description": "Nachname des Partners auf einer Heiratsurkunde (AUS)."
                  },
                  "voter_id": {
                    "type": "string",
                    "description": "Wählerregisternummer (IND EPIC, IRL)."
                  },
                  "epic_card": {
                    "type": "string",
                    "description": "Indische EPIC-Wählerausweisnummer."
                  },
                  "pan": {
                    "type": "string",
                    "description": "Indische PAN (Permanent Account Number)."
                  },
                  "national_id": {
                    "type": "string",
                    "description": "Nationale Identifikationsnummer (CHN, MYS, KEN, KHM, NGA, ZAF, …)."
                  },
                  "cic": {
                    "type": "string",
                    "description": "Mexikanischer INE/IFE Código de Identificación de Credencial (CIC), 9 Ziffern. Wird vom mexikanischen INE-Ausweisgültigkeitsdienst (`mex_ine_vigencia`) verwendet."
                  },
                  "identificador_ciudadano": {
                    "type": "string",
                    "description": "Mexikanischer INE Identificador del Ciudadano (9 Ziffern). Wird zusammen mit `cic` für moderne INE-Modelle (E/F/G/H) in `mex_ine_vigencia` verwendet."
                  },
                  "ocr": {
                    "type": "string",
                    "description": "Mexikanische INE-OCR-Nummer (13 Ziffern, Rückseite der Karte). Wird zusammen mit `cic` für Modell D in `mex_ine_vigencia` verwendet."
                  },
                  "voter_number": {
                    "type": "string",
                    "description": "Mexikanische INE Clave de Elector (18 Zeichen). Wird zusammen mit `emission_number` für ältere IFE-Modelle (A/B/C) in `mex_ine_vigencia` verwendet."
                  },
                  "emission_number": {
                    "type": "string",
                    "description": "Mexikanische INE Número de Emisión. Wird zusammen mit `voter_number` für ältere IFE-Modelle (A/B/C) in `mex_ine_vigencia` verwendet."
                  },
                  "bvn": {
                    "type": "string",
                    "description": "Nigerianische Bank Verification Number."
                  },
                  "bank_card_number": {
                    "type": "string",
                    "description": "Bankkartennummer (CHN-Bankkartenverifizierung)."
                  },
                  "company_registration_number": {
                    "type": "string",
                    "description": "Vom Unternehmensregister ausgestellte Unternehmensregisternummer: der CNPJ in Brasilien (z. B. `11222333000181`), die Registernummer in Südafrika (z. B. `1936/007721/06`). Erforderlich für die Dienste für Unternehmensregister und Unternehmensgeschäftsführer (`bra_company_registry`, `bra_company_directors`, `zaf_company_registry`, `zaf_company_directors`)."
                  },
                  "company_name": {
                    "type": "string",
                    "description": "Eingetragener Unternehmensname, abgeglichen mit dem Registereintrag. Optional für `zaf_company_registry`."
                  },
                  "initials": {
                    "type": "string",
                    "description": "Die Initialen der Person, wie auf dem Dokument aufgedruckt. Erforderlich für `zaf_drivers_license`; akzeptiert von `zaf_bank_account_holder`."
                  },
                  "licence_number": {
                    "type": "string",
                    "description": "Führerscheinnummer wie auf der Karte aufgedruckt, für `zaf_drivers_license`. Bei Weglassen wird `document_number` verwendet."
                  },
                  "refugee_file_number": {
                    "type": "string",
                    "description": "Flüchtlingsaktennummer, ausgestellt vom Department of Home Affairs in Südafrika. Erforderlich für `zaf_refugee`."
                  },
                  "bank_name": {
                    "type": "string",
                    "description": "Name der kontoführenden Bank. Erforderlich für `zaf_bank_account_holder`."
                  },
                  "bank_account_number": {
                    "type": "string",
                    "description": "Bankkontonummer. Erforderlich für `zaf_bank_account_holder`; akzeptiert von `zaf_fraud_prevention`."
                  },
                  "account_type": {
                    "type": "string",
                    "description": "Bankkontotyp für `zaf_bank_account_holder`: `current`, `savings`, `transmission`, `subscriptionShare` oder `notKnown`, ohne Berücksichtigung der Groß-/Kleinschreibung. Jeder andere Wert gibt `400` zurück. Lassen Sie das Feld weg, wenn Sie den Typ nicht kennen: Der Kontotyp-Abgleich wird dann als nicht bestätigt gemeldet."
                  },
                  "phone_number": {
                    "type": "string",
                    "description": "Mobiltelefonnummer des Kontakts für die Dienste, die die Erreichbarkeit überprüfen (`zaf_bank_account_holder`, `zaf_fraud_prevention`, `zaf_refugee`)."
                  },
                  "right_thumb": {
                    "type": "string",
                    "description": "Base64-kodierter rechter Daumenabdruck für `zaf_dha_fingerprint_match`, zusammen mit `left_thumb` oder alleinstehend."
                  },
                  "left_thumb": {
                    "type": "string",
                    "description": "Base64-kodierter linker Daumenabdruck für `zaf_dha_fingerprint_match`, zusammen mit `right_thumb` oder alleinstehend."
                  },
                  "score_level": {
                    "type": "integer",
                    "description": "Minimale biometrische Score-Stufe für `zaf_criminal_face_screening`. Standardwert ist `3`."
                  },
                  "max_matches": {
                    "type": "integer",
                    "description": "Maximale Anzahl potenzieller Treffer, die `zaf_criminal_face_screening` zurückgibt. Standardwert ist `1`."
                  },
                  "vehicle_register_number": {
                    "type": "string",
                    "description": "Fahrzeugregisternummer. Erforderlich, zusammen mit `vehicle_licence_plate` und `vin`, für `zaf_vehicle_ownership`."
                  },
                  "vehicle_licence_plate": {
                    "type": "string",
                    "description": "Kfz-Kennzeichen. Erforderlich, zusammen mit `vehicle_register_number` und `vin`, für `zaf_vehicle_ownership`."
                  },
                  "vin": {
                    "type": "string",
                    "description": "Fahrzeug-Identifizierungsnummer (FIN bzw. Fahrgestellnummer). Erforderlich, zusammen mit `vehicle_register_number` und `vehicle_licence_plate`, für `zaf_vehicle_ownership`."
                  },
                  "ssn": {
                    "type": "string",
                    "description": "Social Security Number (USA)."
                  },
                  "phone": {
                    "type": "string",
                    "description": "Telefonnummer für Telefonverifizierungsdienste."
                  },
                  "landline": {
                    "type": "string",
                    "description": "Festnetznummer für Telefonverifizierungsdienste."
                  },
                  "email": {
                    "type": "string",
                    "format": "email",
                    "description": "E-Mail-Adresse für Identitätsverifizierungsdienste."
                  },
                  "country_of_residence": {
                    "type": "string",
                    "description": "ISO 3166-1-Alpha-2-Wohnsitzland. Wird von globalen Identitätsanreicherungsdiensten (z. B. `glb_identity_enrichment`) verwendet, um die Abfrage einzugrenzen.",
                    "example": "US"
                  },
                  "partial_match_action": {
                    "type": "string",
                    "enum": [
                      "DECLINE",
                      "NO_ACTION"
                    ],
                    "default": "NO_ACTION",
                    "description": "Auswirkung von `partial_match` auf `database_validation.status`. Standardwert ist `NO_ACTION` (Status bleibt `Approved`, mit einer Warnung)."
                  },
                  "no_match_action": {
                    "type": "string",
                    "enum": [
                      "DECLINE",
                      "NO_ACTION"
                    ],
                    "default": "DECLINE",
                    "description": "Auswirkung von `no_match` auf `database_validation.status`. Standardwert ist `DECLINE`."
                  },
                  "save_api_request": {
                    "type": "boolean",
                    "default": true,
                    "description": "Die Validierung als Sitzung beibehalten (Sichtbarkeit in der Konsole, Entscheidungs-Endpoint, `status.updated`-Webhook). Ändert auch die Struktur der `validations`-Antwort: Pro-Dienst-Objekte bei `true` (Standard), eine zusammengeführte Feldzuordnung bei `false`."
                  },
                  "vendor_data": {
                    "type": "string",
                    "description": "Ihre Kennung für den validierten Benutzer; wird zurückgegeben und mit der Sitzung gespeichert."
                  },
                  "metadata": {
                    "type": "object",
                    "nullable": true,
                    "description": "Freiform-JSON, das mit der Anfrage gespeichert und zurückgegeben wird."
                  }
                }
              },
              "example": {
                "issuing_state": "BRA",
                "services": [
                  "bra_cpf"
                ],
                "identification_number": "12345678900",
                "first_name": "John",
                "last_name": "Doe",
                "date_of_birth": "1980-01-01",
                "vendor_data": "user-1234"
              }
            },
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "required": [
                  "issuing_state"
                ],
                "properties": {
                  "issuing_state": {
                    "type": "string",
                    "description": "ISO 3166-1-**Alpha-3**-Ländercode des Registers, anhand dessen validiert werden soll (z. B. `BRA`, `ESP`, `COL`). Bestimmt, welche Dienste verfügbar sind. Nicht unterstützte Codes geben `400` mit der vollständigen Liste der gültigen Optionen zurück.",
                    "example": "BRA"
                  },
                  "services": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    },
                    "description": "Katalog-`service_id`s, die für dieses Land ausgeführt werden sollen (z. B. `[\"bra_cpf\"]`). Akzeptiert auch eine einzelne Zeichenkette oder eine kommagetrennte/JSON-codierte Zeichenkette. **Wird sie weggelassen oder ist sie leer, wird genau ein Standarddienst ausgeführt** — der am längsten etablierte Live-Dienst für das Land; neuere, biometrische und nutzungsbasierte Dienste müssen explizit benannt werden. Das Senden von `services` stellt die Antwort auf die erweiterte Struktur um (fügt `services_used` und `match_score` hinzu). Jede ID muss für den `issuing_state` existieren und live sein; Dienste, die ein Onboarding erfordern, geben `400` zurück, bis sie für Ihre Organisation aktiviert sind. Entdecken Sie verfügbare Dienste pro Land über `GET /v1/organization/database-validation-countries/` (ein Katalog-Endpoint, der in dieser Spezifikation nicht dokumentiert ist) oder den Workflow-Editor der Business Console.",
                    "example": [
                      "bra_cpf"
                    ]
                  },
                  "validation_type": {
                    "type": "string",
                    "deprecated": true,
                    "description": "VERALTET. Aus Gründen der Abwärtskompatibilität akzeptiert, aber ignoriert – der `validation_type` der Antwort wird jetzt daraus abgeleitet, wie viele Dienste eine vollständige Übereinstimmung ergaben. Verwenden Sie `services`, um bestimmte Dienste festzulegen."
                  },
                  "consent": {
                    "type": "boolean",
                    "default": false,
                    "description": "Auf `true` setzen, wenn der Endbenutzer ausdrücklich in die ausgewählten Validierungsdienste eingewilligt hat. Erforderlich für Dienste, die im Katalog mit `requires_consent=true` gekennzeichnet sind – ohne dies geben diese Dienste `400` mit `services_requiring_consent` zurück."
                  },
                  "identification_number": {
                    "type": "string",
                    "description": "Universelle Identifikationsnummer — wird automatisch dem korrekten länderspezifischen Feld zugeordnet, sodass Sie sie anstelle von `personal_number`/`tax_number`/`document_number` verwenden können: ARG→document_number (DNI), BOL→document_number (CI), BRA→tax_number (CPF, 11 Ziffern), CHL→personal_number (RUT), COL→personal_number (Cédula), CRI→personal_number (Cédula), DOM→personal_number (Cédula, 11 Ziffern), ECU→personal_number (Cédula, 10 Ziffern), ESP→personal_number (DNI/NIE), GTM→document_number (DPI), HND→document_number (DNI), MEX→personal_number (CURP, 18 Zeichen), PAN→personal_number (Cédula), PER→personal_number (DNI, 8 Ziffern), PRY→document_number (CI), SLV→document_number (DUI), URY→personal_number (CI), VEN→document_number (Cédula). Sie überschreibt niemals ein explizit angegebenes länderspezifisches Feld."
                  },
                  "first_name": {
                    "type": "string",
                    "description": "Der Vorname der Person. Von einigen Diensten/Ländern erforderlich.",
                    "example": "John"
                  },
                  "last_name": {
                    "type": "string",
                    "description": "Der Nachname der Person. Von einigen Diensten/Ländern erforderlich.",
                    "example": "Doe"
                  },
                  "middle_name": {
                    "type": "string",
                    "description": "Zweitname, der von einigen Länderdiensten verwendet wird (AUS, NZL, …)."
                  },
                  "full_name": {
                    "type": "string",
                    "description": "Vollständiger Name – einige Dienste akzeptieren diesen anstelle von Vor-/Nachname (z. B. CHN-Dienste, die den Namen im nativen Schriftsystem abgleichen)."
                  },
                  "date_of_birth": {
                    "type": "string",
                    "format": "date",
                    "description": "Geburtsdatum, `YYYY-MM-DD`. Von vielen Diensten verlangt.",
                    "example": "1980-01-01"
                  },
                  "personal_number": {
                    "type": "string",
                    "description": "Staatlich ausgestellte eindeutige Personen-ID. Verwendet von: CHL (RUT), COL (Cédula), CRI, DOM, ECU, ESP (DNI/NIE), MEX (CURP), PAN (Cédula), PER (DNI), URY. Ziehen Sie stattdessen `identification_number` in Betracht."
                  },
                  "tax_number": {
                    "type": "string",
                    "description": "Steueridentifikationsnummer. Verwendet von: BRA (CPF, 11 Ziffern). Ziehen Sie stattdessen `identification_number` in Betracht."
                  },
                  "document_number": {
                    "type": "string",
                    "description": "Dokumentennummer. Verwendet von: ARG (DNI), BOL (CI), GTM (DPI), HND (DNI), PRY (CI), SLV (DUI), VEN (Cédula). Ziehen Sie stattdessen `identification_number` in Betracht."
                  },
                  "document_type": {
                    "type": "string",
                    "enum": [
                      "P",
                      "DL",
                      "ID",
                      "RP",
                      "SSC",
                      "HIC",
                      "WP",
                      "TC",
                      "VISA",
                      "PSC",
                      "BC",
                      "OTHER"
                    ],
                    "description": "Art des validierten Dokuments: `P` Reisepass, `DL` Führerschein, `ID` Personalausweis, `RP` Aufenthaltstitel (sowie `SSC`, `HIC`, `WP`, `TC`, `VISA`, `PSC`, `BC`, `OTHER`). Erforderlich für einige Dienste (z. B. ESP)."
                  },
                  "expiration_date": {
                    "type": "string",
                    "format": "date",
                    "description": "Dokumentenablaufdatum, `YYYY-MM-DD`. Erforderlich für die ESP-Validierung (Spanien).",
                    "example": "2030-01-15"
                  },
                  "date_of_issue": {
                    "type": "string",
                    "format": "date",
                    "description": "Dokumentenausstellungsdatum, `YYYY-MM-DD` (fecha de expedición). Erforderlich für die COL-Validierung der Cédula (Kolumbien).",
                    "example": "2015-06-20"
                  },
                  "nationality": {
                    "type": "string",
                    "description": "Staatsangehörigkeit nach ISO 3166-1 alpha-3. Von einigen Diensten benötigt."
                  },
                  "gender": {
                    "type": "string",
                    "enum": [
                      "M",
                      "F",
                      "X"
                    ],
                    "description": "Geschlecht: `M`, `F` oder `X` (sonstiges/unbekannt). Erforderlich für die argentinische RENAPER-Validierung (`arg_renaper`)."
                  },
                  "address": {
                    "description": "Wohnadresse. Bevorzugen Sie das strukturierte Objekt `{\"street_1\":\"123 Main St\",\"street_2\":\"Apt 4B\",\"city\":\"Springfield\",\"region\":\"IL\",\"postal_code\":\"62701\",\"country\":\"US\"}`; ein vollständiger einzeiliger String wird weiterhin akzeptiert. Erforderlich für Adressverifizierungsdienste; wenn ein Dienst Adressanforderungen definiert, geben fehlende Teile `400` mit `address_fields_required_by` zurück.",
                    "oneOf": [
                      {
                        "type": "object",
                        "properties": {
                          "street_1": {
                            "type": "string"
                          },
                          "street_2": {
                            "type": "string"
                          },
                          "city": {
                            "type": "string"
                          },
                          "region": {
                            "type": "string"
                          },
                          "postal_code": {
                            "type": "string"
                          },
                          "country": {
                            "type": "string"
                          }
                        }
                      },
                      {
                        "type": "string",
                        "description": "Vollständige einzeilige Adresse (Legacy)."
                      }
                    ]
                  },
                  "address_element_1": {
                    "type": "string",
                    "description": "Straßenadresse einschließlich Hausnummer und Straßentyp. Falls weggelassen, wird sie aus `address` abgeleitet."
                  },
                  "address_element_2": {
                    "type": "string",
                    "description": "Wohnung, Einheit, Gebäude, Etage oder zusätzliche Adresszeile. Nur senden, wenn explizit vorhanden."
                  },
                  "address_element_3": {
                    "type": "string",
                    "description": "Stadt, Vorort, Bezirk, Ortschaft oder Stadtteil. Falls weggelassen, wird der Wert aus `address` abgeleitet."
                  },
                  "address_element_4": {
                    "type": "string",
                    "description": "Bundesland, Provinz, Region oder Ort. Falls weggelassen, abgeleitet aus `address`."
                  },
                  "address_element_5": {
                    "type": "string",
                    "description": "Postleitzahl. `postal_code` wird als Alias akzeptiert."
                  },
                  "postal_code": {
                    "type": "string",
                    "description": "Postleitzahl für adressbasierte Dienste (Alias von `address_element_5`)."
                  },
                  "driver_license_number": {
                    "type": "string",
                    "description": "Führerscheinnummer für staatliche Dokumentenprüfungsdienste (AUS, NZL, IND)."
                  },
                  "driver_license_card_number": {
                    "type": "string",
                    "description": "Physische Führerscheinkartennummer, sofern separat von der Führerscheinnummer erforderlich (AUS)."
                  },
                  "driver_license_state": {
                    "type": "string",
                    "description": "Ausstellungsstaat oder -territorium des Führerscheins (AUS)."
                  },
                  "driver_license_version": {
                    "type": "string",
                    "description": "Führerschein-Versionscode (NZL)."
                  },
                  "passport_number": {
                    "type": "string",
                    "description": "Reisepassnummer für behördliche Reisepass-Verifizierungsdienste (AUS, NZL, IND, CHN)."
                  },
                  "passport_expiration_date": {
                    "type": "string",
                    "format": "date",
                    "description": "Ablaufdatum des Reisepasses, `YYYY-MM-DD`, für Reisepass-Verifizierungsdienste."
                  },
                  "passport_file_number": {
                    "type": "string",
                    "description": "Reisepass-Aktenzeichen (IND)."
                  },
                  "passport_issue_country": {
                    "type": "string",
                    "description": "Ausstellungsland des Reisepasses (ISO 3166-1 Alpha-3) für Passverifizierungsdienste."
                  },
                  "medicare_card_number": {
                    "type": "string",
                    "description": "Medicare-Kartennummer (AUS)."
                  },
                  "immi_card_number": {
                    "type": "string",
                    "description": "Nummer der australischen ImmiCard."
                  },
                  "immi_card_expiry_date": {
                    "type": "string",
                    "format": "date",
                    "description": "Ablaufdatum der australischen ImmiCard."
                  },
                  "citizenship_certificate_number": {
                    "type": "string",
                    "description": "Staatsbürgerschaftszertifikatsnummer (AUS)."
                  },
                  "birth_registration_number": {
                    "type": "string",
                    "description": "Registrierungsnummer der Geburtsurkunde (AUS)."
                  },
                  "birth_registration_date": {
                    "type": "string",
                    "format": "date",
                    "description": "Registrierungsdatum der Geburtsurkunde (AUS)."
                  },
                  "birth_registration_state": {
                    "type": "string",
                    "description": "Registrierungsstaat der Geburtsurkunde (AUS)."
                  },
                  "marriage_certificate_number": {
                    "type": "string",
                    "description": "Nummer der Heiratsurkunde (AUS)."
                  },
                  "change_of_name_certificate_number": {
                    "type": "string",
                    "description": "Nummer der Namensänderungsurkunde (AUS)."
                  },
                  "first_partner_name": {
                    "type": "string",
                    "description": "Vorname des Partners auf einer Heiratsurkunde (AUS)."
                  },
                  "last_partner_name": {
                    "type": "string",
                    "description": "Nachname des Partners auf einer Heiratsurkunde (AUS)."
                  },
                  "voter_id": {
                    "type": "string",
                    "description": "Wählerregisternummer (IND EPIC, IRL)."
                  },
                  "epic_card": {
                    "type": "string",
                    "description": "Indische EPIC-Wählerausweisnummer."
                  },
                  "pan": {
                    "type": "string",
                    "description": "Indische PAN (Permanent Account Number)."
                  },
                  "national_id": {
                    "type": "string",
                    "description": "Nationale Identifikationsnummer (CHN, MYS, KEN, KHM, NGA, ZAF, …)."
                  },
                  "cic": {
                    "type": "string",
                    "description": "Mexikanischer INE/IFE Código de Identificación de Credencial (CIC), 9 Ziffern. Wird vom mexikanischen INE-Ausweisgültigkeitsdienst (`mex_ine_vigencia`) verwendet."
                  },
                  "identificador_ciudadano": {
                    "type": "string",
                    "description": "Mexikanischer INE Identificador del Ciudadano (9 Ziffern). Wird zusammen mit `cic` für moderne INE-Modelle (E/F/G/H) in `mex_ine_vigencia` verwendet."
                  },
                  "ocr": {
                    "type": "string",
                    "description": "Mexikanische INE-OCR-Nummer (13 Ziffern, Rückseite der Karte). Wird zusammen mit `cic` für Modell D in `mex_ine_vigencia` verwendet."
                  },
                  "voter_number": {
                    "type": "string",
                    "description": "Mexikanische INE Clave de Elector (18 Zeichen). Wird zusammen mit `emission_number` für ältere IFE-Modelle (A/B/C) in `mex_ine_vigencia` verwendet."
                  },
                  "emission_number": {
                    "type": "string",
                    "description": "Mexikanische INE Número de Emisión. Wird zusammen mit `voter_number` für ältere IFE-Modelle (A/B/C) in `mex_ine_vigencia` verwendet."
                  },
                  "bvn": {
                    "type": "string",
                    "description": "Nigerianische Bank Verification Number."
                  },
                  "bank_card_number": {
                    "type": "string",
                    "description": "Bankkartennummer (CHN-Bankkartenverifizierung)."
                  },
                  "company_registration_number": {
                    "type": "string",
                    "description": "Vom Unternehmensregister ausgestellte Unternehmensregisternummer: der CNPJ in Brasilien (z. B. `11222333000181`), die Registernummer in Südafrika (z. B. `1936/007721/06`). Erforderlich für die Dienste für Unternehmensregister und Unternehmensgeschäftsführer (`bra_company_registry`, `bra_company_directors`, `zaf_company_registry`, `zaf_company_directors`)."
                  },
                  "company_name": {
                    "type": "string",
                    "description": "Eingetragener Unternehmensname, abgeglichen mit dem Registereintrag. Optional für `zaf_company_registry`."
                  },
                  "initials": {
                    "type": "string",
                    "description": "Die Initialen der Person, wie auf dem Dokument aufgedruckt. Erforderlich für `zaf_drivers_license`; akzeptiert von `zaf_bank_account_holder`."
                  },
                  "licence_number": {
                    "type": "string",
                    "description": "Führerscheinnummer wie auf der Karte aufgedruckt, für `zaf_drivers_license`. Bei Weglassen wird `document_number` verwendet."
                  },
                  "refugee_file_number": {
                    "type": "string",
                    "description": "Flüchtlingsaktennummer, ausgestellt vom Department of Home Affairs in Südafrika. Erforderlich für `zaf_refugee`."
                  },
                  "bank_name": {
                    "type": "string",
                    "description": "Name der kontoführenden Bank. Erforderlich für `zaf_bank_account_holder`."
                  },
                  "bank_account_number": {
                    "type": "string",
                    "description": "Bankkontonummer. Erforderlich für `zaf_bank_account_holder`; akzeptiert von `zaf_fraud_prevention`."
                  },
                  "account_type": {
                    "type": "string",
                    "description": "Bankkontotyp für `zaf_bank_account_holder`: `current`, `savings`, `transmission`, `subscriptionShare` oder `notKnown`, ohne Berücksichtigung der Groß-/Kleinschreibung. Jeder andere Wert gibt `400` zurück. Lassen Sie das Feld weg, wenn Sie den Typ nicht kennen: Der Kontotyp-Abgleich wird dann als nicht bestätigt gemeldet."
                  },
                  "phone_number": {
                    "type": "string",
                    "description": "Mobiltelefonnummer des Kontakts für die Dienste, die die Erreichbarkeit überprüfen (`zaf_bank_account_holder`, `zaf_fraud_prevention`, `zaf_refugee`)."
                  },
                  "right_thumb": {
                    "type": "string",
                    "description": "Base64-kodierter rechter Daumenabdruck für `zaf_dha_fingerprint_match`, zusammen mit `left_thumb` oder alleinstehend."
                  },
                  "left_thumb": {
                    "type": "string",
                    "description": "Base64-kodierter linker Daumenabdruck für `zaf_dha_fingerprint_match`, zusammen mit `right_thumb` oder alleinstehend."
                  },
                  "score_level": {
                    "type": "integer",
                    "description": "Minimale biometrische Score-Stufe für `zaf_criminal_face_screening`. Standardwert ist `3`."
                  },
                  "max_matches": {
                    "type": "integer",
                    "description": "Maximale Anzahl potenzieller Treffer, die `zaf_criminal_face_screening` zurückgibt. Standardwert ist `1`."
                  },
                  "vehicle_register_number": {
                    "type": "string",
                    "description": "Fahrzeugregisternummer. Erforderlich, zusammen mit `vehicle_licence_plate` und `vin`, für `zaf_vehicle_ownership`."
                  },
                  "vehicle_licence_plate": {
                    "type": "string",
                    "description": "Kfz-Kennzeichen. Erforderlich, zusammen mit `vehicle_register_number` und `vin`, für `zaf_vehicle_ownership`."
                  },
                  "vin": {
                    "type": "string",
                    "description": "Fahrzeug-Identifizierungsnummer (FIN bzw. Fahrgestellnummer). Erforderlich, zusammen mit `vehicle_register_number` und `vehicle_licence_plate`, für `zaf_vehicle_ownership`."
                  },
                  "ssn": {
                    "type": "string",
                    "description": "Social Security Number (USA)."
                  },
                  "phone": {
                    "type": "string",
                    "description": "Telefonnummer für Telefonverifizierungsdienste."
                  },
                  "landline": {
                    "type": "string",
                    "description": "Festnetznummer für Telefonverifizierungsdienste."
                  },
                  "email": {
                    "type": "string",
                    "format": "email",
                    "description": "E-Mail-Adresse für Identitätsverifizierungsdienste."
                  },
                  "country_of_residence": {
                    "type": "string",
                    "description": "ISO 3166-1-Alpha-2-Wohnsitzland. Wird von globalen Identitätsanreicherungsdiensten (z. B. `glb_identity_enrichment`) verwendet, um die Abfrage einzugrenzen.",
                    "example": "US"
                  },
                  "partial_match_action": {
                    "type": "string",
                    "enum": [
                      "DECLINE",
                      "NO_ACTION"
                    ],
                    "default": "NO_ACTION",
                    "description": "Auswirkung von `partial_match` auf `database_validation.status`. Standardwert ist `NO_ACTION` (Status bleibt `Approved`, mit einer Warnung)."
                  },
                  "no_match_action": {
                    "type": "string",
                    "enum": [
                      "DECLINE",
                      "NO_ACTION"
                    ],
                    "default": "DECLINE",
                    "description": "Auswirkung von `no_match` auf `database_validation.status`. Standardwert ist `DECLINE`."
                  },
                  "save_api_request": {
                    "type": "boolean",
                    "default": true,
                    "description": "Die Validierung als Sitzung beibehalten (Sichtbarkeit in der Konsole, Entscheidungs-Endpoint, `status.updated`-Webhook). Ändert auch die Struktur der `validations`-Antwort: Pro-Dienst-Objekte bei `true` (Standard), eine zusammengeführte Feldzuordnung bei `false`."
                  },
                  "vendor_data": {
                    "type": "string",
                    "description": "Ihre Kennung für den validierten Benutzer; wird zurückgegeben und mit der Sitzung gespeichert."
                  },
                  "metadata": {
                    "type": "object",
                    "nullable": true,
                    "description": "Freiform-JSON, das mit der Anfrage gespeichert und zurückgegeben wird."
                  },
                  "selfie": {
                    "type": "string",
                    "format": "binary",
                    "description": "Selfie-Bild (`jpg`, `jpeg`, `png`, `webp`; max. 2 MB – Bilder werden vor dem Hochladen in das Register auf ~1,5 MB komprimiert) für biometrische Validierungsdienste, z. B. argentinische RENAPER (`arg_renaper`) und Panama SIB (`pan_cedula_sib`, `pan_cedula_sib_plus`). Erforderlich, wenn ein ausgewählter Dienst dies als Pflichtfeld auflistet. Nur über `multipart/form-data` verfügbar."
                  }
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X POST https://verification.didit.me/v3/database-validation/ \\\n  -H 'x-api-key: YOUR_API_KEY' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\n    \"issuing_state\": \"BRA\",\n    \"services\": [\"bra_cpf\"],\n    \"identification_number\": \"12345678900\",\n    \"first_name\": \"John\",\n    \"last_name\": \"Doe\",\n    \"date_of_birth\": \"1980-01-01\",\n    \"vendor_data\": \"user-1234\"\n  }'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.database_validation.validate(\n    issuing_state=\"BRA\",\n    services=[\"bra_cpf\"],\n    identification_number=\"12345678900\",\n    first_name=\"John\",\n    last_name=\"Doe\",\n    date_of_birth=\"1980-01-01\",\n    vendor_data=\"user-1234\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.databaseValidation.validate({\n  issuing_state: \"BRA\",\n  services: [\"bra_cpf\"],\n  identification_number: \"12345678900\",\n  first_name: \"John\",\n  last_name: \"Doe\",\n  date_of_birth: \"1980-01-01\",\n  vendor_data: \"user-1234\",\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.DatabaseValidation.Validate(ctx, didit.DatabaseValidationValidateParams{\n\tIssuingState:         \"BRA\",\n\tServices:             didit.Some([]string{\"bra_cpf\"}),\n\tIdentificationNumber: didit.String(\"12345678900\"),\n\tFirstName:            didit.String(\"John\"),\n\tLastName:             didit.String(\"Doe\"),\n\tDateOfBirth:          didit.String(\"1980-01-01\"),\n\tVendorData:           didit.String(\"user-1234\"),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import java.time.LocalDate;\nimport java.util.List;\nimport me.didit.Didit;\nimport me.didit.types.DatabaseValidationValidateParams;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.databaseValidation().validate(DatabaseValidationValidateParams.builder()\n        .issuingState(\"BRA\")\n        .services(List.of(\"bra_cpf\"))\n        .identificationNumber(\"12345678900\")\n        .firstName(\"John\")\n        .lastName(\"Doe\")\n        .dateOfBirth(LocalDate.parse(\"1980-01-01\"))\n        .vendorData(\"user-1234\")\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->databaseValidation->validate([\n    'issuing_state' => 'BRA',\n    'services' => ['bra_cpf'],\n    'identification_number' => '12345678900',\n    'first_name' => 'John',\n    'last_name' => 'Doe',\n    'date_of_birth' => '1980-01-01',\n    'vendor_data' => 'user-1234',\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.database_validation.validate(\n  issuing_state: \"BRA\",\n  services: [\"bra_cpf\"],\n  identification_number: \"12345678900\",\n  first_name: \"John\",\n  last_name: \"Doe\",\n  date_of_birth: \"1980-01-01\",\n  vendor_data: \"user-1234\"\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.DatabaseValidation.ValidateAsync(new DatabaseValidationValidateParams\n{\n    IssuingState = \"BRA\",\n    Services = new string[] { \"bra_cpf\" },\n    IdentificationNumber = \"12345678900\",\n    FirstName = \"John\",\n    LastName = \"Doe\",\n    DateOfBirth = \"1980-01-01\",\n    VendorData = \"user-1234\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "responses": {
          "200": {
            "description": "Validierung abgeschlossen – mindestens ein ausgewählter Dienst hat ein verwertbares Ergebnis zurückgegeben. Prüfen Sie `database_validation.match_type` für das Gesamtergebnis, `validations` für die feldbezogenen Vergleiche und `outcome_code`s pro Dienst sowie `errors` (sofern vorhanden) für Dienste, die fehlgeschlagen sind.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "request_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "Beibehaltene Sitzungs-ID, wenn `save_api_request=true` (verwendbar mit `GET /v3/session/{sessionId}/decision/`); andernfalls eine vorübergehende Korrelations-UUID."
                    },
                    "database_validation": {
                      "type": "object",
                      "properties": {
                        "status": {
                          "type": "string",
                          "enum": [
                            "Approved",
                            "Declined",
                            "In Review"
                          ],
                          "description": "`Declined`, wenn der übergreifende `match_type` eine `DECLINE`-Aktion auslöst (`no_match_action` ist standardmäßig `DECLINE`, `partial_match_action` ist standardmäßig `NO_ACTION`); `In Review`, wenn kein Dienst einen verwertbaren Abgleich geliefert hat, beispielsweise wenn der einzige ausgewählte Dienst `REGISTRY_UNAVAILABLE` oder `INCONCLUSIVE` zurückgegeben hat; andernfalls `Approved`. Eine Anfrage, bei der mehrere Dienste ausgewählt wurden, kann bei der Übereinstimmung eines Dienstes `Approved` sein, während ein anderer nicht verfügbar war; prüfen Sie daher auch `errors` und die `outcome_code`-Werte der einzelnen Dienste."
                        },
                        "issuing_state": {
                          "type": "string",
                          "description": "Echo des ISO-3166-1-Alpha-3-Ländercodes, gegen den validiert wurde.",
                          "example": "BRA"
                        },
                        "validation_type": {
                          "type": "string",
                          "enum": [
                            "one_by_one",
                            "two_by_two"
                          ],
                          "description": "Aus den Ergebnissen abgeleitet: `two_by_two`, wenn ≥2 unterschiedliche Dienste eine vollständige Übereinstimmung geliefert haben (bei der Identifikationsnummer, beim vollständigen Namen und Geburtsdatum zusammen oder bei der Adresse ohne Widersprüche); andernfalls `one_by_one`. (Das gleichnamige Anfragefeld ist veraltet und wird ignoriert.)"
                        },
                        "screened_data": {
                          "type": "object",
                          "description": "Wiedergabe der Eingabefelder, die an die ausgewählten Dienste gesendet wurden (Datumsangaben normalisiert auf `YYYY-MM-DD`; ein `selfie` wird, sofern gesendet, als vorab signierte URL zurückgegeben; `consent_obtained: true` wird hinzugefügt, wenn eine Einwilligung erteilt wurde)."
                        },
                        "match_type": {
                          "type": "string",
                          "nullable": true,
                          "enum": [
                            "full_match",
                            "partial_match",
                            "no_match"
                          ],
                          "description": "Gesamtergebnis aggregiert über Dienste mit Vergleichen auf Feldebene: ein `full_match` → `full_match`; andernfalls ein `partial_match` → `partial_match`; andernfalls `no_match`. Dienste, die nur ein Ergebnis liefern, wie z. B. biometrisches strafrechtliches Screening, können `null` zurückgeben; prüfen Sie jeden Eintrag in `validations` auf seinen `outcome_code`."
                        },
                        "validations": {
                          "description": "Die Struktur hängt von `save_api_request` ab. **`true` (Standard):** ein Array von Objekten pro Dienst (`service_id`, `service_name`, `validation`, `outcome_code`, `outcome_detail`, `source_data`). **`false`:** ein einzelnes flaches Objekt, das die Ergebnisse aller Dienste auf Feldebene zusammenführt (`{\"full_name\": \"full_match\", ...}`).",
                          "oneOf": [
                            {
                              "type": "array",
                              "items": {
                                "type": "object",
                                "description": "Validierungsergebnis pro Dienst (wird zurückgegeben, wenn `save_api_request=true`, der Standardwert).",
                                "properties": {
                                  "service_id": {
                                    "type": "string",
                                    "description": "Katalog-ID des Dienstes, der dieses Ergebnis erzeugt hat (z. B. `bra_cpf`).",
                                    "example": "bra_cpf"
                                  },
                                  "service_name": {
                                    "type": "string",
                                    "description": "Lesbarer Katalogname des Dienstes.",
                                    "example": "Brazil - CPF status check"
                                  },
                                  "validation": {
                                    "type": "object",
                                    "description": "Feldweiser Abgleich zwischen Ihrer Eingabe und dem Registereintrag. Schlüssel sind kanonische Feldnamen (`full_name`, `date_of_birth`, `identification_number`, `address`, …); Werte sind `full_match`, `partial_match` oder `no_match`.",
                                    "additionalProperties": {
                                      "type": "string",
                                      "enum": [
                                        "full_match",
                                        "partial_match",
                                        "no_match"
                                      ]
                                    }
                                  },
                                  "outcome_code": {
                                    "type": "string",
                                    "enum": [
                                      "MATCH",
                                      "PARTIAL_MATCH",
                                      "NO_MATCH",
                                      "DOCUMENT_NOT_FOUND",
                                      "INVALID_DOCUMENT_FORMAT",
                                      "INVALID_INPUT",
                                      "MINOR_BLOCKED",
                                      "DECEASED",
                                      "BIOMETRIC_NO_MATCH",
                                      "BIOMETRIC_IMAGE_UNUSABLE",
                                      "INCONCLUSIVE",
                                      "DOCUMENT_SUPERSEDED",
                                      "REGISTRY_UNAVAILABLE",
                                      "REGISTRY_ERROR"
                                    ],
                                    "description": "Anbieterunabhängiges Ergebnis des Registerabgleichs. `MATCH`/`PARTIAL_MATCH`/`NO_MATCH` beschreiben den Abgleich; `DOCUMENT_NOT_FOUND` bedeutet, dass die Kennung nicht im Register vorhanden ist; `INCONCLUSIVE` bedeutet, dass das Register dies weder bestätigen noch verneinen konnte (zur Prüfung weitergeleitet – KEINE Nicht-Übereinstimmung); `BIOMETRIC_NO_MATCH` ist eine eindeutige Nicht-Übereinstimmung des Gesichts, während `BIOMETRIC_IMAGE_UNUSABLE` ein technisches Bildproblem darstellt (Selfie erneut aufnehmen); `DECEASED`/`MINOR_BLOCKED` sind richtlinienbasierte Registerergebnisse; `DOCUMENT_SUPERSEDED` bedeutet, dass die Identität übereinstimmte, aber die vorgelegte Version des Dokuments nicht der hinterlegten entspricht (es wurde eine neuere Version ausgestellt); `INVALID_DOCUMENT_FORMAT`/`INVALID_INPUT` bedeuten, dass das Register selbst die gesendeten Daten abgelehnt hat; `REGISTRY_UNAVAILABLE`/`REGISTRY_ERROR` weisen auf Upstream-Fehler hin."
                                  },
                                  "outcome_detail": {
                                    "type": "string",
                                    "nullable": true,
                                    "description": "Unverarbeitete Upstream-Statusdetails, die dem Ergebniscode zugrunde liegen (z. B. ein HTTP- oder Register-Statuscode)."
                                  },
                                  "source_data": {
                                    "type": "object",
                                    "nullable": true,
                                    "description": "Bereinigte, normalisierte Ansicht des Registerdatensatzes unter Verwendung kanonischer Feldnamen (`identification_number`, `first_name`, `last_name`, `date_of_birth` sowie registerspezifischer Flags). Bildfelder werden, sofern vorhanden, als vorab signierte URLs zurückgegeben."
                                  }
                                }
                              }
                            },
                            {
                              "type": "object",
                              "additionalProperties": {
                                "type": "string",
                                "enum": [
                                  "full_match",
                                  "partial_match",
                                  "no_match"
                                ]
                              },
                              "description": "Zusammengeführte Ergebnisse auf Feldebene (zustandslose Struktur bei `save_api_request=false`)."
                            }
                          ]
                        },
                        "warnings": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "feature": {
                                "type": "string",
                                "description": "Funktion, die die Warnung ausgelöst hat."
                              },
                              "risk": {
                                "type": "string",
                                "description": "Maschinenlesbare Risiko-Kennung."
                              },
                              "additional_data": {
                                "type": "object",
                                "nullable": true,
                                "description": "Zusätzlicher Kontext für die Warnung, sofern verfügbar."
                              },
                              "log_type": {
                                "type": "string",
                                "description": "`warning`, `information` oder `error` – wie sich das Risiko auf das Ergebnis ausgewirkt hat."
                              },
                              "short_description": {
                                "type": "string",
                                "description": "Einzeilige, lesbare Zusammenfassung."
                              },
                              "long_description": {
                                "type": "string",
                                "description": "Vollständige menschenlesbare Erklärung."
                              }
                            }
                          },
                          "description": "`DATABASE_VALIDATION_NO_MATCH` oder `DATABASE_VALIDATION_PARTIAL_MATCH`, falls zutreffend; leer bei vollständiger Übereinstimmung."
                        },
                        "errors": {
                          "type": "array",
                          "description": "Nur vorhanden, wenn einige (aber nicht alle) ausgewählten Dienste fehlgeschlagen sind. Jeder Eintrag enthält `service_id`, `code`, `message` und `retryable`. Ein hier gemeldeter Dienst fehlt in `validations` sowie `services_used` und wird nicht abgerechnet. Dieses Array ist der einzige Ort, an dem er erscheint; prüfen Sie es daher auch dann, wenn `status` auf `Approved` steht.",
                          "items": {
                            "type": "object",
                            "properties": {
                              "service_id": {
                                "type": "string"
                              },
                              "code": {
                                "type": "string",
                                "example": "empty_provider_response"
                              },
                              "message": {
                                "type": "string"
                              },
                              "retryable": {
                                "type": "boolean",
                                "description": "`true`, wenn der Dienst keine Antwort geliefert hat und ein späterer Wiederholungsversuch erfolgreich sein kann; `false`, wenn die Quelle die gesendeten Daten verweigert hat und die Eingabe zuerst korrigiert werden muss.",
                                "example": true
                              }
                            }
                          }
                        },
                        "services_used": {
                          "type": "array",
                          "items": {
                            "type": "string"
                          },
                          "description": "Katalog-IDs der Dienste, die ein abrechenbares Ergebnis zurückgegeben haben. **Nur vorhanden, wenn die Anfrage explizit `services` gesendet hat.**"
                        },
                        "match_score": {
                          "type": "number",
                          "description": "Anteil (0.0–1.0) der versuchten Dienste, die eine vollständige Übereinstimmung ergaben (bei der Identifikationsnummer, beim vollständigen Namen + Geburtsdatum zusammen oder bei der Adresse ohne Widersprüche). **Nur vorhanden, wenn in der Anfrage explizit `services` gesendet wurde.**"
                        }
                      }
                    },
                    "vendor_data": {
                      "type": "string",
                      "nullable": true,
                      "description": "Wiedergabe der von Ihnen gesendeten `vendor_data`."
                    },
                    "metadata": {
                      "type": "object",
                      "nullable": true,
                      "description": "Rückgabe der von Ihnen gesendeten `metadata`."
                    },
                    "created_at": {
                      "type": "string",
                      "format": "date-time"
                    }
                  }
                },
                "examples": {
                  "Full match (Approved)": {
                    "summary": "Standard save_api_request=true – dienstspezifische `validations`-Objekte",
                    "value": {
                      "request_id": "7f9a1c0e-1f2b-4f6e-9d3a-2b1c0e7f9a1c",
                      "database_validation": {
                        "status": "Approved",
                        "issuing_state": "BRA",
                        "validation_type": "one_by_one",
                        "screened_data": {
                          "tax_number": "12345678900",
                          "first_name": "John",
                          "last_name": "Doe",
                          "date_of_birth": "1980-01-01"
                        },
                        "match_type": "full_match",
                        "validations": [
                          {
                            "validation": {
                              "full_name": "full_match",
                              "date_of_birth": "full_match",
                              "identification_number": "full_match"
                            },
                            "outcome_code": "MATCH",
                            "outcome_detail": "200",
                            "service_id": "bra_cpf",
                            "service_name": "Brazil - CPF status check",
                            "source_data": {
                              "identification_number": "12345678900",
                              "first_name": "JOHN",
                              "last_name": "DOE",
                              "date_of_birth": "1980-01-01",
                              "lgpd_minor": false,
                              "minor_under_16": false,
                              "minor_under_18": false
                            }
                          }
                        ],
                        "warnings": []
                      },
                      "vendor_data": "user-1234",
                      "metadata": null,
                      "created_at": "2026-06-11T10:30:00.000000+00:00"
                    }
                  },
                  "Explicit services (extended shape)": {
                    "summary": "Anfrage mit `services` gesendet — Antwort ergänzt `services_used` und `match_score`",
                    "value": {
                      "request_id": "b3e7c1a2-9d4f-4f0b-8a6c-5e2d1f0a9b3e",
                      "database_validation": {
                        "status": "Approved",
                        "issuing_state": "BRA",
                        "validation_type": "one_by_one",
                        "screened_data": {
                          "tax_number": "12345678900",
                          "first_name": "John",
                          "last_name": "Doe",
                          "date_of_birth": "1980-01-01"
                        },
                        "match_type": "full_match",
                        "validations": [
                          {
                            "validation": {
                              "full_name": "full_match",
                              "date_of_birth": "full_match",
                              "identification_number": "full_match"
                            },
                            "outcome_code": "MATCH",
                            "outcome_detail": "200",
                            "service_id": "bra_cpf",
                            "service_name": "Brazil - CPF status check",
                            "source_data": {
                              "identification_number": "12345678900",
                              "first_name": "JOHN",
                              "last_name": "DOE",
                              "date_of_birth": "1980-01-01",
                              "lgpd_minor": false,
                              "minor_under_16": false,
                              "minor_under_18": false
                            }
                          }
                        ],
                        "warnings": [],
                        "services_used": [
                          "bra_cpf"
                        ],
                        "match_score": 1.0
                      },
                      "vendor_data": "user-1234",
                      "metadata": null,
                      "created_at": "2026-06-11T10:30:00.000000+00:00"
                    }
                  },
                  "No match (Declined)": {
                    "summary": "Registereintrag stimmt nicht überein — Standardwert `no_match_action=DECLINE`",
                    "value": {
                      "request_id": "0a1b2c3d-4e5f-6789-abcd-ef0123456789",
                      "database_validation": {
                        "status": "Declined",
                        "issuing_state": "BRA",
                        "validation_type": "one_by_one",
                        "screened_data": {
                          "tax_number": "12345678900",
                          "first_name": "John",
                          "last_name": "Doe",
                          "date_of_birth": "1980-01-01"
                        },
                        "match_type": "no_match",
                        "validations": [
                          {
                            "validation": {
                              "full_name": "no_match",
                              "date_of_birth": "no_match",
                              "identification_number": "no_match"
                            },
                            "outcome_code": "NO_MATCH",
                            "outcome_detail": "200",
                            "service_id": "bra_cpf",
                            "service_name": "Brazil - CPF status check",
                            "source_data": {
                              "identification_number": "00987654321",
                              "first_name": "TOTALLY",
                              "last_name": "DIFFERENT NAME",
                              "date_of_birth": "1999-01-01",
                              "lgpd_minor": false,
                              "minor_under_16": false,
                              "minor_under_18": false
                            }
                          }
                        ],
                        "warnings": [
                          {
                            "feature": "DATABASE_VALIDATION",
                            "risk": "DATABASE_VALIDATION_NO_MATCH",
                            "additional_data": null,
                            "log_type": "error",
                            "short_description": "Database validation no match",
                            "long_description": "The system identified a no match in the database validation, requiring further investigation."
                          }
                        ]
                      },
                      "vendor_data": null,
                      "metadata": null,
                      "created_at": "2026-06-11T10:31:00.000000+00:00"
                    }
                  },
                  "Stateless (save_api_request=false)": {
                    "summary": "`validations` wird zu einer zusammengeführten Feld-Map zusammengefasst; es wird nichts gespeichert",
                    "value": {
                      "request_id": "c4d5e6f7-8901-2345-6789-abcdef012345",
                      "database_validation": {
                        "status": "Approved",
                        "issuing_state": "BRA",
                        "validation_type": "one_by_one",
                        "screened_data": {
                          "tax_number": "12345678900",
                          "first_name": "John",
                          "last_name": "Doe",
                          "date_of_birth": "1980-01-01"
                        },
                        "match_type": "full_match",
                        "validations": {
                          "full_name": "full_match",
                          "date_of_birth": "full_match",
                          "identification_number": "full_match"
                        },
                        "warnings": []
                      },
                      "vendor_data": null,
                      "metadata": null,
                      "created_at": "2026-06-11T10:32:00.000000+00:00"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Validierungsfehler – es wird nichts abgerechnet. Preflight-Feldfehler treten vor jedem externen Aufruf auf. Wenn jeder unbeantwortete Versuch die Eingabe explizit ablehnt, enthält die Antwort stattdessen `validation_errors` mit `code: provider_rejected_input` und `retryable: false`; korrigieren Sie die Eingabe vor einem Wiederholungsversuch. Probleme auf Feldebene nutzen den Standard-Envelope von DRF; Katalogprobleme geben ein `services`-Array zurück (plus `requires_onboarding` oder `services_requiring_consent`, falls relevant); Fehler zu fehlenden Feldern enthalten `fields_required_by`, das jedes fehlende Feld den Diensten zuordnet, die es erfordern; Dienste, die mindestens eine zusätzliche Kennung benötigen (z. B. `usa_states_credit_bureau`, das einen Namen allein nicht verifizieren kann), geben `any_field_required_by` zurück, das jeden Dienst den Feldern zuordnet, von denen mindestens eines vorhanden sein muss; Formatprobleme, die pro Dienst geprüft werden, geben `invalid_fields_by_service` zurück.",
            "content": {
              "application/json": {
                "examples": {
                  "Invalid issuing_state": {
                    "summary": "Land nicht unterstützt – Meldung listet alle gültigen Alpha-3-Codes auf",
                    "value": {
                      "error": [
                        "Invalid issuing state. Valid options are: ARE, ARG, AUS, AUT, BEL, BGD, BOL, BRA, CAN, CHE, CHL, CHN, CIV, COL, CRI, CZE, DEU, DNK, DOM, ECU, ESP, FIN, FRA, GBR, GHA, GLB, GRC, GTM, HKG, HND, IDN, IND, IRL, ITA, KEN, KHM, MAR, MEX, MYS, NGA, NLD, NOR, NZL, OMN, PAN, PER, PHL, POL, PRT, PRY, QAT, SGP, SLV, SVK, SWE, THA, UGA, URY, USA, VEN, ZAF, ZMB, ZWE"
                      ]
                    }
                  },
                  "Missing required fields": {
                    "summary": "Vereinigung der erforderlichen Felder über ausgewählte Dienste hinweg mit dem Hinweis für universelle Felder",
                    "value": {
                      "error": [
                        "Missing required fields: tax_number (or use 'identification_number' which maps to 'tax_number' for BRA)"
                      ],
                      "fields_required_by": {
                        "tax_number": [
                          "bra_cpf"
                        ]
                      }
                    }
                  },
                  "Unknown service id": {
                    "summary": "`services` enthält eine ID, die nicht im Katalog vorhanden ist",
                    "value": {
                      "services": [
                        "Unknown service_id(s): ['bogus_service']"
                      ]
                    }
                  },
                  "Service not live for country": {
                    "summary": "`services` nennt einen Dienst aus einem anderen Land (oder einen Dummy-Eintrag)",
                    "value": {
                      "services": [
                        "Services not currently live for PER: ['bra_cpf']. Available services: ['per_dni', 'per_residential', 'per_tax_registration']"
                      ]
                    }
                  },
                  "Service requires onboarding": {
                    "summary": "Dienst existiert, ist aber für Ihre Organisation noch nicht aktiviert",
                    "value": {
                      "services": [
                        "Services require onboarding before they can be enabled for AUS: ['aus_australia_driver_licence']. Contact Didit support to activate them."
                      ],
                      "requires_onboarding": [
                        "aus_australia_driver_licence"
                      ]
                    }
                  },
                  "Consent missing": {
                    "summary": "Ein ausgewählter Dienst ist mit requires_consent=true gekennzeichnet und `consent` war nicht `true`",
                    "value": {
                      "consent": [
                        "Explicit end-user consent is required for these database validation services: ['chn_national_id']. Send `consent=true`."
                      ],
                      "services_requiring_consent": [
                        "chn_national_id"
                      ]
                    }
                  },
                  "Country format rule violation": {
                    "summary": "Kennung entspricht nicht der Formatregel des Landes (Länge/Ziffern/Regex)",
                    "value": {
                      "tax_number": [
                        "Invalid tax number for BRA: Brazilian CPF (exactly 11 digits). Must be exactly 11 characters long (got 10)."
                      ]
                    }
                  },
                  "Service-specific format violation": {
                    "summary": "Ein Feld erfüllt nicht die Formatierungsanforderungen des ausgewählten Dienstes",
                    "value": {
                      "error": [
                        "One or more fields do not match the format required by the selected service."
                      ],
                      "invalid_fields_by_service": {
                        "chn_national_id": [
                          "national_id_format"
                        ]
                      }
                    }
                  },
                  "Input refused by every attempt": {
                    "summary": "Korrigieren Sie die Eingabe vor dem Wiederholungsversuch",
                    "value": {
                      "error": "The source refused to run this query with the supplied input.",
                      "validation_errors": [
                        {
                          "service_id": "bra_cpf",
                          "code": "provider_rejected_input",
                          "message": "The source refused to run this query with the supplied input.",
                          "retryable": false
                        }
                      ]
                    }
                  }
                },
                "schema": {
                  "type": "object",
                  "additionalProperties": true,
                  "properties": {
                    "error": {
                      "description": "Erklärung auf Anfrageebene oder Preflight-Feldfehler.",
                      "oneOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "array",
                          "items": {
                            "type": "string"
                          }
                        }
                      ]
                    },
                    "validation_errors": {
                      "type": "array",
                      "description": "Vorhanden, wenn jeder unbeantwortete Versuch die Eingabe nach dem Preflight abgelehnt hat.",
                      "items": {
                        "type": "object",
                        "properties": {
                          "service_id": {
                            "type": "string"
                          },
                          "code": {
                            "type": "string"
                          },
                          "message": {
                            "type": "string"
                          },
                          "retryable": {
                            "type": "boolean",
                            "description": "Gibt an, ob ein späterer Wiederholungsversuch diesen Dienstfehler beheben kann. False bedeutet, dass zuerst die bereitgestellte Eingabe korrigiert werden muss."
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Zugriff verweigert. Wird zurückgegeben, wenn der Header `x-api-key` fehlt sowie wenn das Guthaben der aufrufenden Organisation den Aufruf nicht decken kann; ein falscher, widerrufener oder abgelaufener Schlüssel gibt `401` zurück. Ein fehlender Schlüssel gibt `403` mit `{\"detail\": ...}` zurück; ein falscher, widerrufener oder abgelaufener Schlüssel gibt `401` zurück. Unzureichende Credits geben `403` mit `{\"error\": ...}` zurück, bevor ein Screening- oder Anbieteraufruf stattfindet.",
            "content": {
              "application/json": {
                "examples": {
                  "Missing or invalid API key": {
                    "summary": "Kein `x-api-key`-Header, oder der Schlüssel ist ungültig/widerrufen",
                    "value": {
                      "detail": "You do not have permission to perform this action."
                    }
                  },
                  "Not enough credits": {
                    "summary": "Das Guthaben der Organisation reicht für den Aufruf nicht aus",
                    "value": {
                      "error": "You don't have enough credits to perform this request. Please top up at https://business.didit.me"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate-Limit überschritten. POST/PATCH/DELETE-Endpoints teilen sich ein Budget von 300 Schreibanfragen pro Minute pro API-Schlüssel (Transaktionserstellungen und Ereignis-Ingestion haben ein separates Budget von 600). Die Antwort enthält die Header `X-RateLimit-Limit`, `X-RateLimit-Remaining`, `X-RateLimit-Reset` und `Retry-After`.",
            "content": {
              "application/json": {
                "examples": {
                  "Write rate limit exceeded": {
                    "summary": "Mehr als 300 Schreibanfragen in der aktuellen Minute",
                    "value": {
                      "detail": "Write request rate limit exceeded. You can make up to 300 requests per minute."
                    }
                  }
                },
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          },
          "502": {
            "description": "Kein ausgewählter Dienst hat ein brauchbares Ergebnis zurückgegeben. Prüfen Sie jeden validation_errors-Eintrag vor einem erneuten Versuch; HTTP 502 allein begründet keinen vorübergehenden Fehler. Ein empty_provider_response mit retryable: true weist auf nicht verfügbare oder unerklärte Ergebnisse hin, einschließlich eines abgelehnten primären Anbieters gefolgt von einem nicht verfügbaren Fallback. Legacy-Einträge von provider_invalid_input und provider_validation_error erfordern stattdessen korrigierte Eingaben und lassen retryable möglicherweise weg. Es wird nichts in Rechnung gestellt. Wenn save_api_request=true gesetzt ist, wird der fehlgeschlagene Versuch als Sitzung mit dem Status Not Finished erfasst. Bei Teilfehlern wird 200 mit database_validation.errors zurückgegeben.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "string"
                    },
                    "validation_errors": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "service_id": {
                            "type": "string"
                          },
                          "code": {
                            "type": "string"
                          },
                          "message": {
                            "type": "string"
                          },
                          "retryable": {
                            "type": "boolean",
                            "description": "Gibt an, ob ein späterer Wiederholungsversuch diesen Dienstfehler beheben kann. False bedeutet, dass zuerst die bereitgestellte Eingabe korrigiert werden muss."
                          }
                        }
                      }
                    }
                  }
                },
                "examples": {
                  "Provider returned no result": {
                    "summary": "Jeder ausgewählte Dienst ist fehlgeschlagen",
                    "value": {
                      "error": "Database validation could not be performed. The external validation service did not return a result. Please try again later.",
                      "validation_errors": [
                        {
                          "service_id": "bra_cpf",
                          "code": "empty_provider_response",
                          "message": "The provider did not return a database validation result.",
                          "retryable": true
                        }
                      ]
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/v3/phone/send/": {
      "post": {
        "summary": "Telefoncode senden",
        "description": "Senden Sie einen Einmalcode (OTP) über WhatsApp, SMS oder einen anderen unterstützten Kanal an eine Telefonnummer und verifizieren Sie ihn anschließend mit [`POST /v3/phone/check/`](/de/standalone-apis/phone-check).\n\n**Zusammenspiel von Senden und Prüfen.** Der Verifizierungsstatus wird über Ihre Anwendung und die `phone_number` im E.164-Format identifiziert – der Prüfaufruf erfordert keine `request_id`. Jeder neue Sendevorgang erstellt eine ausstehende Verifizierung mit einer Gültigkeitsdauer von **5 Minuten**: Rufen Sie die Prüfung mit derselben Nummer und dem Code auf, den der Benutzer erhalten hat, bevor das Zeitfenster abläuft. Wird der Sendevorgang für dieselbe Nummer erneut aufgerufen, während eine Verifizierung aussteht, wird ein Code für dieselbe Verifizierung erneut gesendet (`status: \"Retry\"`, dieselbe `request_id`). Auf diese Weise wird höchstens ein Wiederholungsversuch verknüpft (insgesamt zwei Sendevorgänge); ein weiterer Sendevorgang startet eine neue Verifizierung mit einer neuen `request_id`. Das 5-Minuten-Fenster beginnt mit dem ersten Sendevorgang und wird durch Wiederholungsversuche nicht verlängert.\n\n**Zustellkanäle.** `options.preferred_channel` wählt den Kanal aus (standardmäßig `whatsapp`; `sms`, `telegram`, `voice`, `rcs`, `viber` und `zalo` werden ebenfalls unterstützt). Wenn der bevorzugte Kanal für das Zielland oder die Zielnummer nicht verfügbar ist, greift die Zustellung automatisch auf SMS zurück – der Sendevorgang meldet weiterhin `Success`, und der tatsächlich genutzte Kanal wird in der Antwort der Prüfung angegeben (`phone.verification_method` und die `lifecycle`-Ereignisse).\n\n**Branding.** SMS-Codes enthalten ohne zusätzliche Kosten den SMS-Absendernamen Ihrer Anwendung, der in der Business Console eingerichtet wurde. Übergeben Sie `options.sms_sender_name`, um einen einzelnen Code mit einem anderen Namen zu versehen, oder `options.use_white_label_customization: true`, um auf Ihren öffentlichen White-Label-Namen zurückzugreifen, wenn kein Absendername festgelegt ist. WhatsApp-Codes nutzen eine feste Nachricht; verbinden Sie Ihre eigene WhatsApp Business-Nummer in der Business Console, um sie unter Ihrem Unternehmensnamen und Ihrer Nummer zu versenden – abgerechnet wird ausschließlich die Didit-Gebühr.\n\n**Sendestatus.** `Success` – OTP für eine neue Verifizierung gesendet; `Retry` – OTP für die ausstehende Verifizierung erneut gesendet; `Blocked` – die Betrugsprävention hat den Versand verweigert (siehe `reason`, z. B. `repeated_attempts`, `suspicious`, `spam`). Ein `Blocked`-Sendevorgang schließt die Verifizierung sofort mit dem Status `Declined` und einer Warnung vor hohem Risiko ab, sodass eine nachfolgende Prüfung `Expired or Not Found` zurückgibt.\n\n**Abrechnung.** Der Preis hängt vom Zielland und dem Kanal ab, der die Nachricht tatsächlich zustellt – siehe [Preise für Telefonverifizierung](/de/getting-started/phone-verification-pricing). Nur `Blocked`-Sendevorgänge sind garantiert kostenlos: Jeder andere noch nicht abgerechnete Sendeversuch wird beim Abschluss oder Ablauf der Verifizierung in Rechnung gestellt, selbst wenn die Zustellung nie bestätigt wurde oder der Zustelldienstleister die Nachricht als unzustellbar gemeldet hat. Prüfungen sind immer kostenlos. Als Maßnahme gegen Missbrauch ist die Telefonverifizierung bis zum ersten Aufladen Ihrer Organisation deaktiviert (`403`).\n\n**Sitzungspersistenz.** Jede neue Verifizierung wird als Sitzung vom Typ API persistent gespeichert: `request_id` ist eine echte Sitzungs-ID, die Sie an `GET /v3/session/{sessionId}/decision/` übergeben können, die Verifizierung erscheint in der Business Console und `status.updated`-Webhooks werden im weiteren Verlauf ausgelöst.\n\n**Sandbox.** Sandbox-API-Schlüssel überspringen Zustellung und Abrechnung: Nach der Anfragevalidierung (ungültige Eingaben geben weiterhin `400` zurück) liefert der Endpoint eine statische `Success`-Payload mit einer zufälligen `request_id` zurück; es wird keine Nachricht gesendet und nichts persistent gespeichert. Verwenden Sie den Code `123456` bei der Sandbox-Prüfung.\n\n**Authentifizierung.** Übergeben Sie den API-Schlüssel Ihrer Anwendung im Header `x-api-key`. Fehlende oder ungültige Anmeldedaten geben `403` zurück (`{\"detail\": \"You do not have permission to perform this action.\"}`) – diese API gibt niemals `401` zurück.\n\n**Rate-Limits.** Gemeinsames Schreibbudget von 300 Anfragen/Min. pro API-Schlüssel über alle POST/PATCH/DELETE-Endpoints hinweg, plus eine Missbrauchsobergrenze von 4 Sendeversuchen pro Telefonnummer pro Stunde; das Überschreiten eines der Limits gibt `429` zurück.",
        "operationId": "post_v3phone_send",
        "x-didit-sdk": {
          "resource": "phone",
          "method": "send_code",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Standalone APIs"
        ],
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X POST https://verification.didit.me/v3/phone/send/ \\\n  -H 'x-api-key: YOUR_API_KEY' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\n    \"phone_number\": \"+14155552671\",\n    \"options\": {\n      \"code_size\": 6,\n      \"preferred_channel\": \"whatsapp\",\n      \"locale\": \"en-US\"\n    },\n    \"vendor_data\": \"user-1234\"\n  }'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.phone.send_code(\n    phone_number=\"+14155552671\",\n    options={\n        \"locale\": \"en-US\",\n        \"preferred_channel\": \"whatsapp\",\n    },\n    vendor_data=\"user-1234\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.phone.sendCode({\n  phone_number: \"+14155552671\",\n  options: {\n    locale: \"en-US\",\n    preferred_channel: \"whatsapp\",\n  },\n  vendor_data: \"user-1234\",\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Phone.SendCode(ctx, didit.PhoneSendCodeParams{\n\tPhoneNumber: \"+14155552671\",\n\tOptions: didit.Some(didit.PhoneSendCodeParamsOptions{\n\t\tLocale:           didit.String(\"en-US\"),\n\t\tPreferredChannel: didit.Some(didit.PhoneSendCodeParamsOptionsPreferredChannel(\"whatsapp\")),\n\t}),\n\tVendorData: didit.String(\"user-1234\"),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\nimport me.didit.types.PhoneSendCodeParams;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.phone().sendCode(PhoneSendCodeParams.builder()\n        .phoneNumber(\"+14155552671\")\n        .options(PhoneSendCodeParams.Options.builder()\n                .locale(\"en-US\")\n                .preferredChannel(PhoneSendCodeParams.Options.PreferredChannel.of(\"whatsapp\"))\n                .build())\n        .vendorData(\"user-1234\")\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->phone->sendCode([\n    'phone_number' => '+14155552671',\n    'options' => [\n        'locale' => 'en-US',\n        'preferred_channel' => 'whatsapp',\n    ],\n    'vendor_data' => 'user-1234',\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.phone.send_code(\n  phone_number: \"+14155552671\",\n  options: {\n    locale: \"en-US\",\n    preferred_channel: \"whatsapp\",\n  },\n  vendor_data: \"user-1234\"\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Phone.SendCodeAsync(new PhoneSendCodeParams\n{\n    PhoneNumber = \"+14155552671\",\n    Options = new PhoneSendCodeParamsOptions\n    {\n        Locale = \"en-US\",\n        PreferredChannel = new PhoneSendCodeParamsOptionsPreferredChannel(\"whatsapp\"),\n    },\n    VendorData = \"user-1234\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "phone_number": {
                    "type": "string",
                    "maxLength": 20,
                    "description": "Telefonnummer des Empfängers im E.164-Format – vorangestelltes `+` und Ländervorwahl (z. B. `+14155552671`). Nummern werden validiert und in E.164 normalisiert; nicht analysierbare oder ungültige Nummern geben `400` mit einem `phone_number`-Feldfehler zurück.",
                    "example": "+14155552671"
                  },
                  "options": {
                    "type": "object",
                    "description": "Optionen für die OTP-Zustellung. Alle Felder sind optional.",
                    "properties": {
                      "code_size": {
                        "type": "integer",
                        "minimum": 4,
                        "maximum": 8,
                        "default": 6,
                        "description": "Anzahl der Ziffern im OTP."
                      },
                      "locale": {
                        "type": "string",
                        "maxLength": 5,
                        "pattern": "^[a-z]{2,3}(-[A-Z]{2,3})?$",
                        "description": "BCP-47-Locale zur Lokalisierung der Verifizierungsnachricht (z. B. `en-US`, `fr`, `es`). Ungültige Formate geben `400` zurück.",
                        "example": "en-US"
                      },
                      "preferred_channel": {
                        "type": "string",
                        "enum": [
                          "whatsapp",
                          "sms",
                          "telegram",
                          "voice",
                          "rcs",
                          "viber",
                          "zalo"
                        ],
                        "default": "whatsapp",
                        "description": "Bevorzugter Zustellkanal. Wenn der Kanal für das Zielland oder die Zielnummer nicht verfügbar ist, weicht die Nachricht automatisch auf SMS aus – der Versand meldet weiterhin `Success`."
                      },
                      "use_white_label_customization": {
                        "type": "boolean",
                        "default": false,
                        "description": "Wenn `true`, erfolgt der Versand im White-Label-Design: Wenn Ihre Anwendung keinen SMS-Absendernamen hat, nennt die SMS stattdessen Ihren öffentlichen White-Label-Namen („123456 ist Ihr Verifizierungscode für Acme Bank“). Ihr SMS-Absendername wird, sofern festgelegt, mit oder ohne dieses Flag verwendet. Gilt für SMS-Nachrichten, einschließlich eines SMS-Fallbacks von einem anderen Kanal; WhatsApp-Codes werden mit einer festen Nachricht gesendet und tragen kein Branding. Standardmäßig `false`."
                      },
                      "sms_sender_name": {
                        "type": "string",
                        "nullable": true,
                        "maxLength": 30,
                        "example": "Acme Bank",
                        "description": "Der Name, den die SMS dieses Codes trägt („123456 ist Ihr Verifizierungscode für Acme Bank“), anstelle des SMS-Absendernamens Ihrer Anwendung. Kostenlos. 1 bis 30 Zeichen: nur Buchstaben, Ziffern, Leerzeichen und ' & - !, nicht nur Ziffern, mit einzelnen Leerzeichen zwischen den Wörtern; jeder andere Wert gibt `400` zurück und es wird kein Code gesendet. Wenn weggelassen, `null` oder leer, wird der SMS-Absendername Ihrer Anwendung verwendet. Jede Anwendung kann pro Tag (UTC) bis zu zwei neue Namen verwenden; darüber hinaus wird der Code mit dem Namen Ihrer Anwendung gesendet. Gilt für SMS-Nachrichten, einschließlich eines SMS-Fallbacks von einem anderen Kanal; WhatsApp-Codes tragen kein Branding.",
                        "pattern": "^$|^(?![\\d ]+$)[\\p{L}\\p{N}'&!-]+( [\\p{L}\\p{N}'&!-]+)*$"
                      }
                    }
                  },
                  "signals": {
                    "type": "object",
                    "description": "Optionale Geräte- und Netzwerksignale über den Endbenutzer, die an die Betrugsbekämpfungsebene weitergeleitet werden, um die Erkennung von missbräuchlichem oder automatisiertem Datenverkehr zu verbessern. Alle Felder sind optional.",
                    "properties": {
                      "ip": {
                        "type": "string",
                        "description": "IP-Adresse des Endbenutzergeräts. IPv4 oder IPv6.",
                        "example": "192.0.2.1"
                      },
                      "device_id": {
                        "type": "string",
                        "maxLength": 255,
                        "description": "Eindeutige Kennung des Geräts des Endbenutzers. Android: `ANDROID_ID`; iOS: `identifierForVendor`.",
                        "example": "8F0B8FDD-C2CB-4387-B20A-56E9B2E5A0D2"
                      },
                      "device_platform": {
                        "type": "string",
                        "enum": [
                          "android",
                          "ios",
                          "ipados",
                          "tvos",
                          "web"
                        ],
                        "description": "Plattform des Geräts des Endbenutzers."
                      },
                      "device_model": {
                        "type": "string",
                        "maxLength": 255,
                        "description": "Modell des Geräts des Endbenutzers.",
                        "example": "iPhone17,2"
                      },
                      "os_version": {
                        "type": "string",
                        "maxLength": 64,
                        "description": "Betriebssystemversion des Geräts des Endbenutzers.",
                        "example": "18.0.1"
                      },
                      "app_version": {
                        "type": "string",
                        "maxLength": 64,
                        "description": "Version Ihrer Anwendung.",
                        "example": "1.2.34"
                      },
                      "user_agent": {
                        "type": "string",
                        "maxLength": 512,
                        "description": "User-Agent des Browsers oder der App des Endbenutzers.",
                        "example": "Mozilla/5.0 (iPhone; CPU iPhone OS 14_4 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0.3 Mobile/15E148 Safari/604.1"
                      }
                    }
                  },
                  "vendor_data": {
                    "type": "string",
                    "description": "Optionale, vom Aufrufer gesteuerte Kennung (Ihre interne Benutzer-ID, eine E-Mail-Adresse, eine UUID usw.), die in der Sitzung gespeichert und in der Antwort auf den Sendevorgang, der Antwort auf die Abgleichprüfung, Webhooks und der Business Console zurückgegeben wird. Verwenden Sie sie, um Didits `request_id` mit Ihrem Benutzerdatensatz zu korrelieren."
                  },
                  "metadata": {
                    "type": "object",
                    "nullable": true,
                    "description": "Optionales Freiform-JSON-Objekt, das in der Sitzung gespeichert und in der Sendeantwort, der Antwort der Abgleichprüfung, in Webhooks sowie in der Business Console wiedergegeben wird."
                  }
                },
                "required": [
                  "phone_number"
                ]
              },
              "examples": {
                "WhatsApp (default)": {
                  "summary": "6-stelliger OTP über WhatsApp, mit automatischem Fallback auf SMS",
                  "value": {
                    "phone_number": "+14155552671",
                    "options": {
                      "preferred_channel": "whatsapp",
                      "locale": "en-US"
                    },
                    "vendor_data": "user-1234"
                  }
                },
                "SMS with custom code length": {
                  "summary": "SMS-Zustellung mit einem 4-stelligen Code erzwingen",
                  "value": {
                    "phone_number": "+34699999999",
                    "options": {
                      "preferred_channel": "sms",
                      "code_size": 4,
                      "locale": "es"
                    }
                  }
                },
                "With fraud signals": {
                  "summary": "Gerätesignale weiterleiten, um das Betrugspräventions-Screening zu stärken",
                  "value": {
                    "phone_number": "+14155552671",
                    "signals": {
                      "ip": "192.0.2.1",
                      "device_id": "8F0B8FDD-C2CB-4387-B20A-56E9B2E5A0D2",
                      "device_platform": "ios",
                      "device_model": "iPhone17,2",
                      "os_version": "18.0.1",
                      "app_version": "1.2.34"
                    },
                    "vendor_data": "user-1234"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Versand bestätigt. Prüfen Sie `status`: `Success` und `Retry` bedeuten, dass ein Code unterwegs ist; `Blocked` bedeutet, dass die Anti-Betrugs-Ebene abgelehnt hat und die Verifizierung bereits als `Declined` abgeschlossen ist. `request_id` ist die gespeicherte Sitzungs-ID (dieselbe ID bei einem `Retry`).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PhoneVerificationSendResponse"
                },
                "examples": {
                  "Success": {
                    "summary": "OTP für eine neue Verifizierung gesendet",
                    "value": {
                      "request_id": "e39cb057-92fc-4b59-b84e-02fec29a0f24",
                      "status": "Success",
                      "reason": null,
                      "vendor_data": "user-1234",
                      "metadata": null
                    }
                  },
                  "Retry": {
                    "summary": "Zweiter Versand an dieselbe Nummer innerhalb des 5-Minuten-Fensters — identische request_id",
                    "value": {
                      "request_id": "e39cb057-92fc-4b59-b84e-02fec29a0f24",
                      "status": "Retry",
                      "reason": null,
                      "vendor_data": "user-1234",
                      "metadata": null
                    }
                  },
                  "Blocked": {
                    "summary": "Betrugsabwehr-Ablehnung – Verifizierung mit dem Status „abgelehnt“ abgeschlossen, nichts abgerechnet",
                    "value": {
                      "request_id": "0d8af1f4-0c43-46d7-b75c-6e4e22c0a7b3",
                      "status": "Blocked",
                      "reason": "repeated_attempts",
                      "vendor_data": "user-1234",
                      "metadata": null
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Validierungsfehler. Eine fehlerhafte Eingabe gibt die Feld-Fehler-Envelope von DRF zurück (ein Array von Meldungen pro betroffenem Feld, bei Optionsfehlern unter `options` verschachtelt). Eine Nummer, die geparst werden kann, aber beim Senden abgelehnt wird (nicht erreichbar oder ein unzulässiger Leitungstyp wie ein Shortcode), gibt stattdessen eine `{\"detail\": ...}`-Envelope zurück.",
            "content": {
              "application/json": {
                "examples": {
                  "Invalid phone number (field error)": {
                    "summary": "Die Nummer ist keine gültige E.164-Nummer",
                    "value": {
                      "phone_number": [
                        "Invalid phone number provided."
                      ]
                    }
                  },
                  "Missing phone number": {
                    "summary": "`phone_number` nicht im Body enthalten",
                    "value": {
                      "phone_number": [
                        "This field is required."
                      ]
                    }
                  },
                  "Invalid options": {
                    "summary": "`code_size` außerhalb des gültigen Bereichs, ungültiges `locale`, unbekanntes `preferred_channel`",
                    "value": {
                      "options": {
                        "code_size": [
                          "Ensure this value is less than or equal to 8."
                        ],
                        "locale": [
                          "Ensure this field has no more than 5 characters."
                        ],
                        "preferred_channel": [
                          "\"carrier_pigeon\" is not a valid choice."
                        ]
                      }
                    }
                  },
                  "Number rejected at send time": {
                    "summary": "Gültiges E.164-Format, aber die Nummer kann keinen OTP empfangen",
                    "value": {
                      "detail": "Invalid phone number provided."
                    }
                  },
                  "Ineligible line type": {
                    "summary": "Leitungstyp kann keinen Einmalcode empfangen (z. B. Kurzwahlnummer)",
                    "value": {
                      "detail": "Invalid phone line type provided."
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Zugriff verweigert. Wird zurückgegeben, wenn der Header `x-api-key` fehlt (`{\"detail\": ...}`); ein falscher, widerrufener oder abgelaufener Schlüssel gibt `401` zurück. Wird auch vor jedem Senden zurückgegeben, wenn die Organisation noch nie aufgeladen hat (Missbrauchsschutz) oder wenn ihr Guthaben den Sendepreis des Ziels nicht decken kann (`{\"error\": ...}`).",
            "content": {
              "application/json": {
                "examples": {
                  "Missing or invalid API key": {
                    "summary": "Kein `x-api-key`-Header, oder der Schlüssel ist ungültig/widerrufen",
                    "value": {
                      "detail": "You do not have permission to perform this action."
                    }
                  },
                  "Top-up required": {
                    "summary": "Die Telefonverifizierung bleibt bis zum ersten Aufladen der Organisation deaktiviert",
                    "value": {
                      "detail": "To protect against abuse, phone verification is disabled until your first top-up."
                    }
                  },
                  "Not enough credits": {
                    "summary": "Das Guthaben der Organisation reicht für den Preis des Versands nicht aus",
                    "value": {
                      "error": "You don't have enough credits to perform this request."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate-Limit überschritten. POST/PATCH/DELETE-Endpoints teilen sich ein Budget von 300 Schreibanfragen pro Minute pro API-Schlüssel (Transaktionserstellungen und Ereignis-Ingestion haben ein separates Budget von 600). Zusätzlich gilt vorgelagert eine Obergrenze zum Missbrauchsschutz von 4 Verifizierungsversuchen pro Telefonnummer pro Stunde. Die Antwort enthält die Header `X-RateLimit-Limit`, `X-RateLimit-Remaining`, `X-RateLimit-Reset` und `Retry-After`. Hinweis: Die Header `X-RateLimit-*`/`Retry-After` begleiten nur den 429-Fehler des Schreiblimits von 300/Min; der 429-Fehler der Obergrenze pro Nummer enthält keine Rate-Limit-Header.",
            "content": {
              "application/json": {
                "examples": {
                  "Per-number cap": {
                    "summary": "Mehr als 4 Verifizierungsversuche für dieselbe Nummer in der letzten Stunde",
                    "value": {
                      "detail": "Maximum verification attempts reached for this phone number. Only 4 authentication attempts are allowed per hour. Try again later or use a different number."
                    }
                  },
                  "Write rate limit exceeded": {
                    "summary": "Mehr als 300 Schreibanfragen in der aktuellen Minute",
                    "value": {
                      "detail": "Write request rate limit exceeded. You can make up to 300 requests per minute."
                    }
                  }
                },
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          },
          "502": {
            "description": "Der Telefonverifizierungsanbieter ist vorübergehend nicht verfügbar – eine 5xx-Antwort, ein Timeout oder ein Verbindungsfehler, der die integrierten Wiederholungsversuche überdauert hat. Kann gefahrlos wiederholt werden; es wird nichts in Rechnung gestellt und kein Versuch angerechnet.",
            "content": {
              "application/json": {
                "examples": {
                  "Provider outage": {
                    "summary": "Der Anbieter hat die Sendeanfrage nicht beantwortet",
                    "value": {
                      "detail": "Phone verification is temporarily unavailable. Please try again shortly.",
                      "code": "phone_provider_unavailable"
                    }
                  }
                },
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string"
                    },
                    "code": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Unerwarteter Fehler beim Erstellen der Verifizierung, der kein bekannter Anbieterausfall ist. Kann sicher wiederholt werden.",
            "content": {
              "application/json": {
                "examples": {
                  "Provider error": {
                    "summary": "OTP-Zustellung konnte nicht initiiert werden",
                    "value": {
                      "detail": "Error creating phone verification"
                    }
                  }
                },
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/v3/phone/check/": {
      "post": {
        "summary": "Telefon-Code prüfen",
        "description": "Verifizieren Sie das per [`POST /v3/phone/send/`](/de/standalone-apis/phone-send) zugestellte OTP und erhalten Sie das endgültige Verifizierungsergebnis sowie Telefoninformationen: Mobilfunkanbietername und Leitungstyp, Flags für virtuelle Nummern (VoIP) und Wegwerfnummern sowie die mehrfache Verwendung der Nummer über Ihre Sitzungen hinweg.\n\n**Wie die Prüfung die Verifizierung findet.** Der Abgleich erfolgt über Ihre Anwendung sowie die E.164-`phone_number` – `request_id` ist keine Eingabe. Es wird die neueste ausstehende Verifizierung geprüft, die innerhalb der letzten **5 Minuten** erstellt wurde. Gibt es keine (nie gesendet, bereits abgeschlossen oder älter als 5 Minuten), gibt der Endpoint `200` mit `status: \"Expired or Not Found\"` zurück.\n\n**Versuchsbudget.** Jede Verifizierung erlaubt **3 Code-Versuche**. Bei den ersten beiden falschen Codes wird `status: \"Failed\"` mit den verbleibenden Versuchen und `phone: null` zurückgegeben; der dritte falsche Code schließt die Verifizierung als `Declined` mit der Warnung `VERIFICATION_CODE_ATTEMPTS_EXCEEDED` ab und gibt den vollständigen Telefonbericht zurück.\n\n**Ergebnisse.** `Approved` – korrekter Code und kein Ablehnungsrisiko. `Declined` – endgültig: Der Code war korrekt, aber es wurde ein Risiko für eine Ablehnung festgestellt (eine unten stehende `DECLINE`-Aktion, eine auf der Sperrliste stehende oder risikoreiche Nummer) oder das Versuchsbudget wurde aufgebraucht. `Failed` – falscher Code, verbleibende Versuche vorhanden. `Expired or Not Found` – nichts zu prüfen. Bei `Approved`/`Declined` entspricht die `request_id` der `request_id` des Sendevorgangs (die Sitzungs-ID) und `phone` enthält den vollständigen Bericht (`carrier`, `is_virtual`, `is_disposable`, `warnings`, `lifecycle`, `matches`); bei `Failed` und `Expired or Not Found` ist die `request_id` eine einmalige zufällige UUID.\n\n**Risiko-Aktionen.** `duplicated_phone_number_action`, `disposable_number_action` und `voip_number_action` bestimmen, was passiert, wenn das entsprechende Risiko bei einem korrekten Code erkannt wird: `DECLINE` ändert den Endstatus in `Declined`; `NO_ACTION` (Standard) erfasst das Risiko in `phone.warnings`, ohne den Status zu beeinflussen.\n\n**Abrechnung.** Prüfungen sind kostenlos – die Zustellung wird beim Senden abgerechnet (siehe [Preise für Telefonverifizierung](/de/getting-started/phone-verification-pricing)).\n\n**Sitzungspersistenz.** Eine abgeschlossene Prüfung aktualisiert die durch das Senden erstellte Sitzung (sichtbar in der Business Console, abfragbar über `GET /v3/session/{sessionId}/decision/`) und löst einen `status.updated`-Webhook aus.\n\n**Sandbox.** Sandbox-API-Schlüssel überspringen die gesamte Verarbeitung: Jeder wohlgeformte Code (4–8 Ziffern, einschließlich `123456`) gibt eine statische `Approved`-Payload mit einem vereinfachten flachen `phone`-Objekt zurück (`status`, `phone_number`, `country_code`, `carrier_name`, `line_type`, `flags`); fehlerhafte Eingaben geben weiterhin `400` zurück. Es wird nichts dauerhaft gespeichert.\n\n**Authentifizierung.** Senden Sie den API-Schlüssel Ihrer Anwendung im Header `x-api-key`. Fehlende oder ungültige Anmeldedaten geben `403` zurück (`{\"detail\": \"You do not have permission to perform this action.\"}`) – diese API gibt niemals `401` zurück.\n\n**Rate-Limits.** Gemeinsames Schreibkontingent von 300 Anfragen/Min. pro API-Schlüssel sowie die vorgelagerte Anti-Missbrauchs-Obergrenze von 4 Versuchen pro Nummer und Stunde; das Überschreiten eines dieser Limits gibt `429` zurück.\n\n**Social-Media-Präsenz.** Setzen Sie `enable_social` auf `true`, um einen `phone_social`-Block hinzuzufügen: die Online-Plattformen, auf denen diese Nummer registriert ist, mit Anzahl pro Kategorie und allen verfügbaren Profildetails. `profiles_registered: 0` bedeutet, dass die Plattformen geprüft wurden und die Nummer auf keiner davon gefunden wurde – eine gültige, kostenpflichtige Antwort. Der Block fehlt, wenn das Add-on nicht angefragt wurde oder die Prüfung nicht abgeschlossen werden konnte; in diesem Fall wird er nicht in Rechnung gestellt. Bei der Abrechnung wird eine `phone_social`-Einheit pro Anfrage zusätzlich zum Preis dieses Endpoints berechnet.",
        "operationId": "post_v3phone_check",
        "x-didit-sdk": {
          "resource": "phone",
          "method": "check_code",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Standalone APIs"
        ],
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X POST https://verification.didit.me/v3/phone/check/ \\\n  -H 'x-api-key: YOUR_API_KEY' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\n    \"phone_number\": \"+14155552671\",\n    \"code\": \"123456\",\n    \"voip_number_action\": \"DECLINE\"\n  }'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.phone.check_code(\n    phone_number=\"+14155552671\",\n    code=\"123456\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.phone.checkCode({\n  phone_number: \"+14155552671\",\n  code: \"123456\",\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Phone.CheckCode(ctx, didit.PhoneCheckCodeParams{\n\tPhoneNumber: \"+14155552671\",\n\tCode:        \"123456\",\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\nimport me.didit.types.PhoneCheckCodeParams;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.phone().checkCode(PhoneCheckCodeParams.builder()\n        .phoneNumber(\"+14155552671\")\n        .code(\"123456\")\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->phone->checkCode([\n    'phone_number' => '+14155552671',\n    'code' => '123456',\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.phone.check_code(\n  phone_number: \"+14155552671\",\n  code: \"123456\"\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Phone.CheckCodeAsync(new PhoneCheckCodeParams\n{\n    PhoneNumber = \"+14155552671\",\n    Code = \"123456\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "phone_number": {
                    "type": "string",
                    "maxLength": 20,
                    "description": "Dieselbe Telefonnummer, die im zugehörigen Aufruf von [`POST /v3/phone/send/`](/de/standalone-apis/phone-send) verwendet wurde, im E.164-Format. Dadurch wird die Prüfung mit dem Versand verknüpft.",
                    "example": "+14155552671"
                  },
                  "code": {
                    "type": "string",
                    "minLength": 4,
                    "maxLength": 8,
                    "pattern": "^[0-9]{4,8}$",
                    "description": "Das OTP, das der Endbenutzer erhalten hat. Muss aus 4–8 Ziffern bestehen – alles andere gibt `400` zurück, ohne einen Versuch zu verbrauchen. Ein wohlgeformter, aber falscher Code gibt `200` mit `status: \"Failed\"` zurück und verbraucht einen der 3 Versuche.",
                    "example": "123456"
                  },
                  "duplicated_phone_number_action": {
                    "type": "string",
                    "enum": [
                      "NO_ACTION",
                      "DECLINE"
                    ],
                    "default": "NO_ACTION",
                    "description": "Was zu tun ist, wenn dieselbe Nummer bereits von einem anderen Benutzer (andere `vendor_data`) Ihrer Anwendung verwendet wurde. `DECLINE` ändert den finalen `status` zu `Declined`; `NO_ACTION` erfasst das Risiko in `phone.warnings` und befüllt `phone.matches`."
                  },
                  "disposable_number_action": {
                    "type": "string",
                    "enum": [
                      "NO_ACTION",
                      "DECLINE"
                    ],
                    "default": "NO_ACTION",
                    "description": "Was zu tun ist, wenn die Anbieterabfrage die Nummer als temporäre/Wegwerfnummer kennzeichnet (`phone.is_disposable`). `DECLINE` setzt den endgültigen `status` auf `Declined`; `NO_ACTION` erfasst das Risiko in `phone.warnings`."
                  },
                  "voip_number_action": {
                    "type": "string",
                    "enum": [
                      "NO_ACTION",
                      "DECLINE"
                    ],
                    "default": "NO_ACTION",
                    "description": "Was zu tun ist, wenn die Anbieterabfrage einen virtuellen Leitungstyp meldet — `voip`, `isp` oder `vpn` (`phone.is_virtual`). `DECLINE` setzt den endgültigen `status` auf `Declined`; `NO_ACTION` erfasst das Risiko in `phone.warnings`."
                  },
                  "enable_enrichment": {
                    "type": "boolean",
                    "default": false,
                    "description": "Wenn `true`, wird zusätzlich eine Telefon-Intelligence für die Nummer ausgeführt: ein Risiko-Score, der Leitungstyp, ob sie kürzlich portiert wurde, und ein Vertrauensindex. Wird als eine `phone_intelligence_api`-Einheit pro Anfrage ($0.05 zum Listenpreis) zusätzlich zum eigenen Preis dieses Endpoints abgerechnet. Die Anfrage gibt `403` zurück, wenn Ihr Guthaben dies nicht decken kann.",
                    "example": false
                  },
                  "phone_intelligence_score_action": {
                    "type": "string",
                    "enum": [
                      "NO_ACTION",
                      "DECLINE"
                    ],
                    "default": "NO_ACTION",
                    "description": "Aktion, wenn der Risiko-Score der Telefon-Intelligence über dem Schwellenwert liegt. `DECLINE` ändert den endgültigen `status` zu `Declined`; `NO_ACTION` erfasst das Signal, ohne abzulehnen. Wird nur wirksam, wenn `enable_enrichment` auf `true` gesetzt ist."
                  },
                  "phone_type_risk_action": {
                    "type": "string",
                    "enum": [
                      "NO_ACTION",
                      "DECLINE"
                    ],
                    "default": "NO_ACTION",
                    "description": "Aktion, wenn es sich bei der Nummer um einen risikoreichen Leitungstyp handelt. `DECLINE` ändert den endgültigen `status` zu `Declined`; `NO_ACTION` erfasst das Signal, ohne abzulehnen. Wird nur wirksam, wenn `enable_enrichment` auf `true` gesetzt ist."
                  },
                  "recent_port_action": {
                    "type": "string",
                    "enum": [
                      "NO_ACTION",
                      "DECLINE"
                    ],
                    "default": "NO_ACTION",
                    "description": "Aktion, wenn die Nummer kürzlich zu einem anderen Anbieter portiert wurde. `DECLINE` ändert den endgültigen `status` zu `Declined`; `NO_ACTION` erfasst das Signal, ohne abzulehnen. Wird nur wirksam, wenn `enable_enrichment` auf `true` gesetzt ist."
                  },
                  "low_phone_trust_action": {
                    "type": "string",
                    "enum": [
                      "NO_ACTION",
                      "DECLINE"
                    ],
                    "default": "NO_ACTION",
                    "description": "Aktion, wenn der Vertrauensindex der Telefon-Intelligence am oder unter dem Schwellenwert liegt. `DECLINE` ändert den endgültigen `status` zu `Declined`; `NO_ACTION` erfasst das Signal, ohne abzulehnen. Wird nur wirksam, wenn `enable_enrichment` auf `true` gesetzt ist."
                  },
                  "enable_social": {
                    "type": "boolean",
                    "default": false,
                    "description": "Wenn true, wird auch der digitale Fußabdruck der Nummer ermittelt – die Messaging-, Social-, E-Commerce- und Berufs-Plattformen, auf denen sie registriert ist. Wird als eine `phone_social`-Einheit pro Anfrage zusätzlich zum regulären Preis dieses Endpoints abgerechnet.",
                    "example": true
                  },
                  "phone_no_social_presence_action": {
                    "type": "string",
                    "enum": [
                      "NO_ACTION",
                      "DECLINE"
                    ],
                    "default": "NO_ACTION",
                    "description": "Aktion, wenn die Prüfung des digitalen Fußabdrucks (Social Footprint) ergibt, dass die Nummer auf keiner der abgedeckten Plattformen registriert ist. An diesem Endpoint werden nur NO_ACTION und DECLINE akzeptiert; REVIEW ist über den gleichnamigen Workflow-Konfigurationsschlüssel verfügbar."
                  }
                },
                "required": [
                  "phone_number",
                  "code"
                ]
              },
              "examples": {
                "Default": {
                  "summary": "Alle Risiken erfassen, aber nie automatisch ablehnen",
                  "value": {
                    "phone_number": "+14155552671",
                    "code": "123456"
                  }
                },
                "Strict risk policy": {
                  "summary": "VoIP- und Wegwerf-Telefonnummern automatisch ablehnen",
                  "value": {
                    "phone_number": "+14155552671",
                    "code": "123456",
                    "voip_number_action": "DECLINE",
                    "disposable_number_action": "DECLINE"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Prüfung abgeschlossen – falsche Codes und fehlende Verifizierungen geben ebenfalls `200` zurück; prüfen Sie `status`, nicht den HTTP-Code. `phone` ist nur bei abgeschlossenen Ergebnissen (`Approved`/`Declined`) ausgefüllt, `null` bei `Failed` und fehlt bei `Expired or Not Found`.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PhoneVerificationCheckResponse"
                },
                "examples": {
                  "Approved": {
                    "summary": "Korrekter Code – vollständiger Telefonbericht mit Mobilfunkanbieter, Lebenszyklus und Übereinstimmungen",
                    "value": {
                      "request_id": "e39cb057-92fc-4b59-b84e-02fec29a0f24",
                      "status": "Approved",
                      "message": "The verification code is correct.",
                      "phone": {
                        "status": "Approved",
                        "phone_number_prefix": "+1",
                        "phone_number": "4155552671",
                        "full_number": "+14155552671",
                        "country_code": "US",
                        "country_name": "United States",
                        "carrier": {
                          "name": "AT&T",
                          "type": "mobile"
                        },
                        "is_disposable": false,
                        "is_virtual": false,
                        "verification_method": "whatsapp",
                        "verification_attempts": 1,
                        "verified_at": "2026-06-12T01:24:47.311323Z",
                        "warnings": [],
                        "lifecycle": [
                          {
                            "type": "PHONE_VERIFICATION_MESSAGE_SENT",
                            "timestamp": "2026-06-12T01:23:39.580554+00:00",
                            "details": {
                              "status": "Success",
                              "reason": null,
                              "channel": "whatsapp",
                              "actual_channel": "whatsapp"
                            },
                            "fee": 0.0509
                          },
                          {
                            "type": "PHONE_DELIVERY_DELIVERED",
                            "timestamp": "2026-06-12T01:23:43.118220+00:00",
                            "details": {
                              "channel": "whatsapp",
                              "status": "delivered"
                            },
                            "fee": 0
                          },
                          {
                            "type": "VALID_CODE_ENTERED",
                            "timestamp": "2026-06-12T01:24:47.311201+00:00",
                            "details": {
                              "code_tried": "123456",
                              "status": "Approved"
                            },
                            "fee": 0
                          },
                          {
                            "type": "PHONE_VERIFICATION_APPROVED",
                            "timestamp": "2026-06-12T01:24:47.384292+00:00",
                            "details": null,
                            "fee": 0
                          }
                        ],
                        "matches": []
                      },
                      "vendor_data": "user-1234",
                      "metadata": null,
                      "created_at": "2026-06-12T01:24:47.401719+00:00"
                    }
                  },
                  "Failed (attempts remaining)": {
                    "summary": "Falscher Code – der Benutzer kann es erneut versuchen; request_id ist hier eine einmalige UUID",
                    "value": {
                      "request_id": "11111111-2222-3333-4444-555555555555",
                      "status": "Failed",
                      "message": "The verification code is incorrect. Attempts remaining: 2",
                      "phone": null,
                      "vendor_data": "user-1234",
                      "metadata": null,
                      "created_at": "2026-06-12T01:24:21.512340+00:00"
                    }
                  },
                  "Declined (max attempts)": {
                    "summary": "Dritter falscher Code — Verifizierung als abgelehnt abgeschlossen",
                    "value": {
                      "request_id": "e39cb057-92fc-4b59-b84e-02fec29a0f24",
                      "status": "Declined",
                      "message": "The verification code is incorrect. Maximum attempts reached.",
                      "phone": {
                        "status": "Declined",
                        "phone_number_prefix": "+1",
                        "phone_number": "4155552671",
                        "full_number": "+14155552671",
                        "country_code": "US",
                        "country_name": "United States",
                        "carrier": {
                          "name": "AT&T",
                          "type": "mobile"
                        },
                        "is_disposable": false,
                        "is_virtual": false,
                        "verification_method": "whatsapp",
                        "verification_attempts": 1,
                        "verified_at": null,
                        "warnings": [
                          {
                            "feature": "PHONE",
                            "risk": "VERIFICATION_CODE_ATTEMPTS_EXCEEDED",
                            "additional_data": null,
                            "log_type": "error",
                            "short_description": "Verification code attempts exceeded",
                            "long_description": "The system detected that the phone number has exceeded the maximum number of verification code attempts."
                          }
                        ],
                        "lifecycle": [
                          {
                            "type": "PHONE_VERIFICATION_MESSAGE_SENT",
                            "timestamp": "2026-06-12T01:23:39.580554+00:00",
                            "details": {
                              "status": "Success",
                              "reason": null,
                              "channel": "whatsapp",
                              "actual_channel": "whatsapp"
                            },
                            "fee": 0.0509
                          },
                          {
                            "type": "INVALID_CODE_ENTERED",
                            "timestamp": "2026-06-12T01:24:01.118220+00:00",
                            "details": {
                              "code_tried": "111111",
                              "status": "Failed"
                            },
                            "fee": 0
                          },
                          {
                            "type": "INVALID_CODE_ENTERED",
                            "timestamp": "2026-06-12T01:24:21.512340+00:00",
                            "details": {
                              "code_tried": "222222",
                              "status": "Failed"
                            },
                            "fee": 0
                          },
                          {
                            "type": "INVALID_CODE_ENTERED",
                            "timestamp": "2026-06-12T01:24:47.311201+00:00",
                            "details": {
                              "code_tried": "333333",
                              "status": "Failed"
                            },
                            "fee": 0
                          },
                          {
                            "type": "PHONE_VERIFICATION_DECLINED",
                            "timestamp": "2026-06-12T01:24:47.384292+00:00",
                            "details": {
                              "reason": "VERIFICATION_CODE_ATTEMPTS_EXCEEDED"
                            },
                            "fee": 0
                          }
                        ],
                        "matches": []
                      },
                      "vendor_data": "user-1234",
                      "metadata": null,
                      "created_at": "2026-06-12T01:24:47.401719+00:00"
                    }
                  },
                  "Declined (risk policy)": {
                    "summary": "Korrekter Code, aber der Anschluss ist VoIP und voip_number_action=DECLINE",
                    "value": {
                      "request_id": "7f1c9d2e-44a1-4b6e-9a3e-5b8e6f1c2d3a",
                      "status": "Declined",
                      "message": "The verification code is correct.",
                      "phone": {
                        "status": "Declined",
                        "phone_number_prefix": "+1",
                        "phone_number": "5005550006",
                        "full_number": "+15005550006",
                        "country_code": "US",
                        "country_name": "United States",
                        "carrier": {
                          "name": "CLEC LLC",
                          "type": "voip"
                        },
                        "is_disposable": false,
                        "is_virtual": true,
                        "verification_method": "sms",
                        "verification_attempts": 1,
                        "verified_at": "2026-06-12T01:24:47.311323Z",
                        "warnings": [
                          {
                            "feature": "PHONE",
                            "risk": "VOIP_NUMBER_DETECTED",
                            "additional_data": null,
                            "log_type": "error",
                            "short_description": "VoIP number detected",
                            "long_description": "The system detected that the phone number is a VoIP number, which is not allowed."
                          }
                        ],
                        "lifecycle": [
                          {
                            "type": "PHONE_VERIFICATION_MESSAGE_SENT",
                            "timestamp": "2026-06-12T01:23:39.580554+00:00",
                            "details": {
                              "status": "Success",
                              "reason": null,
                              "channel": "whatsapp",
                              "actual_channel": "sms"
                            },
                            "fee": 0.0509
                          },
                          {
                            "type": "VALID_CODE_ENTERED",
                            "timestamp": "2026-06-12T01:24:47.311201+00:00",
                            "details": {
                              "code_tried": "123456",
                              "status": "Approved"
                            },
                            "fee": 0
                          },
                          {
                            "type": "PHONE_VERIFICATION_DECLINED",
                            "timestamp": "2026-06-12T01:24:47.384292+00:00",
                            "details": {
                              "reason": "VOIP_NUMBER_DETECTED"
                            },
                            "fee": 0
                          }
                        ],
                        "matches": []
                      },
                      "vendor_data": "user-1234",
                      "metadata": null,
                      "created_at": "2026-06-12T01:24:47.401719+00:00"
                    }
                  },
                  "Expired or Not Found": {
                    "summary": "Keine ausstehende Verifizierung für diese Nummer in den letzten 5 Minuten",
                    "value": {
                      "request_id": "69cc35c6-280a-47a6-ab8c-4f32abc02ed0",
                      "status": "Expired or Not Found",
                      "message": "No pending phone verification found in the last 5 minutes.",
                      "vendor_data": null,
                      "metadata": null,
                      "created_at": "2026-06-12T01:24:47.311323+00:00"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Validierungsfehler – DRFs Feldfehler-Envelope: ein Array von Meldungen pro fehlerhaftem Feld.",
            "content": {
              "application/json": {
                "examples": {
                  "Invalid code format": {
                    "summary": "`code` besteht nicht aus 4–8 numerischen Ziffern",
                    "value": {
                      "code": [
                        "Invalid code format. Enter 4 to 8 numeric digits."
                      ]
                    }
                  },
                  "Invalid phone number": {
                    "summary": "`phone_number` ist keine gültige E.164-Nummer",
                    "value": {
                      "phone_number": [
                        "Invalid phone number provided."
                      ]
                    }
                  },
                  "Invalid action": {
                    "summary": "Risikoaktionen akzeptieren nur NO_ACTION oder DECLINE",
                    "value": {
                      "voip_number_action": [
                        "\"REVIEW\" is not a valid choice."
                      ]
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Zugriff verweigert. Wird zurückgegeben, wenn der Header `x-api-key` fehlt; ein falscher, widerrufener oder abgelaufener Schlüssel gibt `401` zurück. Prüfungen sind kostenlos, daher erfolgt hier keine Credit-Prüfung.",
            "content": {
              "application/json": {
                "examples": {
                  "Missing or invalid API key": {
                    "summary": "Kein `x-api-key`-Header, oder der Schlüssel ist ungültig/widerrufen",
                    "value": {
                      "detail": "You do not have permission to perform this action."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate-Limit überschritten. POST/PATCH/DELETE-Endpoints teilen sich ein Budget von 300 Schreibanfragen pro Minute pro API-Schlüssel (Transaktionserstellungen und Ereignis-Ingestion haben ein separates Budget von 600). Zusätzlich gilt vorgelagert eine Obergrenze zum Missbrauchsschutz von 4 Verifizierungsversuchen pro Telefonnummer pro Stunde. Die Antwort enthält die Header `X-RateLimit-Limit`, `X-RateLimit-Remaining`, `X-RateLimit-Reset` und `Retry-After`. Hinweis: Die Header `X-RateLimit-*`/`Retry-After` begleiten nur den 429-Fehler des Schreiblimits von 300/Min; der 429-Fehler der Obergrenze pro Nummer enthält keine Rate-Limit-Header.",
            "content": {
              "application/json": {
                "examples": {
                  "Per-number cap": {
                    "summary": "Mehr als 4 Verifizierungsversuche für dieselbe Nummer in der letzten Stunde",
                    "value": {
                      "detail": "Maximum verification attempts reached for this phone number. Only 4 authentication attempts are allowed per hour. Try again later or use a different number."
                    }
                  },
                  "Write rate limit exceeded": {
                    "summary": "Mehr als 300 Schreibanfragen in der aktuellen Minute",
                    "value": {
                      "detail": "Write request rate limit exceeded. You can make up to 300 requests per minute."
                    }
                  }
                },
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          },
          "502": {
            "description": "Der Telefonverifizierungsanbieter ist vorübergehend nicht verfügbar – eine 5xx-Antwort, ein Timeout oder ein Verbindungsfehler, der die integrierten Wiederholungsversuche überdauert hat. Kann gefahrlos wiederholt werden; das Versuchskontingent wird nicht verbraucht.",
            "content": {
              "application/json": {
                "examples": {
                  "Provider outage": {
                    "summary": "Der Anbieter hat die Prüfungsanfrage nicht beantwortet",
                    "value": {
                      "detail": "Phone verification is temporarily unavailable. Please try again shortly.",
                      "code": "phone_provider_unavailable"
                    }
                  }
                },
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string"
                    },
                    "code": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Unerwarteter Fehler bei der vorgelagerten Verifizierung des Codes, der kein bekannter Anbieterausfall ist. Kann sicher wiederholt werden; das Versuchsbudget wird nur durch abgeschlossene Prüfungen verbraucht.",
            "content": {
              "application/json": {
                "examples": {
                  "Provider error": {
                    "summary": "Code-Verifizierung konnte nicht abgeschlossen werden",
                    "value": {
                      "detail": "Error checking phone verification"
                    }
                  }
                },
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/v3/bank/account-check/": {
      "post": {
        "summary": "Bankkonto prüfen",
        "description": "Prüfen Sie, ob ein Bankkonto der von Ihnen genannten Person oder dem Unternehmen gehört, bevor Sie Geld dorthin überweisen. Keine Sitzung und keine Anmeldung: Senden Sie den Namen und das Konto, lesen Sie das Ergebnis ab. Es handelt sich um die [Kontoprüfung](/de/core-technology/bank-verification/account-check) des Bankverifizierungs-Schritts, ausgeführt über Ihr Backend.\n\n**Was Sie senden.** Das Land (`country`, ISO 3166-1 Alpha-3) des Kontos, das Konto (`account`) in der für dieses Land üblichen Schreibweise sowie den Namen des Inhabers (`holder`): `full_name` für eine Person oder `business_name` für ein Unternehmen. Mit einem Unternehmensnamen wird ein Geschäftskonto geprüft.\n\n**Was Sie zurückerhalten.** `result` ist `match`, `close_match`, `no_match` oder `cannot_verify`. Bei einem `close_match` ist `holder_name` der Name, unter dem die Bank das Konto führt, sofern die Bank diesen zurückgegeben hat. `account` wird maskiert auf die letzten 4 Zeichen zurückgegeben.\n\n**Abrechnung.** Jede von der Bank beantwortete Prüfung wird einmal zum Kontoprüfungspreis des Kontolandes abgerechnet, unabhängig vom Ergebnis: Ein `no_match`, ein nicht existierendes Konto und ein `cannot_verify` werden ebenfalls abgerechnet. Eine Anfrage, die mit einem Fehler beantwortet wird, wird nie abgerechnet.\n\n**Jede Anfrage ist eine neue Prüfung.** Es gibt keinen Idempotenz-Schlüssel und keinen Endpoint, um eine Prüfung nachträglich abzurufen; eine wiederholte Anfrage wird daher erneut ausgeführt und abgerechnet. Speichern Sie die Antwort.\n\n**Sandbox.** Verwenden Sie einen Sandbox-API-Schlüssel mit den Beispielkontodaten. Ein Sandbox-Schlüssel ruft keine Bank auf und verursacht keine Kosten. Die letzten 4 Zeichen der IBAN, andernfalls der Kontonummer, bestimmen die Antwort: `0001` ein `close_match` mit einem `holder_name`, `0002` ein `close_match` ohne diesen, `0003` und `0006` ein `no_match`, `0004` `cannot_verify`, `0005` ein `503` und `0009` ein `400`. Jede andere Endung ergibt ein `match`.\n\n**API-Schlüssel.** Ein API-Schlüssel mit Scopes benötigt Schreibzugriff auf Sitzungen.",
        "operationId": "post_v3_bank_account_check",
        "tags": [
          "Standalone APIs"
        ],
        "x-didit-sdk": {
          "resource": "bank",
          "method": "account_check",
          "auth": "api_key",
          "server": true
        },
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/BankAccountCheckRequest"
              },
              "examples": {
                "Person, Nigeria": {
                  "summary": "Ein Bankcode und eine Kontonummer, abgeglichen mit dem Namen einer Person",
                  "value": {
                    "country": "NGA",
                    "account": {
                      "bank_code": "000014",
                      "account_number": "0123450001"
                    },
                    "holder": {
                      "full_name": "Maria Oliveira"
                    },
                    "vendor_data": "payout_20481"
                  }
                },
                "Company, Nigeria": {
                  "summary": "Ein Bankcode und eine Kontonummer, abgeglichen mit dem Namen eines Unternehmens",
                  "value": {
                    "country": "NGA",
                    "account": {
                      "bank_code": "000014",
                      "account_number": "0123456789"
                    },
                    "holder": {
                      "business_name": "Northwind Trading Ltd"
                    }
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Die Bank hat geantwortet. Die Prüfung wird abgerechnet, unabhängig vom Ergebnis.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BankAccountCheckResponse"
                },
                "examples": {
                  "Close match": {
                    "summary": "Die Bank führt das Konto unter einem ähnlichen Namen",
                    "value": {
                      "request_id": "c2f4a9e0-7b1d-4c3a-9e55-1d0a6b8f2a47",
                      "result": "close_match",
                      "holder_name": "MARIA R OLIVEIRA",
                      "account": "****0001",
                      "vendor_data": "payout_20481",
                      "created_at": "2026-10-21T14:32:08Z"
                    }
                  },
                  "Match": {
                    "summary": "Die Bank führt das Konto unter dem übermittelten Namen",
                    "value": {
                      "request_id": "5b0e2d7c-41a8-4f6e-9c3b-8e7d1a2f6c90",
                      "result": "match",
                      "holder_name": null,
                      "account": "****6789",
                      "vendor_data": null,
                      "created_at": "2026-10-21T14:35:41Z"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Im übermittelten Zustand abgelehnt und nicht abgerechnet. `field` nennt das zu korrigierende Feld im Body und `reason` gibt den Grund an, mit denselben Gründen, die das gehostete Kontoformular anzeigt. Es wird nur das erste abgelehnte Feld gemeldet.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BankAccountCheckError"
                },
                "examples": {
                  "Missing field": {
                    "summary": "Die Prüfung des Landes erfordert einen Bankcode",
                    "value": {
                      "detail": "The bank code is not valid (required).",
                      "code": "invalid_account_input",
                      "field": "account.bank_code",
                      "reason": "required"
                    }
                  },
                  "Invalid IBAN": {
                    "summary": "Die IBAN hat die falsche Länge für ihr Land",
                    "value": {
                      "detail": "The iban is not valid (length).",
                      "code": "invalid_account_input",
                      "field": "account.iban",
                      "reason": "length"
                    }
                  },
                  "Refused by the bank": {
                    "summary": "Die Bank hat das Konto in der übermittelten Form abgelehnt",
                    "value": {
                      "detail": "The account was refused as typed (rejected).",
                      "code": "invalid_account_input",
                      "field": "account.account_number",
                      "reason": "rejected"
                    }
                  },
                  "No name": {
                    "summary": "`holder` enthält weder `full_name` noch `business_name`",
                    "value": {
                      "detail": "Send full_name for a person or business_name for a company.",
                      "code": "invalid_account_input",
                      "field": "holder",
                      "reason": "required"
                    }
                  },
                  "Consent required": {
                    "summary": "Die Kontoprüfung des Landes erfordert die Einwilligung des Kontoinhabers",
                    "value": {
                      "detail": "Account checks in this country need the account holder's explicit consent. Ask for it, then send `consent=true`.",
                      "code": "invalid_account_input",
                      "field": "consent",
                      "reason": "required"
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Der API-Schlüssel mit eingeschränktem Geltungsbereich ist abgelaufen.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BankAccountCheckError"
                },
                "examples": {
                  "Expired key": {
                    "summary": "Das Ablaufdatum des Schlüssels ist überschritten",
                    "value": {
                      "detail": "This API key has expired."
                    }
                  }
                }
              }
            }
          },
          "402": {
            "description": "Die Überprüfung kann nicht bezahlt werden und wurde daher nicht ausgeführt. Laden Sie Ihr Guthaben auf und senden Sie sie erneut.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BankAccountCheckError"
                },
                "examples": {
                  "Out of credit": {
                    "summary": "Ihr Guthaben reicht für eine Prüfung nicht aus",
                    "value": {
                      "detail": "You don't have enough credits to perform this request. Please top up at https://business.didit.me",
                      "code": "insufficient_credits"
                    }
                  },
                  "Not in your contract": {
                    "summary": "Ihr Vertrag enthält keinen Preis für die Account-Check-API",
                    "value": {
                      "detail": "Your contract does not price the Account check API. Contact your account manager.",
                      "code": "contract_rate_missing"
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Der `x-api-key`-Header oder das Bearer-Token fehlt oder ist ungültig, die Anfrage stammt von einer Adresse außerhalb der IP-Liste des Schlüssels oder ein berechtigungseingeschränkter Schlüssel hat keinen Schreibzugriff auf Sitzungen.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BankAccountCheckError"
                },
                "examples": {
                  "Missing or invalid credentials": {
                    "summary": "Kein gültiger API-Schlüssel oder Token",
                    "value": {
                      "detail": "You do not have permission to perform this action."
                    }
                  },
                  "No sessions write": {
                    "summary": "Ein Schlüssel mit eingeschränktem Geltungsbereich ohne Schreibzugriff auf Sitzungen",
                    "value": {
                      "detail": "This API key has no write access to sessions."
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Keine Kontoprüfung unterstützt dieses Konto bisher, daher wurde nichts geprüft oder abgerechnet. `country_not_covered`: Keine unterstützt dessen Land oder diesen Kontotyp (Privatperson oder Unternehmen) dort. `bank_not_covered`: Keine unterstützt dessen Bank.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BankAccountCheckError"
                },
                "examples": {
                  "Country not covered": {
                    "summary": "Keine Kontoprüfung unterstützt das Land",
                    "value": {
                      "detail": "No account check serves this country yet.",
                      "code": "country_not_covered"
                    }
                  },
                  "Bank not covered": {
                    "summary": "Keine Kontoprüfung unterstützt die Bank des Kontos",
                    "value": {
                      "detail": "No account check serves this account's bank yet.",
                      "code": "bank_not_covered"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/RateLimitedWrite"
          },
          "503": {
            "description": "Die Bank konnte nicht antworten. Es wurde nichts geprüft oder abgerechnet; senden Sie die Prüfung später erneut.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BankAccountCheckError"
                },
                "examples": {
                  "Unavailable": {
                    "summary": "Die Bank hat nicht geantwortet",
                    "value": {
                      "detail": "The account check is temporarily unavailable and this request was not charged. Please try again.",
                      "code": "account_check_unavailable"
                    }
                  }
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X POST https://verification.didit.me/v3/bank/account-check/ \\\n  -H 'x-api-key: YOUR_API_KEY' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\n    \"country\": \"NGA\",\n    \"account\": {\"bank_code\": \"000014\", \"account_number\": \"0123450001\"},\n    \"holder\": {\"full_name\": \"Maria Oliveira\"},\n    \"vendor_data\": \"payout_20481\"\n  }'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.bank.account_check(\n    country=\"NGA\",\n    account={\n        \"account_number\": \"0123450001\",\n        \"bank_code\": \"000014\",\n    },\n    holder={\n        \"full_name\": \"Maria Oliveira\",\n    },\n    vendor_data=\"payout_20481\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.bank.accountCheck({\n  country: \"NGA\",\n  account: {\n    account_number: \"0123450001\",\n    bank_code: \"000014\",\n  },\n  holder: {\n    full_name: \"Maria Oliveira\",\n  },\n  vendor_data: \"payout_20481\",\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Bank.AccountCheck(ctx, didit.BankAccountCheckRequest{\n\tCountry: \"NGA\",\n\tAccount: didit.BankAccountCheckRequestAccount{\n\t\tAccountNumber: didit.String(\"0123450001\"),\n\t\tBankCode:      didit.String(\"000014\"),\n\t},\n\tHolder: didit.BankAccountCheckHolder{\n\t\tFullName: didit.String(\"Maria Oliveira\"),\n\t},\n\tVendorData: didit.String(\"payout_20481\"),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\nimport me.didit.types.BankAccountCheckHolder;\nimport me.didit.types.BankAccountCheckPersonHolder;\nimport me.didit.types.BankAccountCheckRequest;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.bank().accountCheck(BankAccountCheckRequest.builder()\n        .country(\"NGA\")\n        .account(BankAccountCheckRequest.Account.builder()\n                .accountNumber(\"0123450001\")\n                .bankCode(\"000014\")\n                .build())\n        .holder(BankAccountCheckHolder.ofBankAccountCheckPersonHolder(BankAccountCheckPersonHolder.builder()\n                .fullName(\"Maria Oliveira\")\n                .build()))\n        .vendorData(\"payout_20481\")\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->bank->accountCheck([\n    'country' => 'NGA',\n    'account' => [\n        'account_number' => '0123450001',\n        'bank_code' => '000014',\n    ],\n    'holder' => [\n        'full_name' => 'Maria Oliveira',\n    ],\n    'vendor_data' => 'payout_20481',\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.bank.account_check(\n  country: \"NGA\",\n  account: {\n    account_number: \"0123450001\",\n    bank_code: \"000014\",\n  },\n  holder: {\n    full_name: \"Maria Oliveira\",\n  },\n  vendor_data: \"payout_20481\"\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Bank.AccountCheckAsync(new BankAccountCheckRequest\n{\n    Country = \"NGA\",\n    Account = new()\n    {\n        AccountNumber = \"0123450001\",\n        BankCode = \"000014\",\n    },\n    Holder = new()\n    {\n        FullName = \"Maria Oliveira\",\n    },\n    VendorData = \"payout_20481\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ]
      }
    },
    "/v3/email/send/": {
      "post": {
        "summary": "E-Mail-Code senden",
        "description": "Senden Sie einen Einmalcode (OTP) an eine E-Mail-Adresse und verifizieren Sie ihn anschließend mit [`POST /v3/email/check/`](/de/standalone-apis/email-check).\n\n**Zusammenspiel von Senden und Prüfen.** Der Verifizierungsstatus wird über Ihre Anwendung und die `email`-Adresse zugeordnet – der Prüfaufruf benötigt keine `request_id`. Jeder neue Sendeaufruf erstellt eine ausstehende Verifizierung, die **5 Minuten** lang gültig ist: Rufen Sie die Prüfung mit derselben Adresse und dem Code auf, den der Benutzer erhalten hat, bevor das Zeitfenster abläuft. Wenn Sie für dieselbe Adresse erneut senden, während eine Verifizierung aussteht, wird ein neuer Code für dieselbe Verifizierung generiert (`status: \"Retry\"`, dieselbe `request_id`); der vorherige Code verliert seine Gültigkeit. Auf diese Weise ist höchstens ein Wiederholungsversuch verknüpft (insgesamt zwei Sendeaufrufe); ein weiteres Senden startet eine neue Verifizierung mit einer neuen `request_id`. Das 5-Minuten-Zeitfenster wird ab dem ersten Senden gemessen und durch Wiederholungsversuche nicht verlängert.\n\n**Vorabprüfung der Zustellbarkeit.** Bevor etwas gesendet wird, durchläuft die Adresse eine Syntax- und DNS/MX-Validierung. Adressen, die keine E-Mails empfangen können, geben `200` mit `status: \"Undeliverable\"` und `reason: \"email_can_not_be_delivered\"` zurück – es wird keine E-Mail gesendet, nichts in Rechnung gestellt und die Verifizierung wird sofort als `Declined` abgeschlossen (eine nachfolgende Prüfung gibt `Expired or Not Found` zurück). Ein Sendeversuch, der aus einem anderen Grund fehlschlägt (die E-Mail konnte nicht zur Zustellung übergeben werden), gibt stattdessen `503` zurück: Es wird kein Code gesendet, nichts in Rechnung gestellt, die Verifizierung bleibt offen und dieselbe Anfrage kann wiederholt werden.\n\n**Code-Format und Branding.** Codes bestehen aus 4–8 Zeichen (`options.code_size`, standardmäßig 6), standardmäßig numerisch; setzen Sie `options.alphanumeric_code: true` für Großbuchstaben und Ziffern (der Vergleich bei der Prüfung unterscheidet nicht zwischen Groß- und Kleinschreibung). Die E-Mail-Vorlage wird über `options.locale` lokalisiert (54 unterstützte Sprachen) und kann über `options.use_white_label_customization` das White-Label-Branding Ihrer Anwendung nutzen.\n\n**Abrechnung.** Ein Credit für die E-Mail-Verifizierungs-API pro erfolgreichem Senden (`status: \"Success\"`), abgerechnet zum Zeitpunkt des Sendens. `Retry`- und `Undeliverable`-Sendeaufrufe sind kostenlos, und Prüfungen sind ebenfalls kostenlos.\n\n**Persistenz von Sitzungen.** Jede neue Verifizierung wird als Sitzung vom Typ API beibehalten: `request_id` ist eine echte Sitzungs-ID, die Sie an `GET /v3/session/{sessionId}/decision/` übergeben können, die Verifizierung erscheint in der Business Console und `status.updated`-Webhooks werden im Verlauf ausgelöst.\n\n**Sandbox.** Sandbox-API-Schlüssel überspringen Zustellung und Abrechnung: Nach der Anfragevalidierung (fehlerhafte Eingaben geben weiterhin `400` zurück) gibt der Endpoint eine statische `Success`-Payload mit einer zufälligen `request_id` zurück; es wird keine E-Mail gesendet und nichts gespeichert. Verwenden Sie den Code `123456` für die Prüfung in der Sandbox.\n\n**Authentifizierung.** Senden Sie den API-Schlüssel Ihrer Anwendung im Header `x-api-key`. Fehlende oder ungültige Anmeldedaten geben `403` zurück (`{\"detail\": \"You do not have permission to perform this action.\"}`) – diese API gibt niemals `401` zurück.\n\n**Rate-Limit.** Geteiltes Schreibkontingent von 300 Anfragen/Min. pro API-Schlüssel über alle POST/PATCH/DELETE-Endpoints hinweg; bei Überschreitung wird `429` zurückgegeben.",
        "operationId": "post_v3email_send",
        "x-didit-sdk": {
          "resource": "email",
          "method": "send_code",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Standalone APIs"
        ],
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X POST https://verification.didit.me/v3/email/send/ \\\n  -H 'x-api-key: YOUR_API_KEY' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\n    \"email\": \"alice@example.com\",\n    \"options\": { \"code_size\": 6, \"locale\": \"en\" },\n    \"vendor_data\": \"user-1234\"\n  }'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.email.send_code(\n    email=\"alice@example.com\",\n    options={\n        \"locale\": \"en\",\n    },\n    vendor_data=\"user-1234\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.email.sendCode({\n  email: \"alice@example.com\",\n  options: {\n    locale: \"en\",\n  },\n  vendor_data: \"user-1234\",\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Email.SendCode(ctx, didit.EmailSendCodeParams{\n\tEmail: \"alice@example.com\",\n\tOptions: didit.Some(didit.EmailSendCodeParamsOptions{\n\t\tLocale: didit.Some(didit.EmailSendCodeParamsOptionsLocale(\"en\")),\n\t}),\n\tVendorData: didit.String(\"user-1234\"),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\nimport me.didit.types.EmailSendCodeParams;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.email().sendCode(EmailSendCodeParams.builder()\n        .email(\"alice@example.com\")\n        .options(EmailSendCodeParams.Options.builder()\n                .locale(EmailSendCodeParams.Options.Locale.of(\"en\"))\n                .build())\n        .vendorData(\"user-1234\")\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->email->sendCode([\n    'email' => 'alice@example.com',\n    'options' => [\n        'locale' => 'en',\n    ],\n    'vendor_data' => 'user-1234',\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.email.send_code(\n  email: \"alice@example.com\",\n  options: {\n    locale: \"en\",\n  },\n  vendor_data: \"user-1234\"\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Email.SendCodeAsync(new EmailSendCodeParams\n{\n    Email = \"alice@example.com\",\n    Options = new EmailSendCodeParamsOptions\n    {\n        Locale = new EmailSendCodeParamsOptionsLocale(\"en\"),\n    },\n    VendorData = \"user-1234\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "email": {
                    "type": "string",
                    "format": "email",
                    "description": "Empfänger-E-Mail-Adresse. Ungültig formatierte Adressen geben `400` zurück; syntaktisch gültige Adressen, die keine E-Mails empfangen können (fehlgeschlagene DNS-/MX-Validierung), geben `200` mit `status: \"Undeliverable\"` zurück.",
                    "example": "alice@example.com"
                  },
                  "options": {
                    "type": "object",
                    "description": "Optionen für OTP-Format, Lokalisierung und Branding. Alle Felder sind optional.",
                    "properties": {
                      "code_size": {
                        "type": "integer",
                        "minimum": 4,
                        "maximum": 8,
                        "default": 6,
                        "description": "Anzahl der Zeichen im OTP (standardmäßig Ziffern; Großbuchstaben und Ziffern, wenn `alphanumeric_code` `true` ist)."
                      },
                      "alphanumeric_code": {
                        "type": "boolean",
                        "default": false,
                        "description": "Wenn `true`, besteht das OTP aus Großbuchstaben `A–Z` und Ziffern `0–9` anstelle von reinen Ziffern. Der Vergleich von `/v3/email/check/` unterscheidet nicht zwischen Groß- und Kleinschreibung."
                      },
                      "locale": {
                        "type": "string",
                        "maxLength": 5,
                        "enum": [
                          "en",
                          "ar",
                          "bn",
                          "bg",
                          "bs",
                          "ca",
                          "cs",
                          "da",
                          "de",
                          "el",
                          "es",
                          "et",
                          "fa",
                          "fi",
                          "fr",
                          "he",
                          "hi",
                          "hr",
                          "hu",
                          "hy",
                          "id",
                          "it",
                          "ja",
                          "ka",
                          "kk",
                          "ko",
                          "ky",
                          "lt",
                          "lv",
                          "cnr",
                          "mk",
                          "mn",
                          "ms",
                          "nl",
                          "no",
                          "pl",
                          "pt-BR",
                          "pt",
                          "ro",
                          "ru",
                          "sk",
                          "sl",
                          "so",
                          "sq",
                          "sr",
                          "sv",
                          "th",
                          "tr",
                          "uk",
                          "uz",
                          "vi",
                          "zh-CN",
                          "zh-TW",
                          "zh"
                        ],
                        "description": "Sprache der OTP-E-Mail-Vorlage. Standardmäßig `en`. Nicht unterstützte Werte geben `400` zurück und führen alle unterstützten Gebietsschemata auf.",
                        "example": "en"
                      },
                      "use_white_label_customization": {
                        "type": "boolean",
                        "default": false,
                        "description": "Wenn `true`, verwendet die OTP-E-Mail die White-Label-Anpassung Ihrer Anwendung (Logo, Farben, Absender-Branding) anstelle der standardmäßigen Didit-Vorlage."
                      }
                    }
                  },
                  "signals": {
                    "type": "object",
                    "description": "Optionale Geräte- und Netzwerksignale über den Endbenutzer, die an die Betrugsbekämpfungsebene weitergeleitet werden, um die Erkennung von missbräuchlichem oder automatisiertem Datenverkehr zu verbessern. Alle Felder sind optional.",
                    "properties": {
                      "ip": {
                        "type": "string",
                        "description": "IP-Adresse des Endbenutzergeräts. IPv4 oder IPv6.",
                        "example": "192.0.2.1"
                      },
                      "device_id": {
                        "type": "string",
                        "maxLength": 255,
                        "description": "Eindeutige Kennung des Geräts des Endbenutzers. Android: `ANDROID_ID`; iOS: `identifierForVendor`.",
                        "example": "8F0B8FDD-C2CB-4387-B20A-56E9B2E5A0D2"
                      },
                      "device_platform": {
                        "type": "string",
                        "enum": [
                          "android",
                          "ios",
                          "ipados",
                          "tvos",
                          "web"
                        ],
                        "description": "Plattform des Geräts des Endbenutzers."
                      },
                      "device_model": {
                        "type": "string",
                        "maxLength": 255,
                        "description": "Modell des Geräts des Endbenutzers.",
                        "example": "iPhone17,2"
                      },
                      "os_version": {
                        "type": "string",
                        "maxLength": 64,
                        "description": "Betriebssystemversion des Geräts des Endbenutzers.",
                        "example": "18.0.1"
                      },
                      "app_version": {
                        "type": "string",
                        "maxLength": 64,
                        "description": "Version Ihrer Anwendung.",
                        "example": "1.2.34"
                      },
                      "user_agent": {
                        "type": "string",
                        "maxLength": 512,
                        "description": "User-Agent des Browsers oder der App des Endbenutzers.",
                        "example": "Mozilla/5.0 (iPhone; CPU iPhone OS 14_4 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0.3 Mobile/15E148 Safari/604.1"
                      }
                    }
                  },
                  "vendor_data": {
                    "type": "string",
                    "description": "Optionale, vom Aufrufer gesteuerte Kennung (Ihre interne Benutzer-ID, eine E-Mail-Adresse, eine UUID usw.), die in der Sitzung gespeichert und in der Antwort auf den Sendevorgang, der Antwort auf die Abgleichprüfung, Webhooks und der Business Console zurückgegeben wird. Verwenden Sie sie, um Didits `request_id` mit Ihrem Benutzerdatensatz zu korrelieren."
                  },
                  "metadata": {
                    "type": "object",
                    "nullable": true,
                    "description": "Optionales Freiform-JSON-Objekt, das in der Sitzung gespeichert und in der Sendeantwort, der Antwort der Abgleichprüfung, in Webhooks sowie in der Business Console wiedergegeben wird."
                  }
                },
                "required": [
                  "email"
                ]
              },
              "examples": {
                "Numeric 6-digit code": {
                  "summary": "Standard – 6-stelliger numerischer Code auf Englisch",
                  "value": {
                    "email": "alice@example.com",
                    "options": {
                      "locale": "en"
                    },
                    "vendor_data": "user-1234"
                  }
                },
                "Alphanumeric 8-character code": {
                  "summary": "Großbuchstaben + Ziffern, spanische Vorlage",
                  "value": {
                    "email": "bob@example.com",
                    "options": {
                      "code_size": 8,
                      "alphanumeric_code": true,
                      "locale": "es"
                    }
                  }
                },
                "White-label branding": {
                  "summary": "Senden Sie die OTP-E-Mail mit der White-Label-Anpassung Ihrer Anwendung",
                  "value": {
                    "email": "carol@example.com",
                    "options": {
                      "locale": "en",
                      "use_white_label_customization": true
                    },
                    "vendor_data": "user-5678"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Versand bestätigt. Prüfen Sie `status`: `Success` und `Retry` bedeuten, dass ein Code unterwegs ist; `Undeliverable` bedeutet, dass die Adresse keine Post empfangen kann und die Verifizierung bereits als `Declined` abgeschlossen ist. `request_id` ist die gespeicherte Sitzungs-ID (dieselbe ID bei einem `Retry`).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EmailVerificationSendResponse"
                },
                "examples": {
                  "Success": {
                    "summary": "OTP per E-Mail für eine neue Verifizierung gesendet (abgerechnet)",
                    "value": {
                      "request_id": "e39cb057-92fc-4b59-b84e-02fec29a0f24",
                      "status": "Success",
                      "reason": null,
                      "vendor_data": "user-1234",
                      "metadata": null
                    }
                  },
                  "Retry": {
                    "summary": "Zweiter Versand innerhalb des 5-Minuten-Fensters — neuer Code, identische request_id, kostenlos",
                    "value": {
                      "request_id": "e39cb057-92fc-4b59-b84e-02fec29a0f24",
                      "status": "Retry",
                      "reason": null,
                      "vendor_data": "user-1234",
                      "metadata": null
                    }
                  },
                  "Undeliverable": {
                    "summary": "Adresse hat die DNS/MX-Validierung nicht bestanden – Verifizierung als abgelehnt abgeschlossen, nichts abgerechnet",
                    "value": {
                      "request_id": "cb1a5011-344d-444d-bdce-218904745d7f",
                      "status": "Undeliverable",
                      "reason": "email_can_not_be_delivered",
                      "vendor_data": "user-1234",
                      "metadata": null
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Validierungsfehler – DRFs Feldfehler-Envelope: ein Array von Meldungen pro fehlerhaftem Feld, bei Optionsfehlern unter `options` geschachtelt.",
            "content": {
              "application/json": {
                "examples": {
                  "Invalid email": {
                    "summary": "Ungültige E-Mail-Adresse",
                    "value": {
                      "email": [
                        "Enter a valid email address."
                      ]
                    }
                  },
                  "Unsupported locale": {
                    "summary": "`options.locale` außerhalb der unterstützten Auswahl",
                    "value": {
                      "options": {
                        "locale": [
                          "Invalid locale. Supported locales are en, ar, bn, bg, bs, ca, cs, da, de, el, es, et, fa, fi, fr, he, hi, hr, hu, hy, id, it, ja, ka, kk, ko, ky, lt, lv, cnr, mk, mn, ms, nl, no, pl, pt-BR, pt, ro, ru, sk, sl, so, sq, sr, sv, th, tr, uk, uz, vi, zh-CN, zh-TW, zh."
                        ]
                      }
                    }
                  },
                  "Code size out of range": {
                    "summary": "`options.code_size` außerhalb von 4–8",
                    "value": {
                      "options": {
                        "code_size": [
                          "Ensure this value is less than or equal to 8."
                        ]
                      }
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Zugriff verweigert. Wird zurückgegeben, wenn der Header `x-api-key` fehlt (`{\"detail\": ...}`); ein falscher, widerrufener oder abgelaufener Schlüssel gibt `401` zurück. Wird auch vor jedem Senden zurückgegeben, wenn das Guthaben der Organisation einen Credit der E-Mail-Verifizierungs-API nicht decken kann (`{\"error\": ...}`).",
            "content": {
              "application/json": {
                "examples": {
                  "Missing or invalid API key": {
                    "summary": "Kein `x-api-key`-Header, oder der Schlüssel ist ungültig/widerrufen",
                    "value": {
                      "detail": "You do not have permission to perform this action."
                    }
                  },
                  "Not enough credits": {
                    "summary": "Das Guthaben der Organisation reicht für den Preis des Versands nicht aus",
                    "value": {
                      "error": "You don't have enough credits to perform this request."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate-Limit überschritten. POST/PATCH/DELETE-Endpoints teilen sich ein Budget von 300 Schreibanfragen pro Minute pro API-Schlüssel (Transaktionserstellungen und Ereignis-Ingestion haben ein separates Budget von 600). Die Antwort enthält die Header `X-RateLimit-Limit`, `X-RateLimit-Remaining`, `X-RateLimit-Reset` und `Retry-After`.",
            "content": {
              "application/json": {
                "examples": {
                  "Write rate limit exceeded": {
                    "summary": "Mehr als 300 Schreibanfragen in der aktuellen Minute",
                    "value": {
                      "detail": "Write request rate limit exceeded. You can make up to 300 requests per minute."
                    }
                  }
                },
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          },
          "503": {
            "description": "Die E-Mail konnte aus einem Grund, der nicht mit der Adresse zusammenhängt, nicht gesendet werden (der E-Mail-Anbieter konnte nicht erreicht werden, hatte ein Timeout oder lehnte den Versand selbst ab), sodass kein Code gesendet und nichts abgerechnet oder als Sendeversuch gezählt wurde. Wiederholen Sie dieselbe Anfrage.",
            "content": {
              "application/json": {
                "examples": {
                  "Email delivery unavailable": {
                    "summary": "Der E-Mail-Anbieter ist nach einem automatischen Wiederholungsversuch ausgefallen",
                    "value": {
                      "detail": "Email delivery is temporarily unavailable. Please try again."
                    }
                  }
                },
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/v3/email/check/": {
      "post": {
        "summary": "E-Mail-Code prüfen",
        "description": "Verifizieren Sie den über [`POST /v3/email/send/`](/de/standalone-apis/email-send) zugestellten OTP und erhalten Sie das finale Verifizierungsergebnis sowie Informationen zur E-Mail: Zustellbarkeit, Datenleck-Status (`is_breached` und die `breaches`-Liste aus einer Datenbank zu Datenlecks), Erkennung von Wegwerf-Anbietern und mehrfache Nutzung der Adresse über Ihre Sitzungen hinweg.\n\n**Wie die Prüfung die Verifizierung findet.** Der Abgleich erfolgt über Ihre Anwendung sowie die `email`-Adresse – `request_id` ist keine Eingabe. Es wird die neueste ausstehende Verifizierung geprüft, die innerhalb der letzten **5 Minuten** erstellt wurde. Gibt es keine (nie gesendet, bereits abgeschlossen, zum Sendezeitpunkt unzustellbar oder älter als 5 Minuten), gibt der Endpoint `200` mit `status: \"Expired or Not Found\"` zurück.\n\n**Versuchskontingent.** Jede Verifizierung erlaubt **3 Code-Versuche**. Die ersten beiden falschen Codes geben `status: \"Failed\"` mit den verbleibenden Versuchen und `email: null` zurück; der dritte falsche Code schließt die Verifizierung als `Declined` mit einer `EMAIL_CODE_ATTEMPTS_EXCEEDED`-Warnung ab und gibt den vollständigen E-Mail-Bericht zurück. Codes werden ohne Berücksichtigung von Groß-/Kleinschreibung verglichen (relevant für Versendungen mit `alphanumeric_code`); nur der zuletzt gesendete Code ist gültig.\n\n**Ergebnisse.** `Approved` – korrekter Code und kein ablehnendes Risiko. `Declined` – endgültig: Der Code war korrekt, aber ein ablehnendes Risiko zutraf (eine `DECLINE`-Aktion unten, eine Adresse auf der Sperrliste oder die Adresse wurde beim Abschluss als unzustellbar eingestuft) oder das Versuchskontingent wurde aufgebraucht. `Failed` – falscher Code, verbleibende Versuche. `Expired or Not Found` – nichts zu prüfen. Bei `Approved`/`Declined` entspricht `request_id` der `request_id` des Sendevorgangs (der Sitzungs-ID) und `email` enthält den vollständigen Bericht (`is_breached`, `breaches`, `is_disposable`, `is_undeliverable`, `warnings`, `lifecycle`, `matches`); bei `Failed` und `Expired or Not Found` ist `request_id` eine einmalige zufällige UUID.\n\n**Risikoaktionen.** `duplicated_email_action`, `breached_email_action` und `disposable_email_action` bestimmen, was geschieht, wenn bei einem korrekten Code das entsprechende Risiko erkannt wird: `DECLINE` setzt den finalen Status auf `Declined`; `NO_ACTION` (Standard) erfasst das Risiko in `email.warnings`, ohne den Status zu beeinflussen.\n\n**Abrechnung.** Prüfungen sind kostenlos – der Credit wird durch das erfolgreiche Senden verbraucht.\n\n**Sitzungspersistenz.** Eine abgeschlossene Prüfung aktualisiert die durch das Senden erstellte Sitzung (sichtbar in der Business Console, abrufbar über `GET /v3/session/{sessionId}/decision/`) und löst einen `status.updated`-Webhook aus.\n\n**Sandbox.** Sandbox-API-Schlüssel überspringen die gesamte Verarbeitung: Jeder wohlgeformte Code (einschließlich `123456`) gibt eine statische `Approved`-Payload mit einem vereinfachten `email`-Objekt (`status`, `email`, `is_breached`, `is_disposable`, `is_undeliverable`) zurück; fehlerhafte Eingaben geben weiterhin `400` zurück. Nichts wird persistent gespeichert.\n\n**Authentifizierung.** Senden Sie den API-Schlüssel Ihrer Anwendung im `x-api-key`-Header. Fehlende oder ungültige Anmeldedaten geben `403` (`{\"detail\": \"You do not have permission to perform this action.\"}`) zurück – diese API gibt niemals `401` zurück.\n\n**Rate-Limit.** Geteiltes Schreibkontingent von 300 Anfragen/Min. pro API-Schlüssel über alle POST/PATCH/DELETE-Endpoints hinweg; bei Überschreitung wird `429` zurückgegeben.\n\n**Sozialer Fußabdruck.** Setzen Sie `enable_social` auf `true`, um einen `email_social`-Block hinzuzufügen: die Online-Plattformen, auf denen diese Adresse registriert ist, mit Anzahlen pro Kategorie und allen verfügbaren Profildetails. `profiles_registered: 0` bedeutet, dass die Plattformen geprüft wurden und die Adresse auf keiner davon gefunden wurde – eine gültige, abrechenbare Antwort. Der Block fehlt, wenn das Add-on nicht angefordert wurde oder die Prüfung nicht abgeschlossen werden konnte, und wird in diesem Fall nicht abgerechnet. Die Abrechnung fügt eine `email_social`-Einheit pro Anfrage zusätzlich zum eigenen Preis dieses Endpoints hinzu.",
        "operationId": "post_v3email_check",
        "x-didit-sdk": {
          "resource": "email",
          "method": "check_code",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Standalone APIs"
        ],
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X POST https://verification.didit.me/v3/email/check/ \\\n  -H 'x-api-key: YOUR_API_KEY' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\n    \"email\": \"alice@example.com\",\n    \"code\": \"123456\",\n    \"disposable_email_action\": \"DECLINE\"\n  }'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.email.check_code(\n    email=\"alice@example.com\",\n    code=\"123456\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.email.checkCode({\n  email: \"alice@example.com\",\n  code: \"123456\",\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Email.CheckCode(ctx, didit.EmailCheckCodeParams{\n\tEmail: \"alice@example.com\",\n\tCode:  \"123456\",\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\nimport me.didit.types.EmailCheckCodeParams;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.email().checkCode(EmailCheckCodeParams.builder()\n        .email(\"alice@example.com\")\n        .code(\"123456\")\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->email->checkCode([\n    'email' => 'alice@example.com',\n    'code' => '123456',\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.email.check_code(\n  email: \"alice@example.com\",\n  code: \"123456\"\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Email.CheckCodeAsync(new EmailCheckCodeParams\n{\n    Email = \"alice@example.com\",\n    Code = \"123456\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "email": {
                    "type": "string",
                    "format": "email",
                    "description": "Dieselbe E-Mail-Adresse, die im zugehörigen Aufruf von [`POST /v3/email/send/`](/de/standalone-apis/email-send) verwendet wurde. Dadurch wird die Prüfung mit dem Versand verknüpft.",
                    "example": "alice@example.com"
                  },
                  "code": {
                    "type": "string",
                    "maxLength": 10,
                    "description": "Das OTP, das der Endbenutzer erhalten hat: 4–8 Ziffern oder 4–8 Buchstaben/Ziffern, wenn beim Senden `alphanumeric_code: true` verwendet wurde. Beim Abgleich wird die Groß-/Kleinschreibung nicht berücksichtigt.",
                    "example": "123456"
                  },
                  "duplicated_email_action": {
                    "type": "string",
                    "enum": [
                      "NO_ACTION",
                      "DECLINE"
                    ],
                    "default": "NO_ACTION",
                    "description": "Was zu tun ist, wenn dieselbe Adresse bereits von einem anderen Benutzer Ihrer Anwendung verwendet und genehmigt wurde (nur zuvor genehmigte Verifizierungen zählen) (andere `vendor_data`). `DECLINE` ändert den finalen `status` zu `Declined`; `NO_ACTION` erfasst das Risiko in `email.warnings` und befüllt `email.matches`."
                  },
                  "breached_email_action": {
                    "type": "string",
                    "enum": [
                      "NO_ACTION",
                      "DECLINE"
                    ],
                    "default": "NO_ACTION",
                    "description": "Was zu tun ist, wenn die Adresse in bekannten Datenlecks auftaucht (`email.is_breached`). `DECLINE` setzt den endgültigen `status` auf `Declined`; `NO_ACTION` erfasst das Risiko in `email.warnings`."
                  },
                  "disposable_email_action": {
                    "type": "string",
                    "enum": [
                      "NO_ACTION",
                      "DECLINE"
                    ],
                    "default": "NO_ACTION",
                    "description": "Was zu tun ist, wenn die Domain zu einem Anbieter für Wegwerf-/Temporär-E-Mails gehört (`email.is_disposable`). `DECLINE` ändert den finalen `status` zu `Declined`; `NO_ACTION` erfasst das Risiko in `email.warnings`."
                  },
                  "enable_enrichment": {
                    "type": "boolean",
                    "default": false,
                    "description": "Wenn `true`, wird zusätzlich eine E-Mail-Intelligence für die Adresse ausgeführt: ein Risiko-Score und ihre Historie von Datenpannen. Wird als eine `email_intelligence_api`-Einheit pro Anfrage ($0.05 zum Listenpreis) zusätzlich zum eigenen Preis dieses Endpoints abgerechnet. Die Anfrage gibt `403` zurück, wenn Ihr Guthaben dies nicht decken kann.",
                    "example": false
                  },
                  "email_intelligence_score_action": {
                    "type": "string",
                    "enum": [
                      "NO_ACTION",
                      "DECLINE"
                    ],
                    "default": "NO_ACTION",
                    "description": "Aktion, wenn der Risiko-Score der E-Mail-Intelligence über dem Schwellenwert liegt. `DECLINE` ändert den endgültigen `status` zu `Declined`; `NO_ACTION` erfasst das Signal, ohne abzulehnen. Wird nur wirksam, wenn `enable_enrichment` auf `true` gesetzt ist."
                  },
                  "recent_email_breach_action": {
                    "type": "string",
                    "enum": [
                      "NO_ACTION",
                      "DECLINE"
                    ],
                    "default": "NO_ACTION",
                    "description": "Aktion, wenn die Adresse in einer kürzlich bekannt gewordenen Datenpanne vorkommt. `DECLINE` ändert den endgültigen `status` auf `Declined`; `NO_ACTION` erfasst das Signal, ohne abzulehnen. Wird nur wirksam, wenn `enable_enrichment` auf `true` gesetzt ist."
                  },
                  "frequent_email_breach_action": {
                    "type": "string",
                    "enum": [
                      "NO_ACTION",
                      "DECLINE"
                    ],
                    "default": "NO_ACTION",
                    "description": "Aktion, wenn die Adresse in vielen bekannten Datenpannen vorkommt. `DECLINE` ändert den endgültigen `status` auf `Declined`; `NO_ACTION` erfasst das Signal, ohne abzulehnen. Wird nur wirksam, wenn `enable_enrichment` auf `true` gesetzt ist."
                  },
                  "enable_social": {
                    "type": "boolean",
                    "default": false,
                    "description": "Wenn true, wird auch der digitale Fußabdruck der Adresse ermittelt – die E-Mail-, Social-, Berufs-, E-Commerce- und Unterhaltungsplattformen, auf denen sie registriert ist. Wird als eine `email_social`-Einheit pro Anfrage zusätzlich zum regulären Preis dieses Endpoints abgerechnet.",
                    "example": true
                  },
                  "email_no_social_presence_action": {
                    "type": "string",
                    "enum": [
                      "NO_ACTION",
                      "DECLINE"
                    ],
                    "default": "NO_ACTION",
                    "description": "Aktion, wenn die Prüfung des digitalen Fußabdrucks (Social Footprint) ergibt, dass die Adresse auf keiner der abgedeckten Plattformen registriert ist. An diesem Endpoint werden nur NO_ACTION und DECLINE akzeptiert; REVIEW ist über den gleichnamigen Workflow-Konfigurationsschlüssel verfügbar."
                  }
                },
                "required": [
                  "email",
                  "code"
                ]
              },
              "examples": {
                "Default": {
                  "summary": "Alle Risiken erfassen, aber nie automatisch ablehnen",
                  "value": {
                    "email": "alice@example.com",
                    "code": "123456"
                  }
                },
                "Strict risk policy": {
                  "summary": "Wegwerf- und kompromittierte E-Mail-Postfächer automatisch ablehnen",
                  "value": {
                    "email": "alice@example.com",
                    "code": "123456",
                    "disposable_email_action": "DECLINE",
                    "breached_email_action": "DECLINE"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Prüfung abgeschlossen – falsche Codes und fehlende Verifizierungen geben ebenfalls `200` zurück; prüfen Sie `status`, nicht den HTTP-Code. `email` ist nur bei abgeschlossenen Ergebnissen (`Approved`/`Declined`) ausgefüllt, `null` bei `Failed` und fehlt bei `Expired or Not Found`.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EmailVerificationCheckResponse"
                },
                "examples": {
                  "Approved": {
                    "summary": "Korrekter Code – saubere Adresse, vollständiger E-Mail-Bericht",
                    "value": {
                      "request_id": "e39cb057-92fc-4b59-b84e-02fec29a0f24",
                      "status": "Approved",
                      "message": "The verification code is correct.",
                      "email": {
                        "status": "Approved",
                        "email": "alice@example.com",
                        "is_breached": false,
                        "breaches": [],
                        "is_disposable": false,
                        "is_undeliverable": false,
                        "verification_attempts": 1,
                        "verified_at": "2026-06-12T01:24:47.311323Z",
                        "warnings": [],
                        "lifecycle": [
                          {
                            "type": "EMAIL_VERIFICATION_MESSAGE_SENT",
                            "timestamp": "2026-06-12T01:23:39.580554+00:00",
                            "details": {
                              "status": "Success",
                              "reason": null
                            },
                            "fee": 0.02
                          },
                          {
                            "type": "VALID_CODE_ENTERED",
                            "timestamp": "2026-06-12T01:24:47.311201+00:00",
                            "details": {
                              "code_tried": "123456",
                              "status": "Approved"
                            },
                            "fee": 0
                          },
                          {
                            "type": "EMAIL_VERIFICATION_APPROVED",
                            "timestamp": "2026-06-12T01:24:47.384292+00:00",
                            "details": null,
                            "fee": 0
                          }
                        ],
                        "matches": []
                      },
                      "vendor_data": "user-1234",
                      "metadata": null,
                      "created_at": "2026-06-12T01:24:47.401719+00:00"
                    }
                  },
                  "Approved with breach exposure": {
                    "summary": "Korrekter Code; Gefährdung durch ein Datenleck als Warnung erfasst (breached_email_action=NO_ACTION)",
                    "value": {
                      "request_id": "3a1f2b6c-9d4e-4f7a-8b2c-1e5d6f7a8b9c",
                      "status": "Approved",
                      "message": "The verification code is correct.",
                      "email": {
                        "status": "Approved",
                        "email": "bob@example.com",
                        "is_breached": true,
                        "breaches": [
                          {
                            "name": "ExampleApp",
                            "domain": "exampleapp.com",
                            "breach_date": "2019-03-21",
                            "breach_emails_count": 763117,
                            "description": "In March 2019, the social platform ExampleApp suffered a data breach that exposed email addresses and passwords.",
                            "logo_path": "https://<media-host>/logos/ExampleApp.png",
                            "data_classes": [
                              "email_addresses",
                              "passwords"
                            ],
                            "is_verified": true
                          }
                        ],
                        "is_disposable": false,
                        "is_undeliverable": false,
                        "verification_attempts": 1,
                        "verified_at": "2026-06-12T01:24:47.311323Z",
                        "warnings": [
                          {
                            "feature": "EMAIL",
                            "risk": "BREACHED_EMAIL_DETECTED",
                            "additional_data": null,
                            "log_type": "information",
                            "short_description": "Breached email detected",
                            "long_description": "This email address was found in one or more known data breaches."
                          }
                        ],
                        "lifecycle": [
                          {
                            "type": "EMAIL_VERIFICATION_MESSAGE_SENT",
                            "timestamp": "2026-06-12T01:23:39.580554+00:00",
                            "details": {
                              "status": "Success",
                              "reason": null
                            },
                            "fee": 0.02
                          },
                          {
                            "type": "VALID_CODE_ENTERED",
                            "timestamp": "2026-06-12T01:24:47.311201+00:00",
                            "details": {
                              "code_tried": "835126",
                              "status": "Approved"
                            },
                            "fee": 0
                          },
                          {
                            "type": "EMAIL_VERIFICATION_APPROVED",
                            "timestamp": "2026-06-12T01:24:47.384292+00:00",
                            "details": null,
                            "fee": 0
                          }
                        ],
                        "matches": []
                      },
                      "vendor_data": "user-5678",
                      "metadata": null,
                      "created_at": "2026-06-12T01:24:47.401719+00:00"
                    }
                  },
                  "Failed (attempts remaining)": {
                    "summary": "Falscher Code – der Benutzer kann es erneut versuchen; request_id ist hier eine einmalige UUID",
                    "value": {
                      "request_id": "11111111-2222-3333-4444-555555555555",
                      "status": "Failed",
                      "message": "The verification code is incorrect. Attempts remaining: 2",
                      "email": null,
                      "vendor_data": "user-1234",
                      "metadata": null,
                      "created_at": "2026-06-12T01:24:21.512340+00:00"
                    }
                  },
                  "Declined (risk policy)": {
                    "summary": "Korrekter Code, aber die Adresse ist eine Wegwerfadresse und disposable_email_action=DECLINE",
                    "value": {
                      "request_id": "8c2d3e4f-5a6b-4c7d-8e9f-0a1b2c3d4e5f",
                      "status": "Declined",
                      "message": "The verification code is correct.",
                      "email": {
                        "status": "Declined",
                        "email": "tempuser42@mailinator.com",
                        "is_breached": false,
                        "breaches": [],
                        "is_disposable": true,
                        "is_undeliverable": false,
                        "verification_attempts": 1,
                        "verified_at": "2026-06-12T01:24:47.311323Z",
                        "warnings": [
                          {
                            "feature": "EMAIL",
                            "risk": "DISPOSABLE_EMAIL_DETECTED",
                            "additional_data": null,
                            "log_type": "error",
                            "short_description": "Disposable email detected",
                            "long_description": "The system detected that the email is disposable, which is not allowed."
                          }
                        ],
                        "lifecycle": [
                          {
                            "type": "EMAIL_VERIFICATION_MESSAGE_SENT",
                            "timestamp": "2026-06-12T01:23:39.580554+00:00",
                            "details": {
                              "status": "Success",
                              "reason": null
                            },
                            "fee": 0.02
                          },
                          {
                            "type": "VALID_CODE_ENTERED",
                            "timestamp": "2026-06-12T01:24:47.311201+00:00",
                            "details": {
                              "code_tried": "123456",
                              "status": "Approved"
                            },
                            "fee": 0
                          },
                          {
                            "type": "EMAIL_VERIFICATION_DECLINED",
                            "timestamp": "2026-06-12T01:24:47.384292+00:00",
                            "details": {
                              "reason": "DISPOSABLE_EMAIL_DETECTED"
                            },
                            "fee": 0
                          }
                        ],
                        "matches": []
                      },
                      "vendor_data": "user-1234",
                      "metadata": null,
                      "created_at": "2026-06-12T01:24:47.401719+00:00"
                    }
                  },
                  "Expired or Not Found": {
                    "summary": "Keine ausstehende Verifizierung für diese Adresse in den letzten 5 Minuten",
                    "value": {
                      "request_id": "88808a77-06e9-4cb0-85f5-9c052ddfd987",
                      "status": "Expired or Not Found",
                      "message": "No pending email verification found in the last 5 minutes.",
                      "vendor_data": null,
                      "metadata": null,
                      "created_at": "2026-06-12T01:24:59.887904+00:00"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Validierungsfehler – DRFs Feldfehler-Envelope: ein Array von Meldungen pro fehlerhaftem Feld.",
            "content": {
              "application/json": {
                "examples": {
                  "Invalid email": {
                    "summary": "Ungültige E-Mail-Adresse",
                    "value": {
                      "email": [
                        "Enter a valid email address."
                      ]
                    }
                  },
                  "Missing code": {
                    "summary": "`code` ist nicht im Body enthalten",
                    "value": {
                      "code": [
                        "This field is required."
                      ]
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Zugriff verweigert. Wird zurückgegeben, wenn der Header `x-api-key` fehlt; ein falscher, widerrufener oder abgelaufener Schlüssel gibt `401` zurück. Prüfungen sind kostenlos, daher erfolgt hier keine Credit-Prüfung.",
            "content": {
              "application/json": {
                "examples": {
                  "Missing or invalid API key": {
                    "summary": "Kein `x-api-key`-Header, oder der Schlüssel ist ungültig/widerrufen",
                    "value": {
                      "detail": "You do not have permission to perform this action."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate-Limit überschritten. POST/PATCH/DELETE-Endpoints teilen sich ein Budget von 300 Schreibanfragen pro Minute pro API-Schlüssel (Transaktionserstellungen und Ereignis-Ingestion haben ein separates Budget von 600). Die Antwort enthält die Header `X-RateLimit-Limit`, `X-RateLimit-Remaining`, `X-RateLimit-Reset` und `Retry-After`.",
            "content": {
              "application/json": {
                "examples": {
                  "Write rate limit exceeded": {
                    "summary": "Mehr als 300 Schreibanfragen in der aktuellen Minute",
                    "value": {
                      "detail": "Write request rate limit exceeded. You can make up to 300 requests per minute."
                    }
                  }
                },
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/v3/workflows/": {
      "get": {
        "summary": "Workflows auflisten",
        "description": "Ihre Workflows auflisten, die neuesten zuerst, in einem Paginierungs-Umschlag mit Limit/Offset (`{count, next, previous, results}`, Standard-Seitengröße 50). Jede Zeile stellt eine Version dar; `workflow_id` ist die stabile Gruppen-ID, und neue Sitzungen verwenden die neueste `published`-Version.",
        "operationId": "list_workflows",
        "x-didit-sdk": {
          "resource": "workflows",
          "method": "list",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Workflows"
        ],
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "default": 50
            },
            "description": "Seitengröße (Anzahl der Workflows pro Seite)."
          },
          {
            "name": "offset",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "default": 0
            },
            "description": "Anzahl der vor dem ersten zurückgegebenen Workflow zu überspringenden Zeilen."
          }
        ],
        "responses": {
          "200": {
            "description": "Eine Seite mit Workflows, absteigend nach `created_at` sortiert, eingebettet in das Paginierungsobjekt. Jedes Element in `results` ist ein `WorkflowListItem`.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "count": {
                      "type": "integer",
                      "description": "Gesamtzahl der Workflow-Versionen für die Anwendung."
                    },
                    "next": {
                      "type": "string",
                      "format": "uri",
                      "nullable": true,
                      "description": "URL der nächsten Seite oder `null` auf der letzten Seite."
                    },
                    "previous": {
                      "type": "string",
                      "format": "uri",
                      "nullable": true,
                      "description": "URL der vorherigen Seite oder `null` auf der ersten Seite."
                    },
                    "results": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/WorkflowListItem"
                      }
                    }
                  }
                },
                "examples": {
                  "Two workflows": {
                    "summary": "Ein Standard-KYC-Workflow und ein Entwurf für einen KYC + AML-Workflow",
                    "value": {
                      "count": 2,
                      "next": null,
                      "previous": null,
                      "results": [
                        {
                          "uuid": "a1b2c3d4-5678-90ab-cdef-111111111111",
                          "workflow_id": "a1b2c3d4-5678-90ab-cdef-111111111111",
                          "workflow_label": "Standard KYC",
                          "workflow_type": "kyc",
                          "is_default": true,
                          "is_archived": false,
                          "is_white_label_enabled": false,
                          "total_price": 0.15,
                          "min_price": 0.15,
                          "max_price": 0.15,
                          "features": "OCR + LIVENESS + FACE_MATCH",
                          "is_simple_workflow": true,
                          "is_editable": false,
                          "workflow_url": "https://verify.didit.me/u/_yljPOx8RWG3UAz5ZRQGVQ",
                          "max_retry_attempts": 3,
                          "retry_window_days": 7,
                          "session_expiration_time": 604800,
                          "version": 2,
                          "status": "published",
                          "has_draft": false,
                          "created_by": {
                            "name": "Alex Mateo",
                            "email": "alex@example.com",
                            "type": "user"
                          },
                          "updated_at": "2026-04-12T10:30:00Z"
                        },
                        {
                          "uuid": "b2c3d4e5-6789-01bc-defa-222222222222",
                          "workflow_id": "b2c3d4e5-6789-01bc-defa-222222222222",
                          "workflow_label": "Full Verification + AML",
                          "workflow_type": "kyc",
                          "is_default": false,
                          "is_archived": false,
                          "is_white_label_enabled": false,
                          "total_price": 0.25,
                          "min_price": 0.25,
                          "max_price": 0.25,
                          "features": "OCR + LIVENESS + FACE_MATCH + AML",
                          "is_simple_workflow": true,
                          "is_editable": true,
                          "workflow_url": "https://verify.didit.me/u/Aq3kPOx8RWG3UAz5ZRQGVQ",
                          "max_retry_attempts": 3,
                          "retry_window_days": 7,
                          "session_expiration_time": 604800,
                          "version": 1,
                          "status": "draft",
                          "has_draft": true,
                          "created_by": null,
                          "updated_at": "2026-04-15T18:05:21Z"
                        }
                      ]
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Der API-Schlüssel fehlt, ist fehlerhaft formatiert, abgelaufen oder gehört zu einer anderen Anwendung. Body: `{\"detail\": \"You do not have permission to perform this action.\"}`. Erneuern Sie das Token über die [Auth API](/de/auth-api/get-credentials) und versuchen Sie es erneut.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string"
                    }
                  }
                },
                "examples": {
                  "Invalid token": {
                    "value": {
                      "detail": "You do not have permission to perform this action."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate-Limit überschritten. Wiederholen Sie die Anfrage mit exponentiellem Backoff und beachten Sie etwaige `Retry-After`-Header."
          },
          "500": {
            "description": "Unerwarteter Serverfehler beim Erstellen der Liste. Die Anfrage kann sicher wiederholt werden."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "cURL",
            "source": "curl -X GET 'https://verification.didit.me/v3/workflows/' \\\n  -H 'x-api-key: YOUR_API_KEY' \\\n  -H 'Accept: application/json'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nfor item in client.workflows.list():\n    print(item)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nfor await (const item of didit.workflows.list()) {\n  console.log(item);\n}"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\niter := client.Workflows.ListAutoPaging(ctx, didit.WorkflowsListParams{})\nfor iter.Next() {\n\tfmt.Printf(\"%+v\\n\", iter.Current())\n}\nif err := iter.Err(); err != nil {\n\tlog.Fatal(err)\n}"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nfor (var item : client.workflows().list()) {\n    System.out.println(item);\n}"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\nforeach ($didit->workflows->list() as $item) {\n    print_r($item->toArray());\n}"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\ndidit.workflows.list.auto_paging_each do |item|\n  puts item.to_h\nend"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nawait foreach (var item in await client.Workflows.ListAsync())\n{\n    Console.WriteLine(JsonSerializer.Serialize(item));\n}"
          }
        ]
      },
      "post": {
        "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",
        "x-didit-sdk": {
          "resource": "workflows",
          "method": "create",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Workflows"
        ],
        "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/' \\\n  -H 'x-api-key: YOUR_API_KEY' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\n    \"workflow_label\": \"Standard KYC\",\n    \"features\": [\n      {\"feature\": \"OCR\"},\n      {\"feature\": \"LIVENESS\", \"config\": {\"face_liveness_method\": \"passive\"}},\n      {\"feature\": \"FACE_MATCH\", \"config\": {\"face_match_score_decline_threshold\": 40, \"face_match_score_review_threshold\": 60}}\n    ]\n  }'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.workflows.create(\n    workflow_label=\"Standard KYC\",\n    features=[{\n        \"feature\": \"OCR\",\n        \"config\": {\"duplicated_user_action\": \"review\"},\n    }, {\n        \"feature\": \"LIVENESS\",\n        \"config\": {\"face_liveness_method\": \"passive\"},\n    }, {\n        \"feature\": \"FACE_MATCH\",\n        \"config\": {\"face_match_score_decline_threshold\": 40, \"face_match_score_review_threshold\": 60},\n    }],\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.workflows.create({\n  workflow_label: \"Standard KYC\",\n  features: [{\n    feature: \"OCR\",\n    config: { duplicated_user_action: \"review\" },\n  }, {\n    feature: \"LIVENESS\",\n    config: { face_liveness_method: \"passive\" },\n  }, {\n    feature: \"FACE_MATCH\",\n    config: { face_match_score_decline_threshold: 40, face_match_score_review_threshold: 60 },\n  }],\n});\nconsole.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;\nimport java.util.Map;\nimport me.didit.Didit;\nimport me.didit.types.SimpleWorkflowFeature;\nimport me.didit.types.SimpleWorkflowRequest;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.workflows().create(SimpleWorkflowRequest.builder()\n        .workflowLabel(\"Standard KYC\")\n        .features(List.of(\n                SimpleWorkflowFeature.builder()\n                        .feature(SimpleWorkflowFeature.Feature.of(\"OCR\"))\n                        .config(Map.of(\"duplicated_user_action\", \"review\"))\n                        .build(),\n                SimpleWorkflowFeature.builder()\n                        .feature(SimpleWorkflowFeature.Feature.of(\"LIVENESS\"))\n                        .config(Map.of(\"face_liveness_method\", \"passive\"))\n                        .build(),\n                SimpleWorkflowFeature.builder()\n                        .feature(SimpleWorkflowFeature.Feature.of(\"FACE_MATCH\"))\n                        .config(Map.of(\"face_match_score_decline_threshold\", 40, \"face_match_score_review_threshold\", 60))\n                        .build()))\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->workflows->create([\n    'workflow_label' => 'Standard KYC',\n    'features' => [[\n        'feature' => 'OCR',\n        'config' => ['duplicated_user_action' => 'review'],\n    ], [\n        'feature' => 'LIVENESS',\n        'config' => ['face_liveness_method' => 'passive'],\n    ], [\n        'feature' => 'FACE_MATCH',\n        'config' => ['face_match_score_decline_threshold' => 40, 'face_match_score_review_threshold' => 60],\n    ]],\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.workflows.create(\n  workflow_label: \"Standard KYC\",\n  features: [{\n    feature: \"OCR\",\n    config: { duplicated_user_action: \"review\" },\n  }, {\n    feature: \"LIVENESS\",\n    config: { face_liveness_method: \"passive\" },\n  }, {\n    feature: \"FACE_MATCH\",\n    config: { face_match_score_decline_threshold: 40, face_match_score_review_threshold: 60 },\n  }]\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Collections.Generic;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Workflows.CreateAsync(new SimpleWorkflowRequest\n{\n    WorkflowLabel = \"Standard KYC\",\n    Features = new SimpleWorkflowFeature[]\n    {\n        new()\n        {\n            Feature = \"OCR\",\n            Config = new Dictionary<string, object> { [\"duplicated_user_action\"] = \"review\" },\n        },\n        new()\n        {\n            Feature = \"LIVENESS\",\n            Config = new Dictionary<string, object> { [\"face_liveness_method\"] = \"passive\" },\n        },\n        new()\n        {\n            Feature = \"FACE_MATCH\",\n            Config = new Dictionary<string, object> { [\"face_match_score_decline_threshold\"] = 40, [\"face_match_score_review_threshold\"] = 60 },\n        },\n    },\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ]
      }
    },
    "/v3/workflows/{settings_uuid}/": {
      "get": {
        "summary": "Workflow abrufen",
        "description": "Ruft die vollständige Konfiguration für eine Workflow-Version anhand der `settings_uuid` ab: Funktions-Toggles, Schwellenwerte, zulässige Dokumente, Graph, Richtlinie für Wiederholungsversuche, Callbacks und Preise.",
        "operationId": "get_workflow",
        "x-didit-sdk": {
          "resource": "workflows",
          "method": "retrieve",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Workflows"
        ],
        "parameters": [
          {
            "name": "settings_uuid",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Versionsspezifische UUID des Workflows (der vom Listen-Endpoint zurückgegebene `uuid`-Wert). Jede Version eines Workflows hat ihre eigene `settings_uuid`."
          }
        ],
        "responses": {
          "200": {
            "description": "Vollständige Workflow-Konfiguration. Die Struktur entspricht der rohen `VerificationSettings`-Serialisierung (~190 Felder: jeder Feature-Toggle, Schwellenwert, jede Warnungsaktion, Konfiguration zulässiger Dokumente, der `workflow_graph`, Wiederholungsrichtlinie, Callbacks und Preise). Das nachfolgende Beispiel ist gekürzt. Hinweise: `features` ist ein mit `\" + \"` verbundener String (z. B. `\"OCR + LIVENESS\"`), Preise sind JSON-Zahlen und `is_editable` ist nur für `draft`-Versionen `true`.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WorkflowDetail"
                },
                "examples": {
                  "KYC workflow with face match (abbreviated)": {
                    "value": {
                      "uuid": "a1b2c3d4-5678-90ab-cdef-111111111111",
                      "workflow_id": "a1b2c3d4-5678-90ab-cdef-111111111111",
                      "workflow_label": "Standard KYC",
                      "workflow_type": "kyc",
                      "is_default": true,
                      "is_archived": false,
                      "is_liveness_enabled": true,
                      "face_liveness_method": "passive",
                      "face_liveness_score_decline_threshold": 50,
                      "face_liveness_score_review_threshold": 70,
                      "is_face_match_enabled": true,
                      "face_match_score_decline_threshold": 40,
                      "face_match_score_review_threshold": 60,
                      "is_aml_enabled": false,
                      "is_phone_verification_enabled": false,
                      "is_email_verification_enabled": false,
                      "is_database_validation_enabled": false,
                      "is_ip_analysis_enabled": false,
                      "is_nfc_enabled": false,
                      "duplicated_user_action": "no_action",
                      "documents_allowed": {
                        "ESP": {
                          "P": {
                            "sides": 1,
                            "enabled": 1,
                            "subtypes": [
                              "EPASSPORT",
                              "PASSPORT_GENERIC"
                            ],
                            "preferred_characters": "latin",
                            "expiration_check_mode": "strict"
                          }
                        }
                      },
                      "max_retry_attempts": 3,
                      "retry_window_days": 7,
                      "session_expiration_time": 604800,
                      "version": 2,
                      "status": "published",
                      "published_at": "2026-04-12T10:30:00Z",
                      "is_simple_workflow": false,
                      "is_editable": false,
                      "workflow_url": "https://verify.didit.me/u/_yljPOx8RWG3UAz5ZRQGVQ",
                      "total_price": 0.15,
                      "min_price": 0.15,
                      "max_price": 0.15,
                      "features": "OCR + LIVENESS + FACE_MATCH",
                      "created_at": "2025-01-15T10:30:00Z",
                      "updated_at": "2026-04-12T10:30:00Z"
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "API-Schlüssel fehlt, ist fehlerhaft, abgelaufen oder für eine andere Anwendung gültig.",
            "content": {
              "application/json": {
                "examples": {
                  "Invalid token": {
                    "value": {
                      "detail": "You do not have permission to perform this action."
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Für die authentifizierte Anwendung existiert kein Workflow mit dieser `settings_uuid`. Entweder ist die UUID falsch oder sie gehört zu einer anderen Anwendung – Didit unterscheidet die beiden Fälle bewusst nicht, um Rückschlüsse auf anwendungsübergreifende Datensätze zu vermeiden.",
            "content": {
              "application/json": {
                "examples": {
                  "Not found": {
                    "value": {
                      "detail": "Not found."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate-Limit überschritten. Wiederholen Sie die Anfrage mit exponentiellem Backoff."
          },
          "500": {
            "description": "Unerwarteter Serverfehler. Kann sicher wiederholt werden."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "cURL",
            "source": "curl -X GET 'https://verification.didit.me/v3/workflows/a1b2c3d4-5678-90ab-cdef-111111111111/' \\\n  -H 'x-api-key: YOUR_API_KEY'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.workflows.retrieve(\n    \"11111111-2222-3333-4444-555555555555\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.workflows.retrieve(\"11111111-2222-3333-4444-555555555555\");\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Workflows.Retrieve(ctx, \"11111111-2222-3333-4444-555555555555\")\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.workflows().retrieve(\"11111111-2222-3333-4444-555555555555\");\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->workflows->retrieve('11111111-2222-3333-4444-555555555555');\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.workflows.retrieve(\"11111111-2222-3333-4444-555555555555\")\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Workflows.RetrieveAsync(\"11111111-2222-3333-4444-555555555555\");\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ]
      },
      "patch": {
        "summary": "Workflow aktualisieren",
        "description": "Workflow aktualisieren. Die Versionierung hängt vom übergebenen `status`-Feld und dem aktuellen Status der Version ab: (1) kein `status` bei einer **veröffentlichten** Version → die veröffentlichte Version wird direkt aktualisiert (gleiche `uuid`, gleiche `version`); (2) kein `status` bei einem **Entwurf** → der Entwurf wird aktualisiert und sofort veröffentlicht; (3) `status: \"published\"` bei einer **veröffentlichten** Version → eine NEUE veröffentlichte Version wird unter derselben `workflow_id` erstellt (neue `uuid`, `version` + 1) und zurückgegeben, und jeder vorhandene Entwurf in der Gruppe wird gelöscht; (4) `status: \"draft\"` belässt einen Entwurf als Entwurf (automatische Speicherung), wird jedoch bei einer veröffentlichten Version mit 400 abgelehnt (`\"Cannot revert a published version to draft.\"`). Der Body akzeptiert dieselbe strikte Positivliste für Felder wie beim Erstellen – unbekannte Schlüssel werden mit 400 abgelehnt.",
        "operationId": "update_workflow",
        "x-didit-sdk": {
          "resource": "workflows",
          "method": "update",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Workflows"
        ],
        "parameters": [
          {
            "name": "settings_uuid",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Versionsspezifische UUID des zu aktualisierenden Workflows."
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SimpleWorkflowUpdateRequest"
              },
              "examples": {
                "Replace features": {
                  "summary": "Vollständige gewünschte Funktionsreihenfolge senden",
                  "value": {
                    "features": [
                      {
                        "feature": "OCR"
                      },
                      {
                        "feature": "AML"
                      }
                    ]
                  }
                },
                "Rename": {
                  "summary": "Workflow umbenennen",
                  "value": {
                    "workflow_label": "Premium KYC"
                  }
                },
                "Set as default": {
                  "summary": "Diesen Workflow als Standard der Anwendung festlegen",
                  "value": {
                    "is_default": true
                  }
                },
                "Update config": {
                  "summary": "Funktionskonfiguration ändern",
                  "value": {
                    "features": [
                      {
                        "feature": "OCR"
                      },
                      {
                        "feature": "LIVENESS",
                        "config": {
                          "face_liveness_method": "passive"
                        }
                      }
                    ]
                  }
                },
                "Publish a draft": {
                  "summary": "Einen Entwurf in den Status „veröffentlicht“ überführen",
                  "value": {
                    "status": "published"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Workflow aktualisiert. Der Body ist die VOLLSTÄNDIGE Konfiguration der resultierenden Version (dieselbe Rohform von `VerificationSettings` wie bei `GET /v3/workflows/{settings_uuid}/`). Wenn die Aktualisierung eine neue Version erstellt hat (`status: \"published\"` bei einer veröffentlichten Zeile gesendet), weichen die zurückgegebenen Werte für `uuid` und `version` von denen ab, die Sie gepatcht haben — verwenden Sie die zurückgegebene `uuid` für nachfolgende Aufrufe.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WorkflowDetail"
                }
              }
            }
          },
          "400": {
            "description": "Validierungsfehler – ein Top-Level-Schlüssel außerhalb der akzeptierten Whitelist, eine unbekannte Funktion, eine ungültige Reihenfolge, ein Schwellenwert außerhalb des Bereichs, Verweis auf einen nicht existierenden Fragebogen, eine `SIGNATURE`-Funktion, die ohne zu signierendes Dokument live gehen würde, eine neue `SIGNATURE`-Funktion mit `signature_level: \"aes\"`, während Advanced (AES) nicht verfügbar ist (`aes_not_available`, siehe `signature_availability` im Workflow; ein Schritt, der `aes` bereits speichert, behält es) oder `status: \"draft\"` für eine veröffentlichte Version gesendet (`\"Cannot revert a published version to draft.\"`). Der Antwort-Body ist ein DRF-Validierungsfehler mit dem Feldnamen als Schlüssel."
          },
          "403": {
            "description": "API-Schlüssel fehlt oder ist ungültig.",
            "content": {
              "application/json": {
                "examples": {
                  "Invalid token": {
                    "value": {
                      "detail": "You do not have permission to perform this action."
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Für die authentifizierte Anwendung existiert kein Workflow mit dieser `settings_uuid`."
          },
          "415": {
            "description": "Nicht unterstützter Medientyp. Setzen Sie `Content-Type: application/json`."
          },
          "429": {
            "description": "Rate-Limit überschritten. Wiederholen Sie die Anfrage mit exponentiellem Backoff."
          },
          "500": {
            "description": "Unerwarteter Serverfehler. Kann sicher wiederholt werden."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "cURL",
            "source": "curl -X PATCH 'https://verification.didit.me/v3/workflows/a1b2c3d4-5678-90ab-cdef-111111111111/' \\\n  -H 'x-api-key: YOUR_API_KEY' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\"workflow_label\": \"Premium KYC\"}'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.workflows.update(\n    \"11111111-2222-3333-4444-555555555555\",\n    features=[{\n        \"feature\": \"OCR\",\n    }, {\n        \"feature\": \"AML\",\n    }],\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.workflows.update(\"11111111-2222-3333-4444-555555555555\", {\n  features: [{\n    feature: \"OCR\",\n  }, {\n    feature: \"AML\",\n  }],\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Workflows.Update(ctx, \"11111111-2222-3333-4444-555555555555\", didit.SimpleWorkflowUpdateRequest{\n\tFeatures: didit.Some([]didit.SimpleWorkflowFeature{{\n\t\tFeature: \"OCR\",\n\t}, {\n\t\tFeature: \"AML\",\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;\nimport me.didit.Didit;\nimport me.didit.types.SimpleWorkflowFeature;\nimport me.didit.types.SimpleWorkflowUpdateRequest;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.workflows().update(\"11111111-2222-3333-4444-555555555555\", SimpleWorkflowUpdateRequest.builder()\n        .features(List.of(\n                SimpleWorkflowFeature.builder()\n                        .feature(SimpleWorkflowFeature.Feature.of(\"OCR\"))\n                        .build(),\n                SimpleWorkflowFeature.builder()\n                        .feature(SimpleWorkflowFeature.Feature.of(\"AML\"))\n                        .build()))\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->workflows->update('11111111-2222-3333-4444-555555555555', [\n    'features' => [[\n        'feature' => 'OCR',\n    ], [\n        'feature' => 'AML',\n    ]],\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.workflows.update(\n  \"11111111-2222-3333-4444-555555555555\",\n  features: [{\n    feature: \"OCR\",\n  }, {\n    feature: \"AML\",\n  }]\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Workflows.UpdateAsync(\"11111111-2222-3333-4444-555555555555\", new SimpleWorkflowUpdateRequest\n{\n    Features = new SimpleWorkflowFeature[]\n    {\n        new()\n        {\n            Feature = \"OCR\",\n        },\n        new()\n        {\n            Feature = \"AML\",\n        },\n    },\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ]
      },
      "delete": {
        "summary": "Workflow löschen",
        "description": "Eine Workflow-Version dauerhaft löschen (kann nicht rückgängig gemacht werden). Bestehende Sitzungen behalten ihre Verifizierungsergebnisse, aber ihre Workflow-Referenz wird entfernt; andere Versionen in derselben `workflow_id`-Gruppe werden nicht gelöscht.",
        "operationId": "delete_workflow",
        "x-didit-sdk": {
          "resource": "workflows",
          "method": "delete",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Workflows"
        ],
        "parameters": [
          {
            "name": "settings_uuid",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Versionsspezifische UUID des zu löschenden Workflows."
          }
        ],
        "responses": {
          "204": {
            "description": "Workflow gelöscht. Der Antwort-Body ist leer."
          },
          "403": {
            "description": "API-Schlüssel fehlt oder ist ungültig.",
            "content": {
              "application/json": {
                "examples": {
                  "Invalid token": {
                    "value": {
                      "detail": "You do not have permission to perform this action."
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Für die authentifizierte Anwendung existiert kein Workflow mit dieser `settings_uuid`.",
            "content": {
              "application/json": {
                "examples": {
                  "Not found": {
                    "value": {
                      "detail": "Not found."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate-Limit überschritten. Wiederholen Sie die Anfrage mit exponentiellem Backoff."
          },
          "500": {
            "description": "Unerwarteter Serverfehler. Kann sicher wiederholt werden."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "cURL",
            "source": "curl -X DELETE 'https://verification.didit.me/v3/workflows/a1b2c3d4-5678-90ab-cdef-111111111111/' \\\n  -H 'x-api-key: YOUR_API_KEY'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nclient.workflows.delete(\n    \"11111111-2222-3333-4444-555555555555\",\n)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nawait didit.workflows.delete(\"11111111-2222-3333-4444-555555555555\");"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nif err := client.Workflows.Delete(ctx, \"11111111-2222-3333-4444-555555555555\"); err != nil {\n\tlog.Fatal(err)\n}"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nclient.workflows().delete(\"11111111-2222-3333-4444-555555555555\");"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$didit->workflows->delete('11111111-2222-3333-4444-555555555555');"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\ndidit.workflows.delete(\"11111111-2222-3333-4444-555555555555\")"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nawait client.Workflows.DeleteAsync(\"11111111-2222-3333-4444-555555555555\");"
          }
        ]
      }
    },
    "/v3/questionnaires/": {
      "get": {
        "summary": "Fragebögen auflisten",
        "description": "Listet Ihre Fragebögen auf, die neuesten zuerst, in einem Paginierungs-Umschlag mit Limit/Offset (`{count, next, previous, results}`, Standard-Seitengröße 50). Jede Zeile stellt eine Version dar; `questionnaire_group_id` ist die stabile Gruppen-ID, die auf die neueste `published`-Version verweist.",
        "operationId": "list_questionnaires",
        "x-didit-sdk": {
          "resource": "questionnaires",
          "method": "list",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Questionnaires"
        ],
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "default": 50
            },
            "description": "Seitengröße (Anzahl der Fragebögen pro Seite)."
          },
          {
            "name": "offset",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "default": 0
            },
            "description": "Anzahl der vor dem ersten zurückgegebenen Fragebogen zu überspringenden Zeilen."
          }
        ],
        "responses": {
          "200": {
            "description": "Eine Seite mit Fragebögen, absteigend nach `created_at` sortiert, eingebettet in das Paginierungsobjekt. Jedes Element in `results` ist ein `QuestionnaireListItem`.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "count": {
                      "type": "integer",
                      "description": "Gesamtzahl der Fragebogenversionen für die Anwendung."
                    },
                    "next": {
                      "type": "string",
                      "format": "uri",
                      "nullable": true,
                      "description": "URL der nächsten Seite oder `null` auf der letzten Seite."
                    },
                    "previous": {
                      "type": "string",
                      "format": "uri",
                      "nullable": true,
                      "description": "URL der vorherigen Seite oder `null` auf der ersten Seite."
                    },
                    "results": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/QuestionnaireListItem"
                      }
                    }
                  }
                },
                "examples": {
                  "One questionnaire": {
                    "summary": "Ein einfacher zweisprachiger Fragebogen",
                    "value": {
                      "count": 1,
                      "next": null,
                      "previous": null,
                      "results": [
                        {
                          "uuid": "11111111-2222-3333-4444-555555555555",
                          "title": "KYC Questionnaire",
                          "description": "Additional verification questions",
                          "languages": [
                            "en",
                            "es"
                          ],
                          "default_language": "en",
                          "is_active": true,
                          "is_simple_questionnaire": true,
                          "created_at": "2026-04-23T09:55:00Z",
                          "updated_at": "2026-04-23T10:00:00Z",
                          "question_types": [
                            "SHORT_TEXT",
                            "MULTIPLE_CHOICE",
                            "FILE_UPLOAD"
                          ],
                          "workflow_names": [],
                          "questionnaire_group_id": "11111111-2222-3333-4444-555555555555",
                          "version": 1,
                          "status": "published",
                          "published_at": "2026-04-23T10:00:00Z",
                          "is_editable": false
                        }
                      ]
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "API-Schlüssel fehlt, ist fehlerhaft, abgelaufen oder für eine andere Anwendung gültig.",
            "content": {
              "application/json": {
                "examples": {
                  "Invalid token": {
                    "value": {
                      "detail": "You do not have permission to perform this action."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate-Limit überschritten. Wiederholen Sie die Anfrage mit exponentiellem Backoff."
          },
          "500": {
            "description": "Unerwarteter Serverfehler beim Erstellen der Liste. Kann sicher wiederholt werden."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "cURL",
            "source": "curl -X GET 'https://verification.didit.me/v3/questionnaires/' \\\n  -H 'x-api-key: YOUR_API_KEY'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nfor item in client.questionnaires.list():\n    print(item)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nfor await (const item of didit.questionnaires.list()) {\n  console.log(item);\n}"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\niter := client.Questionnaires.ListAutoPaging(ctx, didit.QuestionnairesListParams{})\nfor iter.Next() {\n\tfmt.Printf(\"%+v\\n\", iter.Current())\n}\nif err := iter.Err(); err != nil {\n\tlog.Fatal(err)\n}"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nfor (var item : client.questionnaires().list()) {\n    System.out.println(item);\n}"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\nforeach ($didit->questionnaires->list() as $item) {\n    print_r($item->toArray());\n}"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\ndidit.questionnaires.list.auto_paging_each do |item|\n  puts item.to_h\nend"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nawait foreach (var item in await client.Questionnaires.ListAsync())\n{\n    Console.WriteLine(JsonSerializer.Serialize(item));\n}"
          }
        ]
      },
      "post": {
        "summary": "Fragebogen erstellen",
        "description": "Erstellen Sie einen einfachen linearen Fragebogen. Senden Sie `form_elements` in der Anzeigereihenfolge; Verzweigungen und wiederholbare Gruppen erfordern die Console. Standardwert ist `published` v1.",
        "operationId": "create_questionnaire",
        "x-didit-sdk": {
          "resource": "questionnaires",
          "method": "create",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Questionnaires"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SimpleQuestionnaireRequest"
              },
              "examples": {
                "Simple": {
                  "summary": "Einfacher Fragebogen",
                  "value": {
                    "title": "Customer Onboarding",
                    "description": "Additional information needed for verification",
                    "default_language": "en",
                    "languages": [
                      "en"
                    ],
                    "is_active": true,
                    "form_elements": [
                      {
                        "id": "occupation",
                        "element_type": "short_text",
                        "label": {
                          "en": "What is your occupation?"
                        },
                        "is_required": true,
                        "placeholder": {
                          "en": "Software engineer"
                        }
                      },
                      {
                        "id": "source_of_funds",
                        "element_type": "multiple_choice",
                        "label": {
                          "en": "Source of funds"
                        },
                        "is_required": true,
                        "options": [
                          {
                            "value": "employment",
                            "label": {
                              "en": "Employment"
                            }
                          },
                          {
                            "value": "business",
                            "label": {
                              "en": "Business"
                            }
                          },
                          {
                            "value": "investments",
                            "label": {
                              "en": "Investments"
                            }
                          },
                          {
                            "value": "other",
                            "label": {
                              "en": "Other"
                            }
                          }
                        ]
                      }
                    ]
                  }
                }
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Fragebogen erstellt. Die Antwort enthält die `questionnaire_id` — speichern Sie diese, um aus Workflows oder bei künftigen Update-/Löschaufrufen auf diesen Fragebogen zu verweisen.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QuestionnaireDetail"
                },
                "examples": {
                  "Created": {
                    "value": {
                      "questionnaire_id": "11111111-2222-3333-4444-555555555555",
                      "title": "Customer Onboarding",
                      "description": "Additional information needed for verification",
                      "languages": [
                        "en"
                      ],
                      "default_language": "en",
                      "is_active": true,
                      "is_simple_questionnaire": true,
                      "graph": {
                        "start_node": "occupation",
                        "nodes": {
                          "occupation": {
                            "element_type": "SHORT_TEXT",
                            "is_required": true,
                            "title": {
                              "en": "What is your occupation?"
                            },
                            "next": "source_of_funds"
                          },
                          "source_of_funds": {
                            "element_type": "MULTIPLE_CHOICE",
                            "is_required": true,
                            "title": {
                              "en": "Source of funds"
                            },
                            "choices": [
                              {
                                "value": "employment",
                                "label": {
                                  "en": "Employment"
                                }
                              },
                              {
                                "value": "business",
                                "label": {
                                  "en": "Business"
                                }
                              }
                            ],
                            "next": null
                          }
                        }
                      },
                      "sections": [],
                      "questionnaire_group_id": "11111111-2222-3333-4444-555555555555",
                      "version": 1,
                      "status": "published",
                      "published_at": "2026-04-23T10:00:00Z",
                      "is_editable": false
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Validierungsfehler. Häufige Ursachen: ein unbekannter `element_type`, ein übersetzbares Feld ohne Übersetzung für eine der `languages`, `languages` enthält kein `en`, `default_language` nicht in `languages`, eine Option ohne `label`, eine Frage mit `branches`/`required_if`/`repeatable_config` (von diesem Endpoint nicht unterstützt) oder das Senden eines unverarbeiteten `graph` anstelle von `form_elements`. Der Body ist ein DRF-Validierungsfehler mit Feldnamen als Schlüsseln.",
            "content": {
              "application/json": {
                "examples": {
                  "Graph not accepted": {
                    "value": {
                      "graph": "The v3 questionnaire API only accepts simple `form_elements`, not `graph`."
                    }
                  },
                  "Missing label": {
                    "value": {
                      "form_elements": [
                        {
                          "label": [
                            "This field is required."
                          ]
                        }
                      ]
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "API-Schlüssel fehlt, ist fehlerhaft, abgelaufen oder für eine andere Anwendung gültig.",
            "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 Fragebogens. Kann sicher wiederholt werden."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "cURL",
            "source": "curl -X POST 'https://verification.didit.me/v3/questionnaires/' \\\n  -H 'x-api-key: YOUR_API_KEY' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\n    \"title\": \"Customer Onboarding\",\n    \"default_language\": \"en\",\n    \"languages\": [\"en\"],\n    \"form_elements\": [\n      {\n        \"id\": \"occupation\",\n        \"element_type\": \"short_text\",\n        \"label\": {\"en\": \"What is your occupation?\"},\n        \"is_required\": true\n      }\n    ]\n  }'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.questionnaires.create(\n    title=\"Customer Onboarding\",\n    description=\"Additional information needed for verification\",\n    languages=[\"en\"],\n    default_language=\"en\",\n    is_active=True,\n    form_elements=[{\n        \"id\": \"occupation\",\n        \"element_type\": \"short_text\",\n        \"label\": {\"en\": \"What is your occupation?\"},\n        \"placeholder\": {\"en\": \"Software engineer\"},\n        \"is_required\": True,\n    }, {\n        \"id\": \"source_of_funds\",\n        \"element_type\": \"multiple_choice\",\n        \"label\": {\"en\": \"Source of funds\"},\n        \"is_required\": True,\n        \"options\": [{\n            \"value\": \"employment\",\n            \"label\": {\"en\": \"Employment\"},\n        }, {\n            \"value\": \"business\",\n            \"label\": {\"en\": \"Business\"},\n        }, {\n            \"value\": \"investments\",\n            \"label\": {\"en\": \"Investments\"},\n        }, {\n            \"value\": \"other\",\n            \"label\": {\"en\": \"Other\"},\n        }],\n    }],\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.questionnaires.create({\n  title: \"Customer Onboarding\",\n  description: \"Additional information needed for verification\",\n  languages: [\"en\"],\n  default_language: \"en\",\n  is_active: true,\n  form_elements: [{\n    id: \"occupation\",\n    element_type: \"short_text\",\n    label: { en: \"What is your occupation?\" },\n    placeholder: { en: \"Software engineer\" },\n    is_required: true,\n  }, {\n    id: \"source_of_funds\",\n    element_type: \"multiple_choice\",\n    label: { en: \"Source of funds\" },\n    is_required: true,\n    options: [{\n      value: \"employment\",\n      label: { en: \"Employment\" },\n    }, {\n      value: \"business\",\n      label: { en: \"Business\" },\n    }, {\n      value: \"investments\",\n      label: { en: \"Investments\" },\n    }, {\n      value: \"other\",\n      label: { en: \"Other\" },\n    }],\n  }],\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Questionnaires.Create(ctx, didit.SimpleQuestionnaireRequest{\n\tTitle:           \"Customer Onboarding\",\n\tDescription:     didit.String(\"Additional information needed for verification\"),\n\tLanguages:       []string{\"en\"},\n\tDefaultLanguage: didit.String(\"en\"),\n\tIsActive:        didit.Bool(true),\n\tFormElements: []didit.SimpleQuestionnaireElement{{\n\t\tID:          didit.String(\"occupation\"),\n\t\tElementType: \"short_text\",\n\t\tLabel:       map[string]string{\"en\": \"What is your occupation?\"},\n\t\tPlaceholder: didit.Some(map[string]string{\"en\": \"Software engineer\"}),\n\t\tIsRequired:  didit.Bool(true),\n\t}, {\n\t\tID:          didit.String(\"source_of_funds\"),\n\t\tElementType: \"multiple_choice\",\n\t\tLabel:       map[string]string{\"en\": \"Source of funds\"},\n\t\tIsRequired:  didit.Bool(true),\n\t\tOptions: didit.Some([]didit.SimpleQuestionnaireElementOptions{{\n\t\t\tValue: didit.String(\"employment\"),\n\t\t\tLabel: map[string]string{\"en\": \"Employment\"},\n\t\t}, {\n\t\t\tValue: didit.String(\"business\"),\n\t\t\tLabel: map[string]string{\"en\": \"Business\"},\n\t\t}, {\n\t\t\tValue: didit.String(\"investments\"),\n\t\t\tLabel: map[string]string{\"en\": \"Investments\"},\n\t\t}, {\n\t\t\tValue: didit.String(\"other\"),\n\t\t\tLabel: map[string]string{\"en\": \"Other\"},\n\t\t}}),\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;\nimport java.util.Map;\nimport me.didit.Didit;\nimport me.didit.types.SimpleQuestionnaireElement;\nimport me.didit.types.SimpleQuestionnaireRequest;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.questionnaires().create(SimpleQuestionnaireRequest.builder()\n        .title(\"Customer Onboarding\")\n        .description(\"Additional information needed for verification\")\n        .languages(List.of(\"en\"))\n        .defaultLanguage(\"en\")\n        .isActive(true)\n        .formElements(List.of(\n                SimpleQuestionnaireElement.builder()\n                        .id(\"occupation\")\n                        .elementType(SimpleQuestionnaireElement.ElementType.of(\"short_text\"))\n                        .label(Map.of(\"en\", \"What is your occupation?\"))\n                        .placeholder(Map.of(\"en\", \"Software engineer\"))\n                        .isRequired(true)\n                        .build(),\n                SimpleQuestionnaireElement.builder()\n                        .id(\"source_of_funds\")\n                        .elementType(SimpleQuestionnaireElement.ElementType.of(\"multiple_choice\"))\n                        .label(Map.of(\"en\", \"Source of funds\"))\n                        .isRequired(true)\n                        .options(List.of(\n                                SimpleQuestionnaireElement.Options.builder()\n                                        .value(\"employment\")\n                                        .label(Map.of(\"en\", \"Employment\"))\n                                        .build(),\n                                SimpleQuestionnaireElement.Options.builder()\n                                        .value(\"business\")\n                                        .label(Map.of(\"en\", \"Business\"))\n                                        .build(),\n                                SimpleQuestionnaireElement.Options.builder()\n                                        .value(\"investments\")\n                                        .label(Map.of(\"en\", \"Investments\"))\n                                        .build(),\n                                SimpleQuestionnaireElement.Options.builder()\n                                        .value(\"other\")\n                                        .label(Map.of(\"en\", \"Other\"))\n                                        .build()))\n                        .build()))\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->questionnaires->create([\n    'title' => 'Customer Onboarding',\n    'description' => 'Additional information needed for verification',\n    'languages' => ['en'],\n    'default_language' => 'en',\n    'is_active' => true,\n    'form_elements' => [[\n        'id' => 'occupation',\n        'element_type' => 'short_text',\n        'label' => ['en' => 'What is your occupation?'],\n        'placeholder' => ['en' => 'Software engineer'],\n        'is_required' => true,\n    ], [\n        'id' => 'source_of_funds',\n        'element_type' => 'multiple_choice',\n        'label' => ['en' => 'Source of funds'],\n        'is_required' => true,\n        'options' => [[\n            'value' => 'employment',\n            'label' => ['en' => 'Employment'],\n        ], [\n            'value' => 'business',\n            'label' => ['en' => 'Business'],\n        ], [\n            'value' => 'investments',\n            'label' => ['en' => 'Investments'],\n        ], [\n            'value' => 'other',\n            'label' => ['en' => 'Other'],\n        ]],\n    ]],\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.questionnaires.create(\n  title: \"Customer Onboarding\",\n  description: \"Additional information needed for verification\",\n  languages: [\"en\"],\n  default_language: \"en\",\n  is_active: true,\n  form_elements: [{\n    id: \"occupation\",\n    element_type: \"short_text\",\n    label: { en: \"What is your occupation?\" },\n    placeholder: { en: \"Software engineer\" },\n    is_required: true,\n  }, {\n    id: \"source_of_funds\",\n    element_type: \"multiple_choice\",\n    label: { en: \"Source of funds\" },\n    is_required: true,\n    options: [{\n      value: \"employment\",\n      label: { en: \"Employment\" },\n    }, {\n      value: \"business\",\n      label: { en: \"Business\" },\n    }, {\n      value: \"investments\",\n      label: { en: \"Investments\" },\n    }, {\n      value: \"other\",\n      label: { en: \"Other\" },\n    }],\n  }]\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Collections.Generic;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Questionnaires.CreateAsync(new SimpleQuestionnaireRequest\n{\n    Title = \"Customer Onboarding\",\n    Description = \"Additional information needed for verification\",\n    Languages = new string[] { \"en\" },\n    DefaultLanguage = \"en\",\n    IsActive = true,\n    FormElements = new SimpleQuestionnaireElement[]\n    {\n        new()\n        {\n            Id = \"occupation\",\n            ElementType = \"short_text\",\n            Label = new Dictionary<string, string> { [\"en\"] = \"What is your occupation?\" },\n            Placeholder = new Dictionary<string, string> { [\"en\"] = \"Software engineer\" },\n            IsRequired = true,\n        },\n        new()\n        {\n            Id = \"source_of_funds\",\n            ElementType = \"multiple_choice\",\n            Label = new Dictionary<string, string> { [\"en\"] = \"Source of funds\" },\n            IsRequired = true,\n            Options = new SimpleQuestionnaireElementOptions[]\n            {\n                new()\n                {\n                    Value = \"employment\",\n                    Label = new Dictionary<string, string> { [\"en\"] = \"Employment\" },\n                },\n                new()\n                {\n                    Value = \"business\",\n                    Label = new Dictionary<string, string> { [\"en\"] = \"Business\" },\n                },\n                new()\n                {\n                    Value = \"investments\",\n                    Label = new Dictionary<string, string> { [\"en\"] = \"Investments\" },\n                },\n                new()\n                {\n                    Value = \"other\",\n                    Label = new Dictionary<string, string> { [\"en\"] = \"Other\" },\n                },\n            },\n        },\n    },\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ]
      }
    },
    "/v3/questionnaires/{questionnaire_uuid}/": {
      "get": {
        "summary": "Fragebogen abrufen",
        "description": "Ruft die vollständigen Details eines Fragebogens für eine Version anhand der `questionnaire_uuid` ab: Titel, `languages`, kanonischer `graph`, abgeleitete `sections` und Versionsmetadaten.",
        "operationId": "get_questionnaire",
        "x-didit-sdk": {
          "resource": "questionnaires",
          "method": "retrieve",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Questionnaires"
        ],
        "parameters": [
          {
            "name": "questionnaire_uuid",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Versionsspezifische UUID des Fragebogens (der vom Listen-Endpoint zurückgegebene `uuid`-Wert, der an Detail-Endpoints auch als `questionnaire_id` zurückgegeben wird)."
          }
        ],
        "responses": {
          "200": {
            "description": "Vollständige Details zum Fragebogen einschließlich des kanonischen `graph`, der abgeleiteten `sections`-Ansicht, Versionsmetadaten und `is_editable`.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QuestionnaireDetail"
                },
                "examples": {
                  "Published questionnaire": {
                    "value": {
                      "questionnaire_id": "11111111-2222-3333-4444-555555555555",
                      "title": "Customer Onboarding",
                      "description": "Additional information needed for verification",
                      "languages": [
                        "en"
                      ],
                      "default_language": "en",
                      "is_active": true,
                      "is_simple_questionnaire": true,
                      "graph": {
                        "start_node": "occupation",
                        "nodes": {
                          "occupation": {
                            "element_type": "SHORT_TEXT",
                            "is_required": true,
                            "title": {
                              "en": "What is your occupation?"
                            },
                            "next": "source_of_funds"
                          },
                          "source_of_funds": {
                            "element_type": "MULTIPLE_CHOICE",
                            "is_required": true,
                            "title": {
                              "en": "Source of funds"
                            },
                            "choices": [
                              {
                                "value": "employment",
                                "label": {
                                  "en": "Employment"
                                }
                              },
                              {
                                "value": "business",
                                "label": {
                                  "en": "Business"
                                }
                              }
                            ],
                            "next": null
                          }
                        }
                      },
                      "sections": [
                        {
                          "title": {},
                          "description": {},
                          "items": [
                            {
                              "uuid": "11111111-2222-3333-4444-666666666666",
                              "value": "occupation",
                              "element_type": "SHORT_TEXT",
                              "is_required": true,
                              "title": {
                                "en": "What is your occupation?"
                              }
                            }
                          ]
                        }
                      ],
                      "questionnaire_group_id": "11111111-2222-3333-4444-555555555555",
                      "version": 1,
                      "status": "published",
                      "published_at": "2026-04-23T10:00:00Z",
                      "is_editable": false
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "API-Schlüssel fehlt, ist fehlerhaft, abgelaufen oder für eine andere Anwendung gültig.",
            "content": {
              "application/json": {
                "examples": {
                  "Invalid token": {
                    "value": {
                      "detail": "You do not have permission to perform this action."
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Für die authentifizierte Anwendung existiert kein Fragebogen mit dieser `questionnaire_uuid`. Entweder ist die UUID falsch oder sie gehört zu einer anderen Anwendung – die API unterscheidet die beiden Fälle bewusst nicht.",
            "content": {
              "application/json": {
                "examples": {
                  "Not found": {
                    "value": {
                      "detail": "Not found."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate-Limit überschritten. Wiederholen Sie die Anfrage mit exponentiellem Backoff."
          },
          "500": {
            "description": "Unerwarteter Serverfehler. Kann sicher wiederholt werden."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "cURL",
            "source": "curl -X GET 'https://verification.didit.me/v3/questionnaires/11111111-2222-3333-4444-555555555555/' \\\n  -H 'x-api-key: YOUR_API_KEY'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.questionnaires.retrieve(\n    \"11111111-2222-3333-4444-555555555555\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.questionnaires.retrieve(\"11111111-2222-3333-4444-555555555555\");\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Questionnaires.Retrieve(ctx, \"11111111-2222-3333-4444-555555555555\")\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.questionnaires().retrieve(\"11111111-2222-3333-4444-555555555555\");\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->questionnaires->retrieve('11111111-2222-3333-4444-555555555555');\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.questionnaires.retrieve(\"11111111-2222-3333-4444-555555555555\")\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Questionnaires.RetrieveAsync(\"11111111-2222-3333-4444-555555555555\");\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ]
      },
      "patch": {
        "summary": "Fragebogen aktualisieren",
        "description": "Fragebogen aktualisieren. Die Versionierung hängt vom übergebenen `status`-Feld und dem aktuellen Status der Version ab: (1) kein `status` bei einer **veröffentlichten** Version → die veröffentlichte Version wird direkt aktualisiert (gleiche `questionnaire_id`, gleiche `version`); (2) kein `status` bei einem **Entwurf** → der Entwurf wird aktualisiert und sofort veröffentlicht; (3) `status: \"published\"` bei einer **veröffentlichten** Version → eine NEUE veröffentlichte Version wird unter derselben `questionnaire_group_id` erstellt (neue `questionnaire_id`, `version` + 1) und zurückgegeben, und jeder vorhandene Entwurf in der Gruppe wird gelöscht; (4) `status: \"draft\"` belässt einen Entwurf als Entwurf (automatische Speicherung), wird jedoch bei einer veröffentlichten Version mit 400 abgelehnt (`\"Cannot revert a published version to draft.\"`).",
        "operationId": "update_questionnaire",
        "x-didit-sdk": {
          "resource": "questionnaires",
          "method": "update",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Questionnaires"
        ],
        "parameters": [
          {
            "name": "questionnaire_uuid",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Versionsspezifische UUID des zu aktualisierenden Fragebogens."
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SimpleQuestionnaireUpdateRequest"
              },
              "examples": {
                "Rename": {
                  "summary": "Fragebogen umbenennen",
                  "value": {
                    "title": "Updated Customer Onboarding"
                  }
                },
                "Replace questions": {
                  "summary": "Vollständige lineare Fragenliste ersetzen",
                  "value": {
                    "form_elements": [
                      {
                        "id": "occupation",
                        "element_type": "short_text",
                        "label": {
                          "en": "What is your occupation?"
                        },
                        "is_required": true
                      },
                      {
                        "id": "source_of_funds",
                        "element_type": "multiple_choice",
                        "label": {
                          "en": "Source of funds"
                        },
                        "options": [
                          {
                            "value": "employment",
                            "label": {
                              "en": "Employment"
                            }
                          },
                          {
                            "value": "business",
                            "label": {
                              "en": "Business"
                            }
                          }
                        ]
                      }
                    ]
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Fragebogen aktualisiert. Der Body stellt den neuesten Status der resultierenden Version dar — die direkt aktualisierte Version oder die neu erstellte veröffentlichte Version, wenn Sie `status: \"published\"` für eine veröffentlichte Zeile übermittelt haben (in diesem Fall weichen `questionnaire_id` und `version` von denen ab, die Sie gepatcht haben). Die `questionnaire_id` in der Antwort ist die versionsspezifische UUID; verwenden Sie `questionnaire_group_id`, wenn Sie die stabile Gruppenkennung benötigen.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QuestionnaireDetail"
                }
              }
            }
          },
          "400": {
            "description": "Validierungsfehler — unbekannter `element_type`, fehlende Übersetzung, nicht unterstützte Verzweigungs-/Bedingungsfelder, `languages` enthält kein `en`, `default_language` nicht in `languages`, Option ohne Label, Senden eines unverarbeiteten `graph` oder `status: \"draft\"` für eine veröffentlichte Version (`\"Cannot revert a published version to draft.\"`). Der Antwort-Body ist ein DRF-Validierungsfehler mit Feldnamen als Schlüsseln."
          },
          "403": {
            "description": "API-Schlüssel fehlt oder ist ungültig.",
            "content": {
              "application/json": {
                "examples": {
                  "Invalid token": {
                    "value": {
                      "detail": "You do not have permission to perform this action."
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Für die authentifizierte Anwendung existiert kein Fragebogen mit dieser `questionnaire_uuid`."
          },
          "415": {
            "description": "Nicht unterstützter Medientyp. Setzen Sie `Content-Type: application/json`."
          },
          "429": {
            "description": "Rate-Limit überschritten. Wiederholen Sie die Anfrage mit exponentiellem Backoff."
          },
          "500": {
            "description": "Unerwarteter Serverfehler. Kann sicher wiederholt werden."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "cURL",
            "source": "curl -X PATCH 'https://verification.didit.me/v3/questionnaires/11111111-2222-3333-4444-555555555555/' \\\n  -H 'x-api-key: YOUR_API_KEY' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\"title\": \"Updated Customer Onboarding\"}'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.questionnaires.update(\n    \"11111111-2222-3333-4444-555555555555\",\n    title=\"Updated Customer Onboarding\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.questionnaires.update(\"11111111-2222-3333-4444-555555555555\", {\n  title: \"Updated Customer Onboarding\",\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Questionnaires.Update(ctx, \"11111111-2222-3333-4444-555555555555\", didit.SimpleQuestionnaireUpdateRequest{\n\tTitle: didit.String(\"Updated Customer Onboarding\"),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\nimport me.didit.types.SimpleQuestionnaireUpdateRequest;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.questionnaires().update(\"11111111-2222-3333-4444-555555555555\", SimpleQuestionnaireUpdateRequest.builder()\n        .title(\"Updated Customer Onboarding\")\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->questionnaires->update('11111111-2222-3333-4444-555555555555', [\n    'title' => 'Updated Customer Onboarding',\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.questionnaires.update(\n  \"11111111-2222-3333-4444-555555555555\",\n  title: \"Updated Customer Onboarding\"\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Questionnaires.UpdateAsync(\"11111111-2222-3333-4444-555555555555\", new SimpleQuestionnaireUpdateRequest\n{\n    Title = \"Updated Customer Onboarding\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ]
      },
      "delete": {
        "summary": "Fragebogen löschen",
        "description": "Eine Fragebogenversion dauerhaft löschen (kann nicht rückgängig gemacht werden). Gespeicherte Fragebogenantworten, die mit dieser Version verknüpft sind, werden mit ihr gelöscht, und Sitzungen, die darauf verweisen, verlieren die Verknüpfung; andere Versionen in derselben Gruppe werden nicht gelöscht. Workflows, die darauf verwiesen haben, laufen weiter, aber der Fragebogenschritt kann sie nicht mehr laden.",
        "operationId": "delete_questionnaire",
        "x-didit-sdk": {
          "resource": "questionnaires",
          "method": "delete",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Questionnaires"
        ],
        "parameters": [
          {
            "name": "questionnaire_uuid",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Versionsspezifische UUID des zu löschenden Fragebogens."
          }
        ],
        "responses": {
          "204": {
            "description": "Fragebogen gelöscht. Der Antwort-Body ist leer."
          },
          "403": {
            "description": "API-Schlüssel fehlt oder ist ungültig.",
            "content": {
              "application/json": {
                "examples": {
                  "Invalid token": {
                    "value": {
                      "detail": "You do not have permission to perform this action."
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Für die authentifizierte Anwendung existiert kein Fragebogen mit dieser `questionnaire_uuid`.",
            "content": {
              "application/json": {
                "examples": {
                  "Not found": {
                    "value": {
                      "detail": "Not found."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate-Limit überschritten. Wiederholen Sie die Anfrage mit exponentiellem Backoff."
          },
          "500": {
            "description": "Unerwarteter Serverfehler. Kann sicher wiederholt werden."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "cURL",
            "source": "curl -X DELETE 'https://verification.didit.me/v3/questionnaires/11111111-2222-3333-4444-555555555555/' \\\n  -H 'x-api-key: YOUR_API_KEY'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nclient.questionnaires.delete(\n    \"11111111-2222-3333-4444-555555555555\",\n)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nawait didit.questionnaires.delete(\"11111111-2222-3333-4444-555555555555\");"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nif err := client.Questionnaires.Delete(ctx, \"11111111-2222-3333-4444-555555555555\"); err != nil {\n\tlog.Fatal(err)\n}"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nclient.questionnaires().delete(\"11111111-2222-3333-4444-555555555555\");"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$didit->questionnaires->delete('11111111-2222-3333-4444-555555555555');"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\ndidit.questionnaires.delete(\"11111111-2222-3333-4444-555555555555\")"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nawait client.Questionnaires.DeleteAsync(\"11111111-2222-3333-4444-555555555555\");"
          }
        ]
      }
    },
    "/v3/users/": {
      "get": {
        "summary": "Benutzer auflisten",
        "description": "Liste der [Benutzer](/entities/users), die Didit aus KYC-Sitzungen mit denselben `vendor_data` (Freitext-String, KEINE UUID) zusammenstellt, zuzüglich über die API erstellter Benutzer. Paginierte Ausgabe, sortiert nach `last_session_at` absteigend. Dieser Endpoint unterstützt keine Filter- oder Suchparameter – rufen Sie Seiten ab und filtern Sie clientseitig.",
        "operationId": "list_users",
        "x-didit-sdk": {
          "resource": "users",
          "method": "list",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Users"
        ],
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "schema": {
              "type": "integer",
              "default": 50,
              "minimum": 1,
              "maximum": 1000000
            },
            "description": "Seitengröße. Standardmäßig 50, wenn nicht angegeben. Es gibt kein festes Maximum, aber halten Sie die Seiten klein, um die Latenz gering zu halten."
          },
          {
            "name": "offset",
            "in": "query",
            "schema": {
              "type": "integer",
              "default": 0,
              "minimum": 0,
              "maximum": 1000000
            },
            "description": "Nullbasierter Offset des ersten zurückzugebenden Datensatzes. Folgen Sie vorzugsweise der `next`-URL der vorherigen Seite, statt diesen Wert manuell zu berechnen."
          }
        ],
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X GET 'https://verification.didit.me/v3/users/?limit=50' \\\n  -H 'x-api-key: YOUR_API_KEY'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nfor item in client.users.list():\n    print(item)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nfor await (const item of didit.users.list()) {\n  console.log(item);\n}"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\niter := client.Users.ListAutoPaging(ctx, didit.UsersListParams{})\nfor iter.Next() {\n\tfmt.Printf(\"%+v\\n\", iter.Current())\n}\nif err := iter.Err(); err != nil {\n\tlog.Fatal(err)\n}"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nfor (var item : client.users().list()) {\n    System.out.println(item);\n}"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\nforeach ($didit->users->list() as $item) {\n    print_r($item->toArray());\n}"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\ndidit.users.list.auto_paging_each do |item|\n  puts item.to_h\nend"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nawait foreach (var item in await client.Users.ListAsync())\n{\n    Console.WriteLine(JsonSerializer.Serialize(item));\n}"
          }
        ],
        "responses": {
          "200": {
            "description": "Paginierte Liste von Benutzern mit Verifizierungsstatus, Sitzungsanzahl und Aufschlüsselung der Funktionen.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "count": {
                      "type": "integer",
                      "description": "Anzahl der übereinstimmenden Zeilen – exakt bis 100, darüber hinaus aus Performancegründen auf 100 begrenzt. Verwenden Sie diesen Wert nicht, um die letzte Seite zu erkennen; verlassen Sie sich stattdessen darauf, dass `next` `null` ist."
                    },
                    "next": {
                      "type": "string",
                      "nullable": true,
                      "description": "Absolute URL der nächsten Seite oder `null` auf der letzten Seite."
                    },
                    "previous": {
                      "type": "string",
                      "nullable": true,
                      "description": "Absolute URL der vorherigen Seite oder `null` auf der ersten Seite."
                    },
                    "results": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/UserListItem"
                      }
                    }
                  }
                },
                "examples": {
                  "Example": {
                    "value": {
                      "count": 2,
                      "next": null,
                      "previous": null,
                      "results": [
                        {
                          "didit_internal_id": "f4e5e1f2-94a9-4f86-8c16-2b7d9b4db418",
                          "vendor_data": "user-abc-123",
                          "display_name": null,
                          "full_name": "John Michael Doe",
                          "date_of_birth": "1990-05-15",
                          "effective_name": "John Michael Doe",
                          "status": "ACTIVE",
                          "portrait_image_url": "https://<media-host>/...",
                          "session_count": 3,
                          "approved_count": 2,
                          "declined_count": 0,
                          "in_review_count": 1,
                          "issuing_states": [
                            "USA"
                          ],
                          "approved_emails": [
                            "john@example.com"
                          ],
                          "approved_phones": [
                            "+14155551234"
                          ],
                          "features": {
                            "ID_VERIFICATION": "Approved",
                            "LIVENESS": "Approved",
                            "FACE_MATCH": "Approved",
                            "AML": "Approved"
                          },
                          "features_list": [
                            {
                              "feature": "ID_VERIFICATION",
                              "status": "Approved"
                            },
                            {
                              "feature": "LIVENESS",
                              "status": "Approved"
                            },
                            {
                              "feature": "FACE_MATCH",
                              "status": "Approved"
                            },
                            {
                              "feature": "AML",
                              "status": "Approved"
                            }
                          ],
                          "last_session_at": "2025-06-15T10:30:00Z",
                          "last_activity_at": "2025-06-15T10:30:00Z",
                          "first_session_at": "2025-06-01T08:00:00Z",
                          "tags": [
                            {
                              "uuid": "9a8b7c6d-5e4f-4a3b-8c2d-1e0f9a8b7c6d",
                              "name": "VIP",
                              "color": "#2567FF"
                            }
                          ],
                          "created_at": "2025-06-01T08:00:00Z"
                        },
                        {
                          "didit_internal_id": "6ed99d53-e8f5-4cf8-9ac1-4a506cb40f6b",
                          "vendor_data": null,
                          "display_name": "Jane S.",
                          "full_name": "Jane Elizabeth Smith",
                          "date_of_birth": "1985-11-22",
                          "effective_name": "Jane S.",
                          "status": "FLAGGED",
                          "portrait_image_url": null,
                          "session_count": 1,
                          "approved_count": 0,
                          "declined_count": 0,
                          "in_review_count": 1,
                          "issuing_states": [],
                          "approved_emails": [],
                          "approved_phones": [],
                          "features": {
                            "ID_VERIFICATION": "In Review"
                          },
                          "features_list": [
                            {
                              "feature": "ID_VERIFICATION",
                              "status": "In Review"
                            }
                          ],
                          "last_session_at": "2025-06-20T14:00:00Z",
                          "last_activity_at": "2025-06-20T14:05:00Z",
                          "first_session_at": "2025-06-20T14:00:00Z",
                          "tags": [],
                          "created_at": "2025-06-20T14:00:00Z"
                        }
                      ]
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Keine Anmeldedaten angegeben. Anfragen an `/v3/users/*`-Pfade ohne einen `x-api-key`-Header (oder `Authorization: Bearer`-Token) werden von der Authentifizierungs-Middleware abgelehnt, bevor sie die API erreichen.",
            "content": {
              "application/json": {
                "examples": {
                  "Missing credentials": {
                    "value": {
                      "detail": "You must be authenticated with a valid access token to access this endpoint."
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Der Schlüssel kann keine Benutzer für diese Anwendung auflisten. Ein fehlender Schlüssel gibt `403` zurück; ein falscher, widerrufener oder abgelaufener Schlüssel gibt `401` zurück.",
            "content": {
              "application/json": {
                "examples": {
                  "Forbidden": {
                    "value": {
                      "detail": "You do not have permission to perform this action."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate-Limit überschritten; drosseln Sie die Anfragen und wiederholen Sie den Versuch nach dem in `Retry-After` angegebenen Intervall.",
            "content": {
              "application/json": {
                "examples": {
                  "Rate limited": {
                    "value": {
                      "detail": "Request was throttled. Expected available in 30 seconds."
                    }
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/v3/users/{vendor_data}/": {
      "get": {
        "summary": "Benutzer abrufen",
        "description": "Ruft einen [Benutzer](/entities/users) anhand von `vendor_data` (exakte Übereinstimmung) ab. Ergänzt die Listenansicht um `metadata`, `comments` und `updated_at` und wechselt bei `tags` zur detaillierten Tag-Link-Struktur.",
        "operationId": "get_user",
        "x-didit-sdk": {
          "resource": "users",
          "method": "retrieve",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Users"
        ],
        "parameters": [
          {
            "name": "vendor_data",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Ihre eindeutige Kennung für den Benutzer — ein Freitext-String (KEINE UUID). Dies ist derselbe Wert, den Sie beim Erstellen der Sitzung, in der dieser Benutzer erstmals eingeführt wurde, als `vendor_data` übergeben haben, exakt wie übermittelt abgeglichen.",
            "example": "user-abc-123"
          }
        ],
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X GET 'https://verification.didit.me/v3/users/user-abc-123/' \\\n  -H 'x-api-key: YOUR_API_KEY'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.users.retrieve(\n    \"user-abc-123\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.users.retrieve(\"user-abc-123\");\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Users.Retrieve(ctx, \"user-abc-123\")\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.users().retrieve(\"user-abc-123\");\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->users->retrieve('user-abc-123');\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.users.retrieve(\"user-abc-123\")\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Users.RetrieveAsync(\"user-abc-123\");\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "responses": {
          "200": {
            "description": "Vollständige Benutzerdetails einschließlich Metadaten, Kommentaren/Aktivitätsprotokoll und aggregierten Sitzungsdaten.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UserDetailItem"
                },
                "examples": {
                  "Active user": {
                    "value": {
                      "didit_internal_id": "f4e5e1f2-94a9-4f86-8c16-2b7d9b4db418",
                      "vendor_data": "user-abc-123",
                      "display_name": null,
                      "full_name": "John Michael Doe",
                      "date_of_birth": "1990-05-15",
                      "effective_name": "John Michael Doe",
                      "status": "ACTIVE",
                      "metadata": {
                        "tier": "premium",
                        "source": "website"
                      },
                      "portrait_image_url": "https://<media-host>/...",
                      "session_count": 3,
                      "approved_count": 2,
                      "declined_count": 0,
                      "in_review_count": 1,
                      "issuing_states": [
                        "USA"
                      ],
                      "approved_emails": [
                        "john@example.com"
                      ],
                      "approved_phones": [
                        "+14155551234"
                      ],
                      "features": {
                        "ID_VERIFICATION": "Approved",
                        "LIVENESS": "Approved",
                        "FACE_MATCH": "Approved",
                        "AML": "Approved"
                      },
                      "features_list": [
                        {
                          "feature": "ID_VERIFICATION",
                          "status": "Approved"
                        },
                        {
                          "feature": "LIVENESS",
                          "status": "Approved"
                        },
                        {
                          "feature": "FACE_MATCH",
                          "status": "Approved"
                        },
                        {
                          "feature": "AML",
                          "status": "Approved"
                        }
                      ],
                      "last_session_at": "2025-06-15T10:30:00Z",
                      "last_activity_at": "2025-06-15T10:30:00Z",
                      "first_session_at": "2025-06-01T08:00:00Z",
                      "tags": [
                        {
                          "uuid": "9a8b7c6d-5e4f-4a3b-8c2d-1e0f9a8b7c6d",
                          "tag": {
                            "uuid": "e1f2a3b4-c5d6-4e7f-8a9b-0c1d2e3f4a5b",
                            "name": "VIP",
                            "color": "#2567FF",
                            "description": null,
                            "source": "custom",
                            "created_at": "2025-05-01T09:00:00Z",
                            "updated_at": "2025-05-01T09:00:00Z"
                          },
                          "added_by_email": "analyst@acme.com",
                          "added_by_name": "Jane Analyst",
                          "created_at": "2025-06-02T11:00:00Z"
                        }
                      ],
                      "comments": [
                        {
                          "uuid": "c1111111-2222-4333-8444-555555555555",
                          "comment_type": "STATUS_CHANGED",
                          "comment": null,
                          "actor_email": "analyst@acme.com",
                          "actor_name": "Jane Analyst",
                          "previous_status": "FLAGGED",
                          "new_status": "ACTIVE",
                          "previous_value": null,
                          "new_value": null,
                          "changed_fields": [],
                          "metadata": null,
                          "mentioned_emails": [],
                          "created_at": "2025-06-01T10:30:00Z"
                        }
                      ],
                      "created_at": "2025-06-01T08:00:00Z",
                      "updated_at": "2025-06-15T10:30:00Z"
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Keine Anmeldedaten angegeben. Anfragen an `/v3/users/*`-Pfade ohne einen `x-api-key`-Header (oder `Authorization: Bearer`-Token) werden von der Authentifizierungs-Middleware abgelehnt, bevor sie die API erreichen.",
            "content": {
              "application/json": {
                "examples": {
                  "Missing credentials": {
                    "value": {
                      "detail": "You must be authenticated with a valid access token to access this endpoint."
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Ungültiger oder widerrufener API-Schlüssel, oder der Schlüssel kann die Benutzer dieser Anwendung nicht lesen. Ein fehlender Schlüssel gibt `403` zurück; ein falscher, widerrufener oder abgelaufener Schlüssel gibt `401` zurück.",
            "content": {
              "application/json": {
                "examples": {
                  "Forbidden": {
                    "value": {
                      "detail": "You do not have permission to perform this action."
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Für diese Anwendung existiert kein Benutzer mit den angegebenen `vendor_data`.",
            "content": {
              "application/json": {
                "examples": {
                  "Not found": {
                    "value": {
                      "detail": "Not found."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate-Limit überschritten; drosseln Sie die Anfragen und wiederholen Sie den Versuch nach dem in `Retry-After` angegebenen Intervall.",
            "content": {
              "application/json": {
                "examples": {
                  "Rate limited": {
                    "value": {
                      "detail": "Request was throttled. Expected available in 30 seconds."
                    }
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      },
      "patch": {
        "summary": "Benutzer aktualisieren",
        "description": "Partielle Aktualisierung eines Benutzers: `display_name`, `full_name`, `date_of_birth`, `status`, `metadata`, `approved_emails`/`approved_phones`/`issuing_states`. `metadata` ersetzt vollständig. Das Ändern von `status` hier funktioniert wie [Update User Status](#patch-/v3/users/-vendor_data-/update-status/): Es protokolliert eine `STATUS_CHANGED`-Aktivität mit dem optionalen `reason`, und `BLOCKED` fügt die `vendor_data` zur System-Sperrliste hinzu (das Ändern weg von `BLOCKED` entfernt diesen Eintrag). Änderungen an `display_name`, `full_name`, `date_of_birth` oder `metadata` werden als `PROFILE_UPDATED`-Aktivität protokolliert.",
        "operationId": "update_user",
        "x-didit-sdk": {
          "resource": "users",
          "method": "update",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Users"
        ],
        "parameters": [
          {
            "name": "vendor_data",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Ihre eindeutige Kennung für den Benutzer (Freitext-String, KEINE UUID).",
            "example": "user-abc-123"
          }
        ],
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X PATCH 'https://verification.didit.me/v3/users/user-abc-123/' \\\n  -H 'x-api-key: YOUR_API_KEY' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\"display_name\": \"Jane S.\", \"status\": \"FLAGGED\"}'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.users.update(\n    \"user-abc-123\",\n    display_name=\"Jane S.\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.users.update(\"user-abc-123\", {\n  display_name: \"Jane S.\",\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Users.Update(ctx, \"user-abc-123\", didit.UsersUpdateParams{\n\tDisplayName: didit.String(\"Jane S.\"),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\nimport me.didit.types.UsersUpdateParams;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.users().update(\"user-abc-123\", UsersUpdateParams.builder()\n        .displayName(\"Jane S.\")\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->users->update('user-abc-123', [\n    'display_name' => 'Jane S.',\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.users.update(\n  \"user-abc-123\",\n  display_name: \"Jane S.\"\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Users.UpdateAsync(\"user-abc-123\", new UsersUpdateParams\n{\n    DisplayName = \"Jane S.\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "responses": {
          "200": {
            "description": "Benutzer aktualisiert. Der vollständige aktualisierte Benutzerdatensatz (gleiches Format wie bei Get User) wird zurückgegeben.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UserDetailItem"
                },
                "examples": {
                  "Updated": {
                    "value": {
                      "didit_internal_id": "f4e5e1f2-94a9-4f86-8c16-2b7d9b4db418",
                      "vendor_data": "user-abc-123",
                      "display_name": "Jane S.",
                      "full_name": "Jane Elizabeth Smith",
                      "date_of_birth": "1985-11-22",
                      "effective_name": "Jane S.",
                      "status": "FLAGGED",
                      "metadata": {
                        "tier": "premium"
                      },
                      "portrait_image_url": "https://<media-host>/...",
                      "session_count": 3,
                      "approved_count": 2,
                      "declined_count": 0,
                      "in_review_count": 1,
                      "issuing_states": [
                        "USA"
                      ],
                      "approved_emails": [
                        "john@example.com"
                      ],
                      "approved_phones": [
                        "+14155551234"
                      ],
                      "features": {
                        "ID_VERIFICATION": "Approved",
                        "LIVENESS": "Approved",
                        "FACE_MATCH": "Approved",
                        "AML": "Approved"
                      },
                      "features_list": [
                        {
                          "feature": "ID_VERIFICATION",
                          "status": "Approved"
                        },
                        {
                          "feature": "LIVENESS",
                          "status": "Approved"
                        },
                        {
                          "feature": "FACE_MATCH",
                          "status": "Approved"
                        },
                        {
                          "feature": "AML",
                          "status": "Approved"
                        }
                      ],
                      "last_session_at": "2025-06-15T10:30:00Z",
                      "last_activity_at": "2025-06-15T10:30:00Z",
                      "first_session_at": "2025-06-01T08:00:00Z",
                      "tags": [
                        {
                          "uuid": "9a8b7c6d-5e4f-4a3b-8c2d-1e0f9a8b7c6d",
                          "tag": {
                            "uuid": "e1f2a3b4-c5d6-4e7f-8a9b-0c1d2e3f4a5b",
                            "name": "VIP",
                            "color": "#2567FF",
                            "description": null,
                            "source": "custom",
                            "created_at": "2025-05-01T09:00:00Z",
                            "updated_at": "2025-05-01T09:00:00Z"
                          },
                          "added_by_email": "analyst@acme.com",
                          "added_by_name": "Jane Analyst",
                          "created_at": "2025-06-02T11:00:00Z"
                        }
                      ],
                      "comments": [],
                      "created_at": "2025-06-01T08:00:00Z",
                      "updated_at": "2025-06-15T10:30:00Z"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Ungültiger Body – typischerweise ein unbekannter `status` oder ein `date_of_birth`, das nicht im Format `YYYY-MM-DD` vorliegt.",
            "content": {
              "application/json": {
                "examples": {
                  "Bad status": {
                    "value": {
                      "status": [
                        "\"INVALID\" is not a valid choice."
                      ]
                    }
                  },
                  "Bad date_of_birth": {
                    "value": {
                      "date_of_birth": [
                        "Date has wrong format. Use one of these formats instead: YYYY-MM-DD."
                      ]
                    }
                  },
                  "Reason too long": {
                    "value": {
                      "reason": [
                        "Ensure this field has no more than 1000 characters."
                      ]
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Keine Anmeldedaten angegeben. Anfragen an `/v3/users/*`-Pfade ohne einen `x-api-key`-Header (oder `Authorization: Bearer`-Token) werden von der Authentifizierungs-Middleware abgelehnt, bevor sie die API erreichen.",
            "content": {
              "application/json": {
                "examples": {
                  "Missing credentials": {
                    "value": {
                      "detail": "You must be authenticated with a valid access token to access this endpoint."
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Der Schlüssel kann keine Benutzer für diese Anwendung aktualisieren. Ein fehlender Schlüssel gibt `403` zurück; ein falscher, widerrufener oder abgelaufener Schlüssel gibt `401` zurück.",
            "content": {
              "application/json": {
                "examples": {
                  "Forbidden": {
                    "value": {
                      "detail": "You do not have permission to perform this action."
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Für diese Anwendung existiert kein Benutzer mit den angegebenen `vendor_data`.",
            "content": {
              "application/json": {
                "examples": {
                  "Not found": {
                    "value": {
                      "detail": "Not found."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate-Limit überschritten; drosseln Sie die Anfragen und wiederholen Sie den Versuch nach dem in `Retry-After` angegebenen Intervall.",
            "content": {
              "application/json": {
                "examples": {
                  "Rate limited": {
                    "value": {
                      "detail": "Request was throttled. Expected available in 30 seconds."
                    }
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "full_name": {
                    "type": "string",
                    "nullable": true,
                    "maxLength": 512,
                    "description": "Vollständiger Name des Benutzers"
                  },
                  "display_name": {
                    "type": "string",
                    "nullable": true,
                    "description": "Benutzerdefinierter Anzeigename für diesen Benutzer"
                  },
                  "date_of_birth": {
                    "type": "string",
                    "format": "date",
                    "nullable": true,
                    "description": "Geburtsdatum im Format JJJJ-MM-TT"
                  },
                  "status": {
                    "type": "string",
                    "enum": [
                      "ACTIVE",
                      "FLAGGED",
                      "BLOCKED"
                    ],
                    "description": "Lebenszyklusstatus des Benutzers. Eine Änderung wird als `STATUS_CHANGED`-Aktivität erfasst, und `BLOCKED` fügt die `vendor_data` zur System-Sperrliste hinzu (das Verlassen von `BLOCKED` entfernt diesen Eintrag wieder)."
                  },
                  "metadata": {
                    "type": "object",
                    "nullable": true,
                    "description": "Beliebiges JSON-Objekt, das Sie an den Benutzer anhängen. **Ersetzt vollständig** die vorhandenen Metadaten bei einer Aktualisierung – führen Sie diese clientseitig zusammen, wenn Sie nur Schlüssel hinzufügen möchten."
                  },
                  "approved_emails": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    },
                    "description": "Verifizierte E-Mail-Adressen für diesen Benutzer, z. B. `[\"john@example.com\"]`. Ersetzt die gespeicherte Liste vollständig."
                  },
                  "approved_phones": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    },
                    "description": "Verifizierte Telefonnummern für diesen Benutzer. Ersetzt die gespeicherte Liste vollständig."
                  },
                  "issuing_states": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    },
                    "description": "Ausstellungsländer (ISO 3166-1 Alpha-3), z. B. `[\"USA\"]`. Ersetzt die gespeicherte Liste vollständig."
                  },
                  "reason": {
                    "type": "string",
                    "nullable": true,
                    "maxLength": 1000,
                    "description": "Warum sich der Status geändert hat. Wird im Statusänderungseintrag der Benutzeraktivität (`comments[].comment` und **Activity** in der Business Console) erfasst, nur wenn sich der Status tatsächlich ändert. Webhooks übertragen dies nicht."
                  }
                }
              },
              "examples": {
                "Rename": {
                  "summary": "Anzeigenamen festlegen",
                  "value": {
                    "display_name": "Jane S."
                  }
                },
                "Override status": {
                  "summary": "Den Benutzer zur Prüfung markieren",
                  "value": {
                    "status": "FLAGGED"
                  }
                },
                "Add metadata": {
                  "summary": "Metadaten-JSON ersetzen",
                  "value": {
                    "metadata": {
                      "tier": "premium",
                      "risk_level": "low"
                    }
                  }
                },
                "Fix extracted DOB": {
                  "summary": "Extrahierte Profilfelder korrigieren",
                  "value": {
                    "full_name": "Jane Elizabeth Smith",
                    "date_of_birth": "1985-11-22"
                  }
                },
                "Flag with reason": {
                  "summary": "Den Benutzer markieren und den Grund erfassen",
                  "value": {
                    "status": "FLAGGED",
                    "reason": "Address does not match the billing country"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/v3/users/{vendor_data}/generate-pdf/": {
      "get": {
        "summary": "Den vollständigen Benutzerverlauf als PDF-Bericht herunterladen",
        "description": "Rendern und laden Sie ein compliance-fähiges PDF herunter, das den vollständigen Verifizierungsverlauf des durch `vendor_data` identifizierten Benutzers enthält. Es handelt sich um dasselbe Dokument, das die Console über **User detail → Actions → Download PDF** generiert, sodass für regelmäßige Compliance-Exporte niemand mehr manuell in der Console klicken muss.\n\n**Was der Bericht enthält.** Ein Deckblatt mit der Profilübersicht (Name, Geburtsdatum, Ausstellungsstaaten, genehmigte E-Mails und Telefonnummern), dem aktuellen Status jeder Funktion, den Sitzungszählern und einem Index der enthaltenen Sitzungen – gefolgt vom Standardbericht jeder enthaltenen Sitzung in chronologischer Reihenfolge (älteste zuerst). Jeder Sitzungsbericht ist dasselbe Dokument, das `GET /v3/session/{sessionId}/generate-pdf/` für diese Sitzung zurückgibt.\n\n**Qualifizierte Sitzungen.** Es werden nur Benutzerverifizierungs-Sitzungen (KYC) im Status `Approved`, `Declined`, `In Review` oder `Kyc Expired` einbezogen; Sitzungen in jedem anderen Status werden übersprungen. Wenn der Benutzer keine Sitzung in einem dieser Status hat, gibt der Endpoint `403` zurück – siehe unten.\n\n**Obergrenze.** Der Bericht ist auf die **20 neuesten** berichtspflichtigen Sitzungen begrenzt. Wenn ein Benutzer mehr hat, werden die 20 neuesten einbezogen und das Deckblatt gibt an, wie viele ältere Sitzungen ausgelassen wurden. Verwenden Sie `GET /v3/sessions/?vendor_data=…` für die vollständige Liste als JSON.\n\n**Branding.** Wenn Ihre Anwendung über White-Label-Anpassungen verfügt, werden das Deckblatt und jeder Sitzungsbericht mit Ihrem Logo und der URL Ihrer Datenschutzerklärung gerendert; andernfalls tragen sie das Didit-Branding. Berichte werden auf Englisch gerendert – es gibt keinen Sprachparameter.\n\n**Kein Caching.** Jeder Aufruf rendert das PDF aus den aktuellen Daten neu, sodass ein nach einer manuellen Prüfung erstellter Bericht die Entscheidung des Prüfers widerspiegelt. Zwei Aufrufe für denselben Benutzer können byte-unterschiedliche Dateien erzeugen – archivieren Sie die heruntergeladene Datei, wenn Sie eine unveränderliche Kopie benötigen.\n\n**Latenz.** Das Rendern erfolgt synchron und lädt jedes gespeicherte Bild jeder enthaltenen Sitzung herunter, sodass ein Vorgang für einen Benutzer mit vielen medienintensiven Sitzungen mehrere zehn Sekunden dauern kann. Verwenden Sie ein großzügiges Client-Lese-Timeout (120 s empfohlen) und streamen Sie den Body auf die Festplatte. Die Generierung stoppt bei einem serverseitigen Zeitbudget, anstatt so lange zu laufen, bis Ihr Client aufgibt: Wird dieses Budget erreicht, ist die Antwort dennoch ein gültiges PDF mit den neuesten Sitzungen, und das Deckblatt gibt an, wie viele ausgelassen wurden.\n\n**Geltungsbereich.** Der Benutzer wird innerhalb der Anwendung aufgelöst, zu der der API-Schlüssel gehört. Ein Schlüssel kann niemals einen Benutzer einer anderen Anwendung exportieren – ein solcher Benutzer existiert für ihn nicht und der Endpoint gibt `404` zurück.\n\n**Nachgestellter Schrägstrich.** Die kanonische Route endet mit einem nachgestellten Schrägstrich (`…/generate-pdf/`). Eine Anfrage ohne diesen wird direkt mit derselben Antwort bedient – es gibt keine `301`-Weiterleitung, sodass kein Client Weiterleitungen folgen muss und `curl` kein `-L` benötigt. Verwenden Sie die URL mit Schrägstrich wie in den Beispielen.",
        "operationId": "get_user_generate_pdf",
        "x-didit-sdk": {
          "resource": "users",
          "method": "generate_pdf",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Users"
        ],
        "parameters": [
          {
            "name": "vendor_data",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Ihre eindeutige Kennung für den Benutzer — ein Freitext-String (KEINE UUID). Dies ist derselbe Wert, den Sie beim Erstellen der Sitzungen des Benutzers als `vendor_data` übergeben haben, exakt wie übermittelt abgeglichen. Kodieren Sie ihn URL-konform; ein Wert, der `/` enthält, kann über diese Route nicht adressiert werden.",
            "example": "user-abc-123"
          }
        ],
        "responses": {
          "200": {
            "description": "Das gerenderte PDF-Dokument, direkt als binäres `application/pdf` zurückgegeben — es gibt keinen JSON-Wrapper und keine Download-URL-Umleitung. Der Body beginnt mit den Magic Bytes `%PDF`. Speichern Sie es in einer `.pdf`-Datei oder leiten Sie es per Stream an Ihren Aufrufer weiter.",
            "headers": {
              "Content-Disposition": {
                "description": "`attachment; filename=user_{didit_internal_id}.pdf` — die Datei ist nach der stabilen Didit-Kennung des Benutzers benannt (`didit_internal_id` bei `GET /v3/users/{vendor_data}/`), nicht nach `vendor_data`.",
                "schema": {
                  "type": "string",
                  "example": "attachment; filename=user_f4e5e1f2-94a9-4f86-8c16-2b7d9b4db418.pdf"
                }
              },
              "Content-Length": {
                "description": "Gesamtgröße des PDFs in Bytes; der Nachrichtentext ist nicht in Chunks aufgeteilt.",
                "schema": {
                  "type": "integer",
                  "example": 148213
                }
              }
            },
            "content": {
              "application/pdf": {
                "schema": {
                  "type": "string",
                  "format": "binary"
                }
              }
            }
          },
          "401": {
            "description": "Keine Anmeldedaten angegeben. Anfragen an `/v3/users/*`-Pfade ohne einen `x-api-key`-Header (oder `Authorization: Bearer`-Token) werden von der Authentifizierungs-Middleware abgelehnt, bevor sie die API erreichen.",
            "content": {
              "application/json": {
                "examples": {
                  "Missing credentials": {
                    "value": {
                      "detail": "You must be authenticated with a valid access token to access this endpoint."
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Autorisierungs- oder Zulässigkeitsfehler. Unterscheiden Sie beide anhand des `detail`-Strings:\n\n- `\"You do not have permission to perform this action.\"` — Der API-Schlüssel ist ungültig oder widerrufen, oder die Anfrage enthält ein Console-Benutzer-Token anstelle eines Anwendungs-API-Schlüssels.\n- `\"This user has no sessions in review, declined, approved or kyc expired to report.\"` — Der Benutzer existiert in Ihrer Anwendung, aber keine seiner Sitzungen befindet sich bisher in einem berichtsfähigen Status (zum Beispiel ist jede Sitzung noch `In Progress`, oder der Benutzer wurde über `POST /v3/users/create/` erstellt und wurde noch nie verifiziert). Warten Sie auf einen Webhook `status.updated`, bevor Sie den Bericht anfordern.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string",
                      "example": "This user has no sessions in review, declined, approved or kyc expired to report."
                    }
                  }
                },
                "examples": {
                  "Invalid credentials": {
                    "summary": "Widerrufener oder ungültiger API-Schlüssel oder ein Console-Benutzertoken",
                    "value": {
                      "detail": "You do not have permission to perform this action."
                    }
                  },
                  "No reportable sessions": {
                    "summary": "Benutzer existiert, hat aber keine Sitzung mit dem Status Approved / Declined / In Review / Kyc Expired",
                    "value": {
                      "detail": "This user has no sessions in review, declined, approved or kyc expired to report."
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "In der Anwendung hinter dem API-Schlüssel existiert kein Benutzer mit den angegebenen `vendor_data`. Benutzer anderer Anwendungen sind für diesen Schlüssel unsichtbar und geben denselben `404` zurück.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string",
                      "example": "User not found."
                    }
                  }
                },
                "examples": {
                  "Unknown user": {
                    "summary": "vendor_data stimmt mit keinem Benutzer dieser Anwendung überein",
                    "value": {
                      "detail": "User not found."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate-Limit überschritten. Die PDF-Generierung hat zusätzlich zum globalen GET-Limit von 600/Min ein dediziertes Limit von **50 Anfragen pro Minute pro Anmeldeinformation** (API-Schlüssel, Bearer-Token oder Quell-IP, wenn nicht authentifiziert), das von diesem Endpoint und `GET /v3/session/{sessionId}/generate-pdf/` gemeinsam genutzt wird. Warten Sie `Retry-After` Sekunden (wird auch in den `X-RateLimit-*`-Headern widergespiegelt) und versuchen Sie es dann erneut. Berichte werden serverseitig nicht zwischengespeichert; laden Sie daher jeden Bericht einmal herunter und speichern Sie die Datei, anstatt sie erneut abzurufen.",
            "headers": {
              "Retry-After": {
                "description": "Anzahl der Sekunden, die vor einer erneuten Anfrage gewartet werden muss.",
                "schema": {
                  "type": "integer",
                  "minimum": 1,
                  "example": 30
                }
              },
              "X-RateLimit-Limit": {
                "description": "Maximale Anzahl an PDF-Generierungen, die im aktuellen Zeitfenster zulässig sind (50).",
                "schema": {
                  "type": "integer",
                  "example": 50
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Im aktuellen Zeitfenster verbleibende Anfragen.",
                "schema": {
                  "type": "integer",
                  "example": 0
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix-Zeitstempel (Sekunden), zu dem das aktuelle Zeitfenster zurückgesetzt wird.",
                "schema": {
                  "type": "integer",
                  "example": 1750000000
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string",
                      "description": "Lesbare Erklärung der Rate-Limit-Überschreitung.",
                      "example": "Session PDF generation rate limit exceeded. You can make up to 50 requests per minute."
                    }
                  }
                },
                "examples": {
                  "Throttled": {
                    "summary": "Mehr als 50 PDF-Generierungen in einer Minute mit denselben Zugangsdaten",
                    "value": {
                      "detail": "Session PDF generation rate limit exceeded. You can make up to 50 requests per minute."
                    }
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "cURL",
            "source": "curl --fail \\\n  'https://verification.didit.me/v3/users/user-abc-123/generate-pdf/' \\\n  -H 'x-api-key: YOUR_API_KEY' \\\n  --output user-history.pdf"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\ncontent = client.users.generate_pdf(\n    \"user-abc-123\",\n)\nwith open(\"download.pdf\", \"wb\") as file:\n    file.write(content)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import { writeFile } from \"node:fs/promises\";\nimport Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst content = await didit.users.generatePdf(\"user-abc-123\");\nawait writeFile(\"download.pdf\", Buffer.from(await content.arrayBuffer()));"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresp, err := client.Users.GeneratePDF(ctx, \"user-abc-123\")\nif err != nil {\n\tlog.Fatal(err)\n}\ndefer resp.Body.Close()\nfile, err := os.Create(\"download.pdf\")\nif err != nil {\n\tlog.Fatal(err)\n}\ndefer file.Close()\nif _, err := io.Copy(file, resp.Body); err != nil {\n\tlog.Fatal(err)\n}"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import java.nio.file.Path;\nimport me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nclient.users().generatePdf(\"user-abc-123\")\n        .writeTo(Path.of(\"download.pdf\"));"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$content = $didit->users->generatePdf('user-abc-123');\n$content->saveTo('download.pdf');"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\ncontent = didit.users.generate_pdf(\"user-abc-123\")\nFile.binwrite(\"download.pdf\", content)"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar content = await client.Users.GeneratePdfAsync(\"user-abc-123\");\nawait content.SaveToAsync(\"download.pdf\");"
          }
        ]
      }
    },
    "/v3/users/delete/": {
      "post": {
        "summary": "Benutzer im Batch löschen",
        "description": "**Benutzer dauerhaft löschen**: Die Benutzerdatensätze werden dauerhaft entfernt. Für das alltägliche Blockieren empfiehlt sich [Benutzerstatus aktualisieren](#patch-/v3/users/-vendor_data-/update-status/) mit `BLOCKED`. Wählen Sie Benutzer mit `vendor_data_list`, mit `didit_internal_id_list` oder mit beiden gleichzeitig aus; oder übergeben Sie `delete_all: true`. Dieser Endpoint schränkt `delete_all` niemals durch Filter ein. Die Personenfilter der Console werden mit einem `400` abgelehnt (siehe die `400`-Antwort), sodass eine eingegrenzte Absicht nicht zu einer vollständigen Löschung führt. Zwei Ausnahmen: `filter_has_approved_sessions` und `filter_has_declined_sessions` werden weder abgelehnt noch angewendet; mit `delete_all: true` löschen sie also weiterhin jeden Benutzer; senden Sie diese nicht mit.\n\n**Biometrische Templates:** Sofern Sie `retain_face_embeddings` nicht auf `true` setzen, wird jedes bildfreie biometrische Template, das für diese Benutzer nach der Sitzungslöschung aufbewahrt wurde (siehe `/v3/biometric-templates/`), vor dem Löschen des Benutzers bereinigt, sodass die Person bei der Duplikaterkennung und der Gesichtssuche nicht mehr übereinstimmt. Mit `retain_face_embeddings: true` und `face_retention_days` entscheiden Sie sich dafür, ein bildfreies biometrisches Template pro Person für diese Anzahl an Tagen aufzubewahren, und nichts anderes über die Person wird behalten. Kann ein Template nicht bereinigt werden, weil ein biometrischer Speicher nicht verfügbar ist, gibt der Aufruf `503` zurück, kein Benutzer in der Anfrage wird gelöscht und ein erneutes Ausführen der Anfrage schließt den Vorgang ab.\n\n**Eingereichte behördliche Berichte:** Befinden sich die ausgewählten Daten in einem finalisierten behördlichen Bericht, wird die gesamte Anfrage mit `409` abgelehnt und nichts wird gelöscht. Der Body verwendet `code: in_filed_report` und benennt jeden Bericht mit `uuid`, `report_number`, `report_type` und `case_uuid`. Löschen Sie die Berichte und wiederholen Sie dann die Anfrage.",
        "operationId": "batch_delete_users",
        "x-didit-sdk": {
          "resource": "users",
          "method": "batch_delete",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Users"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "description": "Geben Sie `vendor_data_list`, `didit_internal_id_list` oder `delete_all: true` an. Die beiden Listen können kombiniert werden und sind ODER-verknüpft. Wenn `delete_all` auf `true` gesetzt ist, hat dies Vorrang und beide Listen werden ignoriert.",
                "properties": {
                  "vendor_data_list": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    },
                    "description": "Ihre eigenen zu löschenden Kennungen, exakt so abgeglichen wie übermittelt."
                  },
                  "didit_internal_id_list": {
                    "type": "array",
                    "items": {
                      "type": "string",
                      "format": "uuid"
                    },
                    "description": "Interne Didit-Benutzer-IDs, die gelöscht werden sollen – die von den Create- und Get-Endpoints zurückgegebene `didit_internal_id`."
                  },
                  "delete_all": {
                    "type": "boolean",
                    "default": false,
                    "description": "Wenn `true`, werden alle Benutzer in der Anwendung gelöscht."
                  },
                  "retain_face_embeddings": {
                    "type": "boolean",
                    "default": false,
                    "description": "Ihre ausdrückliche Auswahl, ein bildfreies biometrisches Template jeder gelöschten Person zur Duplikaterkennung für `face_retention_days` aufzubewahren. Alles andere über die Person wird gelöscht. Lassen Sie es weg oder senden Sie `false`, um die Templates zusammen mit den Benutzern zu löschen. Wenn `true`, ist `face_retention_days` erforderlich."
                  },
                  "face_retention_days": {
                    "type": "integer",
                    "minimum": 1,
                    "maximum": 3650,
                    "description": "Anzahl der Tage, die das biometrische Template ohne Bild aufbewahrt wird, wenn `retain_face_embeddings` `true` ist. Zusammen damit erforderlich und ohne dieses mit einem `400` für `face_retention_days` abgelehnt.",
                    "example": 365
                  }
                }
              },
              "examples": {
                "Specific users": {
                  "summary": "Benutzer nach vendor_data löschen",
                  "value": {
                    "vendor_data_list": [
                      "user-123",
                      "user-456"
                    ]
                  }
                },
                "By Didit internal ID": {
                  "summary": "Benutzer nach didit_internal_id löschen",
                  "value": {
                    "didit_internal_id_list": [
                      "3f1c0d3e-8f0a-4c2e-9a3d-9b1f5f4a2c11"
                    ]
                  }
                },
                "All users": {
                  "summary": "Alle Benutzer in dieser Anwendung löschen",
                  "value": {
                    "delete_all": true
                  }
                },
                "Keep face templates": {
                  "summary": "Benutzer löschen und anonyme Gesichtsvorlagen für 365 Tage behalten",
                  "value": {
                    "vendor_data_list": [
                      "user-123"
                    ],
                    "retain_face_embeddings": true,
                    "face_retention_days": 365
                  }
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X POST 'https://verification.didit.me/v3/users/delete/' \\\n  -H 'x-api-key: YOUR_API_KEY' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\"vendor_data_list\": [\"user-123\", \"user-456\"]}'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.users.batch_delete(\n    vendor_data_list=[\"user-123\", \"user-456\"],\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.users.batchDelete({\n  vendor_data_list: [\"user-123\", \"user-456\"],\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Users.BatchDelete(ctx, didit.UsersBatchDeleteParams{\n\tVendorDataList: didit.Some([]string{\"user-123\", \"user-456\"}),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import java.util.List;\nimport me.didit.Didit;\nimport me.didit.types.UsersBatchDeleteParams;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.users().batchDelete(UsersBatchDeleteParams.builder()\n        .vendorDataList(List.of(\"user-123\", \"user-456\"))\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->users->batchDelete([\n    'vendor_data_list' => ['user-123', 'user-456'],\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.users.batch_delete(vendor_data_list: [\"user-123\", \"user-456\"])\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Users.BatchDeleteAsync(new UsersBatchDeleteParams\n{\n    VendorDataList = new string[] { \"user-123\", \"user-456\" },\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "responses": {
          "200": {
            "description": "Benutzer gelöscht. Gibt die Anzahl der tatsächlich gelöschten Benutzer zurück.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "deleted": {
                      "type": "integer",
                      "description": "Anzahl der gelöschten Benutzer (schließt vendor_data-Werte aus, die mit nichts übereinstimmten)."
                    }
                  }
                },
                "examples": {
                  "Deleted some": {
                    "value": {
                      "deleted": 2
                    }
                  },
                  "Nothing matched": {
                    "value": {
                      "deleted": 0
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Validierungsfehler; es wird nichts gelöscht. Fehler sind nach Feldnamen geschlüsselt. Ohne Selektor (wenn weder eine der Listen angegeben noch `delete_all` auf `true` gesetzt ist) lautet der Body `{\"vendor_data_list\": [\"This field is required unless delete_all is true.\"]}`; eine leere Liste wird unter ihrem eigenen Schlüssel mit `\"This list may not be empty.\"` abgelehnt. Ein reiner Console-Filter (`filter_search`, `filter_status`, `filter_country`, `filter_date_from`, `filter_date_to`, `filter_tag`, `filter_latest_verification_status`, `filter_risk`, `filter_has_sessions`, `filter_has_open_alerts`, `filter_aml_monitoring`, `filter_can_sign_in`, `filter_auth_status`, `filter_auth_method` oder `filter_auth_mfa_enabled`) wird abgelehnt, sobald er einen Wert enthält, selbst `false`, mit einem Objekt, das nach jedem solchen Feld geschlüsselt ist. Jeder andere unbekannte `filter_*`-Schlüssel wird mit `\"Unknown filter.\"` abgelehnt.",
            "content": {
              "application/json": {
                "examples": {
                  "Missing selector": {
                    "summary": "Weder list noch delete_all angegeben",
                    "value": {
                      "vendor_data_list": [
                        "This field is required unless delete_all is true."
                      ]
                    }
                  },
                  "Console-only filter": {
                    "value": {
                      "filter_has_sessions": "This filter is Console-only and is not supported by this endpoint."
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Keine Anmeldedaten angegeben. Anfragen an `/v3/users/*`-Pfade ohne einen `x-api-key`-Header (oder `Authorization: Bearer`-Token) werden von der Authentifizierungs-Middleware abgelehnt, bevor sie die API erreichen.",
            "content": {
              "application/json": {
                "examples": {
                  "Missing credentials": {
                    "value": {
                      "detail": "You must be authenticated with a valid access token to access this endpoint."
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Ungültiger oder widerrufener API-Schlüssel, oder der Schlüssel kann keine Benutzer für diese Anwendung löschen. Ein fehlender Schlüssel gibt `403` zurück; ein falscher, widerrufener oder abgelaufener Schlüssel gibt `401` zurück.",
            "content": {
              "application/json": {
                "examples": {
                  "Forbidden": {
                    "value": {
                      "detail": "You do not have permission to perform this action."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate-Limit überschritten; drosseln Sie die Anfragen und wiederholen Sie den Versuch nach dem in `Retry-After` angegebenen Intervall.",
            "content": {
              "application/json": {
                "examples": {
                  "Rate limited": {
                    "value": {
                      "detail": "Request was throttled. Expected available in 30 seconds."
                    }
                  }
                }
              }
            }
          },
          "503": {
            "description": "Ein Biometriespeicher war während des Aufbewahrens oder Löschens eines biometrischen Templates nicht verfügbar. Es wurde nichts gelöscht; wiederholen Sie dieselbe Anfrage. Wiederholungsversuche sind idempotent und führen zu einem einzigen Template.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string"
                    }
                  }
                },
                "examples": {
                  "Retryable": {
                    "value": {
                      "detail": "The biometric-template operation could not finish because an external store is unavailable. The operation is retryable."
                    }
                  }
                }
              }
            }
          },
          "409": {
            "description": "Es wird nichts gelöscht. `code` gibt den Grund an: `in_filed_report`, wenn die Auswahl eine Person in einem finalisierten behördlichen Bericht enthält, `subject_deletion_in_progress`, wenn eine andere Anfrage noch eine der ausgewählten Personen löscht. Wiederholen Sie die Anfrage, sobald dieser Löschvorgang abgeschlossen ist.",
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "$ref": "#/components/schemas/InFiledReportError"
                    },
                    {
                      "$ref": "#/components/schemas/SubjectDeletionInProgressError"
                    }
                  ]
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/v3/sessions/delete/": {
      "post": {
        "summary": "KYC-Sitzungen nach session_number gesammelt löschen",
        "description": "Löschen Sie Benutzerverifizierungs-Sitzungen (KYC) per Massenvorgang anhand ihrer numerischen `session_number` oder jede KYC-Sitzung in Ihrer Anwendung mit `delete_all: true`.\n\n`session_number` ist der benutzerfreundliche, inkrementierende Zähler, der in der Sitzungsliste der Console angezeigt und von den Endpoints zur Sitzungserstellung und Entscheidungsfindung als `session_number` zurückgegeben wird; es ist **nicht** die `session_id`-UUID. Um eine Sitzung per UUID zu löschen oder eine Unternehmensverifizierungs-Sitzung (KYB) zu löschen, die dieser Endpoint niemals berührt, verwenden Sie stattdessen `DELETE /v3/session/{sessionId}/delete/`.\n\n**Bis zu 20 Sitzungen werden direkt in der Anfrage gelöscht, darüber hinaus wird ein Job ausgeführt.** Ausschlaggebend ist die Anzahl der übereinstimmenden Sitzungen, unabhängig davon, ob sie über `session_numbers` oder mit `delete_all` ausgewählt wurden:\n- Bis zu 20 übereinstimmende Sitzungen: Sie werden vor der Antwort gelöscht, die `200` mit einem Eintrag pro Sitzung in `results[]` ist.\n- Mehr als 20: Die Antwort ist `202` mit einem Löschjob, und die Sitzungen werden im Hintergrund gelöscht. Rufen Sie per Polling `GET /v3/sessions/delete/{job_id}/` auf, bis `status` den Wert `COMPLETED` oder `FAILED` hat. Ein Job meldet Anzahlen pro Ergebnis, niemals welche Sitzungen er gelöscht hat. Ein `delete_all`-Job löscht nur die Sitzungen, die vor der Anfrage erstellt wurden; Sitzungen, die während der Ausführung gestartet werden, werden nicht gelöscht.\n\nJede gelöschte Sitzung wird genau wie beim Einzel-Sitzungs-Lösch-Endpoint behandelt: Die Sitzung, jeder darin enthaltene Verifizierungsversuch, ihre Entscheidung und extrahierten Daten, ihre zugehörigen Funktionsdatensätze (Ausweisverifizierung, Gesicht, Liveness, Gesichtsabgleich usw.) und alle ihre gespeicherten Dateien werden gelöscht, sie verschwindet aus jedem Lese-Endpoint und zuvor ausgestellte Medien-URLs können nicht mehr aufgelöst werden. Webhook-Zustellungen, die sich noch in der Warteschlange für eine gelöschte Sitzung befinden, sowie deren Wiederholungsversuche werden verworfen; bereits zugestellte Webhooks sind nicht betroffen. Sperrlisten-Einträge werden **nicht** entfernt, bereits verbrauchte Credits werden **nicht** erstattet und die übergeordneten Benutzer-Entitäten werden **nicht** gelöscht (verwenden Sie dafür `POST /v3/users/delete/`); für die Löschung wird kein Webhook ausgelöst. Die Löschung ist dauerhaft und unwiderruflich.\n\n**Auswahlsemantik:**\n- Mit `delete_all: true` können Sie die Auswahl mit den Filtern von `GET /v3/sessions/` eingrenzen, jeweils mit dem Präfix `filter_` versehen (zum Beispiel `filter_status`, `filter_workflow_id`, `filter_date_from`). Filter, die in „Sitzungen auflisten“ mehrere Werte annehmen (`status`, `workflow_id`, `country`, `region`, `document_type`, `document_name`, `session_type`, `warning`, `organization_name`), akzeptieren eine kommagetrennte Zeichenkette oder ein Array; die anderen nehmen einen einzelnen Wert an. Ein leerer Wert wird ignoriert. Filter greifen nur zusammen mit `delete_all`, und ein Löschjob wendet dieselben Filter an.\n- Ein unbekannter `filter_*`-Schlüssel oder ein Filterwert, der nicht gelesen werden kann, weist die gesamte Anfrage mit `400` ab, bevor etwas gelöscht wird, sodass ein fehlerhaft eingegebener Filter die Löschung niemals auf alle Sitzungen ausweitet.\n- Einträge in `session_numbers`, die nicht mit einer aktiven KYC-Sitzung in Ihrer Anwendung übereinstimmen (unbekannte Nummern, bereits gelöschte Sitzungen oder Sitzungen einer anderen Anwendung), werden **stillschweigend übersprungen**: Sie erscheinen nicht in `results` und werden im `total` eines Jobs nicht mitgezählt.\n- Validierungsfehler (ein nicht-numerischer Eintrag, eine leere Liste, weder `session_numbers` noch `delete_all` angegeben oder eine Vorlagenaufbewahrung, die die Anwendung nicht erfüllen kann) weisen die **gesamte Anfrage** mit `400` ab und löschen nichts.\n- Sitzungen werden in Gruppen gelöscht. Wenn eine Gruppe nicht gelöscht werden kann (zum Beispiel weil ein Speicherdienst nicht verfügbar ist), wird jede Sitzung in dieser Gruppe als `face_retention_outcome: failed_retryable` gemeldet und bleibt unverändert bestehen; die anderen Gruppen sind nicht betroffen. Wiederholen Sie die Anfrage für diese Sitzungen. Ein Job wiederholt eine solche Gruppe selbstständig.\n- Es gibt keine dokumentierte Obergrenze für die Listenlänge; das geteilte Schreib-Rate-Limit (unten) bildet die praktische Grenze.\n\n**Biometrische Gesichtsdaten:** Die optionalen Felder `retain_face_embeddings`, `face_retention_days`, `face_retention_deadline`, `deletion_instruction` und `instruction_id` haben dieselbe Bedeutung wie bei `DELETE /v3/session/{sessionId}/delete/` und gelten für jede übereinstimmende Sitzung. Jedes Ergebnis meldet sein eigenes `face_retention_outcome`.\n\n**Antwort:** `200 OK` mit `results[]` für bis zu 20 übereinstimmende Sitzungen oder `202 Accepted` mit einem Löschjob für mehr. Jedes Ergebnis bestätigt die Löschung mit Ausnahme von `face_retention_outcome: failed_retryable`, was eine Sitzung meldet, die NICHT gelöscht wurde und wiederholt werden sollte. Frühere Versionen dieses Endpoints gaben `204 No Content` zurück; aktualisieren Sie Clients, die auf `204` prüfen.\n\n**Idempotenz:** Das Wiederholen derselben Anfrage löscht nichts weiter: Nummern, die keiner Sitzung mehr entsprechen, werden übersprungen.\n\n**`delete_all: true` (destruktiv):** Löscht **jede** verbleibende KYC-Sitzung in der Anwendung; `session_numbers` wird ignoriert, wenn gesetzt. Es gibt keinen Bestätigungsschritt und kein Rückgängigmachen.\n\n**Authentifizierung:** API-Schlüssel im Header `x-api-key`. Fehlende oder ungültige Anmeldedaten geben `403` zurück (`{\"detail\": \"You do not have permission to perform this action.\"}`); diese API gibt niemals `401` zurück.\n\n**Rate-Limit:** Geteiltes Schreibkontingent von 300 Anfragen/Min. pro API-Schlüssel über alle POST/PATCH/DELETE-Endpoints hinweg; eine Überschreitung gibt `429` zurück.\n\nDieser Endpoint akzeptiert ausschließlich API-Schlüssel. Bearer-Token von Benutzern der Business Console werden mit `403` abgelehnt (im Gegensatz zum Löschen einer einzelnen Sitzung, das beides akzeptiert).\n\n**Eingereichte regulatorische Berichte:** Wenn sich die ausgewählten Daten in einem finalisierten regulatorischen Bericht befinden, wird die gesamte Anfrage mit `409` abgelehnt und nichts gelöscht. Der Body verwendet `code: in_filed_report` und benennt jeden Bericht mit `uuid`, `report_number`, `report_type` und `case_uuid`. Löschen Sie die Berichte und wiederholen Sie dann die Anfrage.",
        "operationId": "batch_delete_sessions",
        "x-didit-sdk": {
          "resource": "sessions",
          "method": "batch_delete",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Sessions"
        ],
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "session_numbers": {
                    "type": "array",
                    "description": "Numerische `session_number`-Werte der zu löschenden KYC-Sitzungen als reine Ziffern-Strings (JSON-Zahlen werden ebenfalls akzeptiert und umgewandelt). Erforderlich, es sei denn, `delete_all` ist `true`; eine leere Liste gibt `400` zurück. Jeder nicht aus Ziffern bestehende Eintrag lehnt die gesamte Anfrage mit `400` ab (es sei denn, `delete_all` ist `true`, in welchem Fall die Validierung übersprungen und die Einträge ignoriert werden). Nummern, die keiner Live-Sitzung in Ihrer Anwendung entsprechen, werden stillschweigend übersprungen.",
                    "items": {
                      "type": "string",
                      "pattern": "^[0-9]+$",
                      "example": "1001"
                    },
                    "minItems": 1,
                    "example": [
                      "1001",
                      "1002",
                      "1003"
                    ]
                  },
                  "delete_all": {
                    "type": "boolean",
                    "description": "Wenn `true`, wird jede verbleibende KYC-Sitzung in der aufrufenden Anwendung gelöscht und `session_numbers` wird ignoriert, es sei denn, Sie schränken die Auswahl mit `filter_*`-Schlüsseln ein. Mehr als 20 übereinstimmende Sitzungen werden als Löschauftrag (`202`) ausgeführt, der nur die vor der Anfrage erstellten Sitzungen umfasst. Standardmäßig `false`. Unumkehrbar; es gibt keinen Bestätigungsschritt.",
                    "default": false,
                    "example": false
                  },
                  "retain_face_embeddings": {
                    "type": "boolean",
                    "nullable": true,
                    "description": "Überschreibt die `face_retention_policy` der Anwendung für diese Löschung. `true` behält ein bildfreies biometrisches Gesichts-Template, das dem Benutzer der Sitzung zugeordnet ist, bei, nachdem die Sitzung gelöscht wurde; `false` löscht das Gesichts-Embedding mit der Sitzung; weglassen oder `null`, um der Richtlinie der Anwendung zu folgen. Wird für KYB-Sitzungen und für Sitzungen ohne Gesichts-Embedding ignoriert.",
                    "example": true
                  },
                  "face_retention_days": {
                    "type": "integer",
                    "minimum": 1,
                    "maximum": 3650,
                    "description": "Endliche Aufbewahrungsdauer in Tagen für ein aufbewahrtes Template. Erforderlich, wenn ein Template aufbewahrt wird, es sei denn, die Anwendung legt bereits `face_retention_days` fest. Das `expires_at` des Templates wird durch den frühesten der folgenden Zeitpunkte bestimmt: diese Dauer, der allgemeine Datenaufbewahrungszeitraum der Anwendung und `face_retention_deadline`.",
                    "example": 365
                  },
                  "face_retention_deadline": {
                    "type": "string",
                    "format": "date-time",
                    "description": "Optionaler fester Ablaufzeitpunkt für ein aufbewahrtes Template. Muss in der Zukunft liegen.",
                    "example": "2027-08-28T00:00:00Z"
                  },
                  "deletion_instruction": {
                    "type": "string",
                    "enum": [
                      "operational_session_delete",
                      "privacy_erasure"
                    ],
                    "default": "operational_session_delete",
                    "description": "Die Art der Anweisung, die Sie erteilen. `operational_session_delete` löscht die Sitzung und behält ein Template nur dann bei, wenn die Richtlinie oder `retain_face_embeddings` dies vorschreibt. `privacy_erasure` löscht jedes beibehaltene biometrische Template, das mit dem Benutzer der Sitzung verknüpft ist, bevor die Sitzung gelöscht wird, kann nicht durch die Anwendungsrichtlinie überschrieben werden und kann nicht mit `retain_face_embeddings: true` kombiniert werden (`400`).",
                    "example": "operational_session_delete"
                  },
                  "instruction_id": {
                    "type": "string",
                    "maxLength": 255,
                    "description": "Ihre dauerhafte Referenz für diese Löschanweisung (beispielsweise die ID eines Löschtickets). Wird im Audit-Log und auf jedem aufbewahrten Template erfasst. Wird von Didit generiert, wenn sie weggelassen wird.",
                    "example": "dsar-2026-0142"
                  },
                  "filter_status": {
                    "description": "Grenzt ein `delete_all` auf die Sitzungen ein, die dem Filter `status` von [List Sessions](/de/sessions-api/list-sessions) entsprechen, mit denselben Werten. Eine kommagetrennte Zeichenkette oder ein Array. Wird ohne `delete_all` ignoriert. Ein leerer Wert wird ignoriert und schränkt die Auswahl nicht ein.",
                    "oneOf": [
                      {
                        "type": "string"
                      },
                      {
                        "type": "array",
                        "items": {
                          "type": "string"
                        }
                      }
                    ]
                  },
                  "filter_vendor_data": {
                    "description": "Grenzt ein `delete_all` auf die Sitzungen ein, die dem Filter `vendor_data` von [List Sessions](/de/sessions-api/list-sessions) entsprechen, mit demselben Wert. Ein einzelner Wert, keine Liste: Ein Array wird zu einem einzelnen kommagetrennten Text zusammengefügt, sodass mehrere Werte nicht als Alternativen abgeglichen werden. Wird ohne `delete_all` ignoriert. Ein leerer Wert wird ignoriert und schränkt die Auswahl nicht ein.",
                    "type": "string"
                  },
                  "filter_search": {
                    "description": "Grenzt ein `delete_all` auf die Sitzungen ein, die dem Filter `search` von [List Sessions](/de/sessions-api/list-sessions) entsprechen, mit demselben Wert. Ein einzelner Wert, keine Liste: Ein Array wird zu einem einzelnen kommagetrennten Text zusammengefügt, sodass mehrere Werte nicht als Alternativen abgeglichen werden. Wird ohne `delete_all` ignoriert. Ein leerer Wert wird ignoriert und schränkt die Auswahl nicht ein.",
                    "type": "string"
                  },
                  "filter_workflow_id": {
                    "description": "Grenzt ein `delete_all` auf die Sitzungen ein, die dem Filter `workflow_id` von [List Sessions](/de/sessions-api/list-sessions) entsprechen, mit denselben Werten. Eine kommagetrennte Zeichenkette oder ein Array. Wird ohne `delete_all` ignoriert. Ein leerer Wert wird ignoriert und schränkt die Auswahl nicht ein.",
                    "oneOf": [
                      {
                        "type": "string"
                      },
                      {
                        "type": "array",
                        "items": {
                          "type": "string"
                        }
                      }
                    ]
                  },
                  "filter_date_from": {
                    "description": "Grenzt ein `delete_all` auf die Sitzungen ein, die dem `date_from`-Filter von [Sitzungen auflisten](/de/sessions-api/list-sessions) entsprechen, mit demselben Wert. Ein einzelner Wert, keine Liste: Ein Array wird zu einem einzelnen, durch Kommas getrennten Wert zusammengefügt, sodass mehrere Werte mit `400` abgelehnt werden. Wird ohne `delete_all` ignoriert. Ein leerer Wert wird ignoriert und schränkt die Auswahl nicht ein.",
                    "type": "string",
                    "format": "date"
                  },
                  "filter_date_to": {
                    "description": "Grenzt ein `delete_all` auf die Sitzungen ein, die dem `date_to`-Filter von [Sitzungen auflisten](/de/sessions-api/list-sessions) entsprechen, mit demselben Wert. Ein einzelner Wert, keine Liste: Ein Array wird zu einem einzelnen, durch Kommas getrennten Wert zusammengefügt, sodass mehrere Werte mit `400` abgelehnt werden. Wird ohne `delete_all` ignoriert. Ein leerer Wert wird ignoriert und schränkt die Auswahl nicht ein.",
                    "type": "string",
                    "format": "date"
                  },
                  "filter_country": {
                    "description": "Grenzt ein `delete_all` auf die Sitzungen ein, die dem `country`-Filter von [Sitzungen auflisten](/de/sessions-api/list-sessions) entsprechen, mit denselben Werten. Eine kommagetrennte Zeichenfolge oder ein Array. Wird ohne `delete_all` ignoriert. Ein leerer Wert wird ignoriert und schränkt die Auswahl nicht ein.",
                    "oneOf": [
                      {
                        "type": "string"
                      },
                      {
                        "type": "array",
                        "items": {
                          "type": "string"
                        }
                      }
                    ]
                  },
                  "filter_document_type": {
                    "description": "Grenzt ein `delete_all` auf die Sitzungen ein, die dem `document_type`-Filter von [Sitzungen auflisten](/de/sessions-api/list-sessions) entsprechen, mit denselben Werten. Eine kommagetrennte Zeichenfolge oder ein Array. Wird ohne `delete_all` ignoriert. Ein leerer Wert wird ignoriert und schränkt die Auswahl nicht ein.",
                    "oneOf": [
                      {
                        "type": "string"
                      },
                      {
                        "type": "array",
                        "items": {
                          "type": "string"
                        }
                      }
                    ]
                  },
                  "filter_document_name": {
                    "description": "Grenzt ein `delete_all` auf die Sitzungen ein, die dem `document_name`-Filter von [Sitzungen auflisten](/de/sessions-api/list-sessions) entsprechen, mit denselben Werten. Eine kommagetrennte Zeichenfolge oder ein Array. Wird ohne `delete_all` ignoriert. Ein leerer Wert wird ignoriert und schränkt die Auswahl nicht ein.",
                    "oneOf": [
                      {
                        "type": "string"
                      },
                      {
                        "type": "array",
                        "items": {
                          "type": "string"
                        }
                      }
                    ]
                  },
                  "filter_region": {
                    "description": "Grenzt ein `delete_all` auf die Sitzungen ein, die dem Filter `region` von [List Sessions](/de/sessions-api/list-sessions) entsprechen, mit denselben Werten. Eine kommagetrennte Zeichenkette oder ein Array. Wird ohne `delete_all` ignoriert. Ein leerer Wert wird ignoriert und schränkt die Auswahl nicht ein.",
                    "oneOf": [
                      {
                        "type": "string"
                      },
                      {
                        "type": "array",
                        "items": {
                          "type": "string"
                        }
                      }
                    ]
                  },
                  "filter_didit_internal_id": {
                    "description": "Grenzt ein `delete_all` auf die Sitzungen ein, die dem `didit_internal_id`-Filter von [Sitzungen auflisten](/de/sessions-api/list-sessions) entsprechen, mit demselben Wert. Ein einzelner Wert, keine Liste: Ein Array wird zu einem einzelnen, durch Kommas getrennten Wert zusammengefügt, sodass mehrere Werte mit `400` abgelehnt werden. Wird ohne `delete_all` ignoriert. Ein leerer Wert wird ignoriert und schränkt die Auswahl nicht ein.",
                    "type": "string",
                    "format": "uuid"
                  },
                  "filter_session_type": {
                    "description": "Grenzt ein `delete_all` auf die Sitzungen ein, die dem Filter `session_type` von [List Sessions](/de/sessions-api/list-sessions) entsprechen, mit denselben Werten. Eine kommagetrennte Zeichenkette oder ein Array. Wird ohne `delete_all` ignoriert. Ein leerer Wert wird ignoriert und schränkt die Auswahl nicht ein.",
                    "oneOf": [
                      {
                        "type": "string"
                      },
                      {
                        "type": "array",
                        "items": {
                          "type": "string"
                        }
                      }
                    ]
                  },
                  "filter_api_service": {
                    "description": "Grenzt ein `delete_all` auf die Sitzungen ein, die dem `api_service`-Filter von [Sitzungen auflisten](/de/sessions-api/list-sessions) entsprechen, mit demselben Wert. Ein einzelner Wert, keine Liste: Ein Array wird zu einem einzelnen, durch Kommas getrennten Wert zusammengefügt, sodass mehrere Werte mit `400` abgelehnt werden. Wird ohne `delete_all` ignoriert. Ein leerer Wert wird ignoriert und schränkt die Auswahl nicht ein.",
                    "type": "string"
                  },
                  "filter_screened_full_name": {
                    "description": "Grenzt ein `delete_all` auf die Sitzungen ein, die dem Filter `screened_full_name` von [List Sessions](/de/sessions-api/list-sessions) entsprechen, mit demselben Wert. Ein einzelner Wert, keine Liste: Ein Array wird zu einem einzelnen kommagetrennten Text zusammengefügt, sodass mehrere Werte nicht als Alternativen abgeglichen werden. Wird ohne `delete_all` ignoriert. Ein leerer Wert wird ignoriert und schränkt die Auswahl nicht ein.",
                    "type": "string"
                  },
                  "filter_warning": {
                    "description": "Grenzt ein `delete_all` auf die Sitzungen ein, die dem Filter `warning` von [List Sessions](/de/sessions-api/list-sessions) entsprechen, mit denselben Werten. Eine kommagetrennte Zeichenkette oder ein Array. Wird ohne `delete_all` ignoriert. Ein leerer Wert wird ignoriert und schränkt die Auswahl nicht ein.",
                    "oneOf": [
                      {
                        "type": "string"
                      },
                      {
                        "type": "array",
                        "items": {
                          "type": "string"
                        }
                      }
                    ]
                  },
                  "filter_status_initialized_as_in_review": {
                    "description": "Grenzt ein `delete_all` auf die Sitzungen ein, die dem Filter `status_initialized_as_in_review` von [List Sessions](/de/sessions-api/list-sessions) entsprechen, mit denselben Werten. Wird ohne `delete_all` ignoriert. Ein leerer Wert wird ignoriert und schränkt die Auswahl nicht ein.",
                    "type": "boolean"
                  },
                  "filter_is_kyc_to_be_reviewed": {
                    "description": "Grenzt ein `delete_all` auf die Sitzungen ein, die dem `is_kyc_to_be_reviewed`-Filter von [Sitzungen auflisten](/de/sessions-api/list-sessions) entsprechen, mit denselben Werten. Wird ohne `delete_all` ignoriert. Ein leerer Wert wird ignoriert und schränkt die Auswahl nicht ein.",
                    "type": "boolean"
                  },
                  "filter_euuid": {
                    "description": "Grenzt ein `delete_all` auf die Sitzungen ein, die dem `euuid`-Filter von [Sitzungen auflisten](/de/sessions-api/list-sessions) entsprechen, mit demselben Wert. Ein einzelner Wert, keine Liste: Ein Array wird zu einem einzelnen, durch Kommas getrennten Wert zusammengefügt, sodass mehrere Werte mit `400` abgelehnt werden. Wird ohne `delete_all` ignoriert. Ein leerer Wert wird ignoriert und schränkt die Auswahl nicht ein.",
                    "type": "string",
                    "format": "uuid"
                  },
                  "filter_organization_name": {
                    "description": "Grenzt ein `delete_all` auf die Sitzungen ein, die dem Filter `organization_name` von [List Sessions](/de/sessions-api/list-sessions) entsprechen, mit denselben Werten. Eine kommagetrennte Zeichenkette oder ein Array. Mit einem API-Schlüssel kann dies nur mit dem Namen Ihrer eigenen Organisation übereinstimmen, sodass entweder alle Ihre Sitzungen oder keine ausgewählt werden. Wird ohne `delete_all` ignoriert. Ein leerer Wert wird ignoriert und schränkt die Auswahl nicht ein.",
                    "oneOf": [
                      {
                        "type": "string"
                      },
                      {
                        "type": "array",
                        "items": {
                          "type": "string"
                        }
                      }
                    ]
                  }
                }
              },
              "examples": {
                "Specific sessions": {
                  "summary": "Bestimmte Sitzungen nach Nummer löschen",
                  "value": {
                    "session_numbers": [
                      "1001",
                      "1002",
                      "1003"
                    ]
                  }
                },
                "All sessions": {
                  "summary": "Jede KYC-Sitzung in der Anwendung löschen",
                  "value": {
                    "delete_all": true
                  }
                },
                "Delete and retain templates": {
                  "summary": "Sitzungen löschen, aber bildfreie biometrische Templates für 365 Tage behalten",
                  "value": {
                    "session_numbers": [
                      "1001",
                      "1002"
                    ],
                    "retain_face_embeddings": true,
                    "face_retention_days": 365,
                    "instruction_id": "post-approval-cleanup-2026-08"
                  }
                },
                "Privacy erasure": {
                  "summary": "Sitzungen löschen und jede aufbewahrte Vorlage für deren Benutzer löschen",
                  "value": {
                    "session_numbers": [
                      "1001"
                    ],
                    "deletion_instruction": "privacy_erasure",
                    "instruction_id": "dsar-2026-0142"
                  }
                },
                "Filtered delete_all": {
                  "summary": "Jede im September 2026 erstellte abgelehnte Sitzung eines Workflows löschen",
                  "value": {
                    "delete_all": true,
                    "filter_status": [
                      "Declined"
                    ],
                    "filter_workflow_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
                    "filter_date_from": "2026-09-01",
                    "filter_date_to": "2026-09-30"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Bis zu 20 Sitzungen stimmten überein und wurden in der Anfrage verarbeitet. Ein Ergebnis pro übereinstimmender Sitzung; Nummern, die mit nichts übereinstimmten (unbekannt oder bereits gelöscht), werden übersprungen und erscheinen nicht. Ein Ergebnis bestätigt die Löschung, außer wenn `face_retention_outcome` den Wert `failed_retryable` hat: Diese Sitzung wurde NICHT gelöscht und sollte wiederholt werden.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "results": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "session_id": {
                            "type": "string",
                            "format": "uuid",
                            "description": "Die gelöschte Sitzung."
                          },
                          "session_number": {
                            "type": "integer",
                            "nullable": true,
                            "description": "Die Nummer der gelöschten Sitzung."
                          },
                          "face_retention_outcome": {
                            "type": "string",
                            "enum": [
                              "retained_with_user",
                              "deleted",
                              "none",
                              "ineligible_no_vendor_user",
                              "failed_retryable"
                            ],
                            "description": "Was mit den biometrischen Gesichtsdaten der Sitzung passiert ist. `deleted`: Das Gesichts-Embedding wurde mit der Sitzung gelöscht (Standard). `retained_with_user`: Die Sitzung wird gelöscht und ein bildfreies biometrisches Template bleibt beim Benutzer verankert; siehe `biometric_template_uuid`. `none`: Die Sitzung hatte kein Gesichts-Embedding (beispielsweise eine reine Dokumenten-KYC-Sitzung ohne Liveness-Selfie; KYB-Sitzungen werden von diesem Endpoint niemals ausgewählt). `ineligible_no_vendor_user`: Die Aufbewahrung wurde angefordert, aber die Sitzung hat keinen verknüpften Benutzer, daher wurde das Embedding mit der Sitzung gelöscht. `failed_retryable` (nur Batch-Endpoint): Die Gruppe, mit der diese Sitzung gelöscht wurde, konnte nicht gelöscht werden (ein Speicherdienst, ein biometrischer Speicher oder ein Überwachungsanbieter war nicht verfügbar); diese Sitzung ist weiterhin vorhanden, wiederholen Sie die Anfrage für sie."
                          },
                          "biometric_template_uuid": {
                            "type": "string",
                            "format": "uuid",
                            "nullable": true,
                            "description": "ID des aufbewahrten biometrischen Templates, wenn `face_retention_outcome` gleich `retained_with_user` ist; andernfalls `null`. Verwalten Sie es über `/v3/biometric-templates/{template_uuid}/`."
                          },
                          "biometric_template_expires_at": {
                            "type": "string",
                            "format": "date-time",
                            "nullable": true,
                            "description": "Wann das aufbewahrte biometrische Template gelöscht wird, wenn `face_retention_outcome` auf `retained_with_user` steht; `null`, wenn kein Template aufbewahrt wird."
                          },
                          "deleted_child_verifications": {
                            "type": "integer",
                            "description": "Auf diesem Endpoint immer `0`, da er nur KYC-Sitzungen löscht. Das Löschen einer Unternehmensverifizierungs-Sitzung (KYB) mit `DELETE /v3/session/{sessionId}/delete/` meldet die von ihr erstellten Verifizierungen, die mit ihr gelöscht wurden."
                          }
                        }
                      }
                    }
                  }
                },
                "examples": {
                  "Mixed outcomes": {
                    "value": {
                      "results": [
                        {
                          "session_id": "4c5c7f3a-3b1d-4b7e-9c39-2b4f7e6a1d02",
                          "session_number": 1001,
                          "face_retention_outcome": "deleted",
                          "biometric_template_uuid": null,
                          "biometric_template_expires_at": null,
                          "deleted_child_verifications": 0
                        },
                        {
                          "session_id": "b8e1d2c3-4f5a-4b6c-8d7e-9f0a1b2c3d4e",
                          "session_number": 1002,
                          "face_retention_outcome": "retained_with_user",
                          "biometric_template_uuid": "9d2f4b6e-1c3a-4e8f-b7d5-0a1c2e3f4a5b",
                          "biometric_template_expires_at": "2027-10-09T10:15:00Z",
                          "deleted_child_verifications": 0
                        },
                        {
                          "session_id": "7a1e9c2d-5f4b-4c3a-8e2d-1b0a9f8e7d6c",
                          "session_number": 1003,
                          "face_retention_outcome": "ineligible_no_vendor_user",
                          "biometric_template_uuid": null,
                          "biometric_template_expires_at": null,
                          "deleted_child_verifications": 0
                        },
                        {
                          "session_id": "c1d2e3f4-a5b6-4c7d-8e9f-0a1b2c3d4e5f",
                          "session_number": 1004,
                          "face_retention_outcome": "failed_retryable",
                          "biometric_template_uuid": null,
                          "biometric_template_expires_at": null,
                          "deleted_child_verifications": 0
                        }
                      ]
                    }
                  }
                }
              }
            }
          },
          "202": {
            "description": "Mehr als 20 Sitzungen stimmen überein. Sie werden im Hintergrund gelöscht; führen Sie ein Polling auf `GET /v3/sessions/delete/{job_id}/` durch, bis `status` `COMPLETED` oder `FAILED` ist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SessionDeletionJob"
                },
                "examples": {
                  "Job accepted": {
                    "value": {
                      "job_id": "5b8f2c1e-7d3a-4f6b-9e2c-1a0d8f7e6c5b",
                      "status": "PENDING",
                      "total": 250,
                      "processed": 0,
                      "outcomes": {
                        "deleted": 0,
                        "none": 0,
                        "retained_with_user": 0,
                        "ineligible_no_vendor_user": 0,
                        "failed_retryable": 0,
                        "already_deleted": 0
                      },
                      "deleted_child_verifications": 0,
                      "error": null,
                      "created_at": "2026-10-09T10:15:00Z",
                      "completed_at": null
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Validierungsfehler – es wurde nichts gelöscht. Fehlerwerte sind Arrays von Meldungsstrings mit dem Feldnamen als Schlüssel.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "session_numbers": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      }
                    }
                  },
                  "additionalProperties": {
                    "description": "Andere Schlüssel: ein `filter_*`-Schlüssel, der kein Filter zum Auflisten von Sitzungen ist (`\"Unknown filter.\"`), oder ein `filter_*`-Schlüssel, dessen Wert nicht gelesen werden kann (mit diesem `filter_*`-Schlüssel als Schlüssel und einem Array von Meldungen)."
                  }
                },
                "examples": {
                  "Missing selector": {
                    "summary": "Weder session_numbers noch delete_all angegeben",
                    "value": {
                      "session_numbers": [
                        "This field is required unless delete_all is true."
                      ]
                    }
                  },
                  "Empty list": {
                    "summary": "session_numbers ist ein leeres Array",
                    "value": {
                      "session_numbers": [
                        "This list may not be empty."
                      ]
                    }
                  },
                  "Non-numeric entry": {
                    "summary": "session_numbers enthält eine Zeichenfolge, die nicht nur aus Ziffern besteht",
                    "value": {
                      "session_numbers": [
                        "All session_numbers must be numeric."
                      ]
                    }
                  },
                  "Privacy erasure cannot retain": {
                    "summary": "deletion_instruction privacy_erasure kombiniert mit retain_face_embeddings true",
                    "value": {
                      "retain_face_embeddings": [
                        "Privacy erasure cannot retain biometric templates."
                      ]
                    }
                  },
                  "No finite retention duration": {
                    "summary": "Aufbewahrung ohne face_retention_days in der Anfrage oder der Anwendung angefordert",
                    "value": {
                      "detail": "A finite biometric-template retention duration is required."
                    }
                  },
                  "Unknown filter": {
                    "summary": "Ein filter_*-Schlüssel, den Sitzungen auflisten nicht enthält",
                    "value": {
                      "filter_reviewer": "Unknown filter."
                    }
                  },
                  "Unreadable filter value": {
                    "summary": "Ein Filterwert, der nicht gelesen werden kann",
                    "value": {
                      "filter_date_from": [
                        "Enter a valid date."
                      ]
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Fehlender API-Schlüssel. Ein fehlender Schlüssel führt zu einer `403`-Antwort; ein falscher, widerrufener oder abgelaufener Schlüssel führt zu einer `401`-Antwort.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string"
                    }
                  }
                },
                "examples": {
                  "Missing or invalid API key": {
                    "summary": "Kein x-api-key-Header vorhanden oder der Schlüssel ist ungültig",
                    "value": {
                      "detail": "You do not have permission to perform this action."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Gemeinsames Schreib-Rate-Limit überschritten (300 POST/PATCH/DELETE-Anfragen pro Minute pro API-Schlüssel). Prüfen Sie `Retry-After` und die `X-RateLimit-*`-Antwort-Header vor einem Wiederholungsversuch.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string"
                    }
                  }
                },
                "examples": {
                  "Rate limited": {
                    "summary": "Schreibbudget aufgebraucht",
                    "value": {
                      "detail": "Write request rate limit exceeded. You can make up to 300 requests per minute."
                    }
                  }
                }
              }
            }
          },
          "409": {
            "description": "Eine ausgewählte Sitzung ist Teil eines abgeschlossenen regulatorischen Berichts. Es wird nichts gelöscht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/InFiledReportError"
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X POST \\\n  https://verification.didit.me/v3/sessions/delete/ \\\n  -H 'x-api-key: YOUR_API_KEY' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\n    \"session_numbers\": [\"1001\", \"1002\", \"1003\"]\n  }'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.sessions.batch_delete(\n    session_numbers=[\"1001\", \"1002\", \"1003\"],\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.sessions.batchDelete({\n  session_numbers: [\"1001\", \"1002\", \"1003\"],\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Sessions.BatchDelete(ctx, didit.SessionsBatchDeleteParams{\n\tSessionNumbers: didit.Some([]string{\"1001\", \"1002\", \"1003\"}),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import java.util.List;\nimport me.didit.Didit;\nimport me.didit.types.SessionsBatchDeleteParams;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.sessions().batchDelete(SessionsBatchDeleteParams.builder()\n        .sessionNumbers(List.of(\"1001\", \"1002\", \"1003\"))\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->sessions->batchDelete([\n    'session_numbers' => ['1001', '1002', '1003'],\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.sessions.batch_delete(session_numbers: [\"1001\", \"1002\", \"1003\"])\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Sessions.BatchDeleteAsync(new SessionsBatchDeleteParams\n{\n    SessionNumbers = new string[] { \"1001\", \"1002\", \"1003\" },\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ]
      }
    },
    "/v3/sessions/delete/{job_id}/": {
      "get": {
        "summary": "Auftrag zur Massenlöschung von Sitzungen abrufen",
        "description": "Fortschritt einer Massenlöschung von Sitzungen, die `POST /v3/sessions/delete/` mit `202` beantwortet hat (mehr als 20 übereinstimmende Sitzungen, ausgewählt über `session_numbers` oder mit `delete_all`). Alle paar Sekunden abfragen, solange der `status` `PENDING` oder `PROCESSING` ist; stoppen, wenn er `COMPLETED` oder `FAILED` lautet.\n\nDer Job meldet, wie viele Sitzungen mit welchem Ergebnis endeten und wie viele er verarbeitet hat, niemals jedoch, welche Sitzungen gelöscht wurden. Ein `FAILED`-Job enthält die Ursache in `error`; die Sitzungen, die er noch nicht erreicht hatte, sind weiterhin vorhanden. Wiederholen Sie daher die Löschanfrage, um diese zu löschen.\n\n**Authentifizierung:** API-Schlüssel im Header `x-api-key`. Ein Job ist nur für die Anwendung sichtbar, die ihn erstellt hat; jede andere `job_id` gibt `404` zurück. Fehlende oder ungültige Anmeldedaten geben `403` zurück; diese API gibt niemals `401` zurück.",
        "operationId": "get_session_deletion_job",
        "x-didit-sdk": {
          "resource": "sessions",
          "method": "retrieve_deletion_job",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Sessions"
        ],
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "parameters": [
          {
            "name": "job_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Die mit dem `202` von `POST /v3/sessions/delete/` zurückgegebene `job_id`."
          }
        ],
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl 'https://verification.didit.me/v3/sessions/delete/JOB_ID/' \\\n  -H 'x-api-key: YOUR_API_KEY'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.sessions.retrieve_deletion_job(\n    \"11111111-2222-3333-4444-555555555555\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.sessions.retrieveDeletionJob(\"11111111-2222-3333-4444-555555555555\");\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Sessions.RetrieveDeletionJob(ctx, \"11111111-2222-3333-4444-555555555555\")\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.sessions().retrieveDeletionJob(\"11111111-2222-3333-4444-555555555555\");\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->sessions->retrieveDeletionJob('11111111-2222-3333-4444-555555555555');\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.sessions.retrieve_deletion_job(\"11111111-2222-3333-4444-555555555555\")\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Sessions.RetrieveDeletionJobAsync(\"11111111-2222-3333-4444-555555555555\");\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "responses": {
          "200": {
            "description": "Der Job.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SessionDeletionJob"
                },
                "examples": {
                  "Processing": {
                    "value": {
                      "job_id": "5b8f2c1e-7d3a-4f6b-9e2c-1a0d8f7e6c5b",
                      "status": "PROCESSING",
                      "total": 250,
                      "processed": 100,
                      "outcomes": {
                        "deleted": 82,
                        "none": 18,
                        "retained_with_user": 0,
                        "ineligible_no_vendor_user": 0,
                        "failed_retryable": 0,
                        "already_deleted": 0
                      },
                      "deleted_child_verifications": 0,
                      "error": null,
                      "created_at": "2026-10-09T10:15:00Z",
                      "completed_at": null
                    }
                  },
                  "Completed": {
                    "value": {
                      "job_id": "5b8f2c1e-7d3a-4f6b-9e2c-1a0d8f7e6c5b",
                      "status": "COMPLETED",
                      "total": 250,
                      "processed": 250,
                      "outcomes": {
                        "deleted": 204,
                        "none": 44,
                        "retained_with_user": 0,
                        "ineligible_no_vendor_user": 0,
                        "failed_retryable": 0,
                        "already_deleted": 2
                      },
                      "deleted_child_verifications": 0,
                      "error": null,
                      "created_at": "2026-10-09T10:15:00Z",
                      "completed_at": "2026-10-09T10:16:40Z"
                    }
                  },
                  "Failed": {
                    "value": {
                      "job_id": "5b8f2c1e-7d3a-4f6b-9e2c-1a0d8f7e6c5b",
                      "status": "FAILED",
                      "total": 250,
                      "processed": 100,
                      "outcomes": {
                        "deleted": 82,
                        "none": 18,
                        "retained_with_user": 0,
                        "ineligible_no_vendor_user": 0,
                        "failed_retryable": 0,
                        "already_deleted": 0
                      },
                      "deleted_child_verifications": 0,
                      "error": "The deletion stopped before it finished. The sessions it had not reached are still in place; repeat the request to delete them.",
                      "created_at": "2026-10-09T10:15:00Z",
                      "completed_at": "2026-10-09T10:15:52Z"
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Fehlender API-Schlüssel. Ein fehlender Schlüssel führt zu einer `403`-Antwort; ein falscher, widerrufener oder abgelaufener Schlüssel führt zu einer `401`-Antwort.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string"
                    }
                  }
                },
                "examples": {
                  "Missing or invalid API key": {
                    "summary": "Kein x-api-key-Header vorhanden oder der Schlüssel ist ungültig",
                    "value": {
                      "detail": "You do not have permission to perform this action."
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Für die aufrufende Anwendung existiert kein Löschauftrag mit dieser `job_id`. Aufträge sind nur für die Anwendung sichtbar, die sie erstellt hat."
          }
        }
      }
    },
    "/v3/sessions/{session_id}/reviews/": {
      "get": {
        "summary": "Sitzungsprüfungen und Aktivitäts-Log auflisten",
        "description": "Gibt den Audit-Trail / Aktivitäts-Feed für eine Sitzung der Benutzerverifizierung (KYC) zurück, die neuesten zuerst, in einem paginierten Container (`count` / `next` / `previous` / `results`, standardmäßig 50 Einträge pro Seite).\n\nFeed-Einträge werden von jedem Akteur verfasst, der mit der Sitzung interagiert: manuelle Entscheidungen über `PATCH /v3/session/{session_id}/update-status/` (zeichnet `previous_status` → `new_status` auf), Prüferaktivitäten in der Console (Kommentare mit `@email`-Erwähnungen, Bearbeitungen von KYC/POA-Daten, Hochladen/Entfernen von Dateien, Tag-Änderungen, Aufrufe der Detailseite), Treffer der laufenden AML-Überwachung sowie über `POST` auf demselben Pfad hinzugefügte Notizen. Das Auslesen dieses Feeds ist das API-seitige Äquivalent zum Bereich **Activity** in der Sitzungsansicht der Didit Console.\n\nHier können nur Sitzungen der Benutzerverifizierung (KYC) adressiert werden; Sitzungs-IDs der Unternehmensverifizierung (KYB) geben `404` zurück.",
        "operationId": "list_session_reviews",
        "x-didit-sdk": {
          "resource": "sessions.reviews",
          "method": "list",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Sessions"
        ],
        "parameters": [
          {
            "name": "session_id",
            "in": "path",
            "required": true,
            "description": "UUID der Sitzung zur Benutzerverifizierung (KYC). Muss zu derselben Anwendung wie der API-Schlüssel gehören — anwendungsübergreifende UUIDs, gelöschte Sitzungen und Sitzungs-IDs der Unternehmensverifizierung (KYB) geben alle `404` zurück.",
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "8c2f3a14-7e9b-4d23-9e83-3f7d5e8a1c6d"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Seitengröße. Standardmäßig `50`.",
            "schema": {
              "type": "integer",
              "default": 50,
              "example": 50
            }
          },
          {
            "name": "offset",
            "in": "query",
            "required": false,
            "description": "Anzahl der vom Beginn des (sortierten) Feeds zu überspringenden Einträge. Standardmäßig `0`. Die `next`- / `previous`-URLs in der Antwort enthalten die richtigen Werte zum Durchlaufen des Feeds.",
            "schema": {
              "type": "integer",
              "default": 0,
              "example": 0
            }
          },
          {
            "name": "ordering",
            "in": "query",
            "required": false,
            "description": "Sortierreihenfolge. Der Feed verwendet standardmäßig die neuesten zuerst (`-created_at`); übergeben Sie `created_at`, um ihn von den ältesten zuerst zu lesen. Unbekannte Werte werden stillschweigend ignoriert (die Standardreihenfolge wird verwendet); andere Serializer-Feldnamen werden ebenfalls akzeptiert.",
            "schema": {
              "type": "string",
              "default": "-created_at",
              "example": "created_at"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Paginierter Aktivitäts-Feed, standardmäßig die neuesten zuerst. `count` ist die Gesamtzahl der Einträge; `next` / `previous` sind fertige Seiten-URLs (`null` an den Enden). Ein `count` von `0` mit leeren `results` bedeutet, dass noch keine Aktivität erfasst wurde.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "count": {
                      "type": "integer",
                      "description": "Gesamtzahl der Feed-Einträge für diese Sitzung (über alle Seiten hinweg).",
                      "example": 3
                    },
                    "next": {
                      "type": "string",
                      "nullable": true,
                      "description": "URL der nächsten Seite oder `null` auf der letzten Seite.",
                      "example": null
                    },
                    "previous": {
                      "type": "string",
                      "nullable": true,
                      "description": "URL der vorherigen Seite oder `null` auf der ersten Seite.",
                      "example": null
                    },
                    "results": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/ReviewItem"
                      },
                      "description": "Feed-Einträge für diese Seite."
                    }
                  }
                },
                "examples": {
                  "DecisionTrail": {
                    "summary": "Manuelle Genehmigung zuzüglich über die API hinzugefügter Notizen",
                    "value": {
                      "count": 3,
                      "next": null,
                      "previous": null,
                      "results": [
                        {
                          "uuid": "de0561bc-5583-4409-9171-1a31a4c8a5f4",
                          "activity_type": "STATUS_UPDATED",
                          "actor_display": "API Client",
                          "actor_email": null,
                          "actor_type": "API_KEY",
                          "new_status": "Approved",
                          "previous_status": "In Review",
                          "comment": "Document re-checked manually; address matches.",
                          "mentioned_emails": [],
                          "previous_value": {
                            "status": "In Review"
                          },
                          "new_value": {
                            "status": "Approved"
                          },
                          "changed_fields": [
                            "status"
                          ],
                          "metadata": null,
                          "created_at": "2026-06-12T00:19:31.918735Z"
                        },
                        {
                          "uuid": "35370f58-5098-44ee-8a06-8c9af80b2455",
                          "activity_type": "STATUS_UPDATED",
                          "actor_display": "Unknown",
                          "actor_email": null,
                          "actor_type": "CONSOLE_USER",
                          "new_status": null,
                          "previous_status": null,
                          "comment": "Note without status.",
                          "mentioned_emails": [],
                          "previous_value": null,
                          "new_value": null,
                          "changed_fields": [],
                          "metadata": null,
                          "created_at": "2026-06-12T00:18:44.504157Z"
                        },
                        {
                          "uuid": "00338f82-f1c5-4f57-8614-c49bb258af1a",
                          "activity_type": "STATUS_UPDATED",
                          "actor_display": "Unknown",
                          "actor_email": null,
                          "actor_type": "CONSOLE_USER",
                          "new_status": "In Review",
                          "previous_status": null,
                          "comment": "Flagging for manual document re-check.",
                          "mentioned_emails": [],
                          "previous_value": null,
                          "new_value": null,
                          "changed_fields": [],
                          "metadata": null,
                          "created_at": "2026-06-12T00:18:44.466537Z"
                        }
                      ]
                    }
                  },
                  "PaginatedFirstPage": {
                    "summary": "Erste Seite mit limit=2 – next enthält die Folge-URL",
                    "value": {
                      "count": 4,
                      "next": "https://verification.didit.me/v3/sessions/8c2f3a14-7e9b-4d23-9e83-3f7d5e8a1c6d/reviews/?limit=2&offset=2",
                      "previous": null,
                      "results": [
                        {
                          "uuid": "de0561bc-5583-4409-9171-1a31a4c8a5f4",
                          "activity_type": "STATUS_UPDATED",
                          "actor_display": "API Client",
                          "actor_email": null,
                          "actor_type": "API_KEY",
                          "new_status": "Approved",
                          "previous_status": "In Review",
                          "comment": "Document re-checked manually; address matches.",
                          "mentioned_emails": [],
                          "previous_value": {
                            "status": "In Review"
                          },
                          "new_value": {
                            "status": "Approved"
                          },
                          "changed_fields": [
                            "status"
                          ],
                          "metadata": null,
                          "created_at": "2026-06-12T00:19:31.918735Z"
                        },
                        {
                          "uuid": "bd4e6227-bdd2-42b2-a726-1d12f785a457",
                          "activity_type": "STATUS_UPDATED",
                          "actor_display": "Unknown",
                          "actor_email": null,
                          "actor_type": "CONSOLE_USER",
                          "new_status": null,
                          "previous_status": null,
                          "comment": null,
                          "mentioned_emails": [],
                          "previous_value": null,
                          "new_value": null,
                          "changed_fields": [],
                          "metadata": null,
                          "created_at": "2026-06-12T00:18:44.540238Z"
                        }
                      ]
                    }
                  },
                  "Empty": {
                    "summary": "Sitzung noch ohne erfasste Aktivität",
                    "value": {
                      "count": 0,
                      "next": null,
                      "previous": null,
                      "results": []
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Fehlender, fehlerhafter, abgelaufener oder widerrufener `x-api-key`. Die Authentifizierung wird vor dem Nachschlagen der Sitzung geprüft, sodass ein fehlender Schlüssel auch dann `403` zurückgibt, wenn die Sitzungs-UUID nicht existiert.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string",
                      "example": "You do not have permission to perform this action."
                    }
                  }
                },
                "examples": {
                  "InvalidKey": {
                    "summary": "Fehlender oder ungültiger Header x-api-key",
                    "value": {
                      "detail": "You do not have permission to perform this action."
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Für Ihre Anwendung ist keine Benutzerverifizierungs-Sitzung (KYC) mit dieser UUID sichtbar: Die UUID existiert nicht, die Sitzung wurde gelöscht oder gehört zu einer anderen Anwendung. Unternehmensverifizierungs-Sitzungs-IDs (KYB) geben hier ebenfalls `404` zurück – der Prüfungs-Feed ist nur für KYC-Sitzungen adressierbar.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string",
                      "example": "Session not found."
                    }
                  }
                },
                "examples": {
                  "NotFound": {
                    "summary": "Unbekannte, gelöschte oder anwendungsübergreifende Sitzungs-UUID",
                    "value": {
                      "detail": "Session not found."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate-Limit überschritten. Prüfen Sie die Antwort-Header `Retry-After` und `X-RateLimit-*`. Siehe [Rate-Limiting](/de/integration/rate-limiting)."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -s 'https://verification.didit.me/v3/sessions/8c2f3a14-7e9b-4d23-9e83-3f7d5e8a1c6d/reviews/?limit=50' \\\n  -H 'x-api-key: YOUR_API_KEY'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nfor item in client.sessions.reviews.list(\n    \"8c2f3a14-7e9b-4d23-9e83-3f7d5e8a1c6d\",\n):\n    print(item)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nfor await (const item of didit.sessions.reviews.list(\"8c2f3a14-7e9b-4d23-9e83-3f7d5e8a1c6d\")) {\n  console.log(item);\n}"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\niter := client.Sessions.Reviews.ListAutoPaging(ctx, \"8c2f3a14-7e9b-4d23-9e83-3f7d5e8a1c6d\", didit.SessionsReviewsListParams{})\nfor iter.Next() {\n\tfmt.Printf(\"%+v\\n\", iter.Current())\n}\nif err := iter.Err(); err != nil {\n\tlog.Fatal(err)\n}"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nfor (var item : client.sessions().reviews().list(\"8c2f3a14-7e9b-4d23-9e83-3f7d5e8a1c6d\")) {\n    System.out.println(item);\n}"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\nforeach ($didit->sessions->reviews->list('8c2f3a14-7e9b-4d23-9e83-3f7d5e8a1c6d') as $item) {\n    print_r($item->toArray());\n}"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\ndidit.sessions.reviews.list(\"8c2f3a14-7e9b-4d23-9e83-3f7d5e8a1c6d\").auto_paging_each do |item|\n  puts item.to_h\nend"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nawait foreach (var item in await client.Sessions.Reviews.ListAsync(\"8c2f3a14-7e9b-4d23-9e83-3f7d5e8a1c6d\"))\n{\n    Console.WriteLine(JsonSerializer.Serialize(item));\n}"
          }
        ]
      },
      "post": {
        "summary": "Prüfnotiz zum Audit-Log einer Sitzung hinzufügen",
        "description": "Fügt dem Prüfungs-/Aktivitäts-Feed einer Sitzung der Benutzerverifizierung (KYC) eine Notiz an. **Dieser Endpoint zeichnet lediglich einen Eintrag auf – er ändert die Sitzung niemals.** Der `status` der Sitzung bleibt unberührt, es wird keine Statusübergangs-Validierung ausgeführt und kein Webhook ausgelöst. Um eine Sitzung tatsächlich zu genehmigen, abzulehnen oder wieder zu öffnen (was auch einen vollständig attribuierten `STATUS_UPDATED`-Eintrag in diesen Feed schreibt), verwenden Sie stattdessen `PATCH /v3/session/{session_id}/update-status/`.\n\nBeide Body-Felder sind optional und ein leeres JSON-Objekt wird akzeptiert. `new_status` wird rein als Label für den Eintrag gespeichert und akzeptiert jeden der zehn Sitzungsstatuswerte (Groß-/Kleinschreibung beachten). `@email`-Erwähnungen innerhalb von `comment` werden nur als reiner Text gespeichert – sie lösen an diesem Endpoint keine Benachrichtigungen aus, und `mentioned_emails` des Eintrags bleibt leer.\n\nHinweis zur Attribution: Hier erstellte Einträge enthalten keine Akteursinformationen. Im Feed werden sie mit `actor_display: \"Unknown\"`, `actor_type: \"CONSOLE_USER\"` und `activity_type: \"STATUS_UPDATED\"` (Speicherstandardwerte) angezeigt, und das Feld `user` im `201`-Body lautet `\"Unknown\"`.",
        "operationId": "create_session_review",
        "x-didit-sdk": {
          "resource": "sessions.reviews",
          "method": "create",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Sessions"
        ],
        "parameters": [
          {
            "name": "Content-Type",
            "in": "header",
            "required": false,
            "description": "Auf `application/json` setzen, wenn ein JSON-Body gesendet wird.",
            "schema": {
              "type": "string",
              "example": "application/json"
            }
          },
          {
            "name": "session_id",
            "in": "path",
            "required": true,
            "description": "UUID der Sitzung zur Benutzerverifizierung (KYC). Muss zu derselben Anwendung wie der API-Schlüssel gehören — anwendungsübergreifende UUIDs, gelöschte Sitzungen und Sitzungs-IDs der Unternehmensverifizierung (KYB) geben alle `404` zurück.",
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "8c2f3a14-7e9b-4d23-9e83-3f7d5e8a1c6d"
            }
          }
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "new_status": {
                    "type": "string",
                    "nullable": true,
                    "enum": [
                      "Not Started",
                      "In Progress",
                      "Approved",
                      "Declined",
                      "In Review",
                      "Expired",
                      "Abandoned",
                      "Kyc Expired",
                      "Resubmitted",
                      "Awaiting User"
                    ],
                    "description": "Optionales Status-Label, das für den Eintrag erfasst werden soll. Akzeptiert jeden Sitzungsstatuswert unter Beachtung der Groß-/Kleinschreibung (`\"approved\"` wird mit `400` abgelehnt). Das Erfassen eines Status an dieser Stelle ändert **nicht** den tatsächlichen Status der Sitzung – verwenden Sie dafür den Endpoint zur Statusaktualisierung.",
                    "example": "In Review"
                  },
                  "comment": {
                    "type": "string",
                    "nullable": true,
                    "description": "Optionale Freitextnotiz (keine erzwungene Längenbegrenzung). Wird wortgetreu gespeichert; `@email`-Erwähnungen werden an diesem Endpoint nicht verarbeitet.",
                    "example": "Flagging for manual document re-check."
                  }
                }
              },
              "examples": {
                "NoteWithStatusLabel": {
                  "summary": "Notiz mit einem Status-Label (Sitzungsstatus unverändert)",
                  "value": {
                    "new_status": "In Review",
                    "comment": "Flagging for manual document re-check."
                  }
                },
                "CommentOnly": {
                  "summary": "Einfache Notiz ohne Status-Label",
                  "value": {
                    "comment": "Customer emailed an updated utility bill; awaiting upload."
                  }
                }
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Eintrag, der im Audit-Log der Sitzung aufgezeichnet wurde. Die Sitzung selbst bleibt unverändert – ihr `status` behält seinen vorherigen Wert und es wird kein Webhook gesendet. Der neue Eintrag erscheint auch ganz oben bei `GET …/reviews/` (mit `actor_display: \"Unknown\"`).",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "user": {
                      "type": "string",
                      "description": "Anzeigename des Autors des Eintrags. Immer `\"Unknown\"` für Einträge, die über diesen Endpoint erstellt wurden, da er keine Akteurszuordnung erfasst.",
                      "example": "Unknown"
                    },
                    "new_status": {
                      "type": "string",
                      "nullable": true,
                      "enum": [
                        "Not Started",
                        "In Progress",
                        "Approved",
                        "Declined",
                        "In Review",
                        "Expired",
                        "Abandoned",
                        "Kyc Expired",
                        "Resubmitted",
                        "Awaiting User"
                      ],
                      "description": "Das für den Eintrag erfasste Statuslabel oder `null`, wenn keines gesendet wurde. Der tatsächliche Status der Sitzung ist davon nicht betroffen.",
                      "example": "In Review"
                    },
                    "comment": {
                      "type": "string",
                      "nullable": true,
                      "description": "Die für den Eintrag erfasste Notiz oder `null`, wenn keine gesendet wurde.",
                      "example": "Flagging for manual document re-check."
                    },
                    "created_at": {
                      "type": "string",
                      "format": "date-time",
                      "description": "Wann der Eintrag geschrieben wurde, ISO 8601 UTC.",
                      "example": "2026-06-12T00:18:44.466537Z"
                    }
                  }
                },
                "examples": {
                  "NoteWithStatusLabel": {
                    "summary": "Notiz mit einem Status-Label",
                    "value": {
                      "user": "Unknown",
                      "new_status": "In Review",
                      "comment": "Flagging for manual document re-check.",
                      "created_at": "2026-06-12T00:18:44.466537Z"
                    }
                  },
                  "CommentOnly": {
                    "summary": "Einfache Notiz",
                    "value": {
                      "user": "Unknown",
                      "new_status": null,
                      "comment": "Note without status.",
                      "created_at": "2026-06-12T00:18:44.504157Z"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Validierungsfehler, zurückgegeben als Zuordnung von Meldungen pro Feld. Die übliche Ursache ist ein `new_status`-Wert, der keinem der zehn zulässigen Status entspricht — die Prüfung unterscheidet zwischen Groß- und Kleinschreibung.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "new_status": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      },
                      "example": [
                        "\"approved\" is not a valid choice."
                      ]
                    }
                  }
                },
                "examples": {
                  "InvalidStatusChoice": {
                    "summary": "In Kleinbuchstaben geschriebener / unbekannter Statuswert",
                    "value": {
                      "new_status": [
                        "\"approved\" is not a valid choice."
                      ]
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Fehlender, fehlerhafter, abgelaufener oder widerrufener `x-api-key`. Die Authentifizierung wird vor dem Nachschlagen der Sitzung geprüft, sodass ein fehlender Schlüssel auch dann `403` zurückgibt, wenn die Sitzungs-UUID nicht existiert.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string",
                      "example": "You do not have permission to perform this action."
                    }
                  }
                },
                "examples": {
                  "InvalidKey": {
                    "summary": "Fehlender oder ungültiger Header x-api-key",
                    "value": {
                      "detail": "You do not have permission to perform this action."
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Für Ihre Anwendung ist keine Benutzerverifizierungs-Sitzung (KYC) mit dieser UUID sichtbar: Die UUID existiert nicht, die Sitzung wurde gelöscht oder gehört zu einer anderen Anwendung. Unternehmensverifizierungs-Sitzungs-IDs (KYB) geben hier ebenfalls `404` zurück – der Prüfungs-Feed ist nur für KYC-Sitzungen adressierbar.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string",
                      "example": "Session not found."
                    }
                  }
                },
                "examples": {
                  "NotFound": {
                    "summary": "Unbekannte, gelöschte oder anwendungsübergreifende Sitzungs-UUID",
                    "value": {
                      "detail": "Session not found."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate-Limit überschritten. Prüfen Sie die Antwort-Header `Retry-After` und `X-RateLimit-*`. Siehe [Rate-Limiting](/de/integration/rate-limiting)."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "# Records an audit-trail note only -- the session's status does NOT change.\ncurl -s -X POST https://verification.didit.me/v3/sessions/8c2f3a14-7e9b-4d23-9e83-3f7d5e8a1c6d/reviews/ \\\n  -H 'x-api-key: YOUR_API_KEY' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\n    \"new_status\": \"In Review\",\n    \"comment\": \"Flagging for manual document re-check.\"\n  }'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.sessions.reviews.create(\n    \"8c2f3a14-7e9b-4d23-9e83-3f7d5e8a1c6d\",\n    new_status=\"In Review\",\n    comment=\"Flagging for manual document re-check.\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.sessions.reviews.create(\"8c2f3a14-7e9b-4d23-9e83-3f7d5e8a1c6d\", {\n  new_status: \"In Review\",\n  comment: \"Flagging for manual document re-check.\",\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Sessions.Reviews.Create(ctx, \"8c2f3a14-7e9b-4d23-9e83-3f7d5e8a1c6d\", didit.SessionsReviewsCreateParams{\n\tNewStatus: didit.Some(didit.SessionsReviewsCreateParamsNewStatus(\"In Review\")),\n\tComment:   didit.String(\"Flagging for manual document re-check.\"),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\nimport me.didit.types.SessionsReviewsCreateParams;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.sessions().reviews().create(\"8c2f3a14-7e9b-4d23-9e83-3f7d5e8a1c6d\", SessionsReviewsCreateParams.builder()\n        .newStatus(SessionsReviewsCreateParams.NewStatus.of(\"In Review\"))\n        .comment(\"Flagging for manual document re-check.\")\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->sessions->reviews->create('8c2f3a14-7e9b-4d23-9e83-3f7d5e8a1c6d', [\n    'new_status' => 'In Review',\n    'comment' => 'Flagging for manual document re-check.',\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.sessions.reviews.create(\n  \"8c2f3a14-7e9b-4d23-9e83-3f7d5e8a1c6d\",\n  new_status: \"In Review\",\n  comment: \"Flagging for manual document re-check.\"\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Sessions.Reviews.CreateAsync(\"8c2f3a14-7e9b-4d23-9e83-3f7d5e8a1c6d\", new SessionsReviewsCreateParams\n{\n    NewStatus = new SessionsReviewsCreateParamsNewStatus(\"In Review\"),\n    Comment = \"Flagging for manual document re-check.\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ]
      }
    },
    "/v3/billing/balance/": {
      "get": {
        "summary": "Credit-Guthaben abrufen",
        "description": "Aktuelles Prepaid-Credit-Guthaben in USD (organisationsweit) sowie Konfiguration für automatisches Aufladen abrufen. Beträge sind Dezimalstrings – parsen Sie sie mit einer Dezimalbibliothek.",
        "operationId": "get_billing_balance",
        "x-didit-sdk": {
          "resource": "billing",
          "method": "retrieve_balance",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Billing"
        ],
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X GET 'https://verification.didit.me/v3/billing/balance/' \\\n  -H 'x-api-key: YOUR_API_KEY'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.billing.retrieve_balance()\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.billing.retrieveBalance();\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Billing.RetrieveBalance(ctx)\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.billing().retrieveBalance();\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->billing->retrieveBalance();\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.billing.retrieve_balance\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Billing.RetrieveBalanceAsync();\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "responses": {
          "200": {
            "description": "Aktuelles Credit-Guthaben plus die Konfiguration für das automatische Aufladen der Organisation.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "balance",
                    "auto_refill_enabled"
                  ],
                  "properties": {
                    "balance": {
                      "type": "string",
                      "description": "Aktuelles Prepaid-Credit-Guthaben in USD als Dezimalzeichenfolge im Festkommaformat. Verringert sich bei der Abrechnung von Verifizierungen und erhöht sich, wenn eine Aufladung abgeschlossen wird."
                    },
                    "auto_refill_enabled": {
                      "type": "boolean",
                      "description": "Wenn `true`, belastet Didit die gespeicherte Zahlungsmethode automatisch, um Credits aufzuladen, sobald das Guthaben `auto_refill_threshold` unterschreitet. Konfiguriert unter Console → Billing."
                    },
                    "auto_refill_amount": {
                      "type": "string",
                      "nullable": true,
                      "description": "USD-Betrag, der bei jeder automatischen Aufladung zum Nennwert berechnet und dem Guthaben gutgeschrieben wird. Einstellbar von \\$50 bis \\$20,000 in Konsole → Abrechnung. `null`, wenn die automatische Aufladung deaktiviert oder nicht festgelegt ist."
                    },
                    "auto_refill_threshold": {
                      "type": "string",
                      "nullable": true,
                      "description": "Auslöser-Schwellenwert in USD. Auto-Refill wird ausgelöst, wenn das `balance` unter diesen Wert fällt. `null`, wenn Auto-Refill deaktiviert oder nicht festgelegt ist."
                    }
                  }
                },
                "examples": {
                  "Healthy balance with auto-refill": {
                    "value": {
                      "balance": "1234.5600",
                      "auto_refill_enabled": true,
                      "auto_refill_amount": "500.00",
                      "auto_refill_threshold": "100.00"
                    }
                  },
                  "Low balance, manual top-up only": {
                    "value": {
                      "balance": "12.0000",
                      "auto_refill_enabled": false,
                      "auto_refill_amount": null,
                      "auto_refill_threshold": null
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Fehlender, ungültiger oder widerrufener API-Schlüssel, oder der Schlüssel kann keine Abrechnungsdaten für diese Organisation lesen. Ein fehlender Schlüssel gibt `403` zurück; ein falscher, widerrufener oder abgelaufener Schlüssel gibt `401` zurück.",
            "content": {
              "application/json": {
                "examples": {
                  "Forbidden": {
                    "value": {
                      "detail": "You do not have permission to perform this action."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate-Limit überschritten; drosseln Sie die Anfragen und wiederholen Sie den Versuch nach dem in `Retry-After` angegebenen Intervall.",
            "content": {
              "application/json": {
                "examples": {
                  "Throttled": {
                    "value": {
                      "detail": "Request was throttled. Expected available in 30 seconds."
                    }
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/v3/billing/top-up/": {
      "post": {
        "summary": "Credits aufladen",
        "description": "Credits über eine gehostete Stripe-Checkout-Sitzung aufladen (**\\$50 bis \\$20,000** pro Aufladung). Aufladungen sind in den Tarifen Free, Growth und Scale verfügbar, werden zum Nennwert ohne Rabatt oder Bonus gutgeschrieben und sind 12 Monate gültig; Jahresverträge für Enterprise können nicht aufgeladen werden. Leiten Sie den Kunden zur zurückgegebenen `checkout_session_url` weiter.",
        "operationId": "billing_top_up",
        "x-didit-sdk": {
          "resource": "billing",
          "method": "top_up",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Billing"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "amount_in_dollars"
                ],
                "properties": {
                  "amount_in_dollars": {
                    "type": "number",
                    "minimum": 50,
                    "maximum": 20000,
                    "description": "Abzurechnender Betrag in USD. **Muss zwischen 50 und 20.000 liegen.** Dem Guthaben wird derselbe Betrag ohne Rabatt oder Bonus gutgeschrieben. Die Steuer wird beim Checkout basierend auf der Rechnungsadresse des Kunden automatisch hinzugefügt."
                  },
                  "success_url": {
                    "type": "string",
                    "format": "uri",
                    "description": "URL, zu der der gehostete Checkout den Kunden nach einer erfolgreichen Zahlung weiterleitet. Standardmäßig derzeit `https://console.didit.me`. Übergeben Sie explizit eine funktionierende URL; der Standard-Host ist nicht verfügbar. Hängen Sie den Platzhalter `{CHECKOUT_SESSION_ID}` wörtlich an, wenn der gehostete Checkout die Sitzungs-ID einsetzen soll."
                  },
                  "cancel_url": {
                    "type": "string",
                    "format": "uri",
                    "description": "URL, zu der der gehostete Checkout den Kunden weiterleitet, wenn dieser den Vorgang abbricht oder das Checkout-Fenster schließt. Standardmäßig derzeit `https://console.didit.me`. Übergeben Sie explizit eine funktionierende URL; der Standard-Host ist nicht verfügbar."
                  }
                }
              },
              "examples": {
                "Minimum top-up": {
                  "value": {
                    "amount_in_dollars": 50
                  }
                },
                "Custom amount with redirects": {
                  "value": {
                    "amount_in_dollars": 500,
                    "success_url": "https://yourapp.com/billing/top-up/success",
                    "cancel_url": "https://yourapp.com/billing/top-up/cancel"
                  }
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X POST 'https://verification.didit.me/v3/billing/top-up/' \\\n  -H 'x-api-key: YOUR_API_KEY' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\n    \"amount_in_dollars\": 500,\n    \"success_url\": \"https://yourapp.com/billing/success\",\n    \"cancel_url\": \"https://yourapp.com/billing/cancel\"\n  }'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.billing.top_up(\n    amount_in_dollars=50.0,\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.billing.topUp({\n  amount_in_dollars: 50.0,\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Billing.TopUp(ctx, didit.BillingTopUpParams{\n\tAmountInDollars: 50.0,\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\nimport me.didit.types.BillingTopUpParams;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.billing().topUp(BillingTopUpParams.builder()\n        .amountInDollars(50.0)\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->billing->topUp([\n    'amount_in_dollars' => 50.0,\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.billing.top_up(amount_in_dollars: 50.0)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Billing.TopUpAsync(new BillingTopUpParams\n{\n    AmountInDollars = 50.0,\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "responses": {
          "200": {
            "description": "Gehostete Checkout-Sitzung erstellt. Leiten Sie den Benutzer zu `checkout_session_url` weiter, um die Zahlung abzuschließen.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "checkout_session_id",
                    "checkout_session_url"
                  ],
                  "properties": {
                    "checkout_session_id": {
                      "type": "string",
                      "description": "Kennung der gehosteten Checkout-Sitzung (z. B. `cs_test_a1B2c3...`). Nützlich für den serverseitigen Abgleich."
                    },
                    "checkout_session_url": {
                      "type": "string",
                      "format": "uri",
                      "description": "Einmalig verwendbare URL der gehosteten Zahlungsseite. Leiten Sie den Kunden hierher weiter, um die Zahlung abzuschließen."
                    }
                  }
                },
                "examples": {
                  "Created": {
                    "value": {
                      "checkout_session_id": "cs_test_a1B2c3D4e5F6g7H8i9J0",
                      "checkout_session_url": "https://checkout.example.com/c/pay/cs_test_a1B2c3D4e5F6g7H8i9J0"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Ungültige Payload: Der Betrag fehlt, ist keine Zahl, liegt unter dem Mindestbetrag von \\$50 oder über dem Höchstbetrag von \\$20,000, oder die Organisation hat einen Enterprise-Jahresvertrag. Der Fehler-Body ist ein JSON-Array.",
            "content": {
              "application/json": {
                "examples": {
                  "Missing amount": {
                    "value": [
                      "amount_in_dollars is required."
                    ]
                  },
                  "Not a number": {
                    "value": [
                      "amount_in_dollars must be a number."
                    ]
                  },
                  "Below minimum": {
                    "value": [
                      "Amount must be at least $50."
                    ]
                  },
                  "Above maximum": {
                    "value": [
                      "Amount must be at most $20,000."
                    ]
                  },
                  "Annual plan": {
                    "value": [
                      "You have an annual plan. Contact your account manager to top up."
                    ]
                  }
                }
              }
            }
          },
          "403": {
            "description": "Fehlender, ungültiger oder widerrufener API-Schlüssel, oder der Schlüssel kann keine Aufladesitzungen für diese Organisation erstellen. Ein fehlender Schlüssel führt zu einer `403`-Antwort; ein falscher, widerrufener oder abgelaufener Schlüssel führt zu einer `401`-Antwort.",
            "content": {
              "application/json": {
                "examples": {
                  "Forbidden": {
                    "value": {
                      "detail": "You do not have permission to perform this action."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate-Limit überschritten; drosseln Sie die Anfragen und wiederholen Sie den Versuch nach dem in `Retry-After` angegebenen Intervall.",
            "content": {
              "application/json": {
                "examples": {
                  "Throttled": {
                    "value": {
                      "detail": "Request was throttled. Expected available in 30 seconds."
                    }
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/v3/webhook/destinations/": {
      "get": {
        "summary": "Webhook-Ziele auflisten",
        "description": "Alle Webhook-Ziele auflisten (unpaginiertes Array, älteste zuerst). Jeder Eintrag enthält die Konfiguration des Ziels, dessen Zustellungsmetriken für die letzten 30 Tage (`metrics_window_days`) mit einem `daily_points`-Eintrag pro Tag sowie dessen Status (`health_status`, `failing_streak`, `failing_since`, `last_success_at`). Die Liste hat kein `summary`-Objekt und enthält niemals das Signaturgeheimnis: Jeder Eintrag zeigt nur `secret_last4`. Rufen Sie ein einzelnes Ziel ab (`GET /v3/webhook/destinations/{destination_uuid}/`), um `secret_shared_key` auszulesen.",
        "operationId": "list_webhook_destinations",
        "x-didit-sdk": {
          "resource": "webhooks.destinations",
          "method": "list",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Webhook"
        ],
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X GET 'https://verification.didit.me/v3/webhook/destinations/' \\\n  -H 'x-api-key: YOUR_API_KEY'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.webhooks.destinations.list()\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.webhooks.destinations.list();\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Webhooks.Destinations.List(ctx)\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.webhooks().destinations().list();\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->webhooks->destinations->list();\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\ndidit.webhooks.destinations.list.each do |item|\n  puts item.to_h\nend"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Webhooks.Destinations.ListAsync();\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "responses": {
          "200": {
            "description": "Liste der Webhook-Ziele (nicht paginiert, älteste zuerst).",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "type": "object",
                    "properties": {
                      "uuid": {
                        "type": "string",
                        "format": "uuid",
                        "description": "Stabiler Ziel-Identifikator; als `{destination_uuid}` für Aktualisierung/Löschung verwenden."
                      },
                      "label": {
                        "type": "string",
                        "description": "Lesbarer Name, der in der Console angezeigt wird."
                      },
                      "url": {
                        "type": "string",
                        "format": "uri",
                        "description": "Ziel-URL, die `POST`-Anfragen mit der Webhook-Payload empfängt."
                      },
                      "enabled": {
                        "type": "boolean",
                        "description": "Wenn `false`, überspringt Didit die Zustellung an dieses Ziel stillschweigend."
                      },
                      "webhook_version": {
                        "type": "string",
                        "enum": [
                          "v1",
                          "v2",
                          "v3"
                        ],
                        "description": "Payload-Schema-Version, die an dieses Ziel gesendet wird. `v3` ist das aktuelle/empfohlene Format."
                      },
                      "subscribed_events": {
                        "$ref": "#/components/schemas/WebhookSubscribedEvents"
                      },
                      "subscribed_events_count": {
                        "type": "integer",
                        "description": "Gecachte Länge von `subscribed_events`, nützlich für das Rendern der Benutzeroberfläche."
                      },
                      "deliveries_count": {
                        "type": "integer",
                        "description": "Zustellungsversuche (einschließlich Wiederholungsversuche), die in den letzten 30 Tagen an dieses Ziel gesendet wurden."
                      },
                      "failed_deliveries_count": {
                        "type": "integer",
                        "description": "Zustellungsversuche in den letzten 30 Tagen, die das Ziel mit HTTP 400 oder höher beantwortet hat oder die unbeantwortet blieben (Timeout, abgelehnte Verbindung oder blockierte Adresse)."
                      },
                      "average_response_time_ms": {
                        "type": "integer",
                        "nullable": true,
                        "description": "Durchschnittliche Antwortzeit in Millisekunden über die letzten 30 Tage, gerundet auf eine Ganzzahl. `null`, wenn in diesem Zeitraum keine Zustellungen stattfanden."
                      },
                      "error_rate_percentage": {
                        "type": "integer",
                        "description": "`round(failed_deliveries_count / deliveries_count * 100)` über die letzten 30 Tage; `0`, wenn keine Zustellungen vorliegen."
                      },
                      "last_delivery_at": {
                        "type": "string",
                        "format": "date-time",
                        "nullable": true,
                        "description": "Zeitstempel des letzten Zustellungsversuchs (Erfolg oder Fehlschlag). `null`, falls nie zugestellt."
                      },
                      "metrics_window_days": {
                        "type": "integer",
                        "description": "Länge des Zeitfensters in Tagen, das von `deliveries_count`, `failed_deliveries_count`, `average_response_time_ms`, `error_rate_percentage` und `daily_points` abgedeckt wird. Immer `30`."
                      },
                      "health_status": {
                        "type": "string",
                        "enum": [
                          "healthy",
                          "degraded",
                          "failing"
                        ],
                        "description": "Zustellungsstatus. `failing`: Bei 3 oder mehr aufeinanderfolgenden Ereignissen ist jeweils der erste Zustellversuch fehlgeschlagen, seit das Ziel zuletzt erfolgreich geantwortet hat (siehe `failing_streak`). `degraded`: nicht failing, aber in den letzten 24 Stunden ist ein Zustellversuch fehlgeschlagen und kein späterer Versuch hat dieses Ereignis zugestellt; ein Wiederholungsversuch oder ein erneutes Senden, das es zustellt, hebt dies auf. `healthy`: weder noch. Unabhängig von `enabled`. Ein fehlgeschlagener Versuch ist ein Versuch, der mit HTTP 400 oder höher beantwortet oder überhaupt nicht beantwortet wurde."
                      },
                      "failing_streak": {
                        "type": "integer",
                        "description": "Wie viele aufeinanderfolgende Ereignisse bei ihrem ersten Zustellversuch fehlgeschlagen sind, seit das Ziel innerhalb der letzten 30 Tage zuletzt erfolgreich geantwortet hat. Wiederholungsversuche werden nicht gezählt, und jeder erfolgreiche Versuch, einschließlich eines Wiederholungsversuchs oder eines erneuten Sendens, beendet die Serie. `0`, wenn seit dem letzten Erfolg kein Ereignis fehlgeschlagen ist."
                      },
                      "failing_since": {
                        "type": "string",
                        "format": "date-time",
                        "nullable": true,
                        "description": "Wann der erste fehlgeschlagene Versuch der aktuellen `failing_streak` unternommen wurde. `null`, wenn `failing_streak` den Wert `0` hat."
                      },
                      "last_success_at": {
                        "type": "string",
                        "format": "date-time",
                        "nullable": true,
                        "description": "Wann das Ziel zuletzt innerhalb der letzten 30 Tage auf eine Zustellung mit einem HTTP-Status unter 400 geantwortet hat. `null`, wenn dies in diesem Zeitfenster nicht der Fall war."
                      },
                      "environment": {
                        "type": "string",
                        "enum": [
                          "live",
                          "sandbox"
                        ],
                        "description": "Umgebung der Anwendung, zu der das Ziel gehört."
                      },
                      "daily_points": {
                        "type": "array",
                        "description": "Ein Eintrag pro UTC-Tag der letzten 30 Tage, älteste zuerst, einschließlich Tagen ohne Zustellungen. Zählt jeden Versuch, einschließlich Wiederholungsversuchen.",
                        "items": {
                          "type": "object",
                          "properties": {
                            "date": {
                              "type": "string",
                              "format": "date",
                              "description": "Der UTC-Tag."
                            },
                            "total_deliveries": {
                              "type": "integer",
                              "description": "An diesem Tag unternommene Zustellversuche."
                            },
                            "failed_deliveries": {
                              "type": "integer",
                              "description": "Versuche an diesem Tag, die mit HTTP 400 oder höher oder gar nicht beantwortet wurden."
                            }
                          }
                        }
                      },
                      "secret_last4": {
                        "type": "string",
                        "description": "Die letzten vier Zeichen des aktuellen Signiergeheimnisses des Ziels, damit Sie Geheimnisse voneinander unterscheiden können. Reicht nicht aus, um eine Signatur zu verifizieren."
                      },
                      "created_by_email": {
                        "type": "string",
                        "nullable": true,
                        "description": "E-Mail des Mitglieds der Business Console, das das Ziel erstellt hat. `null` für ein mit einem API-Schlüssel erstelltes Ziel."
                      },
                      "created_by_name": {
                        "type": "string",
                        "nullable": true,
                        "description": "Name des Mitglieds der Business Console, das das Ziel erstellt hat. `null` bei einem Ziel, das mit einem API-Schlüssel erstellt wurde."
                      },
                      "created_at": {
                        "type": "string",
                        "format": "date-time"
                      },
                      "updated_at": {
                        "type": "string",
                        "format": "date-time"
                      }
                    }
                  }
                },
                "examples": {
                  "Two destinations": {
                    "value": [
                      {
                        "uuid": "11111111-2222-3333-4444-555555555555",
                        "label": "Production session webhooks",
                        "url": "https://yourapp.com/webhooks/didit",
                        "enabled": true,
                        "webhook_version": "v3",
                        "subscribed_events": [
                          "status.updated",
                          "data.updated"
                        ],
                        "subscribed_events_count": 2,
                        "deliveries_count": 12453,
                        "failed_deliveries_count": 14,
                        "average_response_time_ms": 187,
                        "error_rate_percentage": 0,
                        "last_delivery_at": "2026-05-17T09:21:18Z",
                        "metrics_window_days": 30,
                        "health_status": "healthy",
                        "failing_streak": 0,
                        "failing_since": null,
                        "last_success_at": "2026-05-17T09:21:18Z",
                        "environment": "live",
                        "daily_points": [
                          {
                            "date": "2026-04-18",
                            "total_deliveries": 415,
                            "failed_deliveries": 0
                          },
                          {
                            "date": "2026-04-19",
                            "total_deliveries": 415,
                            "failed_deliveries": 0
                          },
                          {
                            "date": "2026-04-20",
                            "total_deliveries": 415,
                            "failed_deliveries": 0
                          },
                          {
                            "date": "2026-04-21",
                            "total_deliveries": 415,
                            "failed_deliveries": 0
                          },
                          {
                            "date": "2026-04-22",
                            "total_deliveries": 415,
                            "failed_deliveries": 0
                          },
                          {
                            "date": "2026-04-23",
                            "total_deliveries": 415,
                            "failed_deliveries": 0
                          },
                          {
                            "date": "2026-04-24",
                            "total_deliveries": 415,
                            "failed_deliveries": 9
                          },
                          {
                            "date": "2026-04-25",
                            "total_deliveries": 415,
                            "failed_deliveries": 0
                          },
                          {
                            "date": "2026-04-26",
                            "total_deliveries": 415,
                            "failed_deliveries": 0
                          },
                          {
                            "date": "2026-04-27",
                            "total_deliveries": 415,
                            "failed_deliveries": 0
                          },
                          {
                            "date": "2026-04-28",
                            "total_deliveries": 415,
                            "failed_deliveries": 0
                          },
                          {
                            "date": "2026-04-29",
                            "total_deliveries": 415,
                            "failed_deliveries": 0
                          },
                          {
                            "date": "2026-04-30",
                            "total_deliveries": 415,
                            "failed_deliveries": 0
                          },
                          {
                            "date": "2026-05-01",
                            "total_deliveries": 415,
                            "failed_deliveries": 0
                          },
                          {
                            "date": "2026-05-02",
                            "total_deliveries": 415,
                            "failed_deliveries": 0
                          },
                          {
                            "date": "2026-05-03",
                            "total_deliveries": 415,
                            "failed_deliveries": 0
                          },
                          {
                            "date": "2026-05-04",
                            "total_deliveries": 415,
                            "failed_deliveries": 0
                          },
                          {
                            "date": "2026-05-05",
                            "total_deliveries": 415,
                            "failed_deliveries": 0
                          },
                          {
                            "date": "2026-05-06",
                            "total_deliveries": 415,
                            "failed_deliveries": 0
                          },
                          {
                            "date": "2026-05-07",
                            "total_deliveries": 415,
                            "failed_deliveries": 0
                          },
                          {
                            "date": "2026-05-08",
                            "total_deliveries": 415,
                            "failed_deliveries": 0
                          },
                          {
                            "date": "2026-05-09",
                            "total_deliveries": 415,
                            "failed_deliveries": 5
                          },
                          {
                            "date": "2026-05-10",
                            "total_deliveries": 415,
                            "failed_deliveries": 0
                          },
                          {
                            "date": "2026-05-11",
                            "total_deliveries": 415,
                            "failed_deliveries": 0
                          },
                          {
                            "date": "2026-05-12",
                            "total_deliveries": 415,
                            "failed_deliveries": 0
                          },
                          {
                            "date": "2026-05-13",
                            "total_deliveries": 415,
                            "failed_deliveries": 0
                          },
                          {
                            "date": "2026-05-14",
                            "total_deliveries": 415,
                            "failed_deliveries": 0
                          },
                          {
                            "date": "2026-05-15",
                            "total_deliveries": 416,
                            "failed_deliveries": 0
                          },
                          {
                            "date": "2026-05-16",
                            "total_deliveries": 416,
                            "failed_deliveries": 0
                          },
                          {
                            "date": "2026-05-17",
                            "total_deliveries": 416,
                            "failed_deliveries": 0
                          }
                        ],
                        "secret_last4": "0xnQ",
                        "created_by_email": null,
                        "created_by_name": null,
                        "created_at": "2026-01-04T08:00:00Z",
                        "updated_at": "2026-04-22T14:09:11Z"
                      },
                      {
                        "uuid": "22222222-3333-4444-5555-666666666666",
                        "label": "Staging mirror",
                        "url": "https://staging.yourapp.com/webhooks/didit",
                        "enabled": false,
                        "webhook_version": "v3",
                        "subscribed_events": [
                          "status.updated"
                        ],
                        "subscribed_events_count": 1,
                        "deliveries_count": 0,
                        "failed_deliveries_count": 0,
                        "average_response_time_ms": null,
                        "error_rate_percentage": 0,
                        "last_delivery_at": null,
                        "metrics_window_days": 30,
                        "health_status": "healthy",
                        "failing_streak": 0,
                        "failing_since": null,
                        "last_success_at": null,
                        "environment": "live",
                        "daily_points": [
                          {
                            "date": "2026-04-18",
                            "total_deliveries": 0,
                            "failed_deliveries": 0
                          },
                          {
                            "date": "2026-04-19",
                            "total_deliveries": 0,
                            "failed_deliveries": 0
                          },
                          {
                            "date": "2026-04-20",
                            "total_deliveries": 0,
                            "failed_deliveries": 0
                          },
                          {
                            "date": "2026-04-21",
                            "total_deliveries": 0,
                            "failed_deliveries": 0
                          },
                          {
                            "date": "2026-04-22",
                            "total_deliveries": 0,
                            "failed_deliveries": 0
                          },
                          {
                            "date": "2026-04-23",
                            "total_deliveries": 0,
                            "failed_deliveries": 0
                          },
                          {
                            "date": "2026-04-24",
                            "total_deliveries": 0,
                            "failed_deliveries": 0
                          },
                          {
                            "date": "2026-04-25",
                            "total_deliveries": 0,
                            "failed_deliveries": 0
                          },
                          {
                            "date": "2026-04-26",
                            "total_deliveries": 0,
                            "failed_deliveries": 0
                          },
                          {
                            "date": "2026-04-27",
                            "total_deliveries": 0,
                            "failed_deliveries": 0
                          },
                          {
                            "date": "2026-04-28",
                            "total_deliveries": 0,
                            "failed_deliveries": 0
                          },
                          {
                            "date": "2026-04-29",
                            "total_deliveries": 0,
                            "failed_deliveries": 0
                          },
                          {
                            "date": "2026-04-30",
                            "total_deliveries": 0,
                            "failed_deliveries": 0
                          },
                          {
                            "date": "2026-05-01",
                            "total_deliveries": 0,
                            "failed_deliveries": 0
                          },
                          {
                            "date": "2026-05-02",
                            "total_deliveries": 0,
                            "failed_deliveries": 0
                          },
                          {
                            "date": "2026-05-03",
                            "total_deliveries": 0,
                            "failed_deliveries": 0
                          },
                          {
                            "date": "2026-05-04",
                            "total_deliveries": 0,
                            "failed_deliveries": 0
                          },
                          {
                            "date": "2026-05-05",
                            "total_deliveries": 0,
                            "failed_deliveries": 0
                          },
                          {
                            "date": "2026-05-06",
                            "total_deliveries": 0,
                            "failed_deliveries": 0
                          },
                          {
                            "date": "2026-05-07",
                            "total_deliveries": 0,
                            "failed_deliveries": 0
                          },
                          {
                            "date": "2026-05-08",
                            "total_deliveries": 0,
                            "failed_deliveries": 0
                          },
                          {
                            "date": "2026-05-09",
                            "total_deliveries": 0,
                            "failed_deliveries": 0
                          },
                          {
                            "date": "2026-05-10",
                            "total_deliveries": 0,
                            "failed_deliveries": 0
                          },
                          {
                            "date": "2026-05-11",
                            "total_deliveries": 0,
                            "failed_deliveries": 0
                          },
                          {
                            "date": "2026-05-12",
                            "total_deliveries": 0,
                            "failed_deliveries": 0
                          },
                          {
                            "date": "2026-05-13",
                            "total_deliveries": 0,
                            "failed_deliveries": 0
                          },
                          {
                            "date": "2026-05-14",
                            "total_deliveries": 0,
                            "failed_deliveries": 0
                          },
                          {
                            "date": "2026-05-15",
                            "total_deliveries": 0,
                            "failed_deliveries": 0
                          },
                          {
                            "date": "2026-05-16",
                            "total_deliveries": 0,
                            "failed_deliveries": 0
                          },
                          {
                            "date": "2026-05-17",
                            "total_deliveries": 0,
                            "failed_deliveries": 0
                          }
                        ],
                        "secret_last4": "k9Qe",
                        "created_by_email": "reviewer@example.com",
                        "created_by_name": "Example Reviewer",
                        "created_at": "2026-03-12T10:15:02Z",
                        "updated_at": "2026-03-12T10:15:02Z"
                      }
                    ]
                  }
                }
              }
            }
          },
          "403": {
            "description": "API-Schlüssel fehlt, ist fehlerhaft, abgelaufen oder für eine andere Anwendung gültig. Ein fehlender Schlüssel gibt `403` zurück; ein falscher, widerrufener oder abgelaufener Schlüssel gibt `401` zurück.",
            "content": {
              "application/json": {
                "examples": {
                  "Forbidden": {
                    "value": {
                      "detail": "You do not have permission to perform this action."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate-Limit überschritten; drosseln Sie die Anfragen und wiederholen Sie den Versuch.",
            "content": {
              "application/json": {
                "examples": {
                  "Throttled": {
                    "value": {
                      "detail": "Request was throttled. Expected available in 30 seconds."
                    }
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      },
      "post": {
        "summary": "Webhook-Ziel erstellen",
        "description": "Erstellen Sie ein Webhook-Ziel. Die Antwort enthält das automatisch generierte HMAC-Signaturgeheimnis `secret_shared_key` (später auch über `GET /v3/webhook/destinations/{destination_uuid}/` abrufbar). Senden Sie `subscribed_events` immer mit mindestens einem Ereignis (keine Platzhalter): Eine explizit leere Liste wird mit 400 abgelehnt, und das Weglassen des Feldes erstellt ein Ziel ohne Abonnements, das niemals einen Webhook empfängt. Das Paar `(application, url)` muss unter den Zielen der Anwendung eindeutig sein.",
        "operationId": "create_webhook_destination",
        "x-didit-sdk": {
          "resource": "webhooks.destinations",
          "method": "create",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Webhook"
        ],
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X POST 'https://verification.didit.me/v3/webhook/destinations/' \\\n  -H 'x-api-key: YOUR_API_KEY' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\n    \"label\": \"Production session webhooks\",\n    \"url\": \"https://yourapp.com/webhooks/didit\",\n    \"webhook_version\": \"v3\",\n    \"subscribed_events\": [\"status.updated\", \"data.updated\"]\n  }'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.webhooks.destinations.create(\n    label=\"Production session webhooks\",\n    url=\"https://yourapp.com/webhooks/didit\",\n    webhook_version=\"v3\",\n    subscribed_events=[\"status.updated\", \"data.updated\"],\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.webhooks.destinations.create({\n  label: \"Production session webhooks\",\n  url: \"https://yourapp.com/webhooks/didit\",\n  webhook_version: \"v3\",\n  subscribed_events: [\"status.updated\", \"data.updated\"],\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Webhooks.Destinations.Create(ctx, didit.WebhooksDestinationsCreateParams{\n\tLabel:            \"Production session webhooks\",\n\tURL:              \"https://yourapp.com/webhooks/didit\",\n\tWebhookVersion:   didit.Some(didit.WebhooksDestinationsCreateParamsWebhookVersion(\"v3\")),\n\tSubscribedEvents: didit.Some([]didit.WebhookEvent{didit.WebhookEvent(\"status.updated\"), didit.WebhookEvent(\"data.updated\")}),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import java.util.List;\nimport me.didit.Didit;\nimport me.didit.types.WebhookEvent;\nimport me.didit.types.WebhooksDestinationsCreateParams;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.webhooks().destinations().create(WebhooksDestinationsCreateParams.builder()\n        .label(\"Production session webhooks\")\n        .url(\"https://yourapp.com/webhooks/didit\")\n        .webhookVersion(WebhooksDestinationsCreateParams.WebhookVersion.of(\"v3\"))\n        .subscribedEvents(List.of(WebhookEvent.of(\"status.updated\"), WebhookEvent.of(\"data.updated\")))\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->webhooks->destinations->create([\n    'label' => 'Production session webhooks',\n    'url' => 'https://yourapp.com/webhooks/didit',\n    'webhook_version' => 'v3',\n    'subscribed_events' => ['status.updated', 'data.updated'],\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.webhooks.destinations.create(\n  label: \"Production session webhooks\",\n  url: \"https://yourapp.com/webhooks/didit\",\n  webhook_version: \"v3\",\n  subscribed_events: [\"status.updated\", \"data.updated\"]\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Webhooks.Destinations.CreateAsync(new WebhooksDestinationsCreateParams\n{\n    Label = \"Production session webhooks\",\n    Url = \"https://yourapp.com/webhooks/didit\",\n    WebhookVersion = new WebhooksDestinationsCreateParamsWebhookVersion(\"v3\"),\n    SubscribedEvents = new WebhookEvent[] { \"status.updated\", \"data.updated\" },\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "label",
                  "url"
                ],
                "properties": {
                  "label": {
                    "type": "string",
                    "maxLength": 255,
                    "description": "Lesbarer Name, der unter Console → Webhooks angezeigt wird. Hilft bei der Unterscheidung von Zielen, wenn Sie mehrere haben (z. B. „Prod“, „Staging mirror“)."
                  },
                  "url": {
                    "type": "string",
                    "format": "uri",
                    "description": "HTTPS-URL, die `POST`-Anfragen empfängt. Muss unter den Zielen der Anwendung eindeutig sein. Verwenden Sie einen stabilen, abgesicherten Endpoint: Didit wiederholt fehlgeschlagene Zustellungen nach einem Backoff-Zeitplan.",
                    "maxLength": 2000
                  },
                  "enabled": {
                    "type": "boolean",
                    "default": true,
                    "description": "Wenn `false`, wird das Ziel gespeichert, aber Didit sendet keine Webhooks dorthin. Nützlich für Staging-Konfigurationen, die Sie vorübergehend pausieren möchten."
                  },
                  "webhook_version": {
                    "type": "string",
                    "enum": [
                      "v1",
                      "v2",
                      "v3"
                    ],
                    "description": "Payload-Schema-Version, die Didit sendet. `v3` ist das aktuelle/empfohlene Format; ältere Versionen werden zur Abwärtskompatibilität mit älteren Integrationen beibehalten."
                  },
                  "subscribed_events": {
                    "allOf": [
                      {
                        "$ref": "#/components/schemas/WebhookSubscribedEvents"
                      }
                    ],
                    "description": "Zuzustellende Ereignisse. Faktisch erforderlich: Ein explizites `[]` wird mit 400 abgelehnt, und das Weglassen des Felds erstellt ein Ziel ohne Abonnements, das nichts empfängt."
                  }
                }
              },
              "examples": {
                "session_updates": {
                  "summary": "Aktualisierungen von Sitzungsstatus und -daten",
                  "value": {
                    "label": "Production session webhooks",
                    "url": "https://yourapp.com/webhooks/didit",
                    "webhook_version": "v3",
                    "subscribed_events": [
                      "status.updated",
                      "data.updated"
                    ]
                  }
                },
                "transaction_updates": {
                  "summary": "Aktualisierungen der Transaktionsüberwachung",
                  "value": {
                    "label": "Transaction monitoring webhooks",
                    "url": "https://yourapp.com/webhooks/didit-transactions",
                    "webhook_version": "v3",
                    "subscribed_events": [
                      "transaction.created",
                      "transaction.status.updated"
                    ]
                  }
                },
                "entity_updates": {
                  "summary": "Aktualisierungen von Benutzer- und Unternehmensentitäten",
                  "value": {
                    "label": "Entity lifecycle webhooks",
                    "url": "https://yourapp.com/webhooks/didit-entities",
                    "webhook_version": "v3",
                    "subscribed_events": [
                      "user.status.updated",
                      "user.data.updated",
                      "business.status.updated",
                      "business.data.updated",
                      "activity.created"
                    ]
                  }
                }
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Ziel erstellt. `secret_shared_key` ist das HMAC-Signaturgeheimnis – speichern Sie es jetzt.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "uuid": {
                      "type": "string",
                      "format": "uuid",
                      "description": "Stabiler Ziel-Identifikator. In nachfolgenden Aufrufen als `{destination_uuid}` verwenden."
                    },
                    "label": {
                      "type": "string"
                    },
                    "url": {
                      "type": "string",
                      "format": "uri"
                    },
                    "enabled": {
                      "type": "boolean"
                    },
                    "webhook_version": {
                      "type": "string",
                      "enum": [
                        "v1",
                        "v2",
                        "v3"
                      ]
                    },
                    "secret_shared_key": {
                      "type": "string",
                      "description": "Automatisch generiertes HMAC-Signaturgeheimnis, das an dieses Ziel gebunden ist (URL-sicheres Token mit 43 Zeichen). Verwenden Sie es, um die Signatur-Header bei eingehenden Webhooks zu überprüfen. Wird Aufrufern mit API-Schlüssel immer vollständig zurückgegeben; Console-Benutzer benötigen die Berechtigung `read:webhooks`, andernfalls sehen sie eine leere Zeichenfolge."
                    },
                    "secret_last4": {
                      "type": "string",
                      "description": "Die letzten vier Zeichen des aktuellen Signiergeheimnisses des Ziels, damit Sie Geheimnisse voneinander unterscheiden können. Reicht nicht aus, um eine Signatur zu verifizieren."
                    },
                    "previous_secret_expires_at": {
                      "type": "string",
                      "format": "date-time",
                      "nullable": true,
                      "description": "Wird für 24 Stunden gesetzt, nachdem das Signiergeheimnis des Ziels in der Business Console rotiert wurde. Bis zu diesem Zeitpunkt enthält jede Zustellung an das Ziel auch `X-Signature-Previous`, `X-Signature-V2-Previous` und `X-Signature-Simple-Previous`, erstellt mit dem ersetzten Geheimnis (siehe [Signaturprüfung](/de/integration/webhooks#signaturprüfung)). `null`, wenn in den letzten 24 Stunden keine Rotation stattgefunden hat."
                    },
                    "subscribed_events": {
                      "$ref": "#/components/schemas/WebhookSubscribedEvents"
                    },
                    "created_by_email": {
                      "type": "string",
                      "nullable": true,
                      "description": "E-Mail des Mitglieds der Business Console, das das Ziel erstellt hat. `null` für ein mit einem API-Schlüssel erstelltes Ziel."
                    },
                    "created_by_name": {
                      "type": "string",
                      "nullable": true,
                      "description": "Name des Mitglieds der Business Console, das das Ziel erstellt hat. `null` bei einem Ziel, das mit einem API-Schlüssel erstellt wurde."
                    },
                    "created_at": {
                      "type": "string",
                      "format": "date-time"
                    },
                    "updated_at": {
                      "type": "string",
                      "format": "date-time"
                    },
                    "health_status": {
                      "type": "string",
                      "enum": [
                        "healthy",
                        "degraded",
                        "failing"
                      ],
                      "description": "Zustellungsstatus. `failing`: Bei 3 oder mehr aufeinanderfolgenden Ereignissen ist jeweils der erste Zustellversuch fehlgeschlagen, seit das Ziel zuletzt erfolgreich geantwortet hat (siehe `failing_streak`). `degraded`: nicht failing, aber in den letzten 24 Stunden ist ein Zustellversuch fehlgeschlagen und kein späterer Versuch hat dieses Ereignis zugestellt; ein Wiederholungsversuch oder ein erneutes Senden, das es zustellt, hebt dies auf. `healthy`: weder noch. Unabhängig von `enabled`. Ein fehlgeschlagener Versuch ist ein Versuch, der mit HTTP 400 oder höher beantwortet oder überhaupt nicht beantwortet wurde."
                    },
                    "failing_streak": {
                      "type": "integer",
                      "description": "Wie viele aufeinanderfolgende Ereignisse bei ihrem ersten Zustellversuch fehlgeschlagen sind, seit das Ziel innerhalb der letzten 30 Tage zuletzt erfolgreich geantwortet hat. Wiederholungsversuche werden nicht gezählt, und jeder erfolgreiche Versuch, einschließlich eines Wiederholungsversuchs oder eines erneuten Sendens, beendet die Serie. `0`, wenn seit dem letzten Erfolg kein Ereignis fehlgeschlagen ist."
                    },
                    "failing_since": {
                      "type": "string",
                      "format": "date-time",
                      "nullable": true,
                      "description": "Wann der erste fehlgeschlagene Versuch der aktuellen `failing_streak` unternommen wurde. `null`, wenn `failing_streak` den Wert `0` hat."
                    },
                    "last_success_at": {
                      "type": "string",
                      "format": "date-time",
                      "nullable": true,
                      "description": "Wann das Ziel zuletzt innerhalb der letzten 30 Tage auf eine Zustellung mit einem HTTP-Status unter 400 geantwortet hat. `null`, wenn dies in diesem Zeitfenster nicht der Fall war."
                    },
                    "environment": {
                      "type": "string",
                      "enum": [
                        "live",
                        "sandbox"
                      ],
                      "description": "Umgebung der Anwendung, zu der das Ziel gehört."
                    },
                    "summary": {
                      "type": "object",
                      "description": "Zustellungsmetriken für die letzten `metrics_window_days` (30) Tage. `last_delivery_at` ist der letzte Versuch, unabhängig davon, wann er unternommen wurde.",
                      "properties": {
                        "total_deliveries": {
                          "type": "integer"
                        },
                        "failed_deliveries": {
                          "type": "integer"
                        },
                        "error_rate_percentage": {
                          "type": "integer"
                        },
                        "min_response_time_ms": {
                          "type": "integer",
                          "nullable": true
                        },
                        "avg_response_time_ms": {
                          "type": "integer",
                          "nullable": true
                        },
                        "max_response_time_ms": {
                          "type": "integer",
                          "nullable": true
                        },
                        "last_delivery_at": {
                          "type": "string",
                          "format": "date-time",
                          "nullable": true
                        },
                        "metrics_window_days": {
                          "type": "integer",
                          "description": "Länge des Zeitfensters in Tagen, das von den anderen zusammenfassenden Metriken abgedeckt wird. Immer `30`."
                        }
                      }
                    }
                  }
                },
                "examples": {
                  "Created": {
                    "value": {
                      "uuid": "11111111-2222-3333-4444-555555555555",
                      "label": "Production session webhooks",
                      "url": "https://yourapp.com/webhooks/didit",
                      "enabled": true,
                      "webhook_version": "v3",
                      "secret_shared_key": "tno2NTeRC1ZK3sBOYlBJDyEzBVENl3pQ1AcZyAW0xnQ",
                      "secret_last4": "0xnQ",
                      "previous_secret_expires_at": null,
                      "subscribed_events": [
                        "status.updated",
                        "data.updated"
                      ],
                      "created_by_email": null,
                      "created_by_name": null,
                      "created_at": "2026-05-17T10:00:00Z",
                      "updated_at": "2026-05-17T10:00:00Z",
                      "health_status": "healthy",
                      "failing_streak": 0,
                      "failing_since": null,
                      "last_success_at": null,
                      "environment": "live",
                      "summary": {
                        "total_deliveries": 0,
                        "failed_deliveries": 0,
                        "error_rate_percentage": 0,
                        "min_response_time_ms": null,
                        "avg_response_time_ms": null,
                        "max_response_time_ms": null,
                        "last_delivery_at": null,
                        "metrics_window_days": 30
                      }
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Validierung fehlgeschlagen – normalerweise eine doppelte URL, fehlende/ungültige `subscribed_events` oder ein unbekannter Ereignisname.",
            "content": {
              "application/json": {
                "examples": {
                  "Duplicate URL": {
                    "value": {
                      "url": [
                        "This webhook destination already exists for the application."
                      ]
                    }
                  },
                  "Empty events list": {
                    "value": {
                      "subscribed_events": [
                        "At least one subscribed event is required."
                      ]
                    }
                  },
                  "Unknown event": {
                    "value": {
                      "subscribed_events": [
                        "Unsupported webhook events: foo.bar"
                      ]
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "API-Schlüssel fehlt, ist fehlerhaft, abgelaufen oder für eine andere Anwendung gültig. Ein fehlender Schlüssel gibt `403` zurück; ein falscher, widerrufener oder abgelaufener Schlüssel gibt `401` zurück.",
            "content": {
              "application/json": {
                "examples": {
                  "Forbidden": {
                    "value": {
                      "detail": "You do not have permission to perform this action."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate-Limit überschritten; drosseln Sie die Anfragen und wiederholen Sie den Versuch.",
            "content": {
              "application/json": {
                "examples": {
                  "Throttled": {
                    "value": {
                      "detail": "Request was throttled. Expected available in 30 seconds."
                    }
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/v3/webhook/destinations/{destination_uuid}/": {
      "get": {
        "summary": "Webhook-Ziel abrufen",
        "description": "Rufen Sie ein Webhook-Ziel mit seinem `secret_shared_key`-Signaturgeheimnis, seinem Status (`health_status`, `failing_streak`, `failing_since`, `last_success_at`) und einer `summary` der Zustellungen für die letzten 30 Tage ab. Aufrufer mit API-Schlüssel erhalten das Geheimnis immer vollständig; Console-Benutzer ohne `read:webhooks` sehen eine leere Zeichenkette.",
        "operationId": "get_webhook_destination",
        "x-didit-sdk": {
          "resource": "webhooks.destinations",
          "method": "retrieve",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Webhook"
        ],
        "parameters": [
          {
            "name": "destination_uuid",
            "in": "path",
            "required": true,
            "description": "UUID des Ziels (die beim Erstellen / Auflisten zurückgegebene `uuid`).",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "example": "11111111-2222-3333-4444-555555555555"
          }
        ],
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X GET 'https://verification.didit.me/v3/webhook/destinations/11111111-2222-3333-4444-555555555555/' \\\n  -H 'x-api-key: YOUR_API_KEY'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.webhooks.destinations.retrieve(\n    \"11111111-2222-3333-4444-555555555555\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.webhooks.destinations.retrieve(\"11111111-2222-3333-4444-555555555555\");\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Webhooks.Destinations.Retrieve(ctx, \"11111111-2222-3333-4444-555555555555\")\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.webhooks().destinations().retrieve(\"11111111-2222-3333-4444-555555555555\");\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->webhooks->destinations->retrieve('11111111-2222-3333-4444-555555555555');\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.webhooks.destinations.retrieve(\"11111111-2222-3333-4444-555555555555\")\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Webhooks.Destinations.RetrieveAsync(\"11111111-2222-3333-4444-555555555555\");\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "responses": {
          "200": {
            "description": "Details zum Webhook-Ziel.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "uuid": {
                      "type": "string",
                      "format": "uuid"
                    },
                    "label": {
                      "type": "string"
                    },
                    "url": {
                      "type": "string",
                      "format": "uri"
                    },
                    "enabled": {
                      "type": "boolean"
                    },
                    "webhook_version": {
                      "type": "string",
                      "enum": [
                        "v1",
                        "v2",
                        "v3"
                      ]
                    },
                    "secret_shared_key": {
                      "type": "string",
                      "description": "HMAC-Signiergeheimnis (43 Zeichen langes, URL-sicheres Token). Wird für API-Schlüssel-Aufrufer immer vollständig zurückgegeben; Console-Benutzer benötigen `read:webhooks`, andernfalls eine leere Zeichenkette."
                    },
                    "secret_last4": {
                      "type": "string",
                      "description": "Die letzten vier Zeichen des aktuellen Signiergeheimnisses des Ziels, damit Sie Geheimnisse voneinander unterscheiden können. Reicht nicht aus, um eine Signatur zu verifizieren."
                    },
                    "previous_secret_expires_at": {
                      "type": "string",
                      "format": "date-time",
                      "nullable": true,
                      "description": "Wird für 24 Stunden gesetzt, nachdem das Signiergeheimnis des Ziels in der Business Console rotiert wurde. Bis zu diesem Zeitpunkt enthält jede Zustellung an das Ziel auch `X-Signature-Previous`, `X-Signature-V2-Previous` und `X-Signature-Simple-Previous`, erstellt mit dem ersetzten Geheimnis (siehe [Signaturprüfung](/de/integration/webhooks#signaturprüfung)). `null`, wenn in den letzten 24 Stunden keine Rotation stattgefunden hat."
                    },
                    "subscribed_events": {
                      "$ref": "#/components/schemas/WebhookSubscribedEvents"
                    },
                    "created_by_email": {
                      "type": "string",
                      "nullable": true,
                      "description": "E-Mail des Mitglieds der Business Console, das das Ziel erstellt hat. `null` für ein mit einem API-Schlüssel erstelltes Ziel."
                    },
                    "created_by_name": {
                      "type": "string",
                      "nullable": true,
                      "description": "Name des Mitglieds der Business Console, das das Ziel erstellt hat. `null` bei einem Ziel, das mit einem API-Schlüssel erstellt wurde."
                    },
                    "created_at": {
                      "type": "string",
                      "format": "date-time"
                    },
                    "updated_at": {
                      "type": "string",
                      "format": "date-time"
                    },
                    "health_status": {
                      "type": "string",
                      "enum": [
                        "healthy",
                        "degraded",
                        "failing"
                      ],
                      "description": "Zustellungsstatus. `failing`: Bei 3 oder mehr aufeinanderfolgenden Ereignissen ist jeweils der erste Zustellversuch fehlgeschlagen, seit das Ziel zuletzt erfolgreich geantwortet hat (siehe `failing_streak`). `degraded`: nicht failing, aber in den letzten 24 Stunden ist ein Zustellversuch fehlgeschlagen und kein späterer Versuch hat dieses Ereignis zugestellt; ein Wiederholungsversuch oder ein erneutes Senden, das es zustellt, hebt dies auf. `healthy`: weder noch. Unabhängig von `enabled`. Ein fehlgeschlagener Versuch ist ein Versuch, der mit HTTP 400 oder höher beantwortet oder überhaupt nicht beantwortet wurde."
                    },
                    "failing_streak": {
                      "type": "integer",
                      "description": "Wie viele aufeinanderfolgende Ereignisse bei ihrem ersten Zustellversuch fehlgeschlagen sind, seit das Ziel innerhalb der letzten 30 Tage zuletzt erfolgreich geantwortet hat. Wiederholungsversuche werden nicht gezählt, und jeder erfolgreiche Versuch, einschließlich eines Wiederholungsversuchs oder eines erneuten Sendens, beendet die Serie. `0`, wenn seit dem letzten Erfolg kein Ereignis fehlgeschlagen ist."
                    },
                    "failing_since": {
                      "type": "string",
                      "format": "date-time",
                      "nullable": true,
                      "description": "Wann der erste fehlgeschlagene Versuch der aktuellen `failing_streak` unternommen wurde. `null`, wenn `failing_streak` den Wert `0` hat."
                    },
                    "last_success_at": {
                      "type": "string",
                      "format": "date-time",
                      "nullable": true,
                      "description": "Wann das Ziel zuletzt innerhalb der letzten 30 Tage auf eine Zustellung mit einem HTTP-Status unter 400 geantwortet hat. `null`, wenn dies in diesem Zeitfenster nicht der Fall war."
                    },
                    "environment": {
                      "type": "string",
                      "enum": [
                        "live",
                        "sandbox"
                      ],
                      "description": "Umgebung der Anwendung, zu der das Ziel gehört."
                    },
                    "summary": {
                      "type": "object",
                      "description": "Zustellungsmetriken für die letzten `metrics_window_days` (30) Tage. `last_delivery_at` ist der letzte Versuch, unabhängig davon, wann er unternommen wurde.",
                      "properties": {
                        "total_deliveries": {
                          "type": "integer"
                        },
                        "failed_deliveries": {
                          "type": "integer"
                        },
                        "error_rate_percentage": {
                          "type": "integer"
                        },
                        "min_response_time_ms": {
                          "type": "integer",
                          "nullable": true
                        },
                        "avg_response_time_ms": {
                          "type": "integer",
                          "nullable": true
                        },
                        "max_response_time_ms": {
                          "type": "integer",
                          "nullable": true
                        },
                        "last_delivery_at": {
                          "type": "string",
                          "format": "date-time",
                          "nullable": true
                        },
                        "metrics_window_days": {
                          "type": "integer",
                          "description": "Länge des Zeitfensters in Tagen, das von den anderen zusammenfassenden Metriken abgedeckt wird. Immer `30`."
                        }
                      }
                    }
                  }
                },
                "examples": {
                  "Healthy destination": {
                    "value": {
                      "uuid": "11111111-2222-3333-4444-555555555555",
                      "label": "Production session webhooks",
                      "url": "https://yourapp.com/webhooks/didit",
                      "enabled": true,
                      "webhook_version": "v3",
                      "secret_shared_key": "tno2NTeRC1ZK3sBOYlBJDyEzBVENl3pQ1AcZyAW0xnQ",
                      "secret_last4": "0xnQ",
                      "previous_secret_expires_at": null,
                      "subscribed_events": [
                        "status.updated",
                        "data.updated"
                      ],
                      "created_by_email": null,
                      "created_by_name": null,
                      "created_at": "2026-01-04T08:00:00Z",
                      "updated_at": "2026-04-22T14:09:11Z",
                      "health_status": "healthy",
                      "failing_streak": 0,
                      "failing_since": null,
                      "last_success_at": "2026-05-17T09:21:18Z",
                      "environment": "live",
                      "summary": {
                        "total_deliveries": 12453,
                        "failed_deliveries": 14,
                        "error_rate_percentage": 0,
                        "min_response_time_ms": 41,
                        "avg_response_time_ms": 187,
                        "max_response_time_ms": 2103,
                        "last_delivery_at": "2026-05-17T09:21:18Z",
                        "metrics_window_days": 30
                      }
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "API-Schlüssel fehlt, ist fehlerhaft, abgelaufen oder für eine andere Anwendung gültig. Ein fehlender Schlüssel gibt `403` zurück; ein falscher, widerrufener oder abgelaufener Schlüssel gibt `401` zurück.",
            "content": {
              "application/json": {
                "examples": {
                  "Forbidden": {
                    "value": {
                      "detail": "You do not have permission to perform this action."
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Es existiert kein Ziel mit dieser UUID, oder es gehört zu einer anderen Anwendung, oder es wurde gelöscht.",
            "content": {
              "application/json": {
                "examples": {
                  "Not found": {
                    "value": {
                      "detail": "Webhook destination not found."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate-Limit überschritten; drosseln Sie die Anfragen und wiederholen Sie den Versuch.",
            "content": {
              "application/json": {
                "examples": {
                  "Throttled": {
                    "value": {
                      "detail": "Request was throttled. Expected available in 30 seconds."
                    }
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      },
      "patch": {
        "summary": "Webhook-Ziel aktualisieren",
        "description": "Webhook-Ziel aktualisieren. **`subscribed_events` wird VOLLSTÄNDIG ERSETZT, nicht zusammengeführt**: zuerst abrufen, anhängen, erneut senden. Das Geheimnis wird nicht rotiert. Eine `uuid` im Body wird ignoriert: Der Pfad bestimmt das Ziel.",
        "operationId": "update_webhook_destination",
        "x-didit-sdk": {
          "resource": "webhooks.destinations",
          "method": "update",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Webhook"
        ],
        "parameters": [
          {
            "name": "destination_uuid",
            "in": "path",
            "required": true,
            "description": "UUID des zu aktualisierenden Ziels.",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "example": "11111111-2222-3333-4444-555555555555"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "label": {
                    "type": "string",
                    "description": "Neuer menschenlesbarer Name."
                  },
                  "url": {
                    "type": "string",
                    "format": "uri",
                    "description": "Neue Ziel-URL. Muss innerhalb der Anwendung eindeutig sein."
                  },
                  "enabled": {
                    "type": "boolean",
                    "description": "Auf `false` setzen, um Zustellungen an dieses Ziel zu pausieren, ohne es zu löschen."
                  },
                  "webhook_version": {
                    "type": "string",
                    "enum": [
                      "v1",
                      "v2",
                      "v3"
                    ],
                    "description": "Neue Payload-Schemaversion für zukünftige Zustellungen."
                  },
                  "subscribed_events": {
                    "$ref": "#/components/schemas/WebhookSubscribedEvents"
                  }
                }
              },
              "examples": {
                "Pause destination": {
                  "value": {
                    "enabled": false
                  }
                },
                "Add transaction events": {
                  "value": {
                    "subscribed_events": [
                      "status.updated",
                      "data.updated",
                      "transaction.created",
                      "transaction.status.updated"
                    ]
                  }
                },
                "Move target URL": {
                  "value": {
                    "label": "Production session webhooks v2",
                    "url": "https://api.yourapp.com/webhooks/didit/v2"
                  }
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X PATCH 'https://verification.didit.me/v3/webhook/destinations/11111111-2222-3333-4444-555555555555/' \\\n  -H 'x-api-key: YOUR_API_KEY' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\n    \"subscribed_events\": [\n      \"status.updated\",\n      \"data.updated\",\n      \"transaction.created\"\n    ]\n  }'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.webhooks.destinations.update(\n    \"11111111-2222-3333-4444-555555555555\",\n    enabled=False,\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.webhooks.destinations.update(\"11111111-2222-3333-4444-555555555555\", {\n  enabled: false,\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Webhooks.Destinations.Update(ctx, \"11111111-2222-3333-4444-555555555555\", didit.WebhooksDestinationsUpdateParams{\n\tEnabled: didit.Bool(false),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\nimport me.didit.types.WebhooksDestinationsUpdateParams;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.webhooks().destinations().update(\"11111111-2222-3333-4444-555555555555\", WebhooksDestinationsUpdateParams.builder()\n        .enabled(false)\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->webhooks->destinations->update('11111111-2222-3333-4444-555555555555', [\n    'enabled' => false,\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.webhooks.destinations.update(\n  \"11111111-2222-3333-4444-555555555555\",\n  enabled: false\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Webhooks.Destinations.UpdateAsync(\"11111111-2222-3333-4444-555555555555\", new WebhooksDestinationsUpdateParams\n{\n    Enabled = false,\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "responses": {
          "200": {
            "description": "Aktualisiertes Webhook-Ziel. Der Antworttext hat das gleiche Format wie `GET /v3/webhook/destinations/{destination_uuid}/`.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "uuid": {
                      "type": "string",
                      "format": "uuid"
                    },
                    "label": {
                      "type": "string"
                    },
                    "url": {
                      "type": "string",
                      "format": "uri"
                    },
                    "enabled": {
                      "type": "boolean"
                    },
                    "webhook_version": {
                      "type": "string",
                      "enum": [
                        "v1",
                        "v2",
                        "v3"
                      ]
                    },
                    "secret_shared_key": {
                      "type": "string"
                    },
                    "secret_last4": {
                      "type": "string",
                      "description": "Die letzten vier Zeichen des aktuellen Signiergeheimnisses des Ziels, damit Sie Geheimnisse voneinander unterscheiden können. Reicht nicht aus, um eine Signatur zu verifizieren."
                    },
                    "previous_secret_expires_at": {
                      "type": "string",
                      "format": "date-time",
                      "nullable": true,
                      "description": "Wird für 24 Stunden gesetzt, nachdem das Signiergeheimnis des Ziels in der Business Console rotiert wurde. Bis zu diesem Zeitpunkt enthält jede Zustellung an das Ziel auch `X-Signature-Previous`, `X-Signature-V2-Previous` und `X-Signature-Simple-Previous`, erstellt mit dem ersetzten Geheimnis (siehe [Signaturprüfung](/de/integration/webhooks#signaturprüfung)). `null`, wenn in den letzten 24 Stunden keine Rotation stattgefunden hat."
                    },
                    "subscribed_events": {
                      "$ref": "#/components/schemas/WebhookSubscribedEvents"
                    },
                    "created_by_email": {
                      "type": "string",
                      "nullable": true,
                      "description": "E-Mail des Mitglieds der Business Console, das das Ziel erstellt hat. `null` für ein mit einem API-Schlüssel erstelltes Ziel."
                    },
                    "created_by_name": {
                      "type": "string",
                      "nullable": true,
                      "description": "Name des Mitglieds der Business Console, das das Ziel erstellt hat. `null` bei einem Ziel, das mit einem API-Schlüssel erstellt wurde."
                    },
                    "created_at": {
                      "type": "string",
                      "format": "date-time"
                    },
                    "updated_at": {
                      "type": "string",
                      "format": "date-time"
                    },
                    "health_status": {
                      "type": "string",
                      "enum": [
                        "healthy",
                        "degraded",
                        "failing"
                      ],
                      "description": "Zustellungsstatus. `failing`: Bei 3 oder mehr aufeinanderfolgenden Ereignissen ist jeweils der erste Zustellversuch fehlgeschlagen, seit das Ziel zuletzt erfolgreich geantwortet hat (siehe `failing_streak`). `degraded`: nicht failing, aber in den letzten 24 Stunden ist ein Zustellversuch fehlgeschlagen und kein späterer Versuch hat dieses Ereignis zugestellt; ein Wiederholungsversuch oder ein erneutes Senden, das es zustellt, hebt dies auf. `healthy`: weder noch. Unabhängig von `enabled`. Ein fehlgeschlagener Versuch ist ein Versuch, der mit HTTP 400 oder höher beantwortet oder überhaupt nicht beantwortet wurde."
                    },
                    "failing_streak": {
                      "type": "integer",
                      "description": "Wie viele aufeinanderfolgende Ereignisse bei ihrem ersten Zustellversuch fehlgeschlagen sind, seit das Ziel innerhalb der letzten 30 Tage zuletzt erfolgreich geantwortet hat. Wiederholungsversuche werden nicht gezählt, und jeder erfolgreiche Versuch, einschließlich eines Wiederholungsversuchs oder eines erneuten Sendens, beendet die Serie. `0`, wenn seit dem letzten Erfolg kein Ereignis fehlgeschlagen ist."
                    },
                    "failing_since": {
                      "type": "string",
                      "format": "date-time",
                      "nullable": true,
                      "description": "Wann der erste fehlgeschlagene Versuch der aktuellen `failing_streak` unternommen wurde. `null`, wenn `failing_streak` den Wert `0` hat."
                    },
                    "last_success_at": {
                      "type": "string",
                      "format": "date-time",
                      "nullable": true,
                      "description": "Wann das Ziel zuletzt innerhalb der letzten 30 Tage auf eine Zustellung mit einem HTTP-Status unter 400 geantwortet hat. `null`, wenn dies in diesem Zeitfenster nicht der Fall war."
                    },
                    "environment": {
                      "type": "string",
                      "enum": [
                        "live",
                        "sandbox"
                      ],
                      "description": "Umgebung der Anwendung, zu der das Ziel gehört."
                    },
                    "summary": {
                      "type": "object",
                      "properties": {
                        "total_deliveries": {
                          "type": "integer"
                        },
                        "failed_deliveries": {
                          "type": "integer"
                        },
                        "error_rate_percentage": {
                          "type": "integer"
                        },
                        "min_response_time_ms": {
                          "type": "integer",
                          "nullable": true
                        },
                        "avg_response_time_ms": {
                          "type": "integer",
                          "nullable": true
                        },
                        "max_response_time_ms": {
                          "type": "integer",
                          "nullable": true
                        },
                        "last_delivery_at": {
                          "type": "string",
                          "format": "date-time",
                          "nullable": true
                        },
                        "metrics_window_days": {
                          "type": "integer",
                          "description": "Länge des Zeitfensters in Tagen, das von den anderen zusammenfassenden Metriken abgedeckt wird. Immer `30`."
                        }
                      },
                      "description": "Zustellungsmetriken für die letzten `metrics_window_days` (30) Tage. `last_delivery_at` ist der letzte Versuch, unabhängig davon, wann er unternommen wurde."
                    }
                  }
                },
                "examples": {
                  "Paused": {
                    "value": {
                      "uuid": "11111111-2222-3333-4444-555555555555",
                      "label": "Production session webhooks",
                      "url": "https://yourapp.com/webhooks/didit",
                      "enabled": false,
                      "webhook_version": "v3",
                      "secret_shared_key": "tno2NTeRC1ZK3sBOYlBJDyEzBVENl3pQ1AcZyAW0xnQ",
                      "secret_last4": "0xnQ",
                      "previous_secret_expires_at": null,
                      "subscribed_events": [
                        "status.updated",
                        "data.updated"
                      ],
                      "created_by_email": null,
                      "created_by_name": null,
                      "created_at": "2026-01-04T08:00:00Z",
                      "updated_at": "2026-05-17T11:02:55Z",
                      "health_status": "healthy",
                      "failing_streak": 0,
                      "failing_since": null,
                      "last_success_at": "2026-05-17T09:21:18Z",
                      "environment": "live",
                      "summary": {
                        "total_deliveries": 12453,
                        "failed_deliveries": 14,
                        "error_rate_percentage": 0,
                        "min_response_time_ms": 41,
                        "avg_response_time_ms": 187,
                        "max_response_time_ms": 2103,
                        "last_delivery_at": "2026-05-17T09:21:18Z",
                        "metrics_window_days": 30
                      }
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Validierung fehlgeschlagen (doppelte URL, leere Liste oder Liste mit unbekannten Ereignissen, fehlerhafter Body).",
            "content": {
              "application/json": {
                "examples": {
                  "Duplicate URL": {
                    "value": {
                      "url": [
                        "This webhook destination already exists for the application."
                      ]
                    }
                  },
                  "Empty events": {
                    "value": {
                      "subscribed_events": [
                        "At least one subscribed event is required."
                      ]
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "API-Schlüssel fehlt, ist fehlerhaft, abgelaufen oder für eine andere Anwendung gültig. Ein fehlender Schlüssel gibt `403` zurück; ein falscher, widerrufener oder abgelaufener Schlüssel gibt `401` zurück.",
            "content": {
              "application/json": {
                "examples": {
                  "Forbidden": {
                    "value": {
                      "detail": "You do not have permission to perform this action."
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Ziel mit dieser UUID existiert nicht (oder ist gelöscht oder gehört zu einer anderen Anwendung).",
            "content": {
              "application/json": {
                "examples": {
                  "Not found": {
                    "value": {
                      "detail": "Webhook destination not found."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate-Limit überschritten; drosseln Sie die Anfragen und wiederholen Sie den Versuch.",
            "content": {
              "application/json": {
                "examples": {
                  "Throttled": {
                    "value": {
                      "detail": "Request was throttled. Expected available in 30 seconds."
                    }
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      },
      "delete": {
        "summary": "Webhook-Ziel löschen",
        "description": "Löscht ein Webhook-Ziel, dessen Signaturgeheimnis und das gesamte Zustellungs-Log dauerhaft. Dies kann nicht rückgängig gemacht werden. Es werden keine neuen Webhooks an die URL des Ziels gesendet; andere für dieselben Ereignisse abonnierte Ziele empfangen diese weiterhin. Danach erscheint das Ziel nicht mehr in `GET /v3/webhook/destinations/`, und jede Route unter `/v3/webhook/destinations/{destination_uuid}/`, einschließlich ihrer Zustellungen, der Details einer Zustellung und ihres erneuten Sendens, antwortet mit 404. Die veraltete `webhook_url` der Anwendung wird auf die URL des ältesten verbleibenden aktivierten Ziels gesetzt oder geleert, wenn kein aktiviertes Ziel mehr vorhanden ist. Ein erneuter Aufruf von DELETE gibt 404 zurück.",
        "operationId": "delete_webhook_destination",
        "x-didit-sdk": {
          "resource": "webhooks.destinations",
          "method": "delete",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Webhook"
        ],
        "parameters": [
          {
            "name": "destination_uuid",
            "in": "path",
            "required": true,
            "description": "UUID des zu löschenden Ziels.",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "example": "11111111-2222-3333-4444-555555555555"
          }
        ],
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X DELETE 'https://verification.didit.me/v3/webhook/destinations/11111111-2222-3333-4444-555555555555/' \\\n  -H 'x-api-key: YOUR_API_KEY'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nclient.webhooks.destinations.delete(\n    \"11111111-2222-3333-4444-555555555555\",\n)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nawait didit.webhooks.destinations.delete(\"11111111-2222-3333-4444-555555555555\");"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nif err := client.Webhooks.Destinations.Delete(ctx, \"11111111-2222-3333-4444-555555555555\"); err != nil {\n\tlog.Fatal(err)\n}"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nclient.webhooks().destinations().delete(\"11111111-2222-3333-4444-555555555555\");"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$didit->webhooks->destinations->delete('11111111-2222-3333-4444-555555555555');"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\ndidit.webhooks.destinations.delete(\"11111111-2222-3333-4444-555555555555\")"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nawait client.Webhooks.Destinations.DeleteAsync(\"11111111-2222-3333-4444-555555555555\");"
          }
        ],
        "responses": {
          "204": {
            "description": "Ziel, Signaturgeheimnis und Zustellungslog dauerhaft gelöscht. Kein Antworttext."
          },
          "403": {
            "description": "API-Schlüssel fehlt, ist fehlerhaft, abgelaufen oder für eine andere Anwendung gültig. Ein fehlender Schlüssel gibt `403` zurück; ein falscher, widerrufener oder abgelaufener Schlüssel gibt `401` zurück.",
            "content": {
              "application/json": {
                "examples": {
                  "Forbidden": {
                    "value": {
                      "detail": "You do not have permission to perform this action."
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Für die Anwendung existiert kein Ziel mit dieser UUID (bereits gelöscht oder existierte nie).",
            "content": {
              "application/json": {
                "examples": {
                  "Not found": {
                    "value": {
                      "detail": "Webhook destination not found."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate-Limit überschritten; drosseln Sie die Anfragen und wiederholen Sie den Versuch.",
            "content": {
              "application/json": {
                "examples": {
                  "Throttled": {
                    "value": {
                      "detail": "Request was throttled. Expected available in 30 seconds."
                    }
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/v3/wallet-screening/": {
      "post": {
        "summary": "Eine Adresse überprüfen",
        "description": "Führt ein On-Demand-AML-Screening für eine einzelne Krypto-Wallet/Adresse durch, ohne eine Transaktion zu erstellen. Ermittelt den für Ihre Anwendung konfigurierten Blockchain-Analyseanbieter, prüft die Adresse synchron und gibt das normalisierte Risikoergebnis zurück. LIGHTNING ist nur mit einer über den Marketplace hinzugefügten BYOK-Verbindung von Elliptic oder Chainalysis verfügbar. Es wird nichts in die Transaktionstabelle geschrieben. Eine Nutzung des AML-Monitorings wird pro erfolgreichem Screening abgerechnet (Sandbox-Anwendungen werden nicht abgerechnet).",
        "operationId": "screenWallet",
        "x-didit-sdk": {
          "resource": "wallet_screening",
          "method": "screen",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Transactions"
        ],
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "wallet_address"
                ],
                "properties": {
                  "wallet_address": {
                    "type": "string",
                    "description": "Die zu prüfende Krypto-Adresse oder die Netzwerk-ID. Muss zum ausgewählten Netzwerk passen (z. B. eine 40-stellige Hex-Adresse mit `0x`-Präfix für EVM-Chains). Alias: `address`.",
                    "example": "0x94f1b9b64e2932f6a2db338f616844400cd58e8a"
                  },
                  "blockchain": {
                    "type": "string",
                    "description": "Optionaler Netzwerkbezeichner. Wenn er weggelassen wird, wird das Netzwerk anhand des Adressformats ermittelt: `bc1`-, `1`- und `3`-Adressen sind Bitcoin (BTC), `T`-Adressen sind Tron (TRX) und Base58-öffentliche Schlüssel sind Solana (SOL). Eine `0x`-Adresse ist in jedem EVM-Netzwerk gültig, sodass das Weglassen von `blockchain` dafür den Status 422 mit den infrage kommenden Netzwerken in `candidate_chains` zurückgibt. Verwaltetes Screening unterstützt BTC, ETH, LTC, XRP, BCH, DOGE, TRX, SOL, MATIC, BNB, BASE (Base), OP (Optimism), ARB (Arbitrum One), AVAX (Avalanche C-Chain), ADA (Cardano), XLM (Stellar) und HBAR (Hedera). USDT und USDC sind Legacy-Ethereum-Aliase, keine netzwerkübergreifenden Suchen. Die Abdeckung verbundener Anbieter variiert. LIGHTNING erfordert einen unterstützten verbundenen Anbieter. CELO (Celo), MODE (Mode) und PLUME (Plume) werden über ein verbundenes TRM-Labs-Konto überprüft; verwaltetes Screening antwortet für diese mit 400. Alias: `currency`.",
                    "enum": [
                      "BTC",
                      "LIGHTNING",
                      "ETH",
                      "LTC",
                      "XRP",
                      "BCH",
                      "DOGE",
                      "TRX",
                      "SOL",
                      "MATIC",
                      "BNB",
                      "USDT",
                      "USDC",
                      "BASE",
                      "OP",
                      "ARB",
                      "AVAX",
                      "ADA",
                      "XLM",
                      "HBAR",
                      "CELO",
                      "MODE",
                      "PLUME"
                    ],
                    "example": "ETH"
                  },
                  "direction": {
                    "type": "string",
                    "description": "Optional. Gibt an, ob die Adresse als eingehende (Einzahlung) oder ausgehende (Auszahlung) Gegenpartei gescreent wird. Akzeptiert `inbound`, `outbound`, `deposit` oder `withdrawal`. Standardmäßig wird bei Auslassung ein neutrales Pre-Transfer-Screening durchgeführt. Dies wird dem Anbieter nur als Kontext übergeben; es ändert weder den zurückgegebenen `risk_score`, die `severity` noch die Aufschlüsselungen für `source_of_funds`/`destination_of_funds`, die unabhängig von `direction` immer beide zurückgegeben werden. Eine Änderung oder Auslassung von `direction` erfordert daher kein erneutes Screening einer Adresse.",
                    "enum": [
                      "inbound",
                      "outbound",
                      "deposit",
                      "withdrawal"
                    ]
                  }
                }
              },
              "example": {
                "wallet_address": "0x94f1b9b64e2932f6a2db338f616844400cd58e8a",
                "blockchain": "ETH"
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X POST 'https://verification.didit.me/v3/wallet-screening/' \\\n  -H 'x-api-key: YOUR_API_KEY' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\n    \"wallet_address\": \"0x94f1b9b64e2932f6a2db338f616844400cd58e8a\",\n    \"blockchain\": \"ETH\"\n  }'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.wallet_screening.screen(\n    wallet_address=\"0x94f1b9b64e2932f6a2db338f616844400cd58e8a\",\n    blockchain=\"ETH\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.walletScreening.screen({\n  wallet_address: \"0x94f1b9b64e2932f6a2db338f616844400cd58e8a\",\n  blockchain: \"ETH\",\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.WalletScreening.Screen(ctx, didit.WalletScreeningScreenParams{\n\tWalletAddress: \"0x94f1b9b64e2932f6a2db338f616844400cd58e8a\",\n\tBlockchain:    didit.Some(didit.WalletScreeningScreenParamsBlockchain(\"ETH\")),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\nimport me.didit.types.WalletScreeningScreenParams;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.walletScreening().screen(WalletScreeningScreenParams.builder()\n        .walletAddress(\"0x94f1b9b64e2932f6a2db338f616844400cd58e8a\")\n        .blockchain(WalletScreeningScreenParams.Blockchain.of(\"ETH\"))\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->walletScreening->screen([\n    'wallet_address' => '0x94f1b9b64e2932f6a2db338f616844400cd58e8a',\n    'blockchain' => 'ETH',\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.wallet_screening.screen(\n  wallet_address: \"0x94f1b9b64e2932f6a2db338f616844400cd58e8a\",\n  blockchain: \"ETH\"\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.WalletScreening.ScreenAsync(new WalletScreeningScreenParams\n{\n    WalletAddress = \"0x94f1b9b64e2932f6a2db338f616844400cd58e8a\",\n    Blockchain = new WalletScreeningScreenParamsBlockchain(\"ETH\"),\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "responses": {
          "200": {
            "description": "Das normalisierte Wallet-Screening-Ergebnis.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WalletScreeningResult"
                },
                "example": {
                  "provider": "merklescience",
                  "screening_type": "WALLET_SCREENING",
                  "risk_score": 95,
                  "severity": "CRITICAL",
                  "status": "SCREENED",
                  "summary": "Merkle Science risk: Critical (5/5). SANCTIONS HIT. Dominant risk: sanctioned. Driven by: the address is attributed to Sanctions / OFAC (Example Sanctions)",
                  "wallet_address": "0x94f1b9b64e2932f6a2db338f616844400cd58e8a",
                  "transaction_hash": null,
                  "blockchain": "ETH",
                  "block_timestamp": null,
                  "total_value_usd": null,
                  "fee_usd": null,
                  "sender_rows": [],
                  "receiver_rows": [],
                  "transaction_flows": [],
                  "transaction_flows_status": null,
                  "transaction_flows_error": null,
                  "source_of_funds": [
                    {
                      "category": "sanctioned",
                      "percentage": 100.0,
                      "amount_usd": 9813695.0,
                      "entity_name": "Example Sanctions",
                      "entity_type": "Sanctions",
                      "entity_subtype": "OFAC",
                      "hops": null,
                      "description": "Sanctions / OFAC",
                      "is_direct": true,
                      "exposure_direction": "incoming",
                      "exposure_type": "direct",
                      "provider_entity_id": "118885",
                      "provider_entity_type_id": "30",
                      "provider_entity_subtype_id": "125",
                      "country": "",
                      "raw_amount": null,
                      "raw_currency": null
                    }
                  ],
                  "destination_of_funds": [
                    {
                      "category": "defi",
                      "percentage": 84.824453,
                      "amount_usd": 7783414.38,
                      "entity_name": "Example DeFi 7",
                      "entity_type": "DeFi",
                      "entity_subtype": "Bridges",
                      "hops": null,
                      "description": "DeFi / Bridges",
                      "is_direct": false,
                      "exposure_direction": "outgoing",
                      "exposure_type": "indirect",
                      "provider_entity_id": "118459",
                      "provider_entity_type_id": "33",
                      "provider_entity_subtype_id": "143",
                      "country": "",
                      "raw_amount": null,
                      "raw_currency": null
                    },
                    {
                      "category": "defi",
                      "percentage": 15.175547,
                      "amount_usd": 1392494.37,
                      "entity_name": "Example DeFi 2",
                      "entity_type": "DeFi",
                      "entity_subtype": "Yield Aggregator",
                      "hops": null,
                      "description": "DeFi / Yield Aggregator",
                      "is_direct": false,
                      "exposure_direction": "outgoing",
                      "exposure_type": "indirect",
                      "provider_entity_id": "90192",
                      "provider_entity_type_id": "33",
                      "provider_entity_subtype_id": "142",
                      "country": "",
                      "raw_amount": null,
                      "raw_currency": null
                    }
                  ],
                  "counterparty_connections": [
                    {
                      "entity_name": "Example Sanctions",
                      "entity_type": "Sanctions",
                      "entity_subtype": "OFAC",
                      "risk_level": "critical",
                      "categories": [
                        "sanctioned"
                      ],
                      "received_usd": null,
                      "sent_usd": null,
                      "received_hops": null,
                      "sent_hops": null,
                      "percentage": 0.0,
                      "is_direct": true,
                      "country": null,
                      "provider_entity_id": null
                    },
                    {
                      "entity_name": "Example Sanctions",
                      "entity_type": "Sanctions",
                      "entity_subtype": "OFAC",
                      "risk_level": "critical",
                      "categories": [
                        "sanctioned"
                      ],
                      "received_usd": null,
                      "sent_usd": null,
                      "received_hops": null,
                      "sent_hops": null,
                      "percentage": 0.0,
                      "is_direct": true,
                      "country": null,
                      "provider_entity_id": null
                    }
                  ],
                  "network_nodes": [],
                  "network_edges": [],
                  "sanctions_hit": true,
                  "pep_counterparty": null,
                  "dominant_risk_category": "sanctioned",
                  "risk_factors": [
                    {
                      "source": "attribution",
                      "category": "sanctioned",
                      "label": "Sanctions / OFAC",
                      "entity_name": "Example Sanctions",
                      "direction": "attribution",
                      "exposure_type": "attribution",
                      "amount_usd": null,
                      "percentage": 0.0,
                      "is_high_risk": true,
                      "description": "the address is attributed to Sanctions / OFAC (Example Sanctions)"
                    },
                    {
                      "source": "exposure",
                      "category": "sanctioned",
                      "label": "Sanctions / OFAC",
                      "entity_name": "Example Sanctions",
                      "direction": "incoming",
                      "exposure_type": "direct",
                      "amount_usd": 9813695.0,
                      "percentage": 51.679304,
                      "is_high_risk": true,
                      "description": "51.6793% direct incoming exposure to Sanctions / OFAC (Example Sanctions)"
                    },
                    {
                      "source": "exposure",
                      "category": "defi",
                      "label": "DeFi / Bridges",
                      "entity_name": "Example DeFi 7",
                      "direction": "outgoing",
                      "exposure_type": "indirect",
                      "amount_usd": 7783414.38,
                      "percentage": 40.987766,
                      "is_high_risk": false,
                      "description": "40.9878% indirect outgoing exposure to DeFi / Bridges (Example DeFi 7)"
                    },
                    {
                      "source": "exposure",
                      "category": "defi",
                      "label": "DeFi / Yield Aggregator",
                      "entity_name": "Example DeFi 2",
                      "direction": "outgoing",
                      "exposure_type": "indirect",
                      "amount_usd": 1392494.37,
                      "percentage": 7.33293,
                      "is_high_risk": false,
                      "description": "7.33293% indirect outgoing exposure to DeFi / Yield Aggregator (Example DeFi 2)"
                    }
                  ],
                  "raw_response": {
                    "...": "provider-specific details"
                  },
                  "report_signature": "<hmac-sha256 over the result, scoped to your application>"
                }
              }
            }
          },
          "400": {
            "description": "Validierungsfehler – fehlerhafte Adresse, fehlende `wallet_address`, nicht unterstützte `blockchain`, weggelassene `blockchain` bei einer Adresse, deren Format kein Netzwerk benennt, oder LIGHTNING ohne eine Elliptic- oder Chainalysis-BYOK-Marketplace-Verbindung."
          },
          "401": {
            "description": "Fehlender oder ungültiger `x-api-key`."
          },
          "409": {
            "description": "Für die Anwendung ist kein AML-Anbieter konfiguriert, oder der konfigurierte Anbieter unterstützt Wallet-Screening noch nicht. Konfigurieren Sie zuerst die Transaktionsüberwachung."
          },
          "422": {
            "description": "`blockchain` für eine `0x`-Adresse weggelassen, die alle EVM-Netzwerke teilen. Es wird nichts geprüft oder abgerechnet; senden Sie die Anfrage erneut mit `blockchain` auf eine der `candidate_chains` gesetzt.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "blockchain": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      },
                      "example": [
                        "A 0x address is valid on every EVM chain. Send blockchain as one of: ETH, BNB, MATIC, BASE, ARB, OP, CELO, MODE, PLUME."
                      ]
                    },
                    "candidate_chains": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      },
                      "example": [
                        "ETH",
                        "BNB",
                        "MATIC",
                        "BASE",
                        "ARB",
                        "OP",
                        "CELO",
                        "MODE",
                        "PLUME"
                      ]
                    }
                  }
                }
              }
            }
          },
          "502": {
            "description": "Der AML-Anbieter konnte das Screening nicht abschließen. Versuchen Sie es später erneut."
          }
        }
      }
    },
    "/v3/wallet-screening/pdf/": {
      "post": {
        "summary": "Wallet-Screening-Ergebnis als PDF rendern",
        "description": "Zustandsloses Gegenstück zu `POST /v3/wallet-screening/`: Senden Sie genau den JSON-Body erneut, den dieser Endpoint zurückgegeben hat – einschließlich der hinzugefügten `report_signature` – und erhalten Sie ein PDF desselben Ergebnisses im Didit-Branding zurück. Es wird kein Anbieter aufgerufen und nichts abgerechnet oder dauerhaft gespeichert; dies rendert lediglich ein Ergebnis neu, das Didit bereits erstellt hat. Die Signatur verknüpft das PDF mit einem unveränderten Ergebnis: Das Bearbeiten von `risk_score`, `severity`, `sanctions_hit` oder eines anderen signierten Felds vor dem erneuten Senden schlägt mit `400` fehl.",
        "operationId": "screenWalletPdf",
        "x-didit-sdk": {
          "resource": "wallet_screening",
          "method": "screen_pdf",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Transactions"
        ],
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "requestBody": {
          "required": true,
          "description": "Das unveränderte JSON-Objekt, das von `POST /v3/wallet-screening/` zurückgegeben wurde, einschließlich `report_signature`.",
          "content": {
            "application/json": {
              "schema": {
                "allOf": [
                  {
                    "$ref": "#/components/schemas/WalletScreeningResult"
                  }
                ],
                "required": [
                  "report_signature"
                ],
                "description": "Gleiche Struktur wie die Antwort von `POST /v3/wallet-screening/` — übergeben Sie diesen Antwort-Body unverändert zurück, einschließlich `report_signature`."
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "# $RESULT is the saved JSON body from POST /v3/wallet-screening/\ncurl -X POST 'https://verification.didit.me/v3/wallet-screening/pdf/' \\\n  -H 'x-api-key: YOUR_API_KEY' \\\n  -H 'Content-Type: application/json' \\\n  -d \"$RESULT\" \\\n  -o wallet_screening_report.pdf"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\ncontent = client.wallet_screening.screen_pdf(\n    provider=\"your-provider\",\n    screening_type=\"WALLET_SCREENING\",\n    risk_score=1,\n    severity=\"UNKNOWN\",\n    status=\"SCREENED\",\n    summary=\"your-summary\",\n    wallet_address=\"your-wallet-address\",\n    blockchain=\"your-blockchain\",\n    source_of_funds=[{}],\n    destination_of_funds=[{}],\n    counterparty_connections=[{}],\n    sanctions_hit=True,\n    dominant_risk_category=\"your-dominant-risk-category\",\n    report_signature=\"your-report-signature\",\n)\nwith open(\"download.pdf\", \"wb\") as file:\n    file.write(content)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import { writeFile } from \"node:fs/promises\";\nimport Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst content = await didit.walletScreening.screenPdf({\n  provider: \"your-provider\",\n  screening_type: \"WALLET_SCREENING\",\n  risk_score: 1,\n  severity: \"UNKNOWN\",\n  status: \"SCREENED\",\n  summary: \"your-summary\",\n  wallet_address: \"your-wallet-address\",\n  blockchain: \"your-blockchain\",\n  source_of_funds: [{}],\n  destination_of_funds: [{}],\n  counterparty_connections: [{}],\n  sanctions_hit: true,\n  dominant_risk_category: \"your-dominant-risk-category\",\n  report_signature: \"your-report-signature\",\n});\nawait writeFile(\"download.pdf\", Buffer.from(await content.arrayBuffer()));"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresp, err := client.WalletScreening.ScreenPDF(ctx, didit.WalletScreeningResultParam{\n\tProvider:                \"your-provider\",\n\tScreeningType:           \"WALLET_SCREENING\",\n\tRiskScore:               1,\n\tSeverity:                \"UNKNOWN\",\n\tStatus:                  \"SCREENED\",\n\tSummary:                 \"your-summary\",\n\tWalletAddress:           \"your-wallet-address\",\n\tBlockchain:              \"your-blockchain\",\n\tSourceOfFunds:           []didit.WalletScreeningResultParamSourceOfFunds{{}},\n\tDestinationOfFunds:      []didit.WalletScreeningResultParamDestinationOfFunds{{}},\n\tCounterpartyConnections: []didit.WalletScreeningResultParamCounterpartyConnections{{}},\n\tSanctionsHit:            true,\n\tDominantRiskCategory:    didit.String(\"your-dominant-risk-category\"),\n\tReportSignature:         \"your-report-signature\",\n})\nif err != nil {\n\tlog.Fatal(err)\n}\ndefer resp.Body.Close()\nfile, err := os.Create(\"download.pdf\")\nif err != nil {\n\tlog.Fatal(err)\n}\ndefer file.Close()\nif _, err := io.Copy(file, resp.Body); err != nil {\n\tlog.Fatal(err)\n}"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import java.nio.file.Path;\nimport java.util.List;\nimport me.didit.Didit;\nimport me.didit.types.WalletScreeningResult;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nclient.walletScreening().screenPdf(WalletScreeningResult.builder()\n        .provider(\"your-provider\")\n        .screeningType(WalletScreeningResult.ScreeningType.of(\"WALLET_SCREENING\"))\n        .riskScore(1L)\n        .severity(WalletScreeningResult.Severity.of(\"UNKNOWN\"))\n        .status(WalletScreeningResult.Status.of(\"SCREENED\"))\n        .summary(\"your-summary\")\n        .walletAddress(\"your-wallet-address\")\n        .blockchain(\"your-blockchain\")\n        .sourceOfFunds(List.of(WalletScreeningResult.SourceOfFunds.builder()\n                .build()))\n        .destinationOfFunds(List.of(WalletScreeningResult.DestinationOfFunds.builder()\n                .build()))\n        .counterpartyConnections(List.of(WalletScreeningResult.CounterpartyConnections.builder()\n                .build()))\n        .sanctionsHit(true)\n        .dominantRiskCategory(\"your-dominant-risk-category\")\n        .reportSignature(\"your-report-signature\")\n        .build())\n        .writeTo(Path.of(\"download.pdf\"));"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$content = $didit->walletScreening->screenPdf([\n    'provider' => 'your-provider',\n    'screening_type' => 'WALLET_SCREENING',\n    'risk_score' => 1,\n    'severity' => 'UNKNOWN',\n    'status' => 'SCREENED',\n    'summary' => 'your-summary',\n    'wallet_address' => 'your-wallet-address',\n    'blockchain' => 'your-blockchain',\n    'source_of_funds' => [[]],\n    'destination_of_funds' => [[]],\n    'counterparty_connections' => [[]],\n    'sanctions_hit' => true,\n    'dominant_risk_category' => 'your-dominant-risk-category',\n    'report_signature' => 'your-report-signature',\n]);\n$content->saveTo('download.pdf');"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\ncontent = didit.wallet_screening.screen_pdf(\n  provider: \"your-provider\",\n  screening_type: \"WALLET_SCREENING\",\n  risk_score: 1,\n  severity: \"UNKNOWN\",\n  status: \"SCREENED\",\n  summary: \"your-summary\",\n  wallet_address: \"your-wallet-address\",\n  blockchain: \"your-blockchain\",\n  source_of_funds: [{}],\n  destination_of_funds: [{}],\n  counterparty_connections: [{}],\n  sanctions_hit: true,\n  dominant_risk_category: \"your-dominant-risk-category\",\n  report_signature: \"your-report-signature\"\n)\nFile.binwrite(\"download.pdf\", content)"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar content = await client.WalletScreening.ScreenPdfAsync(new WalletScreeningResult\n{\n    Provider = \"your-provider\",\n    ScreeningType = \"WALLET_SCREENING\",\n    RiskScore = 1,\n    Severity = \"UNKNOWN\",\n    Status = \"SCREENED\",\n    Summary = \"your-summary\",\n    WalletAddress = \"your-wallet-address\",\n    Blockchain = \"your-blockchain\",\n    SourceOfFunds = new WalletScreeningResultSourceOfFunds[] { new() },\n    DestinationOfFunds = new WalletScreeningResultDestinationOfFunds[] { new() },\n    CounterpartyConnections = new WalletScreeningResultCounterpartyConnections[] { new() },\n    SanctionsHit = true,\n    DominantRiskCategory = \"your-dominant-risk-category\",\n    ReportSignature = \"your-report-signature\",\n});\nawait content.SaveToAsync(\"download.pdf\");"
          }
        ],
        "responses": {
          "200": {
            "description": "Das gerenderte PDF-Dokument, direkt als binäres `application/pdf` zurückgegeben — es gibt keinen JSON-Wrapper.",
            "headers": {
              "Content-Disposition": {
                "description": "`attachment; filename=wallet_screening_{address}.pdf`, abgeleitet aus der `wallet_address` (oder dem `transaction_hash`) im erneut übermittelten Ergebnis.",
                "schema": {
                  "type": "string",
                  "example": "attachment; filename=wallet_screening_0x28c6c06298d514db0899.pdf"
                }
              }
            },
            "content": {
              "application/pdf": {
                "schema": {
                  "type": "string",
                  "format": "binary"
                }
              }
            }
          },
          "400": {
            "description": "Der Body ist kein JSON-Objekt, das dem Format der Wallet-Screening-Ergebnisse entspricht, oder `report_signature` fehlt bzw. stimmt nicht mit den erneut übermittelten Feldern überein (vor der erneuten Übermittlung bearbeitet oder abgeschnitten).",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                },
                "examples": {
                  "Not an object": {
                    "value": {
                      "non_field_errors": [
                        "Expected a JSON object matching a wallet-screening result."
                      ]
                    }
                  },
                  "Missing or invalid signature": {
                    "value": {
                      "report_signature": [
                        "This wallet-screening result is missing or fails its report signature - repost the exact JSON returned by the wallet-screening endpoint, unmodified."
                      ]
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Fehlender oder ungültiger `x-api-key`."
          }
        }
      }
    },
    "/v3/transactions/": {
      "get": {
        "summary": "Transaktionen auflisten",
        "description": "Paginierte Liste der überwachten Transaktionen, die neuesten zuerst (`txn_date` absteigend). `count` ist auf 100 gedeckelt; verwenden Sie `total_transactions` für die tatsächliche Zeilenanzahl. Dieser Endpoint unterstützt keine Filter- oder Suchparameter.",
        "operationId": "listTransactions",
        "x-didit-sdk": {
          "resource": "transactions",
          "method": "list",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Transactions"
        ],
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "schema": {
              "type": "integer",
              "default": 50,
              "minimum": 1,
              "maximum": 1000000
            },
            "description": "Seitengröße. Standardmäßig 50, wenn nicht angegeben. Es gibt kein festes Maximum, aber halten Sie die Seiten klein, um die Latenz gering zu halten."
          },
          {
            "name": "offset",
            "in": "query",
            "schema": {
              "type": "integer",
              "default": 0,
              "minimum": 0,
              "maximum": 1000000
            },
            "description": "Nullbasierter Offset des ersten zurückzugebenden Datensatzes. Folgen Sie vorzugsweise der `next`-URL der vorherigen Seite."
          },
          {
            "name": "travel_rule_status",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "Gibt nur Transaktionen zurück, deren Transfer gemäß der Travel Rule sich in genau diesem Status befindet (z. B. `ON_HOLD` oder `AWAITING_COUNTERPARTY`). `count` richtet sich nach diesem Filter; `total_transactions` zählt weiterhin jede Transaktion in der Anwendung."
          },
          {
            "name": "assignee",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "Kommagetrennt; eine Transaktion stimmt überein, wenn sie mindestens einem Wert entspricht. `unassigned` steht für Fälle, die noch niemandem zugewiesen sind, `rules` steht für Entscheidungen, die Regeln eigenständig ohne Prüfer getroffen haben, und eine Mitglieds-E-Mail entspricht dem zugewiesenen Prüfer. `me` ist der angemeldete Console-Prüfer, sodass ein API-Schlüssel, der `me` sendet, `400` erhält."
          }
        ],
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X GET 'https://verification.didit.me/v3/transactions/?limit=50' \\\n  -H 'x-api-key: YOUR_API_KEY'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nfor item in client.transactions.list():\n    print(item)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nfor await (const item of didit.transactions.list()) {\n  console.log(item);\n}"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\niter := client.Transactions.ListAutoPaging(ctx, didit.TransactionsListParams{})\nfor iter.Next() {\n\tfmt.Printf(\"%+v\\n\", iter.Current())\n}\nif err := iter.Err(); err != nil {\n\tlog.Fatal(err)\n}"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nfor (var item : client.transactions().list()) {\n    System.out.println(item);\n}"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\nforeach ($didit->transactions->list() as $item) {\n    print_r($item->toArray());\n}"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\ndidit.transactions.list.auto_paging_each do |item|\n  puts item.to_h\nend"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nawait foreach (var item in await client.Transactions.ListAsync())\n{\n    Console.WriteLine(JsonSerializer.Serialize(item));\n}"
          }
        ],
        "responses": {
          "200": {
            "description": "Paginierte Liste von Transaktionszusammenfassungen, die neuesten zuerst.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "count": {
                      "type": "integer",
                      "description": "Gedeckelte Anzahl übereinstimmender Transaktionen (exakt bis 100, danach gedeckelt). Verwenden Sie `total_transactions` für die tatsächliche Anzahl bei Paginierung."
                    },
                    "next": {
                      "type": "string",
                      "nullable": true,
                      "description": "Absolute URL der nächsten Seite oder `null` auf der letzten Seite."
                    },
                    "previous": {
                      "type": "string",
                      "nullable": true,
                      "description": "Absolute URL der vorherigen Seite oder `null` auf der ersten Seite."
                    },
                    "total_transactions": {
                      "type": "integer",
                      "description": "Exakte Gesamtzahl der (nicht gelöschten) Transaktionen für die Anwendung. In paginierten Antworten enthalten."
                    },
                    "results": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "uuid": {
                            "type": "string",
                            "format": "uuid",
                            "description": "Stabiler Didit-Transaktionsidentifikator. Als `{transaction_id}` in Aufrufen für Details, Notizen und verwandte Ressourcen verwenden."
                          },
                          "transaction_number": {
                            "type": "integer",
                            "description": "Fortlaufende Transaktionsnummer innerhalb der Anwendung, wie in der Console angezeigt (z. B. `4123`)."
                          },
                          "txn_id": {
                            "type": "string",
                            "description": "Vom Kunden bereitgestellter Bezeichner aus dem Erstellungsaufruf (max. 128 Zeichen). Eindeutig pro Anwendung."
                          },
                          "transaction_type": {
                            "type": "string",
                            "description": "Kategorie auf oberster Ebene wie gespeichert: `finance`, `kyc`, `travelRule`, `userPlatformEvent`, `gamblingBet`, `gamblingLimitChange`, `gamblingBonusChange`, `auditTrailEvent`. Beachten Sie, dass mehrteilige Werte in camelCase zurückgegeben werden, selbst wenn sie in snake_case übermittelt wurden."
                          },
                          "action_type": {
                            "type": "string",
                            "description": "Untertyp innerhalb der Kategorie (z. B. `deposit`, `withdrawal`, `transfer`)."
                          },
                          "status": {
                            "type": "string",
                            "enum": [
                              "APPROVED",
                              "IN_REVIEW",
                              "DECLINED",
                              "AWAITING_USER"
                            ],
                            "description": "Aktuelles Überwachungsergebnis."
                          },
                          "direction": {
                            "type": "string",
                            "enum": [
                              "INBOUND",
                              "OUTBOUND"
                            ],
                            "description": "Richtung relativ zur betreffenden Entität. Wird unabhängig von der übermittelten Schreibweise in Großbuchstaben gespeichert."
                          },
                          "amount": {
                            "type": "string",
                            "description": "Transaktionsbetrag als Dezimalstring ohne nachgestellte Nullen (z. B. `\"1500\"`, `\"0.5\"`, `\"0.123456789012345678\"`). Bis zu 18 Dezimalstellen."
                          },
                          "currency": {
                            "type": "string",
                            "description": "Währungscode von `amount`. Jeder alphabetische ISO-4217-Code wird akzeptiert (z. B. `EUR`, `USD`, `NGN`), ebenso wie ein Krypto-Asset-Symbol (z. B. `BTC`). Bevorzugen Sie einen aktuell im Umlauf befindlichen Code. Nicht jeder akzeptierte Code verfügt über einen Wechselkurs: Wenn für den Code keiner verfügbar ist (beispielsweise die ISO-Verrechnungseinheit `XSU` oder ein Krypto-Symbol, für das Didit keine Kurse bereitstellt), schlägt die automatische Konvertierung fehl und `preferred_currency_amount` wird als null zurückgegeben, es sei denn, die Anfrage enthielt einen vorkonvertierten Wert für `amount_in_default_currency`."
                          },
                          "preferred_currency_amount": {
                            "type": "string",
                            "nullable": true,
                            "description": "`amount` umgerechnet in die bevorzugte Währung der Anwendung, sofern verfügbar."
                          },
                          "preferred_currency_code": {
                            "type": "string",
                            "nullable": true,
                            "description": "Bevorzugter Währungscode für `preferred_currency_amount` – die Basiswährung der Anwendung, jeder aktuell im Umlauf befindliche ISO-4217-Code. Bei einem Code ohne verfügbaren Wechselkurs bleibt `preferred_currency_amount` null, es sei denn, die Anfrage enthielt einen vorab umgerechneten `amount_in_default_currency`."
                          },
                          "payment_details": {
                            "type": "string",
                            "nullable": true,
                            "description": "Freitext-Zahlungsreferenz oder -Verwendungszweck aus der Übermittlung."
                          },
                          "score": {
                            "type": "integer",
                            "description": "Risiko-Score (typischerweise 0–100). Höher = riskanter."
                          },
                          "severity": {
                            "type": "string",
                            "nullable": true,
                            "enum": [
                              "UNKNOWN",
                              "LOW",
                              "MEDIUM",
                              "HIGH",
                              "CRITICAL"
                            ],
                            "description": "Kategorische Risikoschwere, festgelegt durch Regeln/Anbieter (`UNKNOWN`, `LOW`, `MEDIUM`, `HIGH`, `CRITICAL`). `null`, bis ein Wert festgelegt wird."
                          },
                          "subject_name": {
                            "type": "string",
                            "nullable": true,
                            "description": "Vollständiger Name der Partei `APPLICANT`."
                          },
                          "subject_vendor_data": {
                            "type": "string",
                            "nullable": true,
                            "description": "Ihre interne Benutzer-/Unternehmenskennung für den Antragsteller."
                          },
                          "subject_country": {
                            "type": "string",
                            "nullable": true,
                            "description": "Ländercode des Antragstellers aus der übermittelten `address.country` (üblicherweise ISO 3166-1 Alpha-3)."
                          },
                          "counterparty_name": {
                            "type": "string",
                            "nullable": true,
                            "description": "Vollständiger Name der Partei `COUNTERPARTY`, falls vorhanden."
                          },
                          "counterparty_vendor_data": {
                            "type": "string",
                            "nullable": true,
                            "description": "Ihre interne Kennung für die Gegenpartei."
                          },
                          "counterparty_country": {
                            "type": "string",
                            "nullable": true,
                            "description": "Ländercode der Gegenpartei aus der übermittelten `address.country`."
                          },
                          "tags": {
                            "type": "array",
                            "description": "An die Transaktion angehängte Tags (manuell oder durch Regeln).",
                            "items": {
                              "type": "object",
                              "properties": {
                                "uuid": {
                                  "type": "string",
                                  "format": "uuid"
                                },
                                "name": {
                                  "type": "string"
                                },
                                "color": {
                                  "type": "string"
                                },
                                "description": {
                                  "type": "string",
                                  "nullable": true
                                },
                                "source": {
                                  "type": "string",
                                  "enum": [
                                    "didit",
                                    "custom"
                                  ],
                                  "description": "Gibt an, ob das Tag eine Didit-Voreinstellung oder ein benutzerdefiniertes Tag ist."
                                }
                              }
                            }
                          },
                          "txn_date": {
                            "type": "string",
                            "format": "date-time",
                            "description": "Wann die Transaktion stattgefunden hat (aus `transaction_at` zum Erstellungszeitpunkt)."
                          },
                          "created_at": {
                            "type": "string",
                            "format": "date-time",
                            "description": "Wann Didit die Einreichung aufgezeichnet hat."
                          },
                          "decision_reason_code": {
                            "type": "string",
                            "nullable": true,
                            "description": "Maschinenlesbarer Grund für den aktuellen `status` (z. B. `WALLET_HIGH_RISK`)."
                          },
                          "decision_reason_label": {
                            "type": "string",
                            "nullable": true,
                            "description": "Lesbare Bezeichnung für `decision_reason_code`."
                          },
                          "assigned_to_name": {
                            "type": "string",
                            "nullable": true,
                            "description": "Anzeigename des dieser Transaktion zugewiesenen Console-Prüfers."
                          },
                          "travel_rule_status": {
                            "type": "string",
                            "nullable": true,
                            "description": "Status des Travel-Rule-Transfers der Transaktion (zum Beispiel `COMPLETED`) oder `null`, wenn keiner vorhanden ist."
                          },
                          "travel_rule": {
                            "nullable": true,
                            "allOf": [
                              {
                                "$ref": "#/components/schemas/TransactionTravelRule"
                              }
                            ],
                            "description": "Der Travel-Rule-Transfer der Transaktion, derselbe Block wie `travel_rule` bei `GET /v3/transactions/{transaction_id}/`, oder `null`, wenn die Transaktion keinen hat."
                          }
                        }
                      }
                    }
                  }
                },
                "examples": {
                  "Single transaction": {
                    "value": {
                      "count": 1,
                      "next": null,
                      "previous": null,
                      "total_transactions": 1,
                      "results": [
                        {
                          "uuid": "abcdef12-3456-4890-abcd-ef1234567890",
                          "transaction_number": 4123,
                          "txn_id": "your-txn-2026-05-17-001",
                          "transaction_type": "finance",
                          "action_type": "withdrawal",
                          "status": "IN_REVIEW",
                          "direction": "OUTBOUND",
                          "amount": "1500",
                          "currency": "EUR",
                          "preferred_currency_amount": "1620.45",
                          "preferred_currency_code": "USD",
                          "payment_details": "Withdrawal to crypto wallet",
                          "txn_date": "2026-05-17T08:42:00Z",
                          "created_at": "2026-05-17T08:42:11Z",
                          "score": 78,
                          "severity": "HIGH",
                          "decision_reason_code": "WALLET_HIGH_RISK",
                          "decision_reason_label": "Destination wallet flagged as high risk",
                          "tags": [
                            {
                              "uuid": "9a8b7c6d-5e4f-4a3b-8c2d-1e0f9a8b7c6d",
                              "name": "Manual review",
                              "color": "#F59E0B",
                              "description": null,
                              "source": "custom"
                            }
                          ],
                          "subject_name": "Maria Garcia",
                          "subject_vendor_data": "user-12345",
                          "counterparty_name": null,
                          "counterparty_vendor_data": null,
                          "counterparty_country": null,
                          "subject_country": null,
                          "assigned_to_name": "Alex Reviewer",
                          "travel_rule_status": null,
                          "travel_rule": null
                        }
                      ]
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Fehlender, ungültiger oder widerrufener API-Schlüssel, oder der Schlüssel kann keine Transaktionen für diese Anwendung auflisten. Ein fehlender Schlüssel gibt `403` zurück; ein falscher, widerrufener oder abgelaufener Schlüssel gibt `401` zurück.",
            "content": {
              "application/json": {
                "examples": {
                  "Forbidden": {
                    "value": {
                      "detail": "You do not have permission to perform this action."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate-Limit überschritten; drosseln Sie die Anfragen und wiederholen Sie den Versuch nach dem in `Retry-After` angegebenen Intervall.",
            "content": {
              "application/json": {
                "examples": {
                  "Throttled": {
                    "value": {
                      "detail": "Request was throttled. Expected available in 30 seconds."
                    }
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      },
      "post": {
        "summary": "Transaktion erstellen",
        "description": "Übermitteln Sie eine Transaktion zur synchronen AML-/Risikoüberwachung. Die Transaktion wird als `APPROVED` erstellt, anschließend werden Ihre Regeln (und gegebenenfalls das Krypto-Screening) inline ausgeführt und können den zurückgegebenen `status` auf `IN_REVIEW` oder `DECLINED` umstellen. **`transaction_id` ist Ihr Idempotenz-Schlüssel** (max. 128 Zeichen, eindeutig pro Anwendung); eine erneute Verwendung gibt 400 zurück. Ein `transaction.created`-Webhook wird bei Erfolg für Live-Anwendungen gesendet. Sandbox-Anwendungen werden nicht abgerechnet und senden keine `transaction.created`- oder `transaction.status.updated`-Webhooks. Travel-Rule-Austausche in der Sandbox senden `travel_rule.status.updated`-Webhooks mit `environment: sandbox`. Ein Travel-Rule-Transfer wird gespeichert und zurückgegeben, bevor eine Gegenpartei kontaktiert wird: `travel_rule.status` wird als `AWAITING_COUNTERPARTY` zurückgegeben (oder als `NOT_APPLICABLE` unterhalb Ihres Schwellenwerts, `UNCONFIRMED_OWNERSHIP` für eine deklarierte selbstverwahrte Wallet, `COMPLETED`, wenn die andere Wallet Ihre eigene verifizierte Wallet ist) und `travel_rule.protocol` ist null. Didit wählt dann den Übertragungsweg und leitet den Austausch ein, und jede spätere Statusänderung des Transfers, einschließlich `COUNTERPARTY_VASP_NOT_FOUND`, wenn kein Übertragungsweg die Gegenpartei erreicht, trifft als `travel_rule.status.updated`-Webhook ein. Ihre Regeln werden erneut ausgeführt, wenn sich der Übertragungsweg oder der Status ändert.",
        "operationId": "createTransaction",
        "tags": [
          "Transactions"
        ],
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X POST 'https://verification.didit.me/v3/transactions/' \\\n  -H 'x-api-key: YOUR_API_KEY' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\n    \"transaction_id\": \"your-txn-2026-05-17-001\",\n    \"transaction_category\": \"finance\",\n    \"transaction_details\": {\n      \"direction\": \"outbound\",\n      \"amount\": 1500,\n      \"currency\": \"EUR\",\n      \"action_type\": \"withdrawal\"\n    },\n    \"subject\": {\n      \"entity_type\": \"individual\",\n      \"vendor_data\": \"user-12345\",\n      \"full_name\": \"Maria Garcia\"\n    }\n  }'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.transactions.create(\n    transaction_id=\"your-txn-2026-05-17-001\",\n    transaction_category=\"finance\",\n    transaction_details={\n        \"direction\": \"outbound\",\n        \"amount\": 1500.0,\n        \"currency\": \"EUR\",\n        \"action_type\": \"withdrawal\",\n    },\n    subject={\n        \"entity_type\": \"individual\",\n        \"vendor_data\": \"user-12345\",\n        \"full_name\": \"Maria Garcia\",\n    },\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.transactions.create({\n  transaction_id: \"your-txn-2026-05-17-001\",\n  transaction_category: \"finance\",\n  transaction_details: {\n    direction: \"outbound\",\n    amount: 1500.0,\n    currency: \"EUR\",\n    action_type: \"withdrawal\",\n  },\n  subject: {\n    entity_type: \"individual\",\n    vendor_data: \"user-12345\",\n    full_name: \"Maria Garcia\",\n  },\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Transactions.Create(ctx, didit.TransactionsCreateParams{\n\tTransactionID:       \"your-txn-2026-05-17-001\",\n\tTransactionCategory: \"finance\",\n\tTransactionDetails: didit.TransactionsCreateParamsTransactionDetails{\n\t\tDirection:  \"outbound\",\n\t\tAmount:     1500.0,\n\t\tCurrency:   \"EUR\",\n\t\tActionType: didit.String(\"withdrawal\"),\n\t},\n\tSubject: didit.TransactionsCreateParamsSubject{\n\t\tEntityType: didit.String(\"individual\"),\n\t\tVendorData: \"user-12345\",\n\t\tFullName:   \"Maria Garcia\",\n\t},\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\nimport me.didit.types.TransactionsCreateParams;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.transactions().create(TransactionsCreateParams.builder()\n        .transactionId(\"your-txn-2026-05-17-001\")\n        .transactionCategory(TransactionsCreateParams.TransactionCategory.of(\"finance\"))\n        .transactionDetails(TransactionsCreateParams.TransactionDetails.builder()\n                .direction(TransactionsCreateParams.TransactionDetails.Direction.of(\"outbound\"))\n                .amount(1500.0)\n                .currency(\"EUR\")\n                .actionType(\"withdrawal\")\n                .build())\n        .subject(TransactionsCreateParams.Subject.builder()\n                .entityType(\"individual\")\n                .vendorData(\"user-12345\")\n                .fullName(\"Maria Garcia\")\n                .build())\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->transactions->create([\n    'transaction_id' => 'your-txn-2026-05-17-001',\n    'transaction_category' => 'finance',\n    'transaction_details' => [\n        'direction' => 'outbound',\n        'amount' => 1500.0,\n        'currency' => 'EUR',\n        'action_type' => 'withdrawal',\n    ],\n    'subject' => [\n        'entity_type' => 'individual',\n        'vendor_data' => 'user-12345',\n        'full_name' => 'Maria Garcia',\n    ],\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.transactions.create(\n  transaction_id: \"your-txn-2026-05-17-001\",\n  transaction_category: \"finance\",\n  transaction_details: {\n    direction: \"outbound\",\n    amount: 1500.0,\n    currency: \"EUR\",\n    action_type: \"withdrawal\",\n  },\n  subject: {\n    entity_type: \"individual\",\n    vendor_data: \"user-12345\",\n    full_name: \"Maria Garcia\",\n  }\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Transactions.CreateAsync(new TransactionsCreateParams\n{\n    TransactionId = \"your-txn-2026-05-17-001\",\n    TransactionCategory = \"finance\",\n    TransactionDetails = new()\n    {\n        Direction = \"outbound\",\n        Amount = 1500.0,\n        Currency = \"EUR\",\n        ActionType = \"withdrawal\",\n    },\n    Subject = new()\n    {\n        EntityType = \"individual\",\n        VendorData = \"user-12345\",\n        FullName = \"Maria Garcia\",\n    },\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "transaction_id": {
                    "type": "string",
                    "description": "Ihre eindeutige Kennung für diese Transaktion (maximal 128 Zeichen).",
                    "example": "your-txn-2026-05-17-001"
                  },
                  "transaction_at": {
                    "type": "string",
                    "format": "date-time",
                    "description": "Wann die Transaktion stattgefunden hat. Standardmäßig jetzt, falls weggelassen."
                  },
                  "time_zone": {
                    "type": "string",
                    "description": "IANA-Zeitzonenkennung, z. B. `Europe/Madrid`."
                  },
                  "transaction_category": {
                    "type": "string",
                    "description": "Kategorie der Transaktion. CamelCase-Aliase (`travelRule`, `userPlatformEvent`, `gamblingBet`, …) werden ebenfalls akzeptiert; der gespeicherte/zurückgegebene Wert ist camelCase für mehrteilige Kategorien.",
                    "example": "finance",
                    "enum": [
                      "finance",
                      "kyc",
                      "travel_rule",
                      "user_event",
                      "audit_trail_event",
                      "gambling_bet",
                      "gambling_limit_change",
                      "gambling_bonus_change",
                      "travelRule"
                    ]
                  },
                  "transaction_details": {
                    "type": "object",
                    "description": "Wesentliche Finanzdaten der Transaktion.",
                    "required": [
                      "direction",
                      "amount",
                      "currency"
                    ],
                    "properties": {
                      "direction": {
                        "type": "string",
                        "description": "Richtung der Transaktion relativ zur betreffenden Entität. Groß-/Kleinschreibung wird nicht beachtet; `in`/`out` werden als Aliase akzeptiert. Wird in Großbuchstaben zurückgegeben (`INBOUND`/`OUTBOUND`).",
                        "example": "outbound",
                        "enum": [
                          "inbound",
                          "outbound",
                          "in",
                          "out"
                        ]
                      },
                      "amount": {
                        "type": "number",
                        "description": "Transaktionsbetrag (bis zu 18 Dezimalstellen). Senden Sie ihn als Dezimalstring (z. B. `\"0.123456789012345678\"`), wenn exakte Präzision erforderlich ist: Eine JSON-Zahl wird zuerst als binäre Gleitkommazahl geparst, sodass Ziffern jenseits von etwa 15 signifikanten Stellen gerundet werden, bevor der Betrag gespeichert wird. Muss null oder größer sein: Die Richtung trägt das Vorzeichen, und ein negativer Betrag gibt `400` zurück.",
                        "example": 1500
                      },
                      "currency": {
                        "type": "string",
                        "description": "Währungscode. Jeder alphabetische ISO-4217-Code wird akzeptiert (z. B. `EUR`, `USD`, `NGN`), ebenso wie ein Krypto-Asset-Symbol (z. B. `BTC`). Bevorzugen Sie einen aktuell im Umlauf befindlichen Code. Nicht jeder akzeptierte Code verfügt über einen Wechselkurs: Wenn für den Code keiner verfügbar ist (beispielsweise die ISO-Verrechnungseinheit `XSU` oder ein Krypto-Symbol, für das Didit keine Kurse bereitstellt), schlägt die automatische Konvertierung fehl und `preferred_currency_amount` wird als null zurückgegeben, es sei denn, die Anfrage enthielt einen vorkonvertierten Wert für `amount_in_default_currency`.",
                        "example": "EUR"
                      },
                      "currency_kind": {
                        "type": "string",
                        "description": "Gibt an, ob die Währung `fiat` oder `crypto` ist."
                      },
                      "amount_in_default_currency": {
                        "type": "number",
                        "nullable": true,
                        "description": "Vorab umgerechneter Betrag in der Standardwährung. Wenn weggelassen, wird eine automatische Währungsumrechnung versucht. Muss null oder größer sein."
                      },
                      "default_currency": {
                        "type": "string",
                        "description": "Der Standard-Währungscode für den umgerechneten Betrag. Jeder derzeit im Umlauf befindliche ISO-4217-Code."
                      },
                      "payment_details": {
                        "type": "string",
                        "nullable": true,
                        "description": "Freitext-Zahlungsreferenz oder -Verwendungszweck."
                      },
                      "payment_reference_id": {
                        "type": "string",
                        "nullable": true,
                        "description": "Externe Zahlungssystem-Referenz. Für das Krypto-AML-Transaktions-Hash-Screening senden Sie den Blockchain-Transaktions-Hash und übergeben Sie außerdem `subject.payment_method.account_id` mit der zugehörigen Adresse."
                      },
                      "action_type": {
                        "type": "string",
                        "nullable": true,
                        "description": "Untertyp der Transaktion, z. B. `deposit`, `withdrawal`, `transfer`."
                      },
                      "crypto_params": {
                        "type": "object",
                        "description": "Auswahl des Krypto-Netzwerks, getrennt von der Währung (dem Asset-Symbol). Die Erfassung eines benutzerdefinierten Token-Symbols garantiert keine Abdeckung von Transaktions-Hashes für den zugehörigen Vertrag.",
                        "properties": {
                          "crypto_chain": {
                            "type": "string",
                            "description": "Tatsächliches Netzwerk, das für das Screening verwendet wurde. Das verwaltete Screening unterstützt BTC, ETH, LTC, XRP, BCH, DOGE, TRX, SOL, MATIC, BNB, BASE (Base), OP (Optimism), ARB (Arbitrum One), AVAX (Avalanche C-Chain), ADA (Cardano), XLM (Stellar) und HBAR (Hedera). Gängige Netzwerknamen werden ebenfalls akzeptiert, z. B. POLYGON oder POL für MATIC, BSC für BNB und TRON für TRX. Geben Sie dies bei Multi-Chain-Token immer an. Wenn die Angabe für USDT, USDC oder ETH mit einem 0x-Transaktions-Hash fehlt, schlägt Didit den Hash auf Ethereum, BNB Chain, Polygon, Base, Arbitrum und Optimism nach und führt das Screening auf dem Netzwerk durch, auf dem er gefunden wird; wird er auf keinem Netzwerk gefunden, wird die Transaktion nicht gescreent und custom_values.aml_screening_status lautet FAILED mit dem Grund in custom_values.aml_screening_error. Wenn die Angabe für USDT oder USDC beim Screening nach Wallet (ohne Transaktions-Hash) fehlt, wird eine Tron-Adresse auf Tron, eine Solana-Adresse auf Solana und eine 0x-Adresse auf dem ersten dieser sechs Netzwerke gescreent, auf dem sie eine Transaktion gesendet hat oder das Token hält, oder auf Ethereum, wenn sie auf keinem davon aktiv ist. Die Abdeckung angebundener Anbieter variiert; LIGHTNING erfordert einen unterstützten angebundenen Anbieter.",
                            "example": "BASE"
                          }
                        }
                      }
                    }
                  },
                  "subject": {
                    "type": "object",
                    "description": "Das Subjekt (der Antragsteller) der Transaktion.",
                    "required": [
                      "vendor_data",
                      "full_name"
                    ],
                    "properties": {
                      "entity_type": {
                        "type": "string",
                        "description": "Entitätstyp: `individual` oder `company`."
                      },
                      "vendor_data": {
                        "type": "string",
                        "description": "Ihre interne Benutzer-/Unternehmenskennung.",
                        "example": "user-12345"
                      },
                      "full_name": {
                        "type": "string",
                        "description": "Vollständiger Name der Zielperson.",
                        "example": "Maria Garcia"
                      },
                      "first_name": {
                        "type": "string",
                        "description": "Vorname der Person."
                      },
                      "last_name": {
                        "type": "string",
                        "description": "Nachname der Person."
                      },
                      "date_of_birth": {
                        "type": "string",
                        "format": "date",
                        "description": "Geburtsdatum (JJJJ-MM-TT)."
                      },
                      "address": {
                        "type": "object",
                        "description": "Adressobjekt.",
                        "properties": {
                          "country": {
                            "type": "string",
                            "description": "Ländercode (ISO 3166-1 Alpha-3 empfohlen). Wird in `country_code` der Partei kopiert."
                          },
                          "town": {
                            "type": "string"
                          },
                          "state": {
                            "type": "string"
                          },
                          "street": {
                            "type": "string"
                          },
                          "post_code": {
                            "type": "string"
                          }
                        }
                      },
                      "institution_details": {
                        "type": "object",
                        "description": "Details zur Institution (für institutionelle Subjekte).",
                        "properties": {
                          "name": {
                            "type": "string"
                          },
                          "code": {
                            "type": "string"
                          },
                          "address": {
                            "type": "object"
                          }
                        }
                      },
                      "device_context": {
                        "type": "object",
                        "description": "Gerätekontext, der zum Transaktionszeitpunkt erfasst wurde. browser_family und platform müssen als explizite Top-Level-Schlüssel gesendet werden — sie werden nicht aus user_agent abgeleitet. Der camelCase-Alias device wird in der Anfrage ebenfalls akzeptiert.",
                        "properties": {
                          "fingerprint": {
                            "type": "string",
                            "description": "Eindeutiger Geräte-Fingerabdruck."
                          },
                          "persistent_device_id": {
                            "type": "string",
                            "description": "Stabiler sitzungsübergreifender Geräteidentifikator (v2-Fingerprint-Schema)."
                          },
                          "user_agent": {
                            "type": "string",
                            "description": "User-Agent-String des Browsers oder der App. CamelCase-Alias: userAgent."
                          },
                          "browser_family": {
                            "type": "string",
                            "description": "Browser-Familie (z. B. Chrome, Firefox, Safari). Muss explizit gesendet werden — wird nicht aus user_agent abgeleitet. CamelCase-Alias: browserFamily."
                          },
                          "browser_version": {
                            "type": "string",
                            "description": "Browser-Versions-String. Muss explizit gesendet werden. CamelCase-Alias: browserVersion."
                          },
                          "platform": {
                            "type": "string",
                            "description": "Plattform-Identifikator (web, ios, android, macos, windows, linux). Muss explizit gesendet werden – wird nicht aus user_agent abgeleitet."
                          },
                          "os_family": {
                            "type": "string",
                            "description": "Betriebssystemfamilie (z. B. iOS, Android, Windows). CamelCase-Alias: osFamily."
                          },
                          "os_version": {
                            "type": "string",
                            "description": "Versionszeichenfolge des Betriebssystems. CamelCase-Alias: osVersion."
                          },
                          "accept_language": {
                            "type": "string",
                            "description": "Wert des Accept-Language-Headers. CamelCase-Alias: acceptLang."
                          },
                          "session_id": {
                            "type": "string",
                            "description": "Sitzungskennung der aktuellen Sitzung des Benutzers. In den Metadaten gespeichert. CamelCase-Alias: sessionId."
                          },
                          "session_age_ms": {
                            "type": "number",
                            "description": "Alter der Benutzersitzung in Millisekunden zum Transaktionszeitpunkt. CamelCase-Alias: sessionAgeMs."
                          },
                          "network_context": {
                            "type": "object",
                            "description": "Netzwerkkontext mit IP-Adresse und Geolokalisierung. Ein übergeordneter ipInfo-Block wird ebenfalls in dieses Objekt eingefügt.",
                            "properties": {
                              "ip_address": {
                                "type": "string",
                                "description": "Client-Adresse. CamelCase-Alias: ip."
                              },
                              "ip_country_code": {
                                "type": "string",
                                "description": "Per Geo-IP aufgelöstes Land der IP-Adresse (ISO 3166-1 alpha-3). CamelCase-Alias: countryCode3."
                              },
                              "latitude": {
                                "type": "number",
                                "description": "Geografische Breite der IP-Adresse. CamelCase-Alias: lat."
                              },
                              "longitude": {
                                "type": "number",
                                "description": "Geografische Länge der IP-Adresse. CamelCase-Alias: lon."
                              }
                            }
                          }
                        }
                      },
                      "payment_method": {
                        "type": "object",
                        "description": "Vom Betreffenden verwendete Zahlungsmethode.",
                        "properties": {
                          "method_type": {
                            "type": "string",
                            "description": "Art der Zahlungsmethode: `bank_card`, `bank_account`, `crypto_wallet`, `ewallet`, `unhosted_wallet`, `other`."
                          },
                          "account_id": {
                            "type": "string",
                            "description": "Kontokennung (z. B. IBAN, Adresse). Für das Krypto-Screening sollte dieses Feld die Adresse dieses Teilnehmers enthalten. Das Screening eingehender Transaktions-Hashes erfordert die Einzahlungsadresse des Dienstes/Kunden für das Subjekt. Das Screening ausgehender Transaktionen verwendet die Ziel-Wallet der Gegenpartei. Bei einem Krypto-Transfer auf Bitcoin oder Lightning kann es sich um eine Lightning-Zahlungsanforderung (BOLT11-Rechnung, BOLT12-Angebot, LNURL) oder eine Lightning Address handeln: Didit speichert den darin genannten Zahlungsempfänger als Konto (\"\", wenn keiner genannt wird) und die Angaben der Anfrage unter `chain_details.lightning` des Travel-Rule-Transfers. Nach dem Speichern maximal 255 Zeichen. Bei einem Krypto-Transfer auf Bitcoin oder Lightning kann es sich um eine Lightning-Zahlungsanforderung (BOLT11-Rechnung, BOLT12-Angebot, LNURL) oder eine Lightning Address handeln: Didit speichert den darin genannten Zahlungsempfänger als Konto (\"\", wenn keiner genannt wird) und die Angaben der Anfrage unter `chain_details.lightning` des Travel-Rule-Transfers. Nach dem Speichern maximal 255 Zeichen."
                          },
                          "memo": {
                            "type": "string",
                            "maxLength": 256,
                            "description": "Das Destination-Tag oder Memo, das Teil der Wallet in einem Memo-Netzwerk ist (XRP, XLM, EOS, ATOM, HBAR). Bei einer gemeinsamen Exchange-Adresse ist jedes Memo eine eigene Zahlungsmethode. XRP: ein Destination-Tag, eine Ganzzahl von 0 bis 4294967295 (eine JSON-Zahl wird akzeptiert). XLM: ein Text-Memo von bis zu 28 Bytes, eine 64-Bit-ID oder ein 32-Byte-Hash in hexadezimaler Form. EOS: bis zu 256 Bytes. ATOM: bis zu 256 Zeichen. HBAR: bis zu 100 Bytes. Bitcoin-, EVM-, Solana-, Tron-, Litecoin-, Bitcoin Cash-, Dogecoin- und Lightning-Wallets unterstützen kein Memo: die Angabe eines Memos führt zu einem `400`. Alias: `destinationTag` oder `destination_tag`."
                          },
                          "issuing_country": {
                            "type": "string",
                            "description": "ISO 3166-1-Alpha-3-Ländercode des Ausstellers."
                          }
                        }
                      }
                    }
                  },
                  "counterparty": {
                    "type": "object",
                    "description": "Die Gegenpartei der Transaktion (optional).",
                    "properties": {
                      "entity_type": {
                        "type": "string",
                        "description": "Entitätstyp: `individual` oder `company`."
                      },
                      "vendor_data": {
                        "type": "string",
                        "description": "Ihre interne Kennung für die Gegenpartei."
                      },
                      "full_name": {
                        "type": "string",
                        "description": "Vollständiger Name der Gegenpartei."
                      },
                      "first_name": {
                        "type": "string"
                      },
                      "last_name": {
                        "type": "string"
                      },
                      "date_of_birth": {
                        "type": "string",
                        "format": "date"
                      },
                      "address": {
                        "type": "object",
                        "description": "Adressobjekt mit `country` (ISO 3166-1 Alpha-3)."
                      },
                      "institution_details": {
                        "type": "object"
                      },
                      "device_context": {
                        "type": "object",
                        "description": "Gerätekontext für die Gegenpartei. browser_family und platform müssen als explizite Schlüssel auf oberster Ebene übergeben werden – sie werden nicht aus user_agent abgeleitet.",
                        "properties": {
                          "fingerprint": {
                            "type": "string",
                            "description": "Eindeutiger Geräte-Fingerabdruck."
                          },
                          "persistent_device_id": {
                            "type": "string",
                            "description": "Stabiler sitzungsübergreifender Geräteidentifikator (v2-Fingerprint-Schema)."
                          },
                          "user_agent": {
                            "type": "string",
                            "description": "User-Agent-String des Browsers oder der App. CamelCase-Alias: userAgent."
                          },
                          "browser_family": {
                            "type": "string",
                            "description": "Browser-Familie (z. B. Chrome, Firefox, Safari). Muss explizit gesendet werden — wird nicht aus user_agent abgeleitet. CamelCase-Alias: browserFamily."
                          },
                          "browser_version": {
                            "type": "string",
                            "description": "Browser-Versions-String. Muss explizit gesendet werden. CamelCase-Alias: browserVersion."
                          },
                          "platform": {
                            "type": "string",
                            "description": "Plattform-Identifikator (web, ios, android, macos, windows, linux). Muss explizit gesendet werden – wird nicht aus user_agent abgeleitet."
                          },
                          "os_family": {
                            "type": "string",
                            "description": "Betriebssystemfamilie (z. B. iOS, Android, Windows). CamelCase-Alias: osFamily."
                          },
                          "os_version": {
                            "type": "string",
                            "description": "Versionszeichenfolge des Betriebssystems. CamelCase-Alias: osVersion."
                          },
                          "accept_language": {
                            "type": "string",
                            "description": "Wert des Accept-Language-Headers. CamelCase-Alias: acceptLang."
                          },
                          "session_id": {
                            "type": "string",
                            "description": "Sitzungskennung für die Sitzung der Gegenpartei. In den Metadaten gespeichert. CamelCase-Alias: sessionId."
                          },
                          "session_age_ms": {
                            "type": "number",
                            "description": "Alter der Benutzersitzung in Millisekunden zum Transaktionszeitpunkt. CamelCase-Alias: sessionAgeMs."
                          },
                          "network_context": {
                            "type": "object",
                            "description": "Netzwerkkontext mit IP-Adresse und Geolokalisierung. Ein übergeordneter ipInfo-Block wird ebenfalls in dieses Objekt eingefügt.",
                            "properties": {
                              "ip_address": {
                                "type": "string",
                                "description": "Client-Adresse. CamelCase-Alias: ip."
                              },
                              "ip_country_code": {
                                "type": "string",
                                "description": "Per Geo-IP aufgelöstes Land der IP-Adresse (ISO 3166-1 alpha-3). CamelCase-Alias: countryCode3."
                              },
                              "latitude": {
                                "type": "number",
                                "description": "Geografische Breite der IP-Adresse. CamelCase-Alias: lat."
                              },
                              "longitude": {
                                "type": "number",
                                "description": "Geografische Länge der IP-Adresse. CamelCase-Alias: lon."
                              }
                            }
                          }
                        }
                      },
                      "payment_method": {
                        "type": "object",
                        "description": "Von der Gegenpartei verwendete Zahlungsmethode. Bei travelRule-Transaktionen deklariert `method_type: \"unhosted_wallet\"` die Wallet der Gegenpartei als selbstverwahrt: Der Transfer überspringt das Gegenpartei-VASP-Routing, wird direkt in `UNCONFIRMED_OWNERSHIP` erstellt und (wenn `auto_wallet_verification` aktiviert ist) wird eine Sitzung des Wallet-Ownership-Widgets automatisch erstellt und im `action_required`-Block der Transaktion zurückgegeben.",
                        "properties": {
                          "method_type": {
                            "type": "string",
                            "description": "Art der Zahlungsmethode: `bank_card`, `bank_account`, `crypto_wallet`, `ewallet`, `unhosted_wallet`, `other`. Verwenden Sie `unhosted_wallet`, um eine selbstverwahrte Wallet für die Travel Rule anzugeben."
                          },
                          "account_id": {
                            "type": "string",
                            "description": "Kontokennung (z. B. IBAN oder Adresse). Bei einem Krypto-Transfer auf Bitcoin oder Lightning kann es sich um eine Lightning-Zahlungsanforderung (BOLT11-Rechnung, BOLT12-Angebot, LNURL) oder eine Lightning Address handeln: Didit speichert den darin genannten Zahlungsempfänger als Konto (\"\", wenn keiner genannt wird) und die Angaben der Anfrage unter `chain_details.lightning` des Travel-Rule-Transfers. Nach dem Speichern maximal 255 Zeichen. Bei einem Krypto-Transfer auf Bitcoin oder Lightning kann es sich um eine Lightning-Zahlungsanforderung (BOLT11-Rechnung, BOLT12-Angebot, LNURL) oder eine Lightning Address handeln: Didit speichert den darin genannten Zahlungsempfänger als Konto (\"\", wenn keiner genannt wird) und die Angaben der Anfrage unter `chain_details.lightning` des Travel-Rule-Transfers. Nach dem Speichern maximal 255 Zeichen."
                          },
                          "memo": {
                            "type": "string",
                            "maxLength": 256,
                            "description": "Das Destination-Tag oder Memo, das Teil der Wallet in einem Memo-Netzwerk ist (XRP, XLM, EOS, ATOM, HBAR). Bei einer gemeinsamen Exchange-Adresse ist jedes Memo eine eigene Zahlungsmethode. XRP: ein Destination-Tag, eine Ganzzahl von 0 bis 4294967295 (eine JSON-Zahl wird akzeptiert). XLM: ein Text-Memo von bis zu 28 Bytes, eine 64-Bit-ID oder ein 32-Byte-Hash in hexadezimaler Form. EOS: bis zu 256 Bytes. ATOM: bis zu 256 Zeichen. HBAR: bis zu 100 Bytes. Bitcoin-, EVM-, Solana-, Tron-, Litecoin-, Bitcoin Cash-, Dogecoin- und Lightning-Wallets unterstützen kein Memo: die Angabe eines Memos führt zu einem `400`. Alias: `destinationTag` oder `destination_tag`."
                          },
                          "issuing_country": {
                            "type": "string"
                          }
                        }
                      }
                    }
                  },
                  "custom_properties": {
                    "type": "object",
                    "description": "Beliebige Schlüssel-Wert-Paare, die an die Transaktion angehängt sind. Jeder Schlüssel kann in Regelbedingungen mit dem Feldpfad `custom_values.<key>` referenziert werden.",
                    "additionalProperties": true,
                    "example": {
                      "merchant_id": "test",
                      "bank_name": "test_2"
                    }
                  },
                  "travel_rule_details": {
                    "type": "object",
                    "description": "Travel Rule-Daten. Wenn Travel Rule aktiviert ist und transaction_category travel_rule ist, führt Didit den Austausch selbst durch: status, protocol, required und obligations_count werden ignoriert, und originator_data, beneficiary_data sowie metadata werden verwendet. Andernfalls speichert Didit diese Werte als passiven Travel Rule-Datensatz. Während Travel Rule aktiviert ist, muss ein ausgehender Transfer ab Ihrem Schwellenwert die Vorgaben des jeweiligen Regelwerks enthalten (EU TFR oder FATF-Empfehlung 16), geprüft für die von Ihnen übermittelten Seiten: Ein fehlendes Feld führt zu einer 400-Antwort unter `travel_rule_details.originator_data` oder `travel_rule_details.beneficiary_data`, beispielsweise \"EU TFR requires the originator name.\"",
                    "required": [
                      "status"
                    ],
                    "properties": {
                      "status": {
                        "type": "string",
                        "description": "Erforderlich, wann immer Sie travel_rule_details senden. Einer der Travel Rule-Transferstatus (zum Beispiel AWAITING_COUNTERPARTY, COMPLETED, NOT_APPLICABLE); Kleinbuchstaben- und camelCase-Schreibweisen sowie die veralteten Werte UNKNOWN, COMPLIANT, PENDING_ACTION, PENDING_COUNTERPARTY, FAILED und EXEMPT werden ebenfalls akzeptiert und zugeordnet. Jeder andere Wert gibt 400 zurück."
                      },
                      "protocol": {
                        "type": "string"
                      },
                      "required": {
                        "type": "boolean"
                      },
                      "obligations_count": {
                        "type": "integer"
                      },
                      "originator_data": {
                        "type": "object",
                        "description": "Auftraggeber-Partei als flache Felder oder eine IVMS-101-Person. Für Ihren Benutzer mit einer genehmigten KYC-Verifizierung ersetzt Didit die in der Verifizierung enthaltenen Felder durch die verifizierten Werte (siehe `metadata.originator_provenance`). Es muss ein Objekt sein: alles andere führt zu einem `400`. In einem Netzwerk mit Memos gibt ein `memo`-Schlüssel das Memo oder Tag der Wallet des Auftraggebers an."
                      },
                      "beneficiary_data": {
                        "type": "object",
                        "description": "Begünstigter, als flache Felder oder als eine IVMS-101-Person. Es muss ein Objekt sein: alles andere führt zu einem `400`. Um die Übertragung weiterzuleiten, liest Didit `wallet_address` (ein leerer Wert wird aus `counterparty.payment_method.account_id` übernommen), `chain` (übernommen aus `transaction_details.crypto_params.crypto_chain` oder der `currency`, wenn diese eine unterstützte Chain benennt), `name` (fällt auf `counterparty.full_name` zurück), `travel_address`, `counterparty_vasp_name`, `counterparty_vasp_lei` und `counterparty_vasp_email`. In einem Memo-Netzwerk gibt `memo` das Memo oder den Tag der Wallet des Begünstigten an; `wallet_address` und `memo` haben Vorrang vor der Zahlungsmethode der Gegenpartei."
                      },
                      "metadata": {
                        "type": "object"
                      },
                      "utxo": {
                        "allOf": [
                          {
                            "$ref": "#/components/schemas/TravelRuleUtxo"
                          }
                        ],
                        "description": "Optional, nur UTXO-Chains (BTC, LTC, BCH, DOGE). Die Inputs und Outputs der Transaktion, anhand derer Didit die Wallet des Auftraggebers und den Output des Begünstigten ableitet, wenn Sie diese nicht deklarieren."
                      },
                      "originator": {
                        "type": "object",
                        "description": "Ein IVMS-101-Auftraggeberblock: `originatorPersons` (eine `naturalPerson` oder `legalPerson`; eine juristische Person macht die Partei zu einem Unternehmen) und `accountNumber` (Wallet-Adressen). Wird für `originator_data` verwendet, wenn dieses Objekt leer ist. Ein fehlerhafter Block antwortet mit 400, aufgeschlüsselt nach seinem Pfad, zum Beispiel `originator.originatorPersons`."
                      },
                      "beneficiary": {
                        "type": "object",
                        "description": "Ein IVMS-101-Begünstigtenblock: `beneficiaryPersons` (eine `naturalPerson` oder `legalPerson`; eine juristische Person macht die Partei zu einem Unternehmen) und `accountNumber` (Wallet-Adressen). Wird für `beneficiary_data` verwendet, wenn dieses Objekt leer ist. Ein fehlerhafter Block antwortet mit 400, aufgeschlüsselt nach seinem Pfad, zum Beispiel `beneficiary.beneficiaryPersons`."
                      },
                      "ivms101": {
                        "type": "object",
                        "description": "Die `originator`- und `beneficiary`-Blöcke, verpackt in einem IVMS-101-Objekt (`IVMS101` wird ebenfalls akzeptiert). Blöcke auf oberster Ebene haben Vorrang vor denen des Wrappers."
                      }
                    }
                  },
                  "network_snapshot": {
                    "type": "object",
                    "description": "Vorberechneter Snapshot des Netzwerkgraphen.",
                    "properties": {
                      "nodes": {
                        "type": "array",
                        "items": {
                          "type": "object"
                        }
                      },
                      "edges": {
                        "type": "array",
                        "items": {
                          "type": "object"
                        }
                      },
                      "metrics": {
                        "type": "object"
                      }
                    }
                  },
                  "include_crypto_screening": {
                    "type": "boolean",
                    "nullable": true,
                    "description": "Transaktionsbezogene Überschreibung für das Krypto-Blockchain-Analyse-Screening. Wenn `true`, wird das Krypto-Screening unabhängig vom Standardwert der Anwendung durchgeführt. Wenn `false`, wird das Krypto-Screening übersprungen, selbst wenn es in den Anwendungseinstellungen aktiviert ist. Wenn weggelassen oder `null`, wird der in der Konsole konfigurierte Standardwert auf Anwendungsebene verwendet. Das Krypto-Screening erfordert `transaction_details.direction`, `currency_kind: \"crypto\"`, eine Chain/Währung und die durch die Richtung ausgewählte Wallet-Adresse: Eingehendes Pre-Transfer-Screening verwendet `counterparty.payment_method.account_id`, eingehendes Transaktions-Hash-Screening verwendet `subject.payment_method.account_id` und ausgehendes Screening verwendet `counterparty.payment_method.account_id`. Wenn `transaction_details.payment_reference_id` einen Blockchain-Transaktions-Hash enthält, führt Didit ein Transaktions-Screening durch und gibt eine Transaktionszusammenfassungs-Anreicherung zurück, sofern verfügbar."
                  }
                },
                "required": [
                  "transaction_id",
                  "transaction_category",
                  "transaction_details",
                  "subject"
                ]
              },
              "examples": {
                "Minimal fiat withdrawal": {
                  "summary": "Kleinster zulässiger Payload für einen ausgehenden Fiat-Transfer",
                  "value": {
                    "transaction_id": "your-txn-2026-05-17-001",
                    "transaction_category": "finance",
                    "transaction_details": {
                      "direction": "outbound",
                      "amount": 1500,
                      "currency": "EUR",
                      "action_type": "withdrawal"
                    },
                    "subject": {
                      "entity_type": "individual",
                      "vendor_data": "user-12345",
                      "full_name": "Maria Garcia"
                    }
                  }
                },
                "Crypto outbound with screening": {
                  "summary": "Ausgehende Krypto-Auszahlung an eine selbstverwahrte Wallet, Opt-in-Screening",
                  "value": {
                    "transaction_id": "your-txn-2026-05-17-002",
                    "transaction_category": "finance",
                    "include_crypto_screening": true,
                    "transaction_details": {
                      "direction": "outbound",
                      "amount": 0.5,
                      "currency": "BTC",
                      "currency_kind": "crypto",
                      "amount_in_default_currency": 32500,
                      "default_currency": "USD",
                      "action_type": "withdrawal"
                    },
                    "subject": {
                      "entity_type": "individual",
                      "vendor_data": "user-12345",
                      "full_name": "Maria Garcia",
                      "payment_method": {
                        "method_type": "crypto_wallet",
                        "account_id": "bc1qexampleexchangewalletaddressxyz",
                        "issuing_country": "ESP"
                      }
                    },
                    "counterparty": {
                      "entity_type": "individual",
                      "payment_method": {
                        "method_type": "unhosted_wallet",
                        "account_id": "bc1qexampleexternalwalletaddressabc"
                      }
                    }
                  }
                },
                "Travel Rule transfer": {
                  "summary": "Ausgehender Krypto-Transfer mit Travel-Rule-Daten zu Auftraggeber und Begünstigtem",
                  "value": {
                    "transaction_id": "your-txn-2026-05-17-003",
                    "transaction_category": "travel_rule",
                    "transaction_details": {
                      "direction": "outbound",
                      "amount": 25000,
                      "currency": "USDT",
                      "currency_kind": "crypto",
                      "action_type": "transfer"
                    },
                    "subject": {
                      "entity_type": "individual",
                      "vendor_data": "user-12345",
                      "full_name": "Maria Garcia",
                      "date_of_birth": "1992-03-14",
                      "address": {
                        "country": "ESP",
                        "town": "Madrid",
                        "street": "Calle Mayor 1",
                        "post_code": "28013"
                      }
                    },
                    "counterparty": {
                      "entity_type": "individual",
                      "full_name": "John Beneficiary",
                      "institution_details": {
                        "name": "Beneficiary VASP, Inc.",
                        "code": "BVASP-US"
                      }
                    },
                    "travel_rule_details": {
                      "status": "AWAITING_COUNTERPARTY",
                      "protocol": "IVMS101",
                      "required": true,
                      "originator_data": {
                        "name": "Maria Garcia"
                      },
                      "beneficiary_data": {
                        "name": "John Beneficiary"
                      }
                    }
                  }
                }
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Transaktion übermittelt und überwacht. Der Body enthält die vollständigen Transaktionsdetails (gleiche Struktur wie bei `GET /v3/transactions/{transaction_id}/`), die alle bereits angewendeten Regelergebnisse widerspiegeln.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TransactionDetail"
                },
                "examples": {
                  "Approved with no rule hits": {
                    "value": {
                      "uuid": "abcdef12-3456-4890-abcd-ef1234567890",
                      "environment": "live",
                      "transaction_number": 4123,
                      "txn_id": "your-txn-2026-05-17-001",
                      "txn_date": "2026-05-17T08:42:00Z",
                      "zone_id": "Europe/Madrid",
                      "transaction_type": "finance",
                      "action_type": "withdrawal",
                      "direction": "OUTBOUND",
                      "status": "APPROVED",
                      "source": "LIVE",
                      "amount": "1500",
                      "currency": "EUR",
                      "currency_type": "fiat",
                      "amount_in_default_currency": "1620.45",
                      "default_currency_code": "USD",
                      "preferred_currency_amount": "1620.45",
                      "preferred_currency_code": "USD",
                      "payment_details": "Withdrawal to crypto wallet",
                      "payment_txn_id": null,
                      "score": 0,
                      "severity": null,
                      "decision_reason_code": null,
                      "decision_reason_label": null,
                      "vendor_data": "user-12345",
                      "metadata": {
                        "subject": {
                          "entity_type": "individual",
                          "vendor_data": "user-12345",
                          "full_name": "Maria Garcia",
                          "address": {},
                          "institution_details": {},
                          "device_context": {}
                        },
                        "counterparty": {}
                      },
                      "props": {},
                      "tags": [],
                      "parties": [
                        {
                          "uuid": "b1111111-2222-4333-8444-555555555555",
                          "role": "APPLICANT",
                          "entity_type": "individual",
                          "kind": "USER",
                          "vendor_data": "user-12345",
                          "full_name": "Maria Garcia",
                          "first_name": null,
                          "last_name": null,
                          "country_code": null,
                          "dob": null,
                          "address": {},
                          "institution_info": {},
                          "device": {},
                          "external_party_snapshot": null
                        }
                      ],
                      "payment_methods": [],
                      "documents": [],
                      "activities": [
                        {
                          "uuid": "d4e5f6a7-8901-4bcd-9ef0-123456789abc",
                          "activity_type": "TRANSACTION_CREATED",
                          "source": "TRANSACTION",
                          "status": "APPROVED",
                          "title": "withdrawal",
                          "description": "Transaction recorded.",
                          "metadata": {},
                          "occurred_at": "2026-05-17T08:42:11Z"
                        }
                      ],
                      "alerts": [],
                      "rule_runs": [],
                      "provider_results": [],
                      "travel_rule": null,
                      "network_snapshot": null,
                      "remediation": null,
                      "action_required": null,
                      "cost_breakdown": null
                    }
                  },
                  "Flagged for review": {
                    "value": {
                      "uuid": "abcdef12-3456-4890-abcd-ef1234567891",
                      "environment": "live",
                      "transaction_number": 4124,
                      "txn_id": "your-txn-2026-05-17-002",
                      "txn_date": "2026-05-17T08:42:00Z",
                      "zone_id": "Europe/Madrid",
                      "transaction_type": "finance",
                      "action_type": "withdrawal",
                      "direction": "OUTBOUND",
                      "status": "IN_REVIEW",
                      "source": "LIVE",
                      "amount": "0.5",
                      "currency": "BTC",
                      "currency_type": "crypto",
                      "amount_in_default_currency": "32500",
                      "default_currency_code": "USD",
                      "preferred_currency_amount": "32500",
                      "preferred_currency_code": "USD",
                      "payment_details": "Withdrawal to crypto wallet",
                      "payment_txn_id": null,
                      "score": 78,
                      "severity": "HIGH",
                      "decision_reason_code": "WALLET_HIGH_RISK",
                      "decision_reason_label": "Destination wallet flagged as high risk",
                      "vendor_data": "user-12345",
                      "metadata": {
                        "subject": {
                          "entity_type": "individual",
                          "vendor_data": "user-12345",
                          "full_name": "Maria Garcia",
                          "address": {},
                          "institution_details": {},
                          "device_context": {}
                        },
                        "counterparty": {}
                      },
                      "props": {
                        "order_id": "ord-9988"
                      },
                      "tags": [],
                      "parties": [
                        {
                          "uuid": "b1111111-2222-4333-8444-555555555555",
                          "role": "APPLICANT",
                          "entity_type": "individual",
                          "kind": "USER",
                          "vendor_data": "user-12345",
                          "full_name": "Maria Garcia",
                          "first_name": null,
                          "last_name": null,
                          "country_code": null,
                          "dob": null,
                          "address": {},
                          "institution_info": {},
                          "device": {},
                          "external_party_snapshot": null
                        }
                      ],
                      "payment_methods": [],
                      "documents": [],
                      "activities": [],
                      "alerts": [
                        {
                          "uuid": "a7b8c9d0-1234-4abc-9def-567890abcdef",
                          "title": "Destination wallet flagged as high risk",
                          "description": "Provider risk score exceeded the configured threshold.",
                          "severity": "HIGH",
                          "status": "OPEN",
                          "source": "RULE",
                          "metadata": {},
                          "created_at": "2026-05-17T08:42:12Z",
                          "due_at": null
                        }
                      ],
                      "rule_runs": [
                        {
                          "uuid": "e5f6a7b8-9012-4cde-af01-23456789abcd",
                          "rule": "f6a7b8c9-0123-4def-b012-3456789abcde",
                          "rule_title": "High-risk wallet screening",
                          "rule_description": null,
                          "rule_category": "crypto",
                          "matched": true,
                          "is_test": false,
                          "mode": "ACTIVE",
                          "severity": "HIGH",
                          "score_delta": 78,
                          "status_target": "IN_REVIEW",
                          "action_summary": "score +78; change_status:IN_REVIEW",
                          "metadata": {},
                          "created_at": "2026-05-17T08:42:12Z"
                        }
                      ],
                      "provider_results": [],
                      "travel_rule": null,
                      "network_snapshot": null,
                      "remediation": null,
                      "action_required": null,
                      "cost_breakdown": null
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Validierung fehlgeschlagen (fehlende Pflichtfelder, doppelte `transaction_id`, unbekannter Enum-Wert, ungültige Währung usw.).",
            "content": {
              "application/json": {
                "examples": {
                  "Missing required field": {
                    "value": {
                      "transaction_details": {
                        "amount": [
                          "This field is required."
                        ]
                      }
                    }
                  },
                  "Duplicate transaction_id": {
                    "value": {
                      "transaction_id": [
                        "A transaction with this transaction_id already exists."
                      ]
                    }
                  },
                  "Invalid category": {
                    "value": {
                      "non_field_errors": [
                        "Unsupported transaction category."
                      ]
                    }
                  },
                  "Missing subject identity": {
                    "value": {
                      "subject": [
                        "subject.vendor_data and subject.full_name are required."
                      ]
                    }
                  },
                  "Blocklisted participant": {
                    "value": {
                      "vendor_data": [
                        "The individual 'user-12345' is in the blocklist and cannot participate in transactions."
                      ]
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Fehlender, ungültiger oder widerrufener API-Schlüssel, oder der Schlüssel kann keine Transaktionen für diese Anwendung übermitteln. Ein fehlender Schlüssel gibt `403` zurück; ein falscher, widerrufener oder abgelaufener Schlüssel gibt `401` zurück.",
            "content": {
              "application/json": {
                "examples": {
                  "Forbidden": {
                    "value": {
                      "detail": "You do not have permission to perform this action."
                    }
                  }
                }
              }
            }
          },
          "409": {
            "description": "Eine andere Anfrage mit derselben `transaction_id` hat die Transaktion erstellt, während diese verarbeitet wurde, sodass nur eine von zwei gleichzeitigen Übermittlungen erfolgreich ist. Rufen Sie die bestehende Transaktion ab, anstatt sie erneut zu übermitteln.",
            "content": {
              "application/json": {
                "examples": {
                  "Concurrent duplicate": {
                    "value": {
                      "detail": "A transaction with this transaction_id already exists."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate-Limit überschritten: Transaktionserstellungen und Ereignis-Ingestion (`POST /v3/transactions/`, `POST /v3/events/`, `POST /v3/events/batch/`) teilen sich ein Kontingent von 600 Anfragen pro Minute pro API-Schlüssel, getrennt von den 300, die sich alle anderen Schreibanfragen teilen. Warten Sie `Retry-After` Sekunden und versuchen Sie es dann erneut.",
            "headers": {
              "Retry-After": {
                "description": "Anzahl der Sekunden, die vor einem Wiederholungsversuch gewartet werden muss, aufgerundet, damit der Wiederholungsversuch im nächsten Zeitfenster liegt.",
                "schema": {
                  "type": "integer",
                  "minimum": 1,
                  "example": 30
                }
              }
            },
            "content": {
              "application/json": {
                "examples": {
                  "Throttled": {
                    "value": {
                      "detail": "Ingestion rate limit exceeded. You can make up to 600 requests per minute."
                    }
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "x-didit-sdk": {
          "resource": "transactions",
          "method": "create",
          "auth": "api_key",
          "server": true
        }
      }
    },
    "/v3/transactions/{transaction_id}/": {
      "get": {
        "summary": "Transaktion abrufen",
        "description": "Den vollständigen Überwachungsdatensatz für eine Transaktion abrufen: Parteien, Score/Schweregrad, Regelausführungen, Alerts, Travel-Rule-Ergebnis, Behebungssitzung.",
        "operationId": "getTransaction",
        "x-didit-sdk": {
          "resource": "transactions",
          "method": "retrieve",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Transactions"
        ],
        "parameters": [
          {
            "name": "transaction_id",
            "in": "path",
            "required": true,
            "description": "Stabile Transaktions-UUID von Didit (die von create / list zurückgegebene `uuid`, **nicht** Ihre `txn_id`).",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "example": "abcdef12-3456-7890-abcd-ef1234567890"
          }
        ],
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X GET 'https://verification.didit.me/v3/transactions/abcdef12-3456-7890-abcd-ef1234567890/' \\\n  -H 'x-api-key: YOUR_API_KEY'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.transactions.retrieve(\n    \"abcdef12-3456-7890-abcd-ef1234567890\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.transactions.retrieve(\"abcdef12-3456-7890-abcd-ef1234567890\");\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Transactions.Retrieve(ctx, \"abcdef12-3456-7890-abcd-ef1234567890\")\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.transactions().retrieve(\"abcdef12-3456-7890-abcd-ef1234567890\");\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->transactions->retrieve('abcdef12-3456-7890-abcd-ef1234567890');\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.transactions.retrieve(\"abcdef12-3456-7890-abcd-ef1234567890\")\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Transactions.RetrieveAsync(\"abcdef12-3456-7890-abcd-ef1234567890\");\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "responses": {
          "200": {
            "description": "Vollständige Transaktionsdetails.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TransactionDetail"
                },
                "examples": {
                  "In review with an alert": {
                    "value": {
                      "uuid": "abcdef12-3456-4890-abcd-ef1234567890",
                      "environment": "live",
                      "transaction_number": 4123,
                      "txn_id": "your-txn-2026-05-17-001",
                      "txn_date": "2026-05-17T08:42:00Z",
                      "zone_id": "Europe/Madrid",
                      "transaction_type": "finance",
                      "action_type": "withdrawal",
                      "direction": "OUTBOUND",
                      "status": "IN_REVIEW",
                      "source": "LIVE",
                      "amount": "1500",
                      "currency": "EUR",
                      "currency_type": "fiat",
                      "amount_in_default_currency": "1620.45",
                      "default_currency_code": "USD",
                      "preferred_currency_amount": "1620.45",
                      "preferred_currency_code": "USD",
                      "payment_details": "Withdrawal to crypto wallet",
                      "payment_txn_id": null,
                      "score": 78,
                      "severity": "HIGH",
                      "decision_reason_code": "WALLET_HIGH_RISK",
                      "decision_reason_label": "Destination wallet flagged as high risk",
                      "vendor_data": "user-12345",
                      "metadata": {
                        "subject": {
                          "entity_type": "individual",
                          "vendor_data": "user-12345",
                          "full_name": "Maria Garcia",
                          "address": {},
                          "institution_details": {},
                          "device_context": {}
                        },
                        "counterparty": {}
                      },
                      "props": {
                        "order_id": "ord-9988"
                      },
                      "tags": [],
                      "parties": [
                        {
                          "uuid": "b1111111-2222-4333-8444-555555555555",
                          "role": "APPLICANT",
                          "entity_type": "individual",
                          "kind": "USER",
                          "vendor_data": "user-12345",
                          "full_name": "Maria Garcia",
                          "first_name": null,
                          "last_name": null,
                          "country_code": null,
                          "dob": null,
                          "address": {},
                          "institution_info": {},
                          "device": {},
                          "external_party_snapshot": null
                        }
                      ],
                      "payment_methods": [],
                      "documents": [],
                      "activities": [],
                      "alerts": [
                        {
                          "uuid": "a7b8c9d0-1234-4abc-9def-567890abcdef",
                          "title": "Destination wallet flagged as high risk",
                          "description": "Provider risk score exceeded the configured threshold.",
                          "severity": "HIGH",
                          "status": "OPEN",
                          "source": "RULE",
                          "metadata": {},
                          "created_at": "2026-05-17T08:42:12Z",
                          "due_at": null
                        }
                      ],
                      "rule_runs": [],
                      "provider_results": [],
                      "travel_rule": null,
                      "network_snapshot": null,
                      "remediation": null,
                      "action_required": null,
                      "cost_breakdown": null
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Fehlender, ungültiger oder widerrufener API-Schlüssel, oder der Schlüssel kann die Transaktionen dieser Anwendung nicht lesen. Ein fehlender Schlüssel gibt `403` zurück; ein falscher, widerrufener oder abgelaufener Schlüssel gibt `401` zurück.",
            "content": {
              "application/json": {
                "examples": {
                  "Forbidden": {
                    "value": {
                      "detail": "You do not have permission to perform this action."
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Für die Anwendung existiert keine Transaktion mit dieser UUID (gelöscht, nie erstellt, gehört zu einer anderen Anwendung oder das Pfadsegment ist keine gültige UUID).",
            "content": {
              "application/json": {
                "examples": {
                  "Not found": {
                    "value": {
                      "detail": "Not found."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate-Limit überschritten; drosseln Sie die Anfragen und wiederholen Sie den Versuch nach dem in `Retry-After` angegebenen Intervall.",
            "content": {
              "application/json": {
                "examples": {
                  "Throttled": {
                    "value": {
                      "detail": "Request was throttled. Expected available in 30 seconds."
                    }
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/v3/transactions/sdk-token/": {
      "post": {
        "summary": "SDK-Transaktions-Token erstellen",
        "description": "Erstellen Sie ein kurzlebiges Token mit beschränktem Gültigkeitsbereich, das Ihre App an die Didit-SDKs übergibt, damit diese Transaktionen direkt vom Gerät des Endbenutzers über `POST /v1/transactions/` übermitteln können. Das Token ist an einen `vendor_data`-Wert (Ihre Benutzer-ID) gebunden: Bei jeder damit übermittelten Transaktion wird die Subjekt-Identität serverseitig anhand dieser Bindung erzwungen, sodass ein manipulierter Client keine Transaktionen im Namen eines anderen Benutzers übermitteln kann. Erstellen Sie Token über Ihr Backend – binden Sie den API-Schlüssel selbst niemals in eine App ein. camelCase-Aliase (`vendorData`, `ttlSeconds`, `maxUses`) werden ebenfalls akzeptiert.",
        "operationId": "createTransactionSdkToken",
        "x-didit-sdk": {
          "resource": "transactions",
          "method": "create_sdk_token",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Transactions"
        ],
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "vendor_data": {
                    "type": "string",
                    "description": "Ihre interne Kennung für den Endbenutzer, auf den dieses Token beschränkt ist. Wird als Identität des Subjekts jeder mit dem Token übermittelten Transaktion erzwungen.",
                    "example": "user-042"
                  },
                  "ttl_seconds": {
                    "type": "integer",
                    "default": 900,
                    "maximum": 86400,
                    "description": "Token-Lebensdauer in Sekunden. Standardmäßig 900 (15 Minuten); maximal 86400 (24 Stunden)."
                  },
                  "max_uses": {
                    "type": "integer",
                    "nullable": true,
                    "description": "Maximale Anzahl erfolgreicher Übermittlungen, die mit diesem Token zulässig sind. Weglassen oder auf null setzen für unbegrenzte Nutzungen innerhalb der TTL."
                  }
                },
                "required": [
                  "vendor_data"
                ]
              },
              "example": {
                "vendor_data": "user-042",
                "ttl_seconds": 900,
                "max_uses": 3
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X POST https://verification.didit.me/v3/transactions/sdk-token/ \\\n  -H 'x-api-key: YOUR_API_KEY' -H 'Content-Type: application/json' \\\n  -d '{\"vendor_data\": \"user-042\", \"ttl_seconds\": 900, \"max_uses\": 3}'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.transactions.create_sdk_token(\n    vendor_data=\"user-042\",\n    ttl_seconds=900,\n    max_uses=3,\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.transactions.createSdkToken({\n  vendor_data: \"user-042\",\n  ttl_seconds: 900,\n  max_uses: 3,\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Transactions.CreateSDKToken(ctx, didit.TransactionsCreateSDKTokenParams{\n\tVendorData: \"user-042\",\n\tTTLSeconds: didit.Int(900),\n\tMaxUses:    didit.Int(3),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\nimport me.didit.types.TransactionsCreateSdkTokenParams;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.transactions().createSdkToken(TransactionsCreateSdkTokenParams.builder()\n        .vendorData(\"user-042\")\n        .ttlSeconds(900L)\n        .maxUses(3L)\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->transactions->createSdkToken([\n    'vendor_data' => 'user-042',\n    'ttl_seconds' => 900,\n    'max_uses' => 3,\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.transactions.create_sdk_token(\n  vendor_data: \"user-042\",\n  ttl_seconds: 900,\n  max_uses: 3\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Transactions.CreateSdkTokenAsync(new TransactionsCreateSdkTokenParams\n{\n    VendorData = \"user-042\",\n    TtlSeconds = 900,\n    MaxUses = 3,\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "responses": {
          "201": {
            "description": "Das erstellte Token. Übergeben Sie `sdk_token` an Ihre Anwendung; es authentifiziert die geräteseitigen `/v1/transactions/`-Endpoints über den Header `X-Transaction-Token` bis `expires_at`.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "sdk_token": {
                      "type": "string",
                      "description": "Das Transaktions-Token mit eingeschränktem Geltungsbereich zur Übergabe an das SDK."
                    },
                    "expires_at": {
                      "type": "string",
                      "format": "date-time",
                      "description": "Wann das Token nicht mehr akzeptiert wird."
                    }
                  }
                },
                "example": {
                  "sdk_token": "q7Zt...urlsafe",
                  "expires_at": "2026-07-07T12:15:00Z"
                }
              }
            }
          },
          "400": {
            "description": "Validierung fehlgeschlagen: fehlende `vendor_data` oder `ttl_seconds` außerhalb des zulässigen Bereichs.",
            "content": {
              "application/json": {
                "examples": {
                  "Missing vendor_data": {
                    "value": {
                      "vendor_data": [
                        "This field is required."
                      ]
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Fehlender, ungültiger oder widerrufener API-Schlüssel.",
            "content": {
              "application/json": {
                "examples": {
                  "Invalid API Key": {
                    "value": {
                      "detail": "Invalid API Key."
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/v1/transactions/": {
      "post": {
        "summary": "Transaktion von einem SDK übermitteln",
        "description": "Geräteseitiger Endpoint, den die Didit SDKs aufrufen, um eine Transaktion direkt vom Gerät des Endbenutzers zu übermitteln. Die Authentifizierung erfolgt über ein berechtigungsbeschränktes Token von `POST /v3/transactions/sdk-token/`, das im `X-Transaction-Token`-Header anstelle eines API-Schlüssels gesendet wird, und der Endpoint ist CORS-fähig, sodass Browser ihn ursprungsübergreifend aufrufen können. Die Payload verwendet die unten gezeigten Wire-Aliase in camelCase (die `submitTransaction`-Methoden des SDKs erstellen sie für Sie). Drei serverseitige Garantien: Die Anwendung wird immer aus dem Token übernommen; die Identität des Subjekts (`externalUserId`) wird immer anhand der `vendor_data` des Tokens erzwungen, sodass manipulierte Payload-Werte ignoriert werden; und Geräteinformationen (der SDK-Geräte-Fingerprint plus serverseitig abgeleitete Adresse und User-Agent) werden dem Subjekt automatisch zugeordnet.",
        "operationId": "submitTransactionFromSdk",
        "x-didit-sdk": {
          "resource": "transactions",
          "method": "submit_from_device",
          "auth": "device_token",
          "server": false
        },
        "tags": [
          "Transactions"
        ],
        "security": [
          {
            "TransactionTokenAuth": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "txnId": {
                    "type": "string",
                    "description": "Ihre eindeutige Kennung für diese Transaktion (wird auf `transaction_id` gemappt, maximal 128 Zeichen).",
                    "example": "wd-2026-07-07-0042"
                  },
                  "txnDate": {
                    "type": "string",
                    "format": "date-time",
                    "description": "Wann die Transaktion stattgefunden hat (entspricht `transaction_at`). Standardmäßig jetzt, falls weggelassen."
                  },
                  "zoneId": {
                    "type": "string",
                    "description": "IANA-Zeitzonenkennung (wird auf `time_zone` gemappt), z. B. `Europe/Madrid`."
                  },
                  "type": {
                    "type": "string",
                    "description": "Transaktionskategorie (wird auf `transaction_category` abgebildet), z. B. `finance`, `kyc`, `travelRule`, `userPlatformEvent`, `gamblingBet`.",
                    "example": "travelRule"
                  },
                  "info": {
                    "type": "object",
                    "description": "Wesentliche Finanzdaten der Transaktion (wird auf `transaction_details` abgebildet).",
                    "required": [
                      "direction",
                      "amount",
                      "currency"
                    ],
                    "properties": {
                      "direction": {
                        "type": "string",
                        "description": "Richtung relativ zur betreffenden Entität. Groß-/Kleinschreibung wird nicht beachtet; `in`/`out` werden als Aliase akzeptiert. Wird in Großbuchstaben zurückgegeben (`INBOUND`/`OUTBOUND`).",
                        "example": "out"
                      },
                      "amount": {
                        "type": "number",
                        "description": "Transaktionsbetrag (bis zu 18 Dezimalstellen). Ein Dezimalstring wird ebenfalls akzeptiert und ist die einzige Möglichkeit, mehr als etwa 15 signifikante Stellen beizubehalten: Eine JSON-Zahl wird zuerst als binäre Gleitkommazahl geparst, sodass `0.123456789012345678` als `0.12345678901234568` gespeichert wird.",
                        "example": 0.25
                      },
                      "currency": {
                        "type": "string",
                        "description": "Währungscode. Jeder alphabetische ISO-4217-Code wird akzeptiert (z. B. `EUR`, `USD`, `NGN`), ebenso wie ein Krypto-Asset-Symbol (z. B. `BTC`). Bevorzugen Sie einen aktuell im Umlauf befindlichen Code. Nicht jeder akzeptierte Code verfügt über einen Wechselkurs: Wenn für den Code keiner verfügbar ist (beispielsweise die ISO-Verrechnungseinheit `XSU` oder ein Krypto-Symbol, für das Didit keine Kurse bereitstellt), schlägt die automatische Konvertierung fehl und `preferred_currency_amount` wird als null zurückgegeben, es sei denn, die Anfrage enthielt einen vorkonvertierten Wert für `amountInDefaultCurrency`.",
                        "example": "ETH"
                      },
                      "currencyType": {
                        "type": "string",
                        "description": "Gibt an, ob die Währung `fiat` oder `crypto` ist (entspricht `currency_kind`)."
                      },
                      "amountInDefaultCurrency": {
                        "type": "number",
                        "nullable": true,
                        "description": "Vorab umgerechneter Betrag in der Standardwährung (wird `amount_in_default_currency` zugeordnet). Wenn weggelassen, wird eine automatische Währungsumrechnung versucht."
                      },
                      "defaultCurrencyCode": {
                        "type": "string",
                        "description": "Der Standard-Währungscode für den umgerechneten Betrag (entspricht `default_currency`). Jeder derzeit im Umlauf befindliche ISO-4217-Code."
                      },
                      "paymentDetails": {
                        "type": "string",
                        "nullable": true,
                        "description": "Freitext-Zahlungsreferenz oder -Verwendungszweck (wird auf `payment_details` abgebildet)."
                      },
                      "paymentTxnId": {
                        "type": "string",
                        "nullable": true,
                        "description": "Externe Zahlungsreferenz (wird auf `payment_reference_id` gemappt); der On-Chain-Transaktions-Hash bei Krypto-Transaktionen."
                      },
                      "type": {
                        "type": "string",
                        "nullable": true,
                        "description": "Untertyp der Transaktion (wird auf `action_type` abgebildet), z. B. `deposit`, `withdrawal`, `transfer`."
                      },
                      "cryptoParams": {
                        "type": "object",
                        "description": "Krypto-spezifische Parameter, z. B. `{\"crypto_chain\": \"ETH\"}`."
                      }
                    }
                  },
                  "subject": {
                    "type": "object",
                    "description": "Das Subjekt (der Antragsteller) der Transaktion. `externalUserId` wird hier ignoriert: Die Identität des Subjekts wird immer anhand der `vendor_data` des Tokens erzwungen.",
                    "required": [
                      "fullName"
                    ],
                    "properties": {
                      "type": {
                        "type": "string",
                        "description": "Entitätstyp (entspricht `entity_type`): `individual` (Standard) oder `company`."
                      },
                      "externalUserId": {
                        "type": "string",
                        "description": "Wird für das Subjekt ignoriert – serverseitig anhand der `vendor_data` des Tokens erzwungen."
                      },
                      "fullName": {
                        "type": "string",
                        "example": "Jane Doe"
                      },
                      "firstName": {
                        "type": "string"
                      },
                      "lastName": {
                        "type": "string"
                      },
                      "dob": {
                        "type": "string",
                        "format": "date",
                        "description": "Geburtsdatum (JJJJ-MM-TT; entspricht `date_of_birth`)."
                      },
                      "address": {
                        "type": "object",
                        "description": "Adressobjekt mit `country` (ISO 3166-1 Alpha-3), `town`, `state`, `street`, `post_code`."
                      },
                      "institutionInfo": {
                        "type": "object",
                        "description": "Details zur Institution für institutionelle Teilnehmer (wird auf `institution_details` abgebildet)."
                      },
                      "device": {
                        "type": "object",
                        "description": "Optionaler expliziter Gerätekontext. Wird mit den automatisch erfassten Geräteinformationen zusammengeführt; bei Konflikten haben vom Server abgeleitete Felder Vorrang."
                      },
                      "paymentMethod": {
                        "type": "object",
                        "description": "Vom Betreffenden verwendete Zahlungsmethode (wird auf `payment_method` abgebildet).",
                        "properties": {
                          "type": {
                            "type": "string",
                            "description": "Art der Zahlungsmethode (wird auf `method_type` abgebildet), z. B. `bank_card`, `bank_account`, `crypto_wallet`, `ewallet`, `unhosted_wallet`, `other`."
                          },
                          "accountId": {
                            "type": "string",
                            "description": "Kontokennung (entspricht `account_id`): IBAN, Karten-Fingerprint oder Adresse."
                          },
                          "issuingCountry": {
                            "type": "string",
                            "description": "ISO 3166-1-Alpha-3-Ländercode des Ausstellers (wird auf `issuing_country` gemappt)."
                          }
                        }
                      }
                    }
                  },
                  "counterparty": {
                    "type": "object",
                    "description": "Die Gegenpartei der Transaktion (optional). Dieselbe Struktur wie `subject`; `externalUserId` ist hier von Bedeutung.",
                    "properties": {
                      "type": {
                        "type": "string",
                        "description": "Entitätstyp (entspricht `entity_type`): `individual` oder `company`."
                      },
                      "externalUserId": {
                        "type": "string",
                        "description": "Ihre interne Kennung für die Gegenpartei (entspricht `vendor_data`)."
                      },
                      "fullName": {
                        "type": "string"
                      },
                      "firstName": {
                        "type": "string"
                      },
                      "lastName": {
                        "type": "string"
                      },
                      "dob": {
                        "type": "string",
                        "format": "date"
                      },
                      "address": {
                        "type": "object"
                      },
                      "institutionInfo": {
                        "type": "object"
                      },
                      "device": {
                        "type": "object"
                      },
                      "paymentMethod": {
                        "type": "object",
                        "description": "Von der Gegenpartei verwendete Zahlungsmethode (wird auf `payment_method` abgebildet). Bei travelRule-Transaktionen deklariert `type: \"unhosted_wallet\"` die Wallet der Gegenpartei als selbstverwahrt: Der Transfer überspringt das Gegenpartei-VASP-Routing, wird direkt in `UNCONFIRMED_OWNERSHIP` erstellt und (wenn `auto_wallet_verification` aktiviert ist) wird eine Sitzung des Wallet-Ownership-Widgets automatisch erstellt und in `action_required` zurückgegeben, damit das SDK sie starten kann.",
                        "properties": {
                          "type": {
                            "type": "string",
                            "description": "Art der Zahlungsmethode (wird auf `method_type` abgebildet), z. B. `bank_card`, `bank_account`, `crypto_wallet`, `ewallet`, `unhosted_wallet`, `other`. Verwenden Sie `unhosted_wallet`, um eine selbstverwahrte Wallet für die Travel Rule zu deklarieren."
                          },
                          "accountId": {
                            "type": "string",
                            "description": "Kontokennung (entspricht `account_id`): IBAN, Karten-Fingerprint oder Adresse."
                          },
                          "issuingCountry": {
                            "type": "string"
                          }
                        }
                      }
                    }
                  },
                  "props": {
                    "type": "object",
                    "additionalProperties": true,
                    "description": "Benutzerdefinierte Schlüssel-Wert-Paare (werden `custom_properties` zugeordnet). Jeder Schlüssel kann in Regelbedingungen als `custom_values.<key>` referenziert werden."
                  },
                  "travelRule": {
                    "type": "object",
                    "description": "Travel Rule-Details (wird `travel_rule_details` zugeordnet). Wenn Travel Rule für die Anwendung aktiviert ist, ignoriert Didit jeden von Ihnen gesendeten `status` und führt den Austausch selbst durch.",
                    "required": [
                      "status"
                    ],
                    "properties": {
                      "status": {
                        "type": "string"
                      },
                      "protocol": {
                        "type": "string"
                      },
                      "required": {
                        "type": "boolean"
                      },
                      "obligationsCount": {
                        "type": "integer"
                      },
                      "originatorData": {
                        "type": "object"
                      },
                      "beneficiaryData": {
                        "type": "object"
                      },
                      "metadata": {
                        "type": "object"
                      }
                    }
                  },
                  "includeCryptoScreening": {
                    "type": "boolean",
                    "nullable": true,
                    "description": "Transaktionsbezogene Überschreibung für das Krypto-Blockchain-Analyse-Screening (entspricht `include_crypto_screening`)."
                  },
                  "fingerprint_v2": {
                    "type": "object",
                    "description": "Die `didit-fp-v2`-Gerätefingerabdruck-Payload. Wird von den SDKs automatisch eingefügt; nur relevant, wenn die Wire-API direkt aufgerufen wird."
                  }
                },
                "required": [
                  "txnId",
                  "type",
                  "info",
                  "subject"
                ]
              },
              "example": {
                "txnId": "wd-2026-07-07-0042",
                "type": "travelRule",
                "info": {
                  "direction": "out",
                  "amount": "0.25",
                  "currency": "ETH",
                  "currencyType": "crypto",
                  "cryptoParams": {
                    "crypto_chain": "ETH"
                  }
                },
                "subject": {
                  "fullName": "Jane Doe"
                },
                "counterparty": {
                  "fullName": "Ana Diaz",
                  "paymentMethod": {
                    "type": "unhosted_wallet",
                    "accountId": "0xBeneficiaryWallet01"
                  }
                },
                "travelRule": {
                  "status": "AWAITING_COUNTERPARTY",
                  "beneficiaryData": {
                    "wallet_address": "0xBeneficiaryWallet01",
                    "name": "Ana Diaz"
                  }
                },
                "includeCryptoScreening": true
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X POST https://verification.didit.me/v1/transactions/ \\\n  -H 'X-Transaction-Token: SDK_TOKEN' -H 'Content-Type: application/json' \\\n  -d '{\"txnId\": \"wd-2026-07-07-0042\", \"type\": \"travelRule\", \"info\": {\"direction\": \"out\", \"amount\": \"0.25\", \"currency\": \"ETH\", \"currencyType\": \"crypto\"}, \"subject\": {\"fullName\": \"Jane Doe\"}, \"counterparty\": {\"fullName\": \"Ana Diaz\", \"paymentMethod\": {\"type\": \"unhosted_wallet\", \"accountId\": \"0xBeneficiaryWallet01\"}}, \"travelRule\": {\"status\": \"AWAITING_COUNTERPARTY\", \"beneficiaryData\": {\"wallet_address\": \"0xBeneficiaryWallet01\", \"name\": \"Ana Diaz\"}}, \"includeCryptoScreening\": true}'"
          },
          {
            "lang": "javascript",
            "label": "Web SDK",
            "source": "import { DiditSdk } from '@didit-protocol/sdk-web';\n\nconst result = await DiditSdk.shared.submitTransaction({\n  transactionToken: sdkToken,\n  transaction: {\n    txnId: 'wd-2026-07-07-0042',\n    category: 'travelRule',\n    details: { direction: 'out', amount: '0.25', currency: 'ETH', currencyType: 'crypto' },\n    subject: { fullName: 'Jane Doe' },\n    counterparty: { fullName: 'Ana Diaz', paymentMethod: { type: 'unhosted_wallet', accountId: '0xBeneficiaryWallet01' } },\n    travelRule: { status: 'AWAITING_COUNTERPARTY', beneficiaryData: { wallet_address: '0xBeneficiaryWallet01', name: 'Ana Diaz' } },\n    includeCryptoScreening: true\n  },\n  onActionCompleted: (refreshed) => console.log(refreshed.status)\n});"
          }
        ],
        "responses": {
          "201": {
            "description": "Transaktion übermittelt und überwacht. Gleiche Detailstruktur wie bei `GET /v3/transactions/{transaction_id}/`, einschließlich des Blocks `action_required`, wenn der Endbenutzer eine Folgeaktion ausführen muss (die SDKs starten diese standardmäßig automatisch).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TransactionDetail"
                },
                "examples": {
                  "Wallet ownership required": {
                    "value": {
                      "uuid": "22222222-3333-4444-5555-666666666666",
                      "txn_id": "wd-2026-07-07-0042",
                      "transaction_type": "travelRule",
                      "direction": "OUTBOUND",
                      "status": "APPROVED",
                      "amount": "0.25",
                      "currency": "ETH",
                      "travel_rule": {
                        "uuid": "33333333-4444-5555-6666-777777777777",
                        "status": "UNCONFIRMED_OWNERSHIP",
                        "required": true
                      },
                      "action_required": {
                        "type": "wallet_ownership",
                        "url": "https://verify.didit.me/wallet-ownership/3s9x...urlsafe",
                        "widget_session_id": "77777777-8888-9999-aaaa-bbbbbbbbbbbb",
                        "expires_at": "2026-07-07T13:00:00Z"
                      }
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Validierung fehlgeschlagen (fehlende Pflichtfelder, doppelte `txnId`, unbekannte Kategorie).",
            "content": {
              "application/json": {
                "examples": {
                  "Missing fields": {
                    "value": {
                      "transaction_details": {
                        "currency": [
                          "This field is required."
                        ]
                      }
                    }
                  },
                  "Duplicate txnId": {
                    "value": {
                      "transaction_id": [
                        "A transaction with this transaction_id already exists."
                      ]
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Das Transaktions-Token wurde abgelehnt: fehlend, unbekannt, widerrufen, `max_uses` überschritten oder abgelaufen. Antworten für abgelaufene Token enthalten im Detail immer das Wort `expired`, wodurch die SDKs zwischen `expired_token`- und `invalid_token`-Fehlern unterscheiden.",
            "content": {
              "application/json": {
                "examples": {
                  "Invalid token": {
                    "value": {
                      "detail": "Invalid transaction token."
                    }
                  },
                  "Expired token": {
                    "value": {
                      "detail": "Transaction token expired."
                    }
                  }
                }
              }
            }
          },
          "409": {
            "description": "Eine andere Anfrage mit derselben `txnId` hat die Transaktion erstellt, während diese verarbeitet wurde, sodass nur eine von zwei gleichzeitigen Übermittlungen erfolgreich ist. Rufen Sie die bestehende Transaktion ab, anstatt sie erneut zu übermitteln.",
            "content": {
              "application/json": {
                "examples": {
                  "Concurrent duplicate": {
                    "value": {
                      "detail": "A transaction with this transaction_id already exists."
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/v1/transactions/{transaction_id}/": {
      "get": {
        "summary": "Transaktion von einem SDK abrufen",
        "description": "Geräteseitiger Lese-Endpoint, authentifiziert mit demselben `X-Transaction-Token`, das für die Übermittlung verwendet wurde. Die SDKs fragen ihn per Polling ab, nachdem ein automatisch gestarteter Aktions-Workflow abgeschlossen oder dessen Fenster geschlossen wurde, sodass der Endstatus niemals von einer einzelnen Benachrichtigung abhängt. Gibt dieselben Transaktionsdetails wie die Übermittlungsantwort zurück, einschließlich des aktuellen `action_required`-Blocks (`null`, sobald die Aktion aufgelöst ist).",
        "operationId": "getTransactionFromSdk",
        "x-didit-sdk": {
          "resource": "transactions",
          "method": "retrieve_from_device",
          "auth": "device_token",
          "server": false
        },
        "tags": [
          "Transactions"
        ],
        "parameters": [
          {
            "name": "transaction_id",
            "in": "path",
            "required": true,
            "description": "Stabile Transaktions-UUID von Didit (die `uuid` aus der Übermittlungsantwort, **nicht** Ihre `txnId`).",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "example": "22222222-3333-4444-5555-666666666666"
          }
        ],
        "security": [
          {
            "TransactionTokenAuth": []
          }
        ],
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X GET 'https://verification.didit.me/v1/transactions/22222222-3333-4444-5555-666666666666/' \\\n  -H 'X-Transaction-Token: SDK_TOKEN'"
          }
        ],
        "responses": {
          "200": {
            "description": "Die vollständigen Transaktionsdetails, einschließlich `action_required` (`null`, sobald die ausstehende Aktion erledigt ist).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TransactionDetail"
                }
              }
            }
          },
          "401": {
            "description": "Das Transaktions-Token wurde abgelehnt: fehlend, unbekannt, widerrufen, `max_uses` überschritten oder abgelaufen.",
            "content": {
              "application/json": {
                "examples": {
                  "Expired token": {
                    "value": {
                      "detail": "Transaction token expired."
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Für die Anwendung des Tokens existiert keine Transaktion mit dieser UUID, oder das Pfadsegment ist keine gültige UUID.",
            "content": {
              "application/json": {
                "examples": {
                  "Not found": {
                    "value": {
                      "detail": "Not found."
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/v3/businesses/": {
      "get": {
        "summary": "Unternehmen auflisten",
        "description": "Liste der [Unternehmen](/entities/businesses), die Didit aus KYB-Sitzungen mit denselben `vendor_data` (Freitext-String, KEINE UUID) zusammenstellt, zuzüglich über die API erstellter Unternehmen. Paginierte Ausgabe, sortiert nach `last_session_at` absteigend. Dieser Endpoint unterstützt keine Filter- oder Suchparameter – rufen Sie Seiten ab und filtern Sie clientseitig.",
        "operationId": "list_businesses",
        "x-didit-sdk": {
          "resource": "businesses",
          "method": "list",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Businesses"
        ],
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "schema": {
              "type": "integer",
              "default": 50,
              "minimum": 1,
              "maximum": 1000000
            },
            "description": "Seitengröße. Standardmäßig 50, wenn nicht angegeben. Es gibt kein festes Maximum, aber halten Sie die Seiten klein, um die Latenz gering zu halten."
          },
          {
            "name": "offset",
            "in": "query",
            "schema": {
              "type": "integer",
              "default": 0,
              "minimum": 0,
              "maximum": 1000000
            },
            "description": "Nullbasierter Offset des ersten zurückzugebenden Datensatzes. Folgen Sie vorzugsweise der `next`-URL der vorherigen Seite, statt diesen Wert manuell zu berechnen."
          }
        ],
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X GET 'https://verification.didit.me/v3/businesses/?limit=50' \\\n  -H 'x-api-key: YOUR_API_KEY'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nfor item in client.businesses.list():\n    print(item)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nfor await (const item of didit.businesses.list()) {\n  console.log(item);\n}"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\niter := client.Businesses.ListAutoPaging(ctx, didit.BusinessesListParams{})\nfor iter.Next() {\n\tfmt.Printf(\"%+v\\n\", iter.Current())\n}\nif err := iter.Err(); err != nil {\n\tlog.Fatal(err)\n}"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nfor (var item : client.businesses().list()) {\n    System.out.println(item);\n}"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\nforeach ($didit->businesses->list() as $item) {\n    print_r($item->toArray());\n}"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\ndidit.businesses.list.auto_paging_each do |item|\n  puts item.to_h\nend"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nawait foreach (var item in await client.Businesses.ListAsync())\n{\n    Console.WriteLine(JsonSerializer.Serialize(item));\n}"
          }
        ],
        "responses": {
          "200": {
            "description": "Paginierte Liste von Unternehmen mit Status, Sitzungsanzahl und Aufschlüsselung der Funktionen.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "count": {
                      "type": "integer",
                      "description": "Anzahl der übereinstimmenden Zeilen – exakt bis 100, darüber hinaus aus Performancegründen auf 100 begrenzt. Verwenden Sie diesen Wert nicht, um die letzte Seite zu erkennen; verlassen Sie sich stattdessen darauf, dass `next` `null` ist."
                    },
                    "next": {
                      "type": "string",
                      "nullable": true,
                      "description": "Absolute URL der nächsten Seite oder `null` auf der letzten Seite."
                    },
                    "previous": {
                      "type": "string",
                      "nullable": true,
                      "description": "Absolute URL der vorherigen Seite oder `null` auf der ersten Seite."
                    },
                    "results": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/BusinessListItem"
                      }
                    }
                  }
                },
                "examples": {
                  "Example": {
                    "value": {
                      "count": 1,
                      "next": null,
                      "previous": null,
                      "results": [
                        {
                          "didit_internal_id": "a1b2c3d4-e5f6-4890-abcd-ef1234567890",
                          "vendor_data": "company-123",
                          "display_name": null,
                          "legal_name": "Acme Trading Ltd",
                          "registration_number": "12345678",
                          "country_code": "GB",
                          "effective_name": "Acme Trading Ltd",
                          "status": "ACTIVE",
                          "session_count": 2,
                          "approved_count": 1,
                          "declined_count": 0,
                          "in_review_count": 1,
                          "features": {
                            "KYB": "Approved"
                          },
                          "features_list": [
                            {
                              "feature": "KYB",
                              "status": "Approved"
                            }
                          ],
                          "last_session_at": "2026-03-15T10:30:00Z",
                          "last_activity_at": "2026-03-15T10:30:00Z",
                          "first_session_at": "2026-01-10T08:00:00Z",
                          "tags": [
                            {
                              "uuid": "9a8b7c6d-5e4f-4a3b-8c2d-1e0f9a8b7c6d",
                              "name": "VIP",
                              "color": "#2567FF"
                            }
                          ],
                          "created_at": "2026-01-10T08:00:00Z"
                        }
                      ]
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Fehlender, ungültiger oder widerrufener API-Schlüssel, oder der Schlüssel kann keine Unternehmen für diese Anwendung auflisten. Ein fehlender Schlüssel gibt `403` zurück; ein falscher, widerrufener oder abgelaufener Schlüssel gibt `401` zurück.",
            "content": {
              "application/json": {
                "examples": {
                  "Forbidden": {
                    "value": {
                      "detail": "You do not have permission to perform this action."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate-Limit überschritten; drosseln Sie die Anfragen und wiederholen Sie den Versuch nach dem in `Retry-After` angegebenen Intervall.",
            "content": {
              "application/json": {
                "examples": {
                  "Rate limited": {
                    "value": {
                      "detail": "Request was throttled. Expected available in 30 seconds."
                    }
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/v3/customization/": {
      "get": {
        "summary": "Branding-Anpassung abrufen",
        "description": "Gibt das über den API-Schlüssel aufgelöste White-Label-Branding für die Anwendung zurück: Farben, Schriftarten, Eckenradien, Logo-URLs und UI/UX-Optionen. Einstellungen für benutzerdefinierte Domains und White-Label-E-Mails werden ausschließlich in der Business Console verwaltet und sind nicht Teil dieser Antwort.",
        "operationId": "get_customization",
        "x-didit-sdk": {
          "resource": "customization",
          "method": "retrieve",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Customization"
        ],
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X GET 'https://verification.didit.me/v3/customization/' \\\n  -H 'x-api-key: YOUR_API_KEY'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.customization.retrieve()\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.customization.retrieve();\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Customization.Retrieve(ctx)\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.customization().retrieve();\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->customization->retrieve();\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.customization.retrieve\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Customization.RetrieveAsync();\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "responses": {
          "200": {
            "description": "Aktuelle Branding-Anpassung für die Anwendung.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BrandingCustomization"
                },
                "examples": {
                  "Default branding": {
                    "value": {
                      "color_primary": "#000000",
                      "color_secondary": "#9DA1A1",
                      "color_background": "#FFFFFF",
                      "color_panel": "#2567FF",
                      "color_panel_10": "#1A1A1A",
                      "color_on_panel_1": "#9DA1A1",
                      "color_on_panel_2": "#F4F4F6",
                      "color_on_background": "#000000",
                      "color_button_1": "#2567FF",
                      "color_button_2": "#F8F8F8",
                      "color_button_text_1": "#FFFFFF",
                      "color_button_text_2": "#000000",
                      "color_pill_text": "#111827",
                      "border_radius_panel": 10,
                      "border_radius_buttons": 12,
                      "font_family": "Inter",
                      "font_weight": "regular",
                      "font_url": "https://fonts.googleapis.com/css2?family=Inter",
                      "logo_square": null,
                      "logo_rectangular": null,
                      "logo_rectangular_dark": null,
                      "favicon": null,
                      "app_public_name": "Acme Verify",
                      "privacy_policy_url": "https://acme.com/privacy",
                      "skip_welcome_screen": false,
                      "disable_login_with_didit": false,
                      "hide_progress_bar": false,
                      "callback_seconds": 3
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "API-Schlüssel fehlt, ist fehlerhaft, abgelaufen oder für eine andere Anwendung gültig. Ein fehlender Schlüssel gibt `403` zurück; ein falscher, widerrufener oder abgelaufener Schlüssel gibt `401` zurück.",
            "content": {
              "application/json": {
                "examples": {
                  "Invalid token": {
                    "value": {
                      "detail": "You do not have permission to perform this action."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate-Limit überschritten. Wiederholen Sie die Anfrage mit exponentiellem Backoff."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      },
      "patch": {
        "summary": "Branding-Anpassung aktualisieren",
        "description": "Partielle Aktualisierung des White-Label-Brandings der Anwendung. Senden Sie `application/json`, um Farben, Schriftarten, Radien und UI-Optionen zu ändern, oder `multipart/form-data`, um Logobilder hochzuladen. Nur die Felder, die Sie angeben, werden geändert. Benutzerdefinierte Domain und White-Label-E-Mail können nicht über diesen Endpoint festgelegt werden — verwenden Sie dafür die Business Console.",
        "operationId": "update_customization",
        "x-didit-sdk": {
          "resource": "customization",
          "method": "update",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Customization"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/BrandingCustomizationUpdate"
              },
              "examples": {
                "Update colors and font": {
                  "summary": "Branding-Farben und Schriftart ändern",
                  "value": {
                    "color_primary": "#123456",
                    "color_button_1": "#2567FF",
                    "font_family": "AR One Sans",
                    "border_radius_buttons": 16
                  }
                },
                "Update UI options": {
                  "summary": "Öffentlichen Namen und Flow-Optionen ändern",
                  "value": {
                    "app_public_name": "Acme Verify",
                    "privacy_policy_url": "https://acme.com/privacy",
                    "skip_welcome_screen": true,
                    "hide_progress_bar": true,
                    "callback_seconds": 5
                  }
                },
                "Remove a logo": {
                  "summary": "Das aktuelle rechteckige Logo löschen",
                  "value": {
                    "delete_logo_rectangular": true
                  }
                },
                "Remove the dark-mode logo": {
                  "summary": "Das aktuelle Dark-Mode-Logo löschen",
                  "value": {
                    "delete_logo_rectangular_dark": true
                  }
                }
              }
            },
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "description": "Verwenden Sie multipart/form-data nur zum Hochladen von Logobildern. Die obigen Branding-Felder können auch als Formularfelder in derselben Anfrage gesendet werden.",
                "properties": {
                  "image_square": {
                    "type": "string",
                    "format": "binary",
                    "description": "Quadratisches Logo (Seitenverhältnis 1:1). PNG, JPG oder WebP, mindestens 512 px an der langen Seite, maximal **1 MB**."
                  },
                  "image_rectangular": {
                    "type": "string",
                    "format": "binary",
                    "description": "Rechteckiges Logo (Seitenverhältnis 2:1). PNG, JPG oder WebP, mindestens 512 px an der langen Seite, höchstens **1 MB**."
                  },
                  "image_rectangular_dark": {
                    "type": "string",
                    "format": "binary",
                    "description": "Rechteckiges Logo für den Dark Mode (Seitenverhältnis 2:1), dargestellt auf dunklem Hintergrund. PNG, JPG oder WebP, mindestens 512 px an der langen Seite, höchstens **1 MB**. Wird als `logo_rectangular_dark` zurückgegeben."
                  },
                  "image_favicon": {
                    "type": "string",
                    "format": "binary",
                    "description": "Favicon-Bild. Max. **500 KB**."
                  }
                }
              },
              "example": {
                "image_rectangular": "(binary PNG logo, 2:1)",
                "image_rectangular_dark": "(binary PNG logo for dark mode, 2:1)",
                "image_favicon": "(binary favicon)"
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X PATCH 'https://verification.didit.me/v3/customization/' \\\n  -H 'x-api-key: YOUR_API_KEY' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\"color_primary\": \"#123456\", \"font_family\": \"AR One Sans\"}'"
          },
          {
            "lang": "curl",
            "label": "curl (logo upload)",
            "source": "curl -X PATCH 'https://verification.didit.me/v3/customization/' \\\n  -H 'x-api-key: YOUR_API_KEY' \\\n  -F 'image_rectangular=@logo.png' \\\n  -F 'image_rectangular_dark=@logo-dark.png' \\\n  -F 'image_favicon=@favicon.ico'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.customization.update(\n    image_rectangular=open(\"image_rectangular.jpg\", \"rb\"),\n    image_rectangular_dark=open(\"image_rectangular_dark.jpg\", \"rb\"),\n    image_favicon=open(\"image_favicon.jpg\", \"rb\"),\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit, { fileFromPath } from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.customization.update({\n  image_rectangular: await fileFromPath(\"image_rectangular.jpg\"),\n  image_rectangular_dark: await fileFromPath(\"image_rectangular_dark.jpg\"),\n  image_favicon: await fileFromPath(\"image_favicon.jpg\"),\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Customization.Update(ctx, didit.CustomizationUpdateParams{\n\tImageRectangular:     didit.Some(didit.FileFromPath(\"image_rectangular.jpg\")),\n\tImageRectangularDark: didit.Some(didit.FileFromPath(\"image_rectangular_dark.jpg\")),\n\tImageFavicon:         didit.Some(didit.FileFromPath(\"image_favicon.jpg\")),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import java.nio.file.Path;\nimport me.didit.Didit;\nimport me.didit.types.CustomizationUpdateParams;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.customization().update(CustomizationUpdateParams.builder()\n        .imageRectangular(Path.of(\"image_rectangular.jpg\"))\n        .imageRectangularDark(Path.of(\"image_rectangular_dark.jpg\"))\n        .imageFavicon(Path.of(\"image_favicon.jpg\"))\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\nuse Didit\\File;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->customization->update([\n    'image_rectangular' => File::fromPath('image_rectangular.jpg'),\n    'image_rectangular_dark' => File::fromPath('image_rectangular_dark.jpg'),\n    'image_favicon' => File::fromPath('image_favicon.jpg'),\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.customization.update(\n  image_rectangular: Pathname(\"image_rectangular.jpg\"),\n  image_rectangular_dark: Pathname(\"image_rectangular_dark.jpg\"),\n  image_favicon: Pathname(\"image_favicon.jpg\")\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Customization.UpdateAsync(new CustomizationUpdateParams\n{\n    ImageRectangular = FileUpload.FromPath(\"image_rectangular.jpg\"),\n    ImageRectangularDark = FileUpload.FromPath(\"image_rectangular_dark.jpg\"),\n    ImageFavicon = FileUpload.FromPath(\"image_favicon.jpg\"),\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "responses": {
          "200": {
            "description": "Branding aktualisiert. Das VOLLSTÄNDIGE Branding-Objekt wird zurückgegeben (alle Felder, nicht nur die geänderten).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BrandingCustomization"
                },
                "examples": {
                  "Updated": {
                    "value": {
                      "color_primary": "#123456",
                      "color_secondary": "#9DA1A1",
                      "color_background": "#FFFFFF",
                      "color_panel": "#2567FF",
                      "color_panel_10": "#1A1A1A",
                      "color_on_panel_1": "#9DA1A1",
                      "color_on_panel_2": "#F4F4F6",
                      "color_on_background": "#000000",
                      "color_button_1": "#2567FF",
                      "color_button_2": "#F8F8F8",
                      "color_button_text_1": "#FFFFFF",
                      "color_button_text_2": "#000000",
                      "color_pill_text": "#111827",
                      "border_radius_panel": 10,
                      "border_radius_buttons": 16,
                      "font_family": "AR One Sans",
                      "font_weight": "400",
                      "font_url": "https://fonts.googleapis.com/css2?family=AR+One+Sans",
                      "logo_square": null,
                      "logo_rectangular": "https://cdn.didit.me/white_label/logo_rectangular/...",
                      "logo_rectangular_dark": null,
                      "favicon": null,
                      "app_public_name": "Acme Verify",
                      "privacy_policy_url": "https://acme.com/privacy",
                      "skip_welcome_screen": true,
                      "disable_login_with_didit": false,
                      "hide_progress_bar": false,
                      "callback_seconds": 3
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Ungültiger Body. Zum Beispiel: eine fehlerhafte Hex-Farbe, eine unbekannte Schriftfamilie oder Schriftstärke, ein Feld, das nur für die Business Console bestimmt ist (`domain`, `from_email`, `verify_domain`, `force_remove_domain`, `verify_email_domain`, `force_remove_email_domain` und deren schreibgeschützte Pendants), oder ein Logo-Upload, der kein PNG-, JPG- oder WebP-Bild ist, auf der langen Seite unter 512 px liegt, größer als 1 MB ist oder das falsche Seitenverhältnis aufweist. Wird auch zurückgegeben, wenn `disable_login_with_didit` auf `false` gesetzt wird, während eine benutzerdefinierte Domain konfiguriert ist.",
            "content": {
              "application/json": {
                "examples": {
                  "Bad color": {
                    "value": {
                      "color_primary": [
                        "Invalid color format. Use '#RRGGBB' or '#RRGGBBAA' format."
                      ]
                    }
                  },
                  "Bad logo": {
                    "value": {
                      "image_rectangular": [
                        "Image aspect ratio must be 2:1. Got 1024x1024 image dimensions"
                      ]
                    }
                  },
                  "Unsupported logo format": {
                    "summary": "Kein PNG-, JPG- oder WebP-Bild (beispielsweise eine SVG)",
                    "value": {
                      "image_rectangular_dark": [
                        "Upload a PNG, JPG or WebP image."
                      ]
                    }
                  },
                  "Logo too small": {
                    "summary": "Unter 512 px auf der langen Seite",
                    "value": {
                      "image_rectangular": [
                        "Image must be at least 512 px on its long side. Got 400x200 image dimensions"
                      ]
                    }
                  },
                  "Logo too large": {
                    "summary": "Über 1 MB",
                    "value": {
                      "image_square": [
                        "File size should not exceed 1 MB"
                      ]
                    }
                  },
                  "Console-only field": {
                    "value": {
                      "domain": [
                        "Manage this field in the Business Console."
                      ]
                    }
                  },
                  "Bad font weight": {
                    "value": {
                      "font_weight": [
                        "Font weight 950 is not available for Inter. Available weights are: 100, 200, 300, 400, 500, 600, 700, 800, 900"
                      ]
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "API-Schlüssel fehlt, ist fehlerhaft, abgelaufen oder für eine andere Anwendung gültig. Ein fehlender Schlüssel gibt `403` zurück; ein falscher, widerrufener oder abgelaufener Schlüssel gibt `401` zurück.",
            "content": {
              "application/json": {
                "examples": {
                  "Invalid token": {
                    "value": {
                      "detail": "You do not have permission to perform this action."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate-Limit überschritten. Wiederholen Sie die Anfrage mit exponentiellem Backoff."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/v3/businesses/{vendor_data}/": {
      "get": {
        "summary": "Unternehmen abrufen",
        "description": "Ruft ein [Unternehmen](/entities/businesses) anhand von `vendor_data` ab (exakte Übereinstimmung). Ergänzt die Listenansicht um `metadata` und `updated_at`. Gelöschte Unternehmen geben 404 zurück.",
        "operationId": "get_business",
        "x-didit-sdk": {
          "resource": "businesses",
          "method": "retrieve",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Businesses"
        ],
        "parameters": [
          {
            "name": "vendor_data",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Ihre eindeutige Kennung für das Unternehmen — ein Freitext-String (KEINE UUID), exakt wie übermittelt abgeglichen.",
            "example": "company-123"
          }
        ],
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X GET 'https://verification.didit.me/v3/businesses/company-123/' \\\n  -H 'x-api-key: YOUR_API_KEY'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.businesses.retrieve(\n    \"company-123\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.businesses.retrieve(\"company-123\");\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Businesses.Retrieve(ctx, \"company-123\")\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.businesses().retrieve(\"company-123\");\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->businesses->retrieve('company-123');\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.businesses.retrieve(\"company-123\")\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Businesses.RetrieveAsync(\"company-123\");\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "responses": {
          "200": {
            "description": "Vollständige Unternehmensdetails einschließlich Metadaten und aggregierten Sitzungsdaten.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BusinessDetailItem"
                },
                "examples": {
                  "Active business": {
                    "value": {
                      "didit_internal_id": "a1b2c3d4-e5f6-4890-abcd-ef1234567890",
                      "vendor_data": "company-123",
                      "display_name": null,
                      "legal_name": "Acme Trading Ltd",
                      "registration_number": "12345678",
                      "country_code": "GB",
                      "effective_name": "Acme Trading Ltd",
                      "status": "ACTIVE",
                      "session_count": 2,
                      "approved_count": 1,
                      "declined_count": 0,
                      "in_review_count": 1,
                      "features": {
                        "KYB": "Approved"
                      },
                      "features_list": [
                        {
                          "feature": "KYB",
                          "status": "Approved"
                        }
                      ],
                      "last_session_at": "2026-03-15T10:30:00Z",
                      "last_activity_at": "2026-03-15T10:30:00Z",
                      "first_session_at": "2026-01-10T08:00:00Z",
                      "tags": [
                        {
                          "uuid": "9a8b7c6d-5e4f-4a3b-8c2d-1e0f9a8b7c6d",
                          "name": "VIP",
                          "color": "#2567FF"
                        }
                      ],
                      "created_at": "2026-01-10T08:00:00Z",
                      "metadata": {
                        "industry": "fintech"
                      },
                      "updated_at": "2026-03-15T10:30:00Z"
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Fehlender, ungültiger oder widerrufener API-Schlüssel, oder der Schlüssel kann die Unternehmen dieser Anwendung nicht lesen. Ein fehlender Schlüssel gibt `403` zurück; ein falscher, widerrufener oder abgelaufener Schlüssel gibt `401` zurück.",
            "content": {
              "application/json": {
                "examples": {
                  "Forbidden": {
                    "value": {
                      "detail": "You do not have permission to perform this action."
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Für diese Anwendung existiert kein (nicht gelöschtes) Unternehmen mit den angegebenen `vendor_data`.",
            "content": {
              "application/json": {
                "examples": {
                  "Not found": {
                    "value": {
                      "detail": "Not found."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate-Limit überschritten; drosseln Sie die Anfragen und wiederholen Sie den Versuch nach dem in `Retry-After` angegebenen Intervall.",
            "content": {
              "application/json": {
                "examples": {
                  "Rate limited": {
                    "value": {
                      "detail": "Request was throttled. Expected available in 30 seconds."
                    }
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      },
      "patch": {
        "summary": "Unternehmen aktualisieren",
        "description": "Partielle Aktualisierung eines Unternehmens: `display_name`, `legal_name`, `registration_number`, `country_code`, `status`, `metadata`. `metadata` ersetzt vollständig. Das Setzen von `status` auf `BLOCKED` fügt die `vendor_data` zur System-Sperrliste hinzu; das Ändern weg von `BLOCKED` entfernt diesen Eintrag. Jede Bearbeitung wird in der Aktivität des Unternehmens protokolliert: eine Statusänderung mit dem optionalen `reason` und eine Änderung an `display_name`, `legal_name`, `registration_number`, `country_code` oder `metadata` als Profilaktualisierung.",
        "operationId": "update_business",
        "x-didit-sdk": {
          "resource": "businesses",
          "method": "update",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Businesses"
        ],
        "parameters": [
          {
            "name": "vendor_data",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Ihre eindeutige Kennung für das Unternehmen (Freitext-String, KEINE UUID).",
            "example": "company-123"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "description": "Body für partielle Aktualisierung. Geben Sie nur die Felder an, die Sie ändern möchten.",
                "properties": {
                  "display_name": {
                    "type": "string",
                    "nullable": true,
                    "description": "Benutzerfreundlicher Anzeigename, der in der Konsole angezeigt wird (hat für die UI-Anzeige Vorrang vor `legal_name`)."
                  },
                  "legal_name": {
                    "type": "string",
                    "nullable": true,
                    "description": "Offizieller juristischer Name aus dem Register oder manueller Eingabe."
                  },
                  "registration_number": {
                    "type": "string",
                    "nullable": true,
                    "description": "Unternehmensregister- oder Gründungsnummer."
                  },
                  "country_code": {
                    "type": "string",
                    "nullable": true,
                    "description": "Gründungsland (ISO 3166-1 Alpha-2, z. B. `GB`, `US`)."
                  },
                  "status": {
                    "type": "string",
                    "enum": [
                      "ACTIVE",
                      "FLAGGED",
                      "BLOCKED"
                    ],
                    "description": "Lebenszyklusstatus des Unternehmens. Das Festlegen von `BLOCKED` fügt `vendor_data` automatisch der Systemsperrliste hinzu; der Wechsel von `BLOCKED` zu einem anderen Status entfernt diesen Sperrlisteneintrag wieder."
                  },
                  "metadata": {
                    "type": "object",
                    "nullable": true,
                    "description": "Beliebiges JSON-Objekt, das Sie an das Unternehmen anhängen. **Ersetzt vollständig** die vorhandenen Metadaten bei einer Aktualisierung – führen Sie diese clientseitig zusammen, wenn Sie nur Schlüssel hinzufügen möchten."
                  },
                  "reason": {
                    "type": "string",
                    "nullable": true,
                    "maxLength": 1000,
                    "description": "Warum sich der Status geändert hat. Wird im Statusänderungseintrag unter **Activity** des Unternehmens in der Business Console erfasst, nur wenn sich der Status tatsächlich ändert. Webhooks übertragen dies nicht."
                  }
                }
              },
              "examples": {
                "Update name": {
                  "summary": "Anzeigenamen aktualisieren",
                  "value": {
                    "display_name": "Acme Corp"
                  }
                },
                "Flag for review": {
                  "summary": "Status umschalten",
                  "value": {
                    "status": "FLAGGED"
                  }
                },
                "Add metadata": {
                  "summary": "Metadaten-JSON ersetzen",
                  "value": {
                    "metadata": {
                      "industry": "fintech",
                      "risk_level": "low"
                    }
                  }
                },
                "Fix registry data": {
                  "summary": "Extrahierte Felder korrigieren",
                  "value": {
                    "legal_name": "Acme Trading International Ltd",
                    "registration_number": "12345678",
                    "country_code": "GB"
                  }
                },
                "Flag with reason": {
                  "summary": "Das Unternehmen markieren und den Grund erfassen",
                  "value": {
                    "status": "FLAGGED",
                    "reason": "Ownership structure under review"
                  }
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X PATCH 'https://verification.didit.me/v3/businesses/company-123/' \\\n  -H 'x-api-key: YOUR_API_KEY' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\"display_name\": \"Acme Corp\", \"status\": \"FLAGGED\"}'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.businesses.update(\n    \"company-123\",\n    display_name=\"Acme Corp\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.businesses.update(\"company-123\", {\n  display_name: \"Acme Corp\",\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Businesses.Update(ctx, \"company-123\", didit.BusinessesUpdateParams{\n\tDisplayName: didit.String(\"Acme Corp\"),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\nimport me.didit.types.BusinessesUpdateParams;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.businesses().update(\"company-123\", BusinessesUpdateParams.builder()\n        .displayName(\"Acme Corp\")\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->businesses->update('company-123', [\n    'display_name' => 'Acme Corp',\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.businesses.update(\n  \"company-123\",\n  display_name: \"Acme Corp\"\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Businesses.UpdateAsync(\"company-123\", new BusinessesUpdateParams\n{\n    DisplayName = \"Acme Corp\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "responses": {
          "200": {
            "description": "Unternehmen aktualisiert. Der vollständige aktualisierte Unternehmensdatensatz wird zurückgegeben.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BusinessDetailItem"
                },
                "examples": {
                  "Updated": {
                    "value": {
                      "didit_internal_id": "a1b2c3d4-e5f6-4890-abcd-ef1234567890",
                      "vendor_data": "company-123",
                      "display_name": "Acme Corp",
                      "legal_name": "Acme Trading Ltd",
                      "registration_number": "12345678",
                      "country_code": "GB",
                      "effective_name": "Acme Corp",
                      "status": "FLAGGED",
                      "session_count": 2,
                      "approved_count": 1,
                      "declined_count": 0,
                      "in_review_count": 1,
                      "features": {
                        "KYB": "Approved"
                      },
                      "features_list": [
                        {
                          "feature": "KYB",
                          "status": "Approved"
                        }
                      ],
                      "last_session_at": "2026-03-15T10:30:00Z",
                      "last_activity_at": "2026-03-15T10:30:00Z",
                      "first_session_at": "2026-01-10T08:00:00Z",
                      "tags": [
                        {
                          "uuid": "9a8b7c6d-5e4f-4a3b-8c2d-1e0f9a8b7c6d",
                          "name": "VIP",
                          "color": "#2567FF"
                        }
                      ],
                      "created_at": "2026-01-10T08:00:00Z",
                      "metadata": {
                        "industry": "fintech",
                        "risk_level": "low"
                      },
                      "updated_at": "2026-03-15T10:30:00Z"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Ungültiger Body: typischerweise ein unbekannter `status`, fehlerhaftes `metadata` oder ein `reason` mit mehr als 1000 Zeichen.",
            "content": {
              "application/json": {
                "examples": {
                  "Bad status": {
                    "value": {
                      "status": [
                        "Invalid status. Valid options are: ACTIVE, FLAGGED, BLOCKED"
                      ]
                    }
                  },
                  "Bad metadata": {
                    "value": {
                      "metadata": [
                        "Metadata must be a JSON object."
                      ]
                    }
                  },
                  "Reason too long": {
                    "value": {
                      "reason": [
                        "Ensure this field has no more than 1000 characters."
                      ]
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Fehlender, ungültiger oder widerrufener API-Schlüssel, oder der Schlüssel kann keine Unternehmen für diese Anwendung aktualisieren. Ein fehlender Schlüssel gibt `403` zurück; ein falscher, widerrufener oder abgelaufener Schlüssel gibt `401` zurück.",
            "content": {
              "application/json": {
                "examples": {
                  "Forbidden": {
                    "value": {
                      "detail": "You do not have permission to perform this action."
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Für diese Anwendung existiert kein (nicht gelöschtes) Unternehmen mit den angegebenen `vendor_data`.",
            "content": {
              "application/json": {
                "examples": {
                  "Not found": {
                    "value": {
                      "detail": "Not found."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate-Limit überschritten; drosseln Sie die Anfragen und wiederholen Sie den Versuch nach dem in `Retry-After` angegebenen Intervall.",
            "content": {
              "application/json": {
                "examples": {
                  "Rate limited": {
                    "value": {
                      "detail": "Request was throttled. Expected available in 30 seconds."
                    }
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/v3/businesses/{vendor_data}/update-status/": {
      "patch": {
        "summary": "Unternehmensstatus aktualisieren",
        "description": "Nur den Lebenszyklus-`status` eines Unternehmens umschalten: `ACTIVE`, `FLAGGED` oder `BLOCKED` (keine Sitzungsstatus). `BLOCKED` fügt die `vendor_data` zur System-Sperrliste hinzu; ein Wechsel weg von `BLOCKED` entfernt diesen Eintrag wieder. Jede Änderung wird in den Aktivitäten des Unternehmens mit dem optionalen `reason` erfasst. Das Senden des aktuellen Status ändert nichts und erfasst keinen `reason`. Der Webhook `business.status.updated` überträgt keinen `reason`.",
        "operationId": "update_business_status",
        "x-didit-sdk": {
          "resource": "businesses",
          "method": "update_status",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Businesses"
        ],
        "parameters": [
          {
            "name": "vendor_data",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Ihre eindeutige Kennung für das Unternehmen (Freitext-String, KEINE UUID).",
            "example": "company-123"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "allOf": [
                  {
                    "$ref": "#/components/schemas/EntityStatusUpdateRequest"
                  },
                  {
                    "type": "object",
                    "properties": {
                      "reason": {
                        "type": "string",
                        "nullable": true,
                        "maxLength": 1000,
                        "description": "Warum sich der Status geändert hat. Wird im Statusänderungseintrag unter **Activity** des Unternehmens in der Business Console erfasst, nur wenn sich der Status tatsächlich ändert. Webhooks übertragen dies nicht."
                      }
                    }
                  }
                ]
              },
              "examples": {
                "Flag": {
                  "summary": "Das Unternehmen zur Prüfung markieren",
                  "value": {
                    "status": "FLAGGED"
                  }
                },
                "Block": {
                  "summary": "Unternehmen sperren (fügt es zur Systemsperrliste hinzu)",
                  "value": {
                    "status": "BLOCKED"
                  }
                },
                "Reactivate": {
                  "summary": "Unternehmen reaktivieren",
                  "value": {
                    "status": "ACTIVE"
                  }
                },
                "Block with reason": {
                  "summary": "Unternehmen sperren und Grund erfassen",
                  "value": {
                    "status": "BLOCKED",
                    "reason": "Registry shows the company dissolved"
                  }
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X PATCH 'https://verification.didit.me/v3/businesses/company-123/update-status/' \\\n  -H 'x-api-key: YOUR_API_KEY' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\"status\": \"BLOCKED\"}'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.businesses.update_status(\n    \"company-123\",\n    status=\"FLAGGED\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.businesses.updateStatus(\"company-123\", {\n  status: \"FLAGGED\",\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Businesses.UpdateStatus(ctx, \"company-123\", didit.BusinessesUpdateStatusParams{\n\tStatus: \"FLAGGED\",\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\nimport me.didit.types.BusinessesUpdateStatusParams;\nimport me.didit.types.EntityStatusUpdateRequest;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.businesses().updateStatus(\"company-123\", BusinessesUpdateStatusParams.builder()\n        .status(EntityStatusUpdateRequest.Status.of(\"FLAGGED\"))\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->businesses->updateStatus('company-123', [\n    'status' => 'FLAGGED',\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.businesses.update_status(\n  \"company-123\",\n  status: \"FLAGGED\"\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Businesses.UpdateStatusAsync(\"company-123\", new BusinessesUpdateStatusParams\n{\n    Status = \"FLAGGED\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "responses": {
          "200": {
            "description": "Unternehmensstatus aktualisiert. Vollständiger Unternehmensdatensatz zurückgegeben.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BusinessDetailItem"
                },
                "examples": {
                  "Blocked": {
                    "value": {
                      "didit_internal_id": "a1b2c3d4-e5f6-4890-abcd-ef1234567890",
                      "vendor_data": "company-123",
                      "display_name": null,
                      "legal_name": "Acme Trading Ltd",
                      "registration_number": "12345678",
                      "country_code": "GB",
                      "effective_name": "Acme Trading Ltd",
                      "status": "BLOCKED",
                      "session_count": 2,
                      "approved_count": 1,
                      "declined_count": 0,
                      "in_review_count": 1,
                      "features": {
                        "KYB": "Approved"
                      },
                      "features_list": [
                        {
                          "feature": "KYB",
                          "status": "Approved"
                        }
                      ],
                      "last_session_at": "2026-03-15T10:30:00Z",
                      "last_activity_at": "2026-03-15T10:30:00Z",
                      "first_session_at": "2026-01-10T08:00:00Z",
                      "tags": [
                        {
                          "uuid": "9a8b7c6d-5e4f-4a3b-8c2d-1e0f9a8b7c6d",
                          "name": "VIP",
                          "color": "#2567FF"
                        }
                      ],
                      "created_at": "2026-01-10T08:00:00Z",
                      "metadata": {
                        "industry": "fintech"
                      },
                      "updated_at": "2026-03-15T10:30:00Z"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Fehlender oder ungültiger `status` oder ein `reason` mit mehr als 1000 Zeichen.",
            "content": {
              "application/json": {
                "examples": {
                  "Missing status": {
                    "value": {
                      "status": [
                        "This field is required."
                      ]
                    }
                  },
                  "Bad status": {
                    "value": {
                      "status": [
                        "Invalid status. Valid options are: ACTIVE, FLAGGED, BLOCKED"
                      ]
                    }
                  },
                  "Reason too long": {
                    "value": {
                      "reason": [
                        "Ensure this field has no more than 1000 characters."
                      ]
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Fehlender, ungültiger oder widerrufener API-Schlüssel, oder der Schlüssel kann keine Unternehmen für diese Anwendung aktualisieren. Ein fehlender Schlüssel gibt `403` zurück; ein falscher, widerrufener oder abgelaufener Schlüssel gibt `401` zurück.",
            "content": {
              "application/json": {
                "examples": {
                  "Forbidden": {
                    "value": {
                      "detail": "You do not have permission to perform this action."
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Für diese Anwendung existiert kein (nicht gelöschtes) Unternehmen mit den angegebenen `vendor_data`.",
            "content": {
              "application/json": {
                "examples": {
                  "Not found": {
                    "value": {
                      "detail": "Not found."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate-Limit überschritten; drosseln Sie die Anfragen und wiederholen Sie den Versuch nach dem in `Retry-After` angegebenen Intervall.",
            "content": {
              "application/json": {
                "examples": {
                  "Rate limited": {
                    "value": {
                      "detail": "Request was throttled. Expected available in 30 seconds."
                    }
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/v3/businesses/delete/": {
      "post": {
        "summary": "Unternehmen im Batch löschen",
        "description": "**Unternehmen dauerhaft löschen** — dies kann nicht rückgängig gemacht werden. Zum Blockieren empfiehlt sich [Unternehmensstatus aktualisieren](#patch-/v3/businesses/-vendor_data-/update-status/) mit `BLOCKED`.\n\n**Eingereichte behördliche Berichte:** Befinden sich die ausgewählten Daten in einem finalisierten behördlichen Bericht, wird die gesamte Anfrage mit `409` abgelehnt und nichts wird gelöscht. Der Body verwendet `code: in_filed_report` und benennt jeden Bericht mit `uuid`, `report_number`, `report_type` und `case_uuid`. Löschen Sie die Berichte und wiederholen Sie dann die Anfrage.",
        "operationId": "batch_delete_businesses",
        "x-didit-sdk": {
          "resource": "businesses",
          "method": "batch_delete",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Businesses"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "description": "Geben Sie `vendor_data_list`, `didit_internal_id_list` oder `delete_all: true` an. Rangfolge, wenn mehrere gesendet werden: `delete_all` > `vendor_data_list` > `didit_internal_id_list` (nur der Selektor mit dem höchsten Vorrang wird verwendet).",
                "properties": {
                  "vendor_data_list": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    },
                    "description": "Ihre eigenen zu löschenden Kennungen, exakt so abgeglichen wie übermittelt."
                  },
                  "didit_internal_id_list": {
                    "type": "array",
                    "items": {
                      "type": "string",
                      "format": "uuid"
                    },
                    "description": "Zu löschende interne Didit-UUIDs (`didit_internal_id`)."
                  },
                  "delete_all": {
                    "type": "boolean",
                    "default": false,
                    "description": "Wenn `true`, werden alle Unternehmen in der Anwendung gelöscht. Kann nicht mit den Listen-Selektoren kombiniert werden."
                  }
                }
              },
              "examples": {
                "Specific businesses": {
                  "summary": "Nach vendor_data löschen",
                  "value": {
                    "vendor_data_list": [
                      "company-123",
                      "company-456"
                    ]
                  }
                },
                "Specific internal IDs": {
                  "summary": "Nach didit_internal_id löschen",
                  "value": {
                    "didit_internal_id_list": [
                      "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
                      "b2c3d4e5-f6a7-8901-bcde-f12345678901"
                    ]
                  }
                },
                "All businesses": {
                  "summary": "Alle Unternehmen in dieser Anwendung löschen",
                  "value": {
                    "delete_all": true
                  }
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X POST 'https://verification.didit.me/v3/businesses/delete/' \\\n  -H 'x-api-key: YOUR_API_KEY' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\"vendor_data_list\": [\"company-123\", \"company-456\"]}'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.businesses.batch_delete(\n    vendor_data_list=[\"company-123\", \"company-456\"],\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.businesses.batchDelete({\n  vendor_data_list: [\"company-123\", \"company-456\"],\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Businesses.BatchDelete(ctx, didit.BusinessesBatchDeleteParams{\n\tVendorDataList: didit.Some([]string{\"company-123\", \"company-456\"}),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import java.util.List;\nimport me.didit.Didit;\nimport me.didit.types.BusinessesBatchDeleteParams;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.businesses().batchDelete(BusinessesBatchDeleteParams.builder()\n        .vendorDataList(List.of(\"company-123\", \"company-456\"))\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->businesses->batchDelete([\n    'vendor_data_list' => ['company-123', 'company-456'],\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.businesses.batch_delete(vendor_data_list: [\"company-123\", \"company-456\"])\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Businesses.BatchDeleteAsync(new BusinessesBatchDeleteParams\n{\n    VendorDataList = new string[] { \"company-123\", \"company-456\" },\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "responses": {
          "200": {
            "description": "Unternehmen gelöscht. Gibt die Anzahl der tatsächlich entfernten Zeilen zurück.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "deleted": {
                      "type": "integer",
                      "description": "Anzahl der gelöschten Unternehmen (schließt vendor_data-Werte aus, die mit nichts übereinstimmten)."
                    }
                  }
                },
                "examples": {
                  "Deleted some": {
                    "value": {
                      "deleted": 2
                    }
                  },
                  "Nothing matched": {
                    "value": {
                      "deleted": 0
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Kein Selektor angegeben (alle drei von `vendor_data_list`, `didit_internal_id_list` und `delete_all` fehlen oder sind leer). Der Fehler-Body ist ein JSON-Array.",
            "content": {
              "application/json": {
                "examples": {
                  "Missing selector": {
                    "value": [
                      "Provide vendor_data_list, didit_internal_id_list, or set delete_all=true."
                    ]
                  }
                }
              }
            }
          },
          "403": {
            "description": "Fehlender, ungültiger oder widerrufener API-Schlüssel, oder der Schlüssel kann keine Unternehmen für diese Anwendung löschen. Ein fehlender Schlüssel gibt `403` zurück; ein falscher, widerrufener oder abgelaufener Schlüssel gibt `401` zurück.",
            "content": {
              "application/json": {
                "examples": {
                  "Forbidden": {
                    "value": {
                      "detail": "You do not have permission to perform this action."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate-Limit überschritten; drosseln Sie die Anfragen und wiederholen Sie den Versuch nach dem in `Retry-After` angegebenen Intervall.",
            "content": {
              "application/json": {
                "examples": {
                  "Rate limited": {
                    "value": {
                      "detail": "Request was throttled. Expected available in 30 seconds."
                    }
                  }
                }
              }
            }
          },
          "409": {
            "description": "Es wird nichts gelöscht. `code` gibt den Grund an: `in_filed_report`, wenn die Auswahl ein Unternehmen in einem finalisierten behördlichen Bericht enthält, `subject_deletion_in_progress`, wenn eine andere Anfrage noch eines der ausgewählten Unternehmen löscht. Wiederholen Sie die Anfrage, sobald dieser Löschvorgang abgeschlossen ist.",
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "$ref": "#/components/schemas/InFiledReportError"
                    },
                    {
                      "$ref": "#/components/schemas/SubjectDeletionInProgressError"
                    }
                  ]
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/v3/users/aml-monitoring/": {
      "post": {
        "summary": "Laufende AML-Überwachung für Benutzer aktivieren oder deaktivieren",
        "description": "Schaltet die laufende AML-Überwachung für die ausgewählten Benutzer ein oder aus, mit derselben Semantik wie die Business Console. Pro Benutzer wird genau ein überwachtes AML-Screening beibehalten, sodass ein Profil, das sich mehrmals verifiziert hat, einmal überwacht und abgerechnet wird; das Deaktivieren schaltet die Überwachung für alle Screenings des Profils ab. Benutzer ohne jegliches AML-Screening werden zuerst gescreent (abgerechnet als reguläres AML-Screening), wenn sie den erforderlichen vollständigen Namen sowie das erforderliche Geburtsdatum und Land haben; andernfalls werden sie als `skipped_no_identity_data` gemeldet.\n\nSetzen Sie `estimate_only: true`, um eine Vorschau der Anzahlen und Kosten anzuzeigen, ohne Änderungen zu schreiben. Auswahlen von 20 oder weniger Profilen werden direkt aufgelöst und geben `200` mit dem abgeschlossenen Job zurück; größere Auswahlen geben `202` zurück und laufen im Hintergrund – fragen Sie [AML-Überwachungsjob abrufen](#get-/v3/aml-monitoring/jobs/-job_id-/) mit der zurückgegebenen `job_id` ab. Die Aktivierung wird mit `403` abgelehnt, wenn das Guthaben der Organisation die Schätzung nicht deckt. Bezeichner, die mit nichts übereinstimmen, werden in `unmatched` aufgeführt und führen nie zum Fehlschlagen der Anfrage: Eine Auswahl, die mit nichts übereinstimmt, wird als leerer Job (`total` 0) abgeschlossen – dieselbe Konvention wie bei den Batch-Lösch-Endpoints.",
        "operationId": "toggle_users_aml_monitoring",
        "x-didit-sdk": {
          "resource": "users",
          "method": "set_aml_monitoring",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "AML Ongoing Monitoring"
        ],
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "is_enabled"
                ],
                "description": "Wählen Sie Benutzer mit `vendor_data_list`, `didit_internal_id_list` oder beiden aus (die beiden Listen werden ODER-verknüpft). Maximal 1000 IDs pro Anfrage über beide Listen hinweg.",
                "properties": {
                  "is_enabled": {
                    "type": "boolean",
                    "description": "true, um die Überwachung zu aktivieren, false, um sie zu deaktivieren."
                  },
                  "estimate_only": {
                    "type": "boolean",
                    "default": false,
                    "description": "Wenn true, wird die Kostenschätzung zurückgegeben und es werden keine Schreibvorgänge ausgeführt – kein Screening, keine Abrechnung, kein Job."
                  },
                  "vendor_data_list": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    },
                    "description": "Ihre eigenen Kennungen der umzuschaltenden Benutzer, exakt so abgeglichen wie übermittelt."
                  },
                  "didit_internal_id_list": {
                    "type": "array",
                    "items": {
                      "type": "string",
                      "format": "uuid"
                    },
                    "description": "Interne Didit-IDs der umzuschaltenden Benutzer – die von den Create-, Get- und List-Endpoints zurückgegebene `didit_internal_id`."
                  }
                }
              },
              "examples": {
                "Estimate first": {
                  "summary": "Vorschau der Kosten ohne Schreibvorgang anzeigen",
                  "value": {
                    "is_enabled": true,
                    "estimate_only": true,
                    "vendor_data_list": [
                      "user-123",
                      "user-456"
                    ]
                  }
                },
                "Enable": {
                  "summary": "Überwachung für zwei Benutzer aktivieren",
                  "value": {
                    "is_enabled": true,
                    "vendor_data_list": [
                      "user-123",
                      "user-456"
                    ]
                  }
                },
                "Disable": {
                  "summary": "Überwachung anhand der internen Didit-ID deaktivieren",
                  "value": {
                    "is_enabled": false,
                    "didit_internal_id_list": [
                      "3f1c0d3e-8f0a-4c2e-9a3d-9b1f5f4a2c11"
                    ]
                  }
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X POST 'https://verification.didit.me/v3/users/aml-monitoring/' \\\n  -H 'x-api-key: YOUR_API_KEY' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\"is_enabled\": true, \"vendor_data_list\": [\"user-123\", \"user-456\"]}'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.users.set_aml_monitoring(\n    is_enabled=True,\n    estimate_only=True,\n    vendor_data_list=[\"user-123\", \"user-456\"],\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.users.setAmlMonitoring({\n  is_enabled: true,\n  estimate_only: true,\n  vendor_data_list: [\"user-123\", \"user-456\"],\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Users.SetAMLMonitoring(ctx, didit.UsersSetAMLMonitoringParams{\n\tIsEnabled:      true,\n\tEstimateOnly:   didit.Bool(true),\n\tVendorDataList: didit.Some([]string{\"user-123\", \"user-456\"}),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import java.util.List;\nimport me.didit.Didit;\nimport me.didit.types.UsersSetAmlMonitoringParams;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.users().setAmlMonitoring(UsersSetAmlMonitoringParams.builder()\n        .isEnabled(true)\n        .estimateOnly(true)\n        .vendorDataList(List.of(\"user-123\", \"user-456\"))\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->users->setAmlMonitoring([\n    'is_enabled' => true,\n    'estimate_only' => true,\n    'vendor_data_list' => ['user-123', 'user-456'],\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.users.set_aml_monitoring(\n  is_enabled: true,\n  estimate_only: true,\n  vendor_data_list: [\"user-123\", \"user-456\"]\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Users.SetAmlMonitoringAsync(new UsersSetAmlMonitoringParams\n{\n    IsEnabled = true,\n    EstimateOnly = true,\n    VendorDataList = new string[] { \"user-123\", \"user-456\" },\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "responses": {
          "200": {
            "description": "Die Schätzung (wenn `estimate_only` true ist) oder der abgeschlossene Job für eine inline verarbeitete Auswahl.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AMLMonitoringToggleResult"
                }
              }
            }
          },
          "202": {
            "description": "Größere Auswahlen werden im Hintergrund ausgeführt. Fragen Sie den Job-Endpoint mit `job_id` ab; `results` wird befüllt, sobald die Profile verarbeitet sind.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AMLMonitoringJob"
                }
              }
            }
          },
          "400": {
            "description": "Validierungsfehler: `is_enabled` fehlt, kein Selektor oder mehr als 1000 Bezeichner über beide Listen hinweg."
          },
          "401": {
            "description": "Fehlender oder ungültiger API-Schlüssel."
          },
          "403": {
            "description": "Unzureichendes Guthaben, um die Überwachung für diese Auswahl zu aktivieren. Die Antwort enthält die Schätzung (`estimate`), damit Sie den richtigen Betrag aufladen können.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "string"
                    },
                    "estimate": {
                      "type": "object",
                      "description": "Kostenvorschau. Wird direkt zurückgegeben, wenn estimate_only wahr ist (es wird nichts geschrieben).",
                      "properties": {
                        "users_total": {
                          "type": "integer",
                          "description": "Profile, die der Auswahl entsprechen."
                        },
                        "already_enabled": {
                          "type": "integer",
                          "description": "Profile, die bereits überwacht werden (beim Aktivieren ist nichts zu tun; diese werden beim Deaktivieren abgeschaltet)."
                        },
                        "with_existing_aml": {
                          "type": "integer",
                          "description": "Profile, deren bestehendes AML-Screening auf überwacht umgestellt wird (kein neues Screening)."
                        },
                        "needing_screening": {
                          "type": "integer",
                          "description": "Profile ohne bisheriges AML-Screening, die zuerst gescreent werden (abgerechnet als reguläres AML-Screening)."
                        },
                        "skipped_no_identity_data": {
                          "type": "integer",
                          "description": "Profile, die nicht gescreent werden können, da Identitätsdaten fehlen."
                        },
                        "skipped_blocked": {
                          "type": "integer",
                          "description": "Gesperrte Benutzer, die übersprungen werden (bei Unternehmen immer 0)."
                        },
                        "estimated_screening_cost_usd": {
                          "type": "number",
                          "example": 0.2,
                          "description": "Einmalige Kosten für die neuen Screenings."
                        },
                        "estimated_annual_monitoring_cost_usd": {
                          "type": "number",
                          "example": 0.07,
                          "description": "Jährliche Überwachungskosten für die Profile, die künftig überwacht werden."
                        },
                        "balance_sufficient": {
                          "type": "boolean",
                          "description": "Gibt an, ob das Guthaben der Organisation das Screening plus das erste Jahr der Überwachung abdeckt."
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/v3/businesses/aml-monitoring/": {
      "post": {
        "summary": "Laufende AML-Überwachung für Unternehmen aktivieren oder deaktivieren",
        "description": "Schaltet die laufende AML-Überwachung für die ausgewählten Unternehmen ein oder aus, mit derselben Semantik wie die Business Console. Pro Unternehmen wird genau ein überwachtes AML-Screening beibehalten, sodass ein Profil, das sich mehrmals verifiziert hat, einmal überwacht und abgerechnet wird; das Deaktivieren schaltet die Überwachung für alle Screenings des Profils ab. Unternehmen ohne jegliches AML-Screening werden zuerst gescreent (abgerechnet als reguläres AML-Screening), wenn sie den erforderlichen rechtlichen Namen oder Anzeigenamen haben; andernfalls werden sie als `skipped_no_identity_data` gemeldet.\n\nSetzen Sie `estimate_only: true`, um eine Vorschau der Anzahlen und Kosten anzuzeigen, ohne Änderungen zu schreiben. Auswahlen von 20 oder weniger Profilen werden direkt aufgelöst und geben `200` mit dem abgeschlossenen Job zurück; größere Auswahlen geben `202` zurück und laufen im Hintergrund – fragen Sie [AML-Überwachungsjob abrufen](#get-/v3/aml-monitoring/jobs/-job_id-/) mit der zurückgegebenen `job_id` ab. Die Aktivierung wird mit `403` abgelehnt, wenn das Guthaben der Organisation die Schätzung nicht deckt. Bezeichner, die mit nichts übereinstimmen, werden in `unmatched` aufgeführt und führen nie zum Fehlschlagen der Anfrage: Eine Auswahl, die mit nichts übereinstimmt, wird als leerer Job (`total` 0) abgeschlossen – dieselbe Konvention wie bei den Batch-Lösch-Endpoints.",
        "operationId": "toggle_businesses_aml_monitoring",
        "x-didit-sdk": {
          "resource": "businesses",
          "method": "set_aml_monitoring",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "AML Ongoing Monitoring"
        ],
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "is_enabled"
                ],
                "description": "Wählen Sie Unternehmen mit `vendor_data_list`, `didit_internal_id_list` oder beiden aus (die beiden Listen werden ODER-verknüpft). Maximal 1000 IDs pro Anfrage über beide Listen hinweg.",
                "properties": {
                  "is_enabled": {
                    "type": "boolean",
                    "description": "true, um die Überwachung zu aktivieren, false, um sie zu deaktivieren."
                  },
                  "estimate_only": {
                    "type": "boolean",
                    "default": false,
                    "description": "Wenn true, wird die Kostenschätzung zurückgegeben und es werden keine Schreibvorgänge ausgeführt – kein Screening, keine Abrechnung, kein Job."
                  },
                  "vendor_data_list": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    },
                    "description": "Ihre eigenen Kennungen der umzuschaltenden Unternehmen, exakt so abgeglichen wie übermittelt."
                  },
                  "didit_internal_id_list": {
                    "type": "array",
                    "items": {
                      "type": "string",
                      "format": "uuid"
                    },
                    "description": "Interne Didit-IDs der umzuschaltenden Unternehmen – die von den Create-, Get- und List-Endpoints zurückgegebene `didit_internal_id`."
                  }
                }
              },
              "examples": {
                "Estimate first": {
                  "summary": "Vorschau der Kosten ohne Schreibvorgang anzeigen",
                  "value": {
                    "is_enabled": true,
                    "estimate_only": true,
                    "vendor_data_list": [
                      "company-123",
                      "company-456"
                    ]
                  }
                },
                "Enable": {
                  "summary": "Überwachung für zwei Unternehmen aktivieren",
                  "value": {
                    "is_enabled": true,
                    "vendor_data_list": [
                      "company-123",
                      "company-456"
                    ]
                  }
                },
                "Disable": {
                  "summary": "Überwachung anhand der internen Didit-ID deaktivieren",
                  "value": {
                    "is_enabled": false,
                    "didit_internal_id_list": [
                      "3f1c0d3e-8f0a-4c2e-9a3d-9b1f5f4a2c11"
                    ]
                  }
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X POST 'https://verification.didit.me/v3/businesses/aml-monitoring/' \\\n  -H 'x-api-key: YOUR_API_KEY' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\"is_enabled\": true, \"vendor_data_list\": [\"company-123\", \"company-456\"]}'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.businesses.set_aml_monitoring(\n    is_enabled=True,\n    estimate_only=True,\n    vendor_data_list=[\"company-123\", \"company-456\"],\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.businesses.setAmlMonitoring({\n  is_enabled: true,\n  estimate_only: true,\n  vendor_data_list: [\"company-123\", \"company-456\"],\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Businesses.SetAMLMonitoring(ctx, didit.BusinessesSetAMLMonitoringParams{\n\tIsEnabled:      true,\n\tEstimateOnly:   didit.Bool(true),\n\tVendorDataList: didit.Some([]string{\"company-123\", \"company-456\"}),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import java.util.List;\nimport me.didit.Didit;\nimport me.didit.types.BusinessesSetAmlMonitoringParams;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.businesses().setAmlMonitoring(BusinessesSetAmlMonitoringParams.builder()\n        .isEnabled(true)\n        .estimateOnly(true)\n        .vendorDataList(List.of(\"company-123\", \"company-456\"))\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->businesses->setAmlMonitoring([\n    'is_enabled' => true,\n    'estimate_only' => true,\n    'vendor_data_list' => ['company-123', 'company-456'],\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.businesses.set_aml_monitoring(\n  is_enabled: true,\n  estimate_only: true,\n  vendor_data_list: [\"company-123\", \"company-456\"]\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Businesses.SetAmlMonitoringAsync(new BusinessesSetAmlMonitoringParams\n{\n    IsEnabled = true,\n    EstimateOnly = true,\n    VendorDataList = new string[] { \"company-123\", \"company-456\" },\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "responses": {
          "200": {
            "description": "Die Schätzung (wenn `estimate_only` true ist) oder der abgeschlossene Job für eine inline verarbeitete Auswahl.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AMLMonitoringToggleResult"
                }
              }
            }
          },
          "202": {
            "description": "Größere Auswahlen werden im Hintergrund ausgeführt. Fragen Sie den Job-Endpoint mit `job_id` ab; `results` wird befüllt, sobald die Profile verarbeitet sind.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AMLMonitoringJob"
                }
              }
            }
          },
          "400": {
            "description": "Validierungsfehler: `is_enabled` fehlt, kein Selektor oder mehr als 1000 Bezeichner über beide Listen hinweg."
          },
          "401": {
            "description": "Fehlender oder ungültiger API-Schlüssel."
          },
          "403": {
            "description": "Unzureichendes Guthaben, um die Überwachung für diese Auswahl zu aktivieren. Die Antwort enthält die Schätzung (`estimate`), damit Sie den richtigen Betrag aufladen können.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "string"
                    },
                    "estimate": {
                      "type": "object",
                      "description": "Kostenvorschau. Wird direkt zurückgegeben, wenn estimate_only wahr ist (es wird nichts geschrieben).",
                      "properties": {
                        "users_total": {
                          "type": "integer",
                          "description": "Profile, die der Auswahl entsprechen."
                        },
                        "already_enabled": {
                          "type": "integer",
                          "description": "Profile, die bereits überwacht werden (beim Aktivieren ist nichts zu tun; diese werden beim Deaktivieren abgeschaltet)."
                        },
                        "with_existing_aml": {
                          "type": "integer",
                          "description": "Profile, deren bestehendes AML-Screening auf überwacht umgestellt wird (kein neues Screening)."
                        },
                        "needing_screening": {
                          "type": "integer",
                          "description": "Profile ohne bisheriges AML-Screening, die zuerst gescreent werden (abgerechnet als reguläres AML-Screening)."
                        },
                        "skipped_no_identity_data": {
                          "type": "integer",
                          "description": "Profile, die nicht gescreent werden können, da Identitätsdaten fehlen."
                        },
                        "skipped_blocked": {
                          "type": "integer",
                          "description": "Gesperrte Benutzer, die übersprungen werden (bei Unternehmen immer 0)."
                        },
                        "estimated_screening_cost_usd": {
                          "type": "number",
                          "example": 0.2,
                          "description": "Einmalige Kosten für die neuen Screenings."
                        },
                        "estimated_annual_monitoring_cost_usd": {
                          "type": "number",
                          "example": 0.07,
                          "description": "Jährliche Überwachungskosten für die Profile, die künftig überwacht werden."
                        },
                        "balance_sufficient": {
                          "type": "boolean",
                          "description": "Gibt an, ob das Guthaben der Organisation das Screening plus das erste Jahr der Überwachung abdeckt."
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/v3/aml-monitoring/jobs/{job_id}/": {
      "get": {
        "summary": "Laufenden AML-Überwachungsauftrag abrufen",
        "description": "Status, Ergebnisindikatoren und Datensatzergebnisse eines Monitoring-Umschaltauftrags, der über `POST /v3/users/aml-monitoring/` oder `POST /v3/businesses/aml-monitoring/` gestartet wurde. Pollen Sie alle paar Sekunden, während `status` `PENDING` oder `PROCESSING` ist; `results` ist vollständig, sobald der Status `COMPLETED` lautet.",
        "operationId": "get_aml_monitoring_job",
        "x-didit-sdk": {
          "resource": "aml_monitoring",
          "method": "retrieve_job",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "AML Ongoing Monitoring"
        ],
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "parameters": [
          {
            "name": "job_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Die vom Toggle-Endpoint zurückgegebene `job_id`."
          }
        ],
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl 'https://verification.didit.me/v3/aml-monitoring/jobs/JOB_ID/' \\\n  -H 'x-api-key: YOUR_API_KEY'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.aml_monitoring.retrieve_job(\n    \"11111111-2222-3333-4444-555555555555\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.amlMonitoring.retrieveJob(\"11111111-2222-3333-4444-555555555555\");\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.AMLMonitoring.RetrieveJob(ctx, \"11111111-2222-3333-4444-555555555555\")\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.amlMonitoring().retrieveJob(\"11111111-2222-3333-4444-555555555555\");\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->amlMonitoring->retrieveJob('11111111-2222-3333-4444-555555555555');\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.aml_monitoring.retrieve_job(\"11111111-2222-3333-4444-555555555555\")\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.AmlMonitoring.RetrieveJobAsync(\"11111111-2222-3333-4444-555555555555\");\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "responses": {
          "200": {
            "description": "Der Job.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "job_id": {
                      "type": "string",
                      "format": "uuid"
                    },
                    "status": {
                      "type": "string",
                      "enum": [
                        "PENDING",
                        "PROCESSING",
                        "COMPLETED",
                        "FAILED"
                      ]
                    },
                    "is_enabled": {
                      "type": "boolean",
                      "description": "true, wenn der Job die Überwachung aktiviert, false, wenn er sie deaktiviert."
                    },
                    "target_type": {
                      "type": "string",
                      "enum": [
                        "user",
                        "business"
                      ],
                      "description": "Welche Profilfamilie der Auftrag umschaltet."
                    },
                    "total": {
                      "type": "integer",
                      "description": "Profile, die der Job verarbeitet."
                    },
                    "processed": {
                      "type": "integer",
                      "description": "Bisher verarbeitete Profile."
                    },
                    "outcomes": {
                      "type": "object",
                      "description": "Ergebniszähler pro Datensatz. Jedes ausgewählte Profil wird genau einem Zähler zugeordnet; nichts wird stillschweigend übersprungen.",
                      "properties": {
                        "enabled": {
                          "type": "integer",
                          "description": "Überwachung für ein bestehendes AML-Screening aktiviert."
                        },
                        "screened_and_enabled": {
                          "type": "integer",
                          "description": "Ein neues AML-Screening wurde erstellt (in Rechnung gestellt) und die Überwachung dafür aktiviert."
                        },
                        "already_enabled": {
                          "type": "integer",
                          "description": "Überwachung war bereits aktiv; es wurde nichts geändert und nichts in Rechnung gestellt."
                        },
                        "disabled": {
                          "type": "integer",
                          "description": "Überwachung für jedes AML-Screening des Profils deaktiviert."
                        },
                        "skipped_no_identity_data": {
                          "type": "integer",
                          "description": "Übersprungen: Dem Profil fehlen der vollständige Name, das Geburtsdatum und das Land (Benutzer) oder ein Name (Unternehmen), die für das Screening erforderlich sind."
                        },
                        "skipped_blocked": {
                          "type": "integer",
                          "description": "Übersprungen: Der Benutzer ist gesperrt."
                        },
                        "skipped_sandbox": {
                          "type": "integer",
                          "description": "Übersprungen: Sandbox-Anwendung, es wird kein Screening erstellt."
                        },
                        "failed_provider": {
                          "type": "integer",
                          "description": "Das Screening konnte nicht abgeschlossen werden; versuchen Sie es später erneut."
                        },
                        "failed_insufficient_balance": {
                          "type": "integer",
                          "description": "Das Guthaben wurde aufgebraucht, während der Auftrag lief."
                        }
                      }
                    },
                    "results": {
                      "type": "array",
                      "description": "Ein Eintrag pro verarbeitetem Profil, in der Reihenfolge der Verarbeitung. Wächst, während der Job läuft; vollständig, sobald der Status COMPLETED ist. Erfasst für Jobs, die über die API gestartet wurden; ein über die Business Console gestarteter Job meldet nur Zähler.",
                      "items": {
                        "type": "object",
                        "properties": {
                          "didit_internal_id": {
                            "type": "string",
                            "format": "uuid",
                            "description": "Interne Didit-ID des Profils."
                          },
                          "vendor_data": {
                            "type": "string",
                            "nullable": true,
                            "description": "Ihre eigene Kennung für das Profil."
                          },
                          "outcome": {
                            "type": "string",
                            "enum": [
                              "enabled",
                              "screened_and_enabled",
                              "already_enabled",
                              "disabled",
                              "skipped_no_identity_data",
                              "skipped_blocked",
                              "skipped_sandbox",
                              "failed_provider",
                              "failed_insufficient_balance"
                            ]
                          }
                        }
                      }
                    },
                    "error": {
                      "type": "string",
                      "nullable": true,
                      "description": "Generische Fehlermeldung, wenn der Status FAILED lautet; die detaillierte Ursache verbleibt auf Plattformseite."
                    },
                    "created_at": {
                      "type": "string",
                      "format": "date-time"
                    },
                    "completed_at": {
                      "type": "string",
                      "format": "date-time",
                      "nullable": true
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Fehlender oder ungültiger API-Schlüssel."
          },
          "404": {
            "description": "Kein solcher Auftrag für diese Anwendung."
          }
        }
      }
    },
    "/v3/users/{vendor_data}/update-status/": {
      "patch": {
        "summary": "Benutzerstatus aktualisieren",
        "description": "Nur den Lebenszyklus-`status` eines Benutzers umschalten: `ACTIVE`, `FLAGGED` oder `BLOCKED` (keine Sitzungsstatus). `BLOCKED` fügt die `vendor_data` zur System-Sperrliste hinzu; ein Wechsel weg von `BLOCKED` entfernt diesen Eintrag wieder. Jede Änderung wird als `STATUS_CHANGED`-Aktivität beim Benutzer mit dem optionalen `reason` als deren `comment` erfasst. Das Senden des aktuellen Status ändert nichts und erfasst keinen `reason`. Der Webhook `user.status.updated` überträgt keinen `reason`.",
        "operationId": "update_user_status",
        "x-didit-sdk": {
          "resource": "users",
          "method": "update_status",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Users"
        ],
        "parameters": [
          {
            "name": "vendor_data",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Ihre eindeutige Kennung für den Benutzer."
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "allOf": [
                  {
                    "$ref": "#/components/schemas/EntityStatusUpdateRequest"
                  },
                  {
                    "type": "object",
                    "properties": {
                      "reason": {
                        "type": "string",
                        "nullable": true,
                        "maxLength": 1000,
                        "description": "Warum sich der Status geändert hat. Wird im Statusänderungseintrag der Benutzeraktivität (`comments[].comment` und **Activity** in der Business Console) erfasst, nur wenn sich der Status tatsächlich ändert. Webhooks übertragen dies nicht."
                      }
                    }
                  }
                ]
              },
              "examples": {
                "Activate": {
                  "summary": "Benutzer reaktivieren",
                  "value": {
                    "status": "ACTIVE"
                  }
                },
                "Flag": {
                  "summary": "Den Benutzer zur Prüfung markieren",
                  "value": {
                    "status": "FLAGGED"
                  }
                },
                "Block": {
                  "summary": "Benutzer sperren (fügt ihn zur Systemsperrliste hinzu)",
                  "value": {
                    "status": "BLOCKED"
                  }
                },
                "Block with reason": {
                  "summary": "Benutzer sperren und Grund erfassen",
                  "value": {
                    "status": "BLOCKED",
                    "reason": "Chargeback fraud pattern confirmed"
                  }
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X PATCH 'https://verification.didit.me/v3/users/user-abc-123/update-status/' \\\n  -H 'x-api-key: YOUR_API_KEY' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\"status\": \"BLOCKED\"}'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.users.update_status(\n    \"user-123\",\n    status=\"ACTIVE\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.users.updateStatus(\"user-123\", {\n  status: \"ACTIVE\",\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Users.UpdateStatus(ctx, \"user-123\", didit.UsersUpdateStatusParams{\n\tStatus: \"ACTIVE\",\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\nimport me.didit.types.EntityStatusUpdateRequest;\nimport me.didit.types.UsersUpdateStatusParams;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.users().updateStatus(\"user-123\", UsersUpdateStatusParams.builder()\n        .status(EntityStatusUpdateRequest.Status.of(\"ACTIVE\"))\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->users->updateStatus('user-123', [\n    'status' => 'ACTIVE',\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.users.update_status(\n  \"user-123\",\n  status: \"ACTIVE\"\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Users.UpdateStatusAsync(\"user-123\", new UsersUpdateStatusParams\n{\n    Status = \"ACTIVE\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "responses": {
          "200": {
            "description": "Benutzerstatus aktualisiert. Vollständiger Benutzerdatensatz zurückgegeben.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UserDetailItem"
                },
                "examples": {
                  "Blocked": {
                    "value": {
                      "didit_internal_id": "f4e5e1f2-94a9-4f86-8c16-2b7d9b4db418",
                      "vendor_data": "user-abc-123",
                      "display_name": null,
                      "full_name": "John Michael Doe",
                      "date_of_birth": "1990-05-15",
                      "effective_name": "John Michael Doe",
                      "status": "BLOCKED",
                      "metadata": {
                        "tier": "premium",
                        "source": "website"
                      },
                      "portrait_image_url": "https://<media-host>/...",
                      "session_count": 3,
                      "approved_count": 2,
                      "declined_count": 0,
                      "in_review_count": 1,
                      "issuing_states": [
                        "USA"
                      ],
                      "approved_emails": [
                        "john@example.com"
                      ],
                      "approved_phones": [
                        "+14155551234"
                      ],
                      "features": {
                        "ID_VERIFICATION": "Approved",
                        "LIVENESS": "Approved",
                        "FACE_MATCH": "Approved",
                        "AML": "Approved"
                      },
                      "features_list": [
                        {
                          "feature": "ID_VERIFICATION",
                          "status": "Approved"
                        },
                        {
                          "feature": "LIVENESS",
                          "status": "Approved"
                        },
                        {
                          "feature": "FACE_MATCH",
                          "status": "Approved"
                        },
                        {
                          "feature": "AML",
                          "status": "Approved"
                        }
                      ],
                      "last_session_at": "2025-06-15T10:30:00Z",
                      "last_activity_at": "2025-06-15T10:30:00Z",
                      "first_session_at": "2025-06-01T08:00:00Z",
                      "tags": [
                        {
                          "uuid": "9a8b7c6d-5e4f-4a3b-8c2d-1e0f9a8b7c6d",
                          "tag": {
                            "uuid": "e1f2a3b4-c5d6-4e7f-8a9b-0c1d2e3f4a5b",
                            "name": "VIP",
                            "color": "#2567FF",
                            "description": null,
                            "source": "custom",
                            "created_at": "2025-05-01T09:00:00Z",
                            "updated_at": "2025-05-01T09:00:00Z"
                          },
                          "added_by_email": "analyst@acme.com",
                          "added_by_name": "Jane Analyst",
                          "created_at": "2025-06-02T11:00:00Z"
                        }
                      ],
                      "comments": [
                        {
                          "uuid": "c1111111-2222-4333-8444-555555555555",
                          "comment_type": "STATUS_CHANGED",
                          "comment": "Chargeback fraud pattern confirmed",
                          "actor_email": null,
                          "actor_name": null,
                          "previous_status": "ACTIVE",
                          "new_status": "BLOCKED",
                          "previous_value": null,
                          "new_value": null,
                          "changed_fields": [],
                          "metadata": null,
                          "mentioned_emails": [],
                          "created_at": "2025-06-15T10:30:00Z"
                        }
                      ],
                      "created_at": "2025-06-01T08:00:00Z",
                      "updated_at": "2025-06-15T10:30:00Z"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Fehlender oder ungültiger `status` oder ein `reason` mit mehr als 1000 Zeichen.",
            "content": {
              "application/json": {
                "examples": {
                  "Missing status": {
                    "value": {
                      "status": [
                        "This field is required."
                      ]
                    }
                  },
                  "Bad status": {
                    "value": {
                      "status": [
                        "Invalid status. Valid options are: ACTIVE, FLAGGED, BLOCKED"
                      ]
                    }
                  },
                  "Reason too long": {
                    "value": {
                      "reason": [
                        "Ensure this field has no more than 1000 characters."
                      ]
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Keine Anmeldedaten angegeben. Anfragen an `/v3/users/*`-Pfade ohne einen `x-api-key`-Header (oder `Authorization: Bearer`-Token) werden von der Authentifizierungs-Middleware abgelehnt, bevor sie die API erreichen.",
            "content": {
              "application/json": {
                "examples": {
                  "Missing credentials": {
                    "value": {
                      "detail": "You must be authenticated with a valid access token to access this endpoint."
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Der Schlüssel kann keine Benutzer für diese Anwendung aktualisieren. Ein fehlender Schlüssel gibt `403` zurück; ein falscher, widerrufener oder abgelaufener Schlüssel gibt `401` zurück.",
            "content": {
              "application/json": {
                "examples": {
                  "Forbidden": {
                    "value": {
                      "detail": "You do not have permission to perform this action."
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Für diese Anwendung existiert kein (nicht gelöschter) Benutzer mit den angegebenen `vendor_data`.",
            "content": {
              "application/json": {
                "examples": {
                  "Not found": {
                    "value": {
                      "detail": "Not found."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate-Limit überschritten; drosseln Sie die Anfragen und wiederholen Sie den Versuch nach dem in `Retry-After` angegebenen Intervall.",
            "content": {
              "application/json": {
                "examples": {
                  "Rate limited": {
                    "value": {
                      "detail": "Request was throttled. Expected available in 30 seconds."
                    }
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/v3/businesses/create/": {
      "post": {
        "summary": "Unternehmen erstellen",
        "description": "Erstellen Sie vorab ein [Unternehmen](/entities/businesses) *ohne* eine KYB-Sitzung. Alle Felder sind optional, aber Sie sollten immer `vendor_data` senden – ohne diese Angabe kann der Datensatz nicht mit Sitzungen oder Transaktionen verknüpft werden. Sofern angegeben, muss `vendor_data` unter nicht gelöschten Unternehmen eindeutig sein (exakte Übereinstimmung; Konflikte geben 400 zurück). Nicht idempotent.",
        "operationId": "create_business",
        "x-didit-sdk": {
          "resource": "businesses",
          "method": "create",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Businesses"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "vendor_data": {
                    "type": "string",
                    "nullable": true,
                    "description": "Ihre eindeutige Kennung für dieses Unternehmen (Freitext-String, KEINE UUID). Optional, aber dringend empfohlen. Wenn angegeben, muss sie unter den nicht gelöschten Unternehmen der Anwendung eindeutig sein; exakt wie übermittelt abgeglichen."
                  },
                  "display_name": {
                    "type": "string",
                    "nullable": true,
                    "maxLength": 255,
                    "description": "Benutzerfreundlicher Anzeigename, der in der Konsole angezeigt wird (hat für die UI-Anzeige Vorrang vor `legal_name`)."
                  },
                  "legal_name": {
                    "type": "string",
                    "nullable": true,
                    "maxLength": 255,
                    "description": "Offizieller juristischer Name des Unternehmens."
                  },
                  "registration_number": {
                    "type": "string",
                    "nullable": true,
                    "maxLength": 100,
                    "description": "Unternehmensregister- oder Gründungsnummer."
                  },
                  "country_code": {
                    "type": "string",
                    "nullable": true,
                    "maxLength": 10,
                    "description": "Gründungsland (ISO 3166-1 Alpha-2, z. B. `GB`, `US`)."
                  },
                  "status": {
                    "type": "string",
                    "enum": [
                      "ACTIVE",
                      "FLAGGED",
                      "BLOCKED"
                    ],
                    "default": "ACTIVE",
                    "description": "Anfänglicher Lebenszyklusstatus. Standardmäßig `ACTIVE`."
                  },
                  "metadata": {
                    "type": "object",
                    "nullable": true,
                    "description": "Beliebiges JSON-Objekt, das Sie an das Unternehmen anhängen. Standardmäßig `{}`."
                  }
                }
              },
              "examples": {
                "Basic": {
                  "summary": "Empfohlenes Minimum",
                  "value": {
                    "vendor_data": "company-456",
                    "legal_name": "New Corp Ltd",
                    "country_code": "US"
                  }
                },
                "Full": {
                  "summary": "Alle Felder",
                  "value": {
                    "vendor_data": "company-789",
                    "display_name": "New Corp",
                    "legal_name": "New Corp International Ltd",
                    "registration_number": "98765432",
                    "country_code": "DE",
                    "status": "ACTIVE",
                    "metadata": {
                      "industry": "fintech",
                      "tier": "enterprise"
                    }
                  }
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X POST 'https://verification.didit.me/v3/businesses/create/' \\\n  -H 'x-api-key: YOUR_API_KEY' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\"vendor_data\": \"company-456\", \"legal_name\": \"New Corp Ltd\", \"country_code\": \"US\"}'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.businesses.create(\n    vendor_data=\"company-456\",\n    legal_name=\"New Corp Ltd\",\n    country_code=\"US\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.businesses.create({\n  vendor_data: \"company-456\",\n  legal_name: \"New Corp Ltd\",\n  country_code: \"US\",\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Businesses.Create(ctx, didit.BusinessesCreateParams{\n\tVendorData:  didit.String(\"company-456\"),\n\tLegalName:   didit.String(\"New Corp Ltd\"),\n\tCountryCode: didit.String(\"US\"),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\nimport me.didit.types.BusinessesCreateParams;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.businesses().create(BusinessesCreateParams.builder()\n        .vendorData(\"company-456\")\n        .legalName(\"New Corp Ltd\")\n        .countryCode(\"US\")\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->businesses->create([\n    'vendor_data' => 'company-456',\n    'legal_name' => 'New Corp Ltd',\n    'country_code' => 'US',\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.businesses.create(\n  vendor_data: \"company-456\",\n  legal_name: \"New Corp Ltd\",\n  country_code: \"US\"\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Businesses.CreateAsync(new BusinessesCreateParams\n{\n    VendorData = \"company-456\",\n    LegalName = \"New Corp Ltd\",\n    CountryCode = \"US\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "responses": {
          "201": {
            "description": "Unternehmen erstellt. Vollständiger Unternehmensdatensatz zurückgegeben (gleiche Struktur wie „Get Business“).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BusinessDetailItem"
                },
                "examples": {
                  "Created": {
                    "value": {
                      "didit_internal_id": "a1b2c3d4-e5f6-4890-abcd-ef1234567890",
                      "vendor_data": "company-456",
                      "display_name": null,
                      "legal_name": "New Corp Ltd",
                      "registration_number": null,
                      "country_code": "US",
                      "effective_name": "New Corp Ltd",
                      "status": "ACTIVE",
                      "session_count": 0,
                      "approved_count": 0,
                      "declined_count": 0,
                      "in_review_count": 0,
                      "features": {},
                      "features_list": [],
                      "last_session_at": null,
                      "last_activity_at": "2026-03-15T10:30:00Z",
                      "first_session_at": null,
                      "tags": [],
                      "created_at": "2026-03-15T10:30:00Z",
                      "metadata": {},
                      "updated_at": "2026-03-15T10:30:00Z"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Ungültiger Body – typischerweise ein dupliziertes `vendor_data`, ein unbekannter `status` oder ein fehlerhaftes `metadata`.",
            "content": {
              "application/json": {
                "examples": {
                  "Duplicate": {
                    "value": {
                      "vendor_data": [
                        "A business with this vendor_data already exists."
                      ]
                    }
                  },
                  "Bad status": {
                    "value": {
                      "status": [
                        "Invalid status. Valid options are: ACTIVE, FLAGGED, BLOCKED"
                      ]
                    }
                  },
                  "Bad metadata": {
                    "value": {
                      "metadata": [
                        "Metadata must be a JSON object."
                      ]
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Fehlender, ungültiger oder widerrufener API-Schlüssel, oder der Schlüssel kann keine Unternehmen für diese Anwendung erstellen. Ein fehlender Schlüssel führt zu einer `403`-Antwort; ein falscher, widerrufener oder abgelaufener Schlüssel führt zu einer `401`-Antwort.",
            "content": {
              "application/json": {
                "examples": {
                  "Forbidden": {
                    "value": {
                      "detail": "You do not have permission to perform this action."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate-Limit überschritten; drosseln Sie die Anfragen und wiederholen Sie den Versuch nach dem in `Retry-After` angegebenen Intervall.",
            "content": {
              "application/json": {
                "examples": {
                  "Rate limited": {
                    "value": {
                      "detail": "Request was throttled. Expected available in 30 seconds."
                    }
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/v3/users/create/": {
      "post": {
        "summary": "Benutzer erstellen",
        "description": "Erstellen Sie einen [Benutzer](/entities/users) anhand von `vendor_data`, vor oder ohne eine Verifizierungssitzung. `vendor_data` muss unter den Benutzern der Anwendung eindeutig sein (ein Duplikat gibt `400` zurück). Nicht idempotent.\n\n**Kontaktdaten:** `email` und `phone_number` werden in `metadata.contact` gespeichert und `country` in `metadata.address`. Wenn Sie `first_name` oder `last_name` ohne `full_name` übermitteln, führt Didit diese zu `full_name` zusammen.\n\n**Verifizierungslink:** Bei `send_verification_link: true` erstellt Didit außerdem eine Verifizierungssitzung für die Person mit `workflow_id` und sendet ihr den Link per E-Mail an `email`. Die Sitzung führt dieselben Prüfungen wie [Sitzung erstellen](/de/sessions-api/create-session) aus, wie etwa die Sperrliste und Ihr Credit-Guthaben. Die Person und die Sitzung werden entweder gemeinsam oder gar nicht erstellt: Schlägt eine Prüfung fehl, wird nichts geschrieben und keine E-Mail versendet. Das Feld `verification_link` in der Antwort beschreibt die Sitzung und ist `null`, wenn Sie keinen Link anfordern.\n\n**API-Schlüssel-Zugriff:** Ein Scoped-API-Schlüssel benötigt die Schreibberechtigung für `users`. Bei `send_verification_link: true` benötigt er zudem die Schreibberechtigung für `sessions`, andernfalls antwortet der Aufruf mit `403`, bevor etwas geschrieben wird. Schlüssel mit Vollzugriff sind davon nicht betroffen. Siehe [API-Schlüssel](/de/console/api-keys).",
        "operationId": "create_user",
        "x-didit-sdk": {
          "resource": "users",
          "method": "create",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Users"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "vendor_data"
                ],
                "properties": {
                  "vendor_data": {
                    "type": "string",
                    "description": "Ihre eindeutige Kennung für diesen Benutzer (Freitext-String, KEINE UUID). Muss unter den Benutzern der Anwendung eindeutig sein; exakt wie übermittelt abgeglichen."
                  },
                  "full_name": {
                    "type": "string",
                    "nullable": true,
                    "maxLength": 512,
                    "description": "Vollständiger rechtlicher Name des Benutzers."
                  },
                  "display_name": {
                    "type": "string",
                    "nullable": true,
                    "description": "Benutzerfreundlicher Anzeigename, der in der Konsole angezeigt wird (hat für die UI-Anzeige Vorrang vor `full_name`).",
                    "maxLength": 255
                  },
                  "date_of_birth": {
                    "type": "string",
                    "format": "date",
                    "nullable": true,
                    "description": "Geburtsdatum im Format `YYYY-MM-DD`."
                  },
                  "status": {
                    "type": "string",
                    "enum": [
                      "ACTIVE",
                      "FLAGGED",
                      "BLOCKED"
                    ],
                    "default": "ACTIVE",
                    "description": "Anfänglicher Lebenszyklusstatus. Standardmäßig `ACTIVE`."
                  },
                  "metadata": {
                    "type": "object",
                    "nullable": true,
                    "description": "Beliebiges JSON-Objekt, das Sie an den Benutzer anhängen. Standardmäßig `{}`."
                  },
                  "approved_emails": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    },
                    "description": "Vorab als vertrauenswürdig eingestufte E-Mail-Adressen für diesen Benutzer, z. B. `[\"john@example.com\"]`."
                  },
                  "approved_phones": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    },
                    "description": "Vorab als vertrauenswürdig eingestufte Telefonnummern für diesen Benutzer, z. B. `[\"+14155551234\"]`."
                  },
                  "issuing_states": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    },
                    "description": "Vorab erfasste Ausstellungsländer (ISO 3166-1 Alpha-3), z. B. `[\"USA\"]`."
                  },
                  "first_name": {
                    "type": "string",
                    "maxLength": 255,
                    "description": "Vorname. Wenn `full_name` nicht gesendet wird, verbindet Didit `first_name` und `last_name` mit einem Leerzeichen zu `full_name`. Wird nicht als separates Feld zurückgegeben."
                  },
                  "last_name": {
                    "type": "string",
                    "maxLength": 255,
                    "description": "Nachname. Wird mit `first_name` zu `full_name` zusammengefügt, wenn `full_name` nicht übermittelt wird. Wird nicht als separates Feld zurückgegeben."
                  },
                  "email": {
                    "type": "string",
                    "format": "email",
                    "description": "Kontakt-E-Mail, gespeichert in `metadata.contact.email` (sie ersetzt eine `email`, die Sie innerhalb von `metadata.contact` senden). Erforderlich, wenn `send_verification_link` auf `true` gesetzt ist: Der Link wird an diese Adresse gesendet. Wenn `metadata.contact` kein JSON-Objekt ist, antwortet der Aufruf bei diesem Feld mit `400`."
                  },
                  "phone_number": {
                    "type": "string",
                    "maxLength": 32,
                    "description": "Telefonnummer des Kontakts, gespeichert in `metadata.contact.phone_number`. Wenn `metadata.contact` kein JSON-Objekt ist, antwortet der Aufruf für dieses Feld mit `400`."
                  },
                  "country": {
                    "type": "string",
                    "maxLength": 3,
                    "description": "Land als ISO-3166-Code, Alpha-2 oder Alpha-3 (`ES` oder `ESP`). Wird in Großbuchstaben in `metadata.address.country` gespeichert. Wenn `metadata.address` kein JSON-Objekt ist, antwortet der Aufruf für dieses Feld mit `400`."
                  },
                  "send_verification_link": {
                    "type": "boolean",
                    "default": false,
                    "description": "Wenn `true`, erstellt Didit eine Verifizierungssitzung für die Person unter `workflow_id` und sendet ihr den Link per E-Mail an `email`. Erfordert `email` und `workflow_id`. Ein berechtigungsbeschränkter API-Schlüssel benötigt außerdem Schreibrechte für `sessions`."
                  },
                  "workflow_id": {
                    "type": "string",
                    "format": "uuid",
                    "description": "Der Workflow der Verifizierungssitzung. Erforderlich, wenn `send_verification_link` auf `true` gesetzt ist. Er muss eine Person verifizieren: Ein Workflow für Unternehmensverifizierung (KYB) wird abgelehnt. Andernfalls wird er ignoriert."
                  },
                  "language": {
                    "type": "string",
                    "maxLength": 10,
                    "description": "Sprache der Verifizierungs-E-Mail als Code einer [unterstützten Sprache](/de/integration/supported-languages). Wenn nicht angegeben, wird Englisch verwendet. Wird ignoriert, wenn `send_verification_link` nicht `true` ist."
                  }
                }
              },
              "examples": {
                "Basic": {
                  "summary": "Mit Basisinformationen erstellen",
                  "value": {
                    "vendor_data": "user-abc-123",
                    "full_name": "John Doe"
                  }
                },
                "Full": {
                  "summary": "Alle Felder",
                  "value": {
                    "vendor_data": "user-abc-456",
                    "full_name": "Jane Smith",
                    "display_name": "Jane S.",
                    "date_of_birth": "1990-05-15",
                    "status": "ACTIVE",
                    "metadata": {
                      "tier": "premium",
                      "source": "api"
                    },
                    "approved_emails": [
                      "jane@example.com"
                    ]
                  }
                },
                "Contact details": {
                  "summary": "Name, E-Mail, Telefon und Land",
                  "value": {
                    "vendor_data": "user-abc-789",
                    "first_name": "Julia",
                    "last_name": "Martin",
                    "email": "julia.martin@example.com",
                    "phone_number": "+34600000000",
                    "country": "ES"
                  }
                },
                "With verification link": {
                  "summary": "Person erstellen und ihr einen Verifizierungslink per E-Mail senden",
                  "value": {
                    "vendor_data": "user-abc-789",
                    "first_name": "Julia",
                    "last_name": "Martin",
                    "email": "julia.martin@example.com",
                    "send_verification_link": true,
                    "workflow_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
                    "language": "es"
                  }
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X POST 'https://verification.didit.me/v3/users/create/' \\\n  -H 'x-api-key: YOUR_API_KEY' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\"vendor_data\": \"user-abc-123\", \"full_name\": \"John Doe\"}'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.users.create(\n    vendor_data=\"user-abc-123\",\n    full_name=\"John Doe\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.users.create({\n  vendor_data: \"user-abc-123\",\n  full_name: \"John Doe\",\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Users.Create(ctx, didit.UsersCreateParams{\n\tVendorData: \"user-abc-123\",\n\tFullName:   didit.String(\"John Doe\"),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\nimport me.didit.types.UsersCreateParams;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.users().create(UsersCreateParams.builder()\n        .vendorData(\"user-abc-123\")\n        .fullName(\"John Doe\")\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->users->create([\n    'vendor_data' => 'user-abc-123',\n    'full_name' => 'John Doe',\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.users.create(\n  vendor_data: \"user-abc-123\",\n  full_name: \"John Doe\"\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Users.CreateAsync(new UsersCreateParams\n{\n    VendorData = \"user-abc-123\",\n    FullName = \"John Doe\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "responses": {
          "201": {
            "description": "Benutzer erstellt. Der vollständige Benutzerdatensatz (gleiches Format wie bei Get User), plus `verification_link`: die Verifizierungssitzung, die Didit per E-Mail gesendet hat, wenn `send_verification_link` auf `true` gesetzt war, andernfalls `null`.",
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/UserDetailItem"
                    },
                    {
                      "type": "object",
                      "required": [
                        "verification_link"
                      ],
                      "properties": {
                        "verification_link": {
                          "type": "object",
                          "nullable": true,
                          "description": "Die Verifizierungssitzung, die Didit erstellt und der Person per E-Mail gesendet hat. Immer vorhanden: `null`, wenn `send_verification_link` nicht `true` war.",
                          "required": [
                            "session_id",
                            "session_number",
                            "status",
                            "url",
                            "workflow_id",
                            "email"
                          ],
                          "properties": {
                            "session_id": {
                              "type": "string",
                              "format": "uuid",
                              "description": "ID der Verifizierungssitzung."
                            },
                            "session_number": {
                              "type": "integer",
                              "description": "Fortlaufende Nummer der Sitzung innerhalb Ihrer Anwendung."
                            },
                            "status": {
                              "type": "string",
                              "description": "Status der Sitzung, `Not Started` für eine Sitzung, die gerade erst erstellt wurde."
                            },
                            "url": {
                              "type": "string",
                              "format": "uri",
                              "description": "Der Verifizierungslink, den Didit der Person per E-Mail gesendet hat."
                            },
                            "workflow_id": {
                              "type": "string",
                              "format": "uuid",
                              "nullable": true,
                              "description": "Der Workflow, den die Sitzung ausführt."
                            },
                            "email": {
                              "type": "string",
                              "format": "email",
                              "description": "Die Adresse, an die der Link gesendet wurde."
                            }
                          }
                        }
                      }
                    }
                  ]
                },
                "examples": {
                  "Created": {
                    "value": {
                      "didit_internal_id": "f4e5e1f2-94a9-4f86-8c16-2b7d9b4db418",
                      "vendor_data": "user-abc-123",
                      "display_name": null,
                      "full_name": "John Doe",
                      "date_of_birth": null,
                      "effective_name": "John Doe",
                      "status": "ACTIVE",
                      "metadata": {},
                      "portrait_image_url": null,
                      "session_count": 0,
                      "approved_count": 0,
                      "declined_count": 0,
                      "in_review_count": 0,
                      "issuing_states": [],
                      "approved_emails": [],
                      "approved_phones": [],
                      "features": {},
                      "features_list": [],
                      "last_session_at": null,
                      "last_activity_at": "2025-06-15T10:30:00Z",
                      "first_session_at": null,
                      "tags": [],
                      "comments": [],
                      "created_at": "2025-06-15T10:30:00Z",
                      "updated_at": "2025-06-15T10:30:00Z",
                      "verification_link": null
                    }
                  },
                  "Created with verification link": {
                    "value": {
                      "didit_internal_id": "9b2f6c1e-3d4a-4e5f-8a7b-1c2d3e4f5a6b",
                      "vendor_data": "user-abc-789",
                      "display_name": null,
                      "full_name": "Julia Martin",
                      "date_of_birth": null,
                      "effective_name": "Julia Martin",
                      "status": "ACTIVE",
                      "metadata": {
                        "contact": {
                          "email": "julia.martin@example.com"
                        }
                      },
                      "portrait_image_url": null,
                      "session_count": 1,
                      "approved_count": 0,
                      "declined_count": 0,
                      "in_review_count": 0,
                      "issuing_states": [],
                      "approved_emails": [],
                      "approved_phones": [],
                      "features": {},
                      "features_list": [],
                      "last_session_at": "2025-06-15T10:30:00Z",
                      "last_activity_at": "2025-06-15T10:30:00Z",
                      "first_session_at": "2025-06-15T10:30:00Z",
                      "tags": [],
                      "comments": [],
                      "created_at": "2025-06-15T10:30:00Z",
                      "updated_at": "2025-06-15T10:30:00Z",
                      "verification_link": {
                        "session_id": "3fa85f64-5717-4562-b3fc-2c963f66afa7",
                        "session_number": 43762,
                        "status": "Not Started",
                        "url": "https://verify.didit.me/en/session/3FaJ9wLqX2Mz",
                        "workflow_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
                        "email": "julia.martin@example.com"
                      }
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Ungültiger Body, nach Feldern aufgeschlüsselt: typischerweise ein dupliziertes `vendor_data`, ein fehlendes Pflichtfeld oder ein fehlerhafter Wert. Bei `send_verification_link: true` auch eine fehlende `email` oder `workflow_id`, ein unbekannter Workflow oder ein Workflow für die Unternehmensverifizierung (KYB), eine nicht unterstützte `language` (mit Schlüssel `contact_details.email_lang`), ein auf der Sperrliste stehendes `vendor_data` oder zu wenige Credits zum Starten der Sitzung. Es wird nichts geschrieben.",
            "content": {
              "application/json": {
                "examples": {
                  "Duplicate": {
                    "value": {
                      "vendor_data": [
                        "A user with this vendor_data already exists."
                      ]
                    }
                  },
                  "Missing vendor_data": {
                    "value": {
                      "vendor_data": [
                        "This field is required."
                      ]
                    }
                  },
                  "Bad metadata": {
                    "value": {
                      "metadata": [
                        "Metadata must be a JSON object."
                      ]
                    }
                  },
                  "Bad status": {
                    "value": {
                      "status": [
                        "Invalid status. Valid options are: ACTIVE, FLAGGED, BLOCKED"
                      ]
                    }
                  },
                  "Bad country": {
                    "value": {
                      "country": [
                        "Use an ISO 3166 country code, like ES or ESP."
                      ]
                    }
                  },
                  "Contact not an object": {
                    "value": {
                      "email": [
                        "metadata.contact must be a JSON object to store this value."
                      ]
                    }
                  },
                  "Address not an object": {
                    "value": {
                      "country": [
                        "metadata.address must be a JSON object to store this value."
                      ]
                    }
                  },
                  "Link without email or workflow": {
                    "value": {
                      "email": [
                        "An email address is required to send a verification link."
                      ],
                      "workflow_id": [
                        "Pick the workflow to send a verification link for."
                      ]
                    }
                  },
                  "Unknown workflow": {
                    "value": {
                      "workflow_id": [
                        "Invalid workflow_id."
                      ]
                    }
                  },
                  "Business workflow": {
                    "value": {
                      "workflow_id": [
                        "This workflow verifies a business. Pick a workflow that verifies a person to send them a verification link."
                      ]
                    }
                  },
                  "Blocklisted vendor_data": {
                    "value": {
                      "vendor_data": "This user or business has been blocked and cannot create new verification sessions."
                    }
                  },
                  "Insufficient credits": {
                    "value": {
                      "detail": "You don't have enough credits to perform this request. Please top up at https://business.didit.me"
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Keine Anmeldedaten angegeben. Anfragen an `/v3/users/*`-Pfade ohne einen `x-api-key`-Header (oder `Authorization: Bearer`-Token) werden von der Authentifizierungs-Middleware abgelehnt, bevor sie die API erreichen.",
            "content": {
              "application/json": {
                "examples": {
                  "Missing credentials": {
                    "value": {
                      "detail": "You must be authenticated with a valid access token to access this endpoint."
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Ungültiger oder widerrufener API-Schlüssel, oder der Schlüssel kann keine Benutzer für diese Anwendung erstellen. Ein berechtigungsbeschränkter API-Schlüssel benötigt Schreibzugriff auf `users` und zusätzlich Schreibzugriff auf `sessions`, wenn `send_verification_link` auf `true` gesetzt ist; es wird nichts geschrieben. Ein fehlender Schlüssel gibt `403` zurück; ein falscher, widerrufener oder abgelaufener Schlüssel gibt `401` zurück.",
            "content": {
              "application/json": {
                "examples": {
                  "Forbidden": {
                    "value": {
                      "detail": "You do not have permission to perform this action."
                    }
                  },
                  "No sessions write": {
                    "summary": "Schlüssel mit eingeschränktem Berechtigungsumfang fordert einen Verifizierungslink ohne sessions write an",
                    "value": {
                      "detail": "This API key has no write access to sessions."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate-Limit überschritten; drosseln Sie die Anfragen und wiederholen Sie den Versuch nach dem in `Retry-After` angegebenen Intervall.",
            "content": {
              "application/json": {
                "examples": {
                  "Rate limited": {
                    "value": {
                      "detail": "Request was throttled. Expected available in 30 seconds."
                    }
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/v3/organization/{organization_id}/application/{application_id}/vendor-users/by-id/{didit_internal_id}/faces/upload/": {
      "post": {
        "summary": "Benutzergesicht hochladen",
        "description": "Ein vertrauenswürdiges, importiertes Gesichtsbild an ein bestehendes Benutzerprofil anhängen. Verwenden Sie dies, nachdem Sie einen Benutzer über `vendor_data` erstellt oder abgerufen und dessen `didit_internal_id` ausgelesen haben. Das hochgeladene Gesicht wird im Benutzerprofil gespeichert und für die Duplikaterkennung sowie Gesichtssuche indexiert. Es wird nicht zu einer Gesichts-Sperrliste hinzugefügt.",
        "operationId": "upload_user_face",
        "x-didit-sdk": {
          "resource": "users",
          "method": "upload_face",
          "auth": "api_key",
          "server": true,
          "scope": "application"
        },
        "tags": [
          "Users"
        ],
        "parameters": [
          {
            "name": "organization_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "UUID der Organisation, der die Anwendung gehört."
          },
          {
            "name": "application_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "UUID der Anwendung, zu der das Benutzerprofil gehört."
          },
          {
            "name": "didit_internal_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Didits interne Benutzer-UUID, zurückgegeben als `didit_internal_id` von `GET /v3/users/{vendor_data}/` und `POST /v3/users/create/`."
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "image"
                ],
                "properties": {
                  "image": {
                    "type": "string",
                    "format": "byte",
                    "description": "Unverarbeitetes Base64-codiertes JPG- oder PNG-Gesichtsbild. Kein `data:image/...;base64,`-Präfix angeben. Maximale decodierte Größe: 2 MB."
                  },
                  "comment": {
                    "type": "string",
                    "description": "Optionale, für den Bearbeiter sichtbare Notiz zum hochgeladenen Gesicht.",
                    "default": ""
                  }
                }
              },
              "examples": {
                "Imported face": {
                  "summary": "Ein von einem vorherigen Anbieter importiertes Gesicht anhängen",
                  "value": {
                    "image": "/9j/4AAQSkZJRgABAQEA...",
                    "comment": "Imported from previous KYC provider"
                  }
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X POST 'https://verification.didit.me/v3/organization/11111111-2222-3333-4444-555555555555/application/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/vendor-users/by-id/f4e5e1f2-94a9-4f86-8c16-2b7d9b4db418/faces/upload/' \\\n  -H 'x-api-key: YOUR_API_KEY' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\"image\": \"/9j/4AAQSkZJRgABAQEA...\", \"comment\": \"Imported from previous KYC provider\"}'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.users.upload_face(\n    \"11111111-2222-3333-4444-555555555555\",\n    image=\"/9j/4AAQSkZJRgABAQEA...\",\n    comment=\"Imported from previous KYC provider\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.users.uploadFace(\"11111111-2222-3333-4444-555555555555\", {\n  image: \"/9j/4AAQSkZJRgABAQEA...\",\n  comment: \"Imported from previous KYC provider\",\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.Users.UploadFace(ctx, \"11111111-2222-3333-4444-555555555555\", didit.UsersUploadFaceParams{\n\tImage:   \"/9j/4AAQSkZJRgABAQEA...\",\n\tComment: didit.String(\"Imported from previous KYC provider\"),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\nimport me.didit.types.UsersUploadFaceParams;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.users().uploadFace(\"11111111-2222-3333-4444-555555555555\", UsersUploadFaceParams.builder()\n        .image(\"/9j/4AAQSkZJRgABAQEA...\")\n        .comment(\"Imported from previous KYC provider\")\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\n$didit = new DiditClient();\n\n$result = $didit->users->uploadFace('11111111-2222-3333-4444-555555555555', [\n    'image' => '/9j/4AAQSkZJRgABAQEA...',\n    'comment' => 'Imported from previous KYC provider',\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.users.upload_face(\n  \"11111111-2222-3333-4444-555555555555\",\n  image: \"/9j/4AAQSkZJRgABAQEA...\",\n  comment: \"Imported from previous KYC provider\"\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.Users.UploadFaceAsync(\"11111111-2222-3333-4444-555555555555\", new UsersUploadFaceParams\n{\n    Image = \"/9j/4AAQSkZJRgABAQEA...\",\n    Comment = \"Imported from previous KYC provider\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "responses": {
          "201": {
            "description": "Gesicht hochgeladen und dem Benutzerprofil zugeordnet.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "uuid",
                    "image_url",
                    "comment",
                    "uploaded_by",
                    "created_at"
                  ],
                  "properties": {
                    "uuid": {
                      "type": "string",
                      "format": "uuid",
                      "description": "UUID des hochgeladenen Benutzer-Gesichtsdatensatzes."
                    },
                    "image_url": {
                      "type": "string",
                      "format": "uri",
                      "nullable": true,
                      "description": "Signierte URL für das hochgeladene Gesichtsbild."
                    },
                    "comment": {
                      "type": "string",
                      "nullable": true,
                      "description": "Kommentar, der beim Hochladen des Gesichts angegeben wurde."
                    },
                    "uploaded_by": {
                      "type": "string",
                      "nullable": true,
                      "description": "E-Mail oder Akteurskennung des Uploaders, sofern verfügbar."
                    },
                    "created_at": {
                      "type": "string",
                      "format": "date-time",
                      "description": "Zeitstempel des Uploads."
                    }
                  }
                },
                "examples": {
                  "Uploaded": {
                    "value": {
                      "uuid": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee",
                      "image_url": "https://signed-url.example/face.jpg",
                      "comment": "Imported from previous KYC provider",
                      "uploaded_by": "api",
                      "created_at": "2026-05-18T12:00:00Z"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Ungültiger Anfrage-Body oder ungültiges Bild. Häufige Ursachen: ungültiges Base64, ungültiges Bild, kein erkennbares Gesicht, Bild über 2 MB, fehlendes Embedding oder der Benutzer hat bereits 5 hochgeladene Gesichter.",
            "content": {
              "application/json": {
                "examples": {
                  "No face": {
                    "value": {
                      "image": "No face detected in the image. Please upload a clear photo with a visible face."
                    }
                  },
                  "Too many faces": {
                    "value": {
                      "detail": "Maximum of 5 faces per user reached."
                    }
                  },
                  "Too large": {
                    "value": {
                      "image": "Image exceeds maximum size of 2 MB."
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Fehlender oder ungültiger API-Schlüssel.",
            "content": {
              "application/json": {
                "examples": {
                  "Missing key": {
                    "value": {
                      "detail": "Authentication credentials were not provided."
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Der Berechtigungsnachweis ist gültig, kann jedoch keine Benutzerprofile für diese Anwendung schreiben.",
            "content": {
              "application/json": {
                "examples": {
                  "Forbidden": {
                    "value": {
                      "detail": "You do not have permission to perform this action."
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Für diese `didit_internal_id` existiert kein Benutzer in der Anwendung.",
            "content": {
              "application/json": {
                "examples": {
                  "Not found": {
                    "value": {
                      "detail": "Not found."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate-Limit überschritten; drosseln Sie die Anfragen und wiederholen Sie den Versuch.",
            "content": {
              "application/json": {
                "examples": {
                  "Rate limited": {
                    "value": {
                      "detail": "Request was throttled. Expected available in 30 seconds."
                    }
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/v3/session/{sessionId}/update-data/": {
      "patch": {
        "summary": "Aus dem Ausweisdokument extrahierte KYC-Daten in einer Verifizierungssitzung aktualisieren",
        "description": "Korrigieren Sie die aus dem Ausweisdokument des Benutzers extrahierten Identitätsfelder (OCR / NFC) – falsch gelesene Namen, Daten, Dokumentnummern usw. –, nachdem die Verifizierung abgeschlossen ist. Typische Aufrufer sind ein Compliance-Analyst, der aus Ihrem eigenen Backoffice arbeitet, oder ein automatisierter Abgleichsjob. Jedes Feld im Body ist optional: Es werden nur die Schlüssel geschrieben, die Sie senden, alles andere bleibt unverändert (`PATCH`-Semantik).\n\nDie Sitzung muss zu Ihrer Anwendung gehören und den Status `Approved`, `Declined`, `In Review` oder `Kyc Expired` aufweisen. Sitzungen in jedem anderen Status (z. B. noch `In Progress`) geben `404` mit `\"No Session matches the given query.\"` zurück – im Unterschied zu `\"Not found.\"`, das bei einer unbekannten oder gelöschten `sessionId` zurückgegeben wird. Die Sitzung muss außerdem einen Datensatz zur Ausweisverifizierung (KYC) enthalten: Sitzungen, deren Workflow nie einen Schritt zur Ausweisverifizierung ausgeführt hat, geben `404` zurück (`\"The session does not have a KYC.\"`). Bei Graph-Workflows mit mehreren Ausweisverifizierungsschritten können Sie einen bestimmten Schritt mit `node_id` (Query-Parameter oder Body-Feld) ansteuern; wenn dieser weggelassen wird, wird der neueste KYC-Datensatz gepatcht.\n\nZwei abgeleitete Felder werden bei jedem Aufruf neu berechnet: `full_name` (aus `first_name` + `last_name`) und `issuing_state_name` (aus `issuing_state`). Wenn sich die Freitext-`address` ändert, kann der Server diese auch neu geokodieren und `parsed_address` aktualisieren (wird bei Sandbox-Sitzungen übersprungen). `extra_fields` und `parsed_address` werden Schlüssel für Schlüssel zusammengeführt und nicht ersetzt – siehe die Beschreibungen der einzelnen Felder für die Semantik von `null` zum Löschen.\n\nDas Übermitteln von mindestens einem gültigen Feld löst den `data.updated`-[Webhook](/de/integration/webhooks) aus (Auslöser `manual_review`) – selbst dann, wenn die übermittelten Werte den gespeicherten entsprechen. Wenn sich Werte tatsächlich ändern, wird ein `KYC_DATA_UPDATED`-Aktivitätseintrag, der die geänderten Felder mit vorherigen und neuen Werten erfasst, an die `reviews` der Sitzung angehängt, sichtbar in [Get Decision](#get-/v3/session/-sessionId-/decision/) und in der Aktivitäts-Timeline der Konsole. Der Status und die Entscheidung der Sitzung werden **nicht** neu bewertet – verwenden Sie [Update Status](#patch-/v3/session/-sessionId-/update-status/), um das Ergebnis zu ändern. Ein leerer JSON-Body (`{}`) wird akzeptiert und gibt einfach die aktuellen KYC-Daten zurück, ohne den Webhook auszulösen.\n\nAkzeptiert einen API-Schlüssel oder ein Konsolen-Benutzer-Token; in beiden Fällen benötigt der Berechtigungsnachweis die Berechtigung `write:sessions`. Sowohl Authentifizierungs- als auch Berechtigungsfehler geben `403` zurück – diese API antwortet nie mit `401`. Beachten Sie, dass die Sitzungssuche vor den Berechtigungsprüfungen erfolgt, sodass eine unbekannte `sessionId` selbst bei fehlenden Anmeldedaten `404` zurückgibt. Dieser Endpoint hat ein dediziertes Rate-Limit von 10 Anfragen pro Minute pro API-Schlüssel (ungültige Anfragen zählen ebenfalls); das geteilte Schreibbudget von 300 Anfragen pro Minute gilt ebenfalls.",
        "operationId": "patch_v3_session_update_data",
        "x-didit-sdk": {
          "resource": "sessions",
          "method": "update_data",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Sessions"
        ],
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "parameters": [
          {
            "name": "sessionId",
            "in": "path",
            "required": true,
            "description": "UUID der Sitzung zur Benutzerverifizierung (KYC), deren extrahierte Dokumentdaten Sie korrigieren. Sitzungs-IDs der Unternehmensverifizierung (KYB) sind hier nicht gültig — verwenden Sie für Unternehmensdaten [KYB-Unternehmensdaten aktualisieren](#patch-/v3/session/-sessionId-/kyb/-companyUuid-/update-data/).",
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "11111111-2222-3333-4444-555555555555"
            }
          },
          {
            "name": "node_id",
            "in": "query",
            "required": false,
            "description": "Workflow-Graph-Knoten, dessen KYC-Datensatz aktualisiert werden soll, bei Graph-Workflows mit mehreren Schritten zur Ausweisverifizierung (wird auch als `node_id`-Body-Feld akzeptiert). Wenn nicht angegeben, wird der jüngste KYC-Datensatz der Sitzung aktualisiert. Falls für den angegebenen Knoten kein KYC existiert, gibt der Aufruf `404` zurück (`\"The session does not have a KYC for node '<node_id>'.\"`).",
            "schema": {
              "type": "string",
              "example": "feature_ocr"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "description": "Alle Felder optional – senden Sie nur das, was Sie ändern möchten.",
                "properties": {
                  "document_type": {
                    "type": "string",
                    "description": "Dokumenttyp-Code. Akzeptiert die im Enum aufgeführten Kurzcodes sowie sechs Aliasse in Langform, die vor der Validierung serverseitig normalisiert werden: `Passport` → `P`, `Identity Card` → `ID`, `Driver's License` → `DL`, `Residence Permit` → `RP`, `Health Insurance Card` → `HIC`, `Tax Card` → `TC`. Jeder andere Wert (einschließlich `PASSPORT` in Großbuchstaben) gibt `400` zurück.",
                    "enum": [
                      "P",
                      "DL",
                      "ID",
                      "RP",
                      "SSC",
                      "HIC",
                      "WP",
                      "TC",
                      "VISA",
                      "PSC",
                      "BC",
                      "OTHER"
                    ],
                    "nullable": true,
                    "example": "P"
                  },
                  "document_subtype": {
                    "type": "string",
                    "maxLength": 128,
                    "nullable": true,
                    "description": "Dokument-Untertyp aus dem Dokumentenregister, einschließlich des Regionspräfixes, wenn das Register regionale Varianten unterscheidet."
                  },
                  "document_number": {
                    "type": "string",
                    "maxLength": 255,
                    "nullable": true,
                    "description": "Dokumentennummer wie auf dem Ausweis aufgedruckt.",
                    "example": "PAB123456"
                  },
                  "personal_number": {
                    "type": "string",
                    "maxLength": 255,
                    "nullable": true,
                    "description": "Persönliche / nationale Identifikationsnummer, sofern das Dokument eine solche enthält (z. B. spanische DNI auf einem Reisepass).",
                    "example": "99999999R"
                  },
                  "date_of_birth": {
                    "type": "string",
                    "format": "date",
                    "nullable": true,
                    "description": "Geburtsdatum in `YYYY-MM-DD`. Jedes andere Format gibt `400` zurück.",
                    "example": "1980-01-01"
                  },
                  "date_of_issue": {
                    "type": "string",
                    "format": "date",
                    "nullable": true,
                    "description": "Ausstellungsdatum des Dokuments im Format `YYYY-MM-DD`."
                  },
                  "expiration_date": {
                    "type": "string",
                    "format": "date",
                    "nullable": true,
                    "description": "Ablaufdatum des Dokuments im Format `YYYY-MM-DD`."
                  },
                  "issuing_state": {
                    "type": "string",
                    "nullable": true,
                    "description": "Ausstellungsland als ISO 3166-1 Alpha-3-Code. Groß-/Kleinschreibung wird nicht berücksichtigt (`esp` wird als `ESP` gespeichert); der in [Entscheidung abrufen](#get-/v3/session/-sessionId-/decision/) angezeigte, lesbare `issuing_state_name` wird anhand dieses Werts neu berechnet. Ungültige Codes geben `400` zurück.",
                    "example": "ESP"
                  },
                  "first_name": {
                    "type": "string",
                    "maxLength": 255,
                    "nullable": true,
                    "description": "Vorname(n). Der gespeicherte `full_name` wird bei jedem Aufruf dieses Endpoints als `first_name + ' ' + last_name` neu berechnet.",
                    "example": "Carmen"
                  },
                  "last_name": {
                    "type": "string",
                    "maxLength": 255,
                    "nullable": true,
                    "description": "Nachname(n). Fließt auch in den neu berechneten `full_name` ein.",
                    "example": "Espanola Espanola"
                  },
                  "gender": {
                    "type": "string",
                    "enum": [
                      "M",
                      "F",
                      "U"
                    ],
                    "nullable": true,
                    "description": "Geschlecht wie auf dem Dokument aufgedruckt: `M` (männlich), `F` (weiblich) oder `U` (unbekannt). Jeder andere Wert — einschließlich `X` — gibt `400` zurück."
                  },
                  "address": {
                    "type": "string",
                    "maxLength": 255,
                    "nullable": true,
                    "description": "Freitextadresse, wie auf dem Dokument aufgedruckt. Wenn sich dieser Wert ändert (nur bei Nicht-Sandbox-Sitzungen) und die strukturierte Adresse noch fehlt oder unvollständig ist, führt der Server vor der Antwort synchron ein erneutes Geocoding durch – der 200-Body enthält bereits die aktualisierte `parsed_address`. Das erneute Geocoding erfordert außerdem, dass `issuing_state` im KYC-Datensatz vorhanden ist."
                  },
                  "place_of_birth": {
                    "type": "string",
                    "maxLength": 255,
                    "nullable": true,
                    "description": "Geburtsort wie auf dem Dokument aufgedruckt."
                  },
                  "nationality": {
                    "type": "string",
                    "maxLength": 32,
                    "nullable": true,
                    "description": "Staatsangehörigkeit wie auf dem Dokument aufgedruckt. Freitext bis zu 32 Zeichen – typischerweise ein ISO-3166-1-alpha-3-Code (z. B. `ESP`), wird jedoch nicht als solcher validiert."
                  },
                  "marital_status": {
                    "type": "string",
                    "enum": [
                      "SINGLE",
                      "MARRIED",
                      "DIVORCED",
                      "WIDOWED",
                      "UNKNOWN"
                    ],
                    "description": "Familienstand, sofern im Dokument enthalten. Jeder andere Wert gibt `400` zurück."
                  },
                  "extra_fields": {
                    "type": "object",
                    "additionalProperties": true,
                    "nullable": true,
                    "description": "Überschreibungen pro Schlüssel für dokumentspezifische Zusatzfelder (z. B. `blood_group`, `dl_categories`, `mrz_string`). Schlüssel werden in die bestehende Überschreibungs-Map zusammengeführt: Senden Sie einen Schlüssel mit einem Wert, um ihn zu setzen, oder mit `null` / `\"\"`, um diesen Schlüssel aus der zusammengeführten Ansicht zu entfernen. Senden Sie das gesamte Feld als `null`, um alle zuvor angewendeten Überschreibungen zu löschen. Muss ein JSON-Objekt sein, andernfalls `400`. Die Antwort gibt immer die zusammengeführte Ansicht zurück (per OCR extrahierte Werte mit Ihren angewendeten Überschreibungen)."
                  },
                  "parsed_address": {
                    "type": "object",
                    "nullable": true,
                    "description": "Strukturierte Adresse. Nur diese verschachtelten Schlüssel werden akzeptiert: `address_type`, `city`, `region`, `street_1`, `street_2`, `postal_code`, `country` – jeder andere Schlüssel gibt `400` zurück. Semantik pro Schlüssel: Ein Wert setzt den Schlüssel, `null` entfernt ihn. `formatted_address` wird serverseitig neu berechnet, indem `street_1`, `street_2`, `city`, `region`, `postal_code` und `country` zusammengefügt werden, und wird in der Antwort zurückgegeben – Sie können sie nicht direkt festlegen.",
                    "properties": {
                      "address_type": {
                        "type": "string",
                        "nullable": true,
                        "description": "Freiform-Adressklassifizierung (z. B. `home`)."
                      },
                      "city": {
                        "type": "string",
                        "nullable": true,
                        "example": "Madrid"
                      },
                      "region": {
                        "type": "string",
                        "nullable": true,
                        "description": "Bundesland / Provinz / autonome Gemeinschaft."
                      },
                      "street_1": {
                        "type": "string",
                        "nullable": true,
                        "example": "Avda de Madrid 34"
                      },
                      "street_2": {
                        "type": "string",
                        "nullable": true
                      },
                      "postal_code": {
                        "type": "string",
                        "nullable": true,
                        "example": "28013"
                      },
                      "country": {
                        "type": "string",
                        "nullable": true,
                        "description": "ISO 3166-1 Alpha-2-Ländercode. Die Eingabe in Kleinbuchstaben wird in Großbuchstaben normalisiert; Alpha-3-Codes werden mit `400` abgelehnt.",
                        "example": "ES"
                      }
                    }
                  }
                }
              },
              "examples": {
                "Correct name and DOB": {
                  "summary": "Durch OCR falsch gelesenen Namen, Geburtsdatum und strukturierte Adresse korrigieren",
                  "value": {
                    "first_name": "Carmen",
                    "last_name": "Espanola Espanola",
                    "date_of_birth": "1980-01-01",
                    "issuing_state": "ESP",
                    "marital_status": "MARRIED",
                    "extra_fields": {
                      "blood_group": "O+"
                    },
                    "parsed_address": {
                      "street_1": "Avda de Madrid 34",
                      "city": "Madrid",
                      "postal_code": "28013",
                      "country": "ES"
                    }
                  }
                },
                "Remove an extra field": {
                  "summary": "Einen Schlüssel für ein zusätzliches Feld löschen, den Rest behalten",
                  "value": {
                    "extra_fields": {
                      "blood_group": null
                    }
                  }
                },
                "Long-form document type": {
                  "summary": "Langform-Alias wird zum Kurzcode normalisiert (hier P)",
                  "value": {
                    "document_type": "Passport"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "KYC-Daten aktualisiert. Gibt den **vollständigen aktuellen KYC-Datensatz** zurück (jedes aktualisierbare Feld mit seinem gespeicherten Wert sowie die zusammengeführten `extra_fields` und die aktuelle `parsed_address`) – nicht nur die von Ihnen übermittelten Felder. Der Webhook `data.updated` wird ausgelöst, wenn mindestens ein gültiges Feld in der Payload enthalten war.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "document_type": {
                      "type": "string",
                      "description": "Dokumenttyp-Code. Akzeptiert die im Enum aufgeführten Kurzcodes sowie sechs Aliasse in Langform, die vor der Validierung serverseitig normalisiert werden: `Passport` → `P`, `Identity Card` → `ID`, `Driver's License` → `DL`, `Residence Permit` → `RP`, `Health Insurance Card` → `HIC`, `Tax Card` → `TC`. Jeder andere Wert (einschließlich `PASSPORT` in Großbuchstaben) gibt `400` zurück.",
                      "enum": [
                        "P",
                        "DL",
                        "ID",
                        "RP",
                        "SSC",
                        "HIC",
                        "WP",
                        "TC",
                        "VISA",
                        "PSC",
                        "BC",
                        "OTHER"
                      ],
                      "nullable": true,
                      "example": "P"
                    },
                    "document_subtype": {
                      "type": "string",
                      "maxLength": 128,
                      "nullable": true,
                      "description": "Dokument-Untertyp aus dem Dokumentenregister, einschließlich des Regionspräfixes, wenn das Register regionale Varianten unterscheidet."
                    },
                    "document_number": {
                      "type": "string",
                      "maxLength": 255,
                      "nullable": true,
                      "description": "Dokumentennummer wie auf dem Ausweis aufgedruckt.",
                      "example": "PAB123456"
                    },
                    "personal_number": {
                      "type": "string",
                      "maxLength": 255,
                      "nullable": true,
                      "description": "Persönliche / nationale Identifikationsnummer, sofern das Dokument eine solche enthält (z. B. spanische DNI auf einem Reisepass).",
                      "example": "99999999R"
                    },
                    "date_of_birth": {
                      "type": "string",
                      "format": "date",
                      "nullable": true,
                      "description": "Geburtsdatum in `YYYY-MM-DD`. Jedes andere Format gibt `400` zurück.",
                      "example": "1980-01-01"
                    },
                    "date_of_issue": {
                      "type": "string",
                      "format": "date",
                      "nullable": true,
                      "description": "Ausstellungsdatum des Dokuments im Format `YYYY-MM-DD`."
                    },
                    "expiration_date": {
                      "type": "string",
                      "format": "date",
                      "nullable": true,
                      "description": "Ablaufdatum des Dokuments im Format `YYYY-MM-DD`."
                    },
                    "issuing_state": {
                      "type": "string",
                      "nullable": true,
                      "description": "Ausstellungsland als ISO 3166-1 Alpha-3-Code. Groß-/Kleinschreibung wird nicht berücksichtigt (`esp` wird als `ESP` gespeichert); der in [Entscheidung abrufen](#get-/v3/session/-sessionId-/decision/) angezeigte, lesbare `issuing_state_name` wird anhand dieses Werts neu berechnet. Ungültige Codes geben `400` zurück.",
                      "example": "ESP"
                    },
                    "first_name": {
                      "type": "string",
                      "maxLength": 255,
                      "nullable": true,
                      "description": "Vorname(n). Der gespeicherte `full_name` wird bei jedem Aufruf dieses Endpoints als `first_name + ' ' + last_name` neu berechnet.",
                      "example": "Carmen"
                    },
                    "last_name": {
                      "type": "string",
                      "maxLength": 255,
                      "nullable": true,
                      "description": "Nachname(n). Fließt auch in den neu berechneten `full_name` ein.",
                      "example": "Espanola Espanola"
                    },
                    "gender": {
                      "type": "string",
                      "enum": [
                        "M",
                        "F",
                        "U"
                      ],
                      "nullable": true,
                      "description": "Geschlecht wie auf dem Dokument aufgedruckt: `M` (männlich), `F` (weiblich) oder `U` (unbekannt). Jeder andere Wert — einschließlich `X` — gibt `400` zurück."
                    },
                    "address": {
                      "type": "string",
                      "maxLength": 255,
                      "nullable": true,
                      "description": "Freitextadresse, wie auf dem Dokument aufgedruckt. Wenn sich dieser Wert ändert (nur bei Nicht-Sandbox-Sitzungen) und die strukturierte Adresse noch fehlt oder unvollständig ist, führt der Server im Hintergrund derselben Anfrage ein erneutes Geocoding durch und kann `parsed_address` mit dem Geocoder-Ergebnis überschreiben."
                    },
                    "place_of_birth": {
                      "type": "string",
                      "maxLength": 255,
                      "nullable": true,
                      "description": "Geburtsort wie auf dem Dokument aufgedruckt."
                    },
                    "nationality": {
                      "type": "string",
                      "maxLength": 32,
                      "nullable": true,
                      "description": "Staatsangehörigkeit wie auf dem Dokument aufgedruckt. Freitext bis zu 32 Zeichen – typischerweise ein ISO-3166-1-alpha-3-Code (z. B. `ESP`), wird jedoch nicht als solcher validiert."
                    },
                    "marital_status": {
                      "type": "string",
                      "enum": [
                        "SINGLE",
                        "MARRIED",
                        "DIVORCED",
                        "WIDOWED",
                        "UNKNOWN"
                      ],
                      "description": "Familienstand, sofern im Dokument enthalten. Jeder andere Wert gibt `400` zurück."
                    },
                    "extra_fields": {
                      "type": "object",
                      "additionalProperties": true,
                      "nullable": true,
                      "description": "Zusammengeführte Ansicht der zusätzlichen Felder des Dokuments: die per OCR extrahierten Werte mit allen angewendeten Operator-Überschreibungen. Schlüssel, die über eine `null`-Überschreibung entfernt wurden, fehlen in dieser Map."
                    },
                    "parsed_address": {
                      "type": "object",
                      "nullable": true,
                      "description": "Aktuelle strukturierte Adresse (ohne interne Buchhaltungsschlüssel) oder `null`, falls keine vorhanden ist. Enthält die neu berechnete `formatted_address` zusammen mit den sieben bearbeitbaren Schlüsseln.",
                      "properties": {
                        "address_type": {
                          "type": "string",
                          "nullable": true,
                          "description": "Freiform-Adressklassifizierung (z. B. `home`)."
                        },
                        "city": {
                          "type": "string",
                          "nullable": true,
                          "example": "Madrid"
                        },
                        "region": {
                          "type": "string",
                          "nullable": true,
                          "description": "Bundesland / Provinz / autonome Gemeinschaft."
                        },
                        "street_1": {
                          "type": "string",
                          "nullable": true,
                          "example": "Avda de Madrid 34"
                        },
                        "street_2": {
                          "type": "string",
                          "nullable": true
                        },
                        "postal_code": {
                          "type": "string",
                          "nullable": true,
                          "example": "28013"
                        },
                        "country": {
                          "type": "string",
                          "nullable": true,
                          "description": "ISO 3166-1 Alpha-2-Ländercode. Die Eingabe in Kleinbuchstaben wird in Großbuchstaben normalisiert; Alpha-3-Codes werden mit `400` abgelehnt.",
                          "example": "ES"
                        },
                        "formatted_address": {
                          "type": "string",
                          "nullable": true,
                          "description": "Zusammengefasste, lesbare Form der strukturierten Adresse. Wird nach jeder Bearbeitung von `parsed_address` serverseitig neu berechnet.",
                          "example": "Avda de Madrid 34, Madrid, 28013, ES"
                        }
                      }
                    }
                  }
                },
                "examples": {
                  "Updated KYC": {
                    "summary": "Vollständiger KYC-Datensatz nach der Korrektur",
                    "value": {
                      "document_type": "P",
                      "document_subtype": null,
                      "document_number": "PAB123456",
                      "personal_number": "99999999R",
                      "date_of_birth": "1980-01-01",
                      "date_of_issue": "2021-02-09",
                      "expiration_date": "2031-02-08",
                      "issuing_state": "ESP",
                      "first_name": "Carmen",
                      "last_name": "Espanola Espanola",
                      "gender": "F",
                      "address": "AVDA DE MADRID 34, MADRID, MADRID 28013",
                      "place_of_birth": "MADRID",
                      "nationality": "ESP",
                      "marital_status": "MARRIED",
                      "extra_fields": {
                        "mrz_string": "P<ESPESPANOLA<<CARMEN<<<<<",
                        "blood_group": "O+"
                      },
                      "parsed_address": {
                        "city": "Madrid",
                        "street_1": "Avda de Madrid 34",
                        "postal_code": "28013",
                        "country": "ES",
                        "formatted_address": "Avda de Madrid 34, Madrid, 28013, ES"
                      }
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Validierungsfehler. Feldfehler werden als `{\"<field>\": [\"<message>\"]}` zurückgegeben; Fehler bei verschachtelten Schlüsseln unter `parsed_address` / `extra_fields` verwenden einen Objektwert: `{\"parsed_address\": {\"<key>\": \"<message>\"}}`.",
            "content": {
              "application/json": {
                "examples": {
                  "Invalid gender": {
                    "summary": "gender muss M, F oder U sein",
                    "value": {
                      "gender": [
                        "\"X\" is not a valid choice."
                      ]
                    }
                  },
                  "Invalid document type": {
                    "summary": "Kein Kurzcode oder Langform-Alias",
                    "value": {
                      "document_type": [
                        "\"PASSPORT\" is not a valid choice."
                      ]
                    }
                  },
                  "Invalid issuing state": {
                    "summary": "issuing_state ist kein ISO 3166-1 alpha-3",
                    "value": {
                      "issuing_state": [
                        "Invalid ISO 3166-1 alpha-3 country code for issuing_state."
                      ]
                    }
                  },
                  "Invalid marital status": {
                    "summary": "marital_status nicht im Enum",
                    "value": {
                      "marital_status": [
                        "\"ENGAGED\" is not a valid choice."
                      ]
                    }
                  },
                  "Bad date format": {
                    "summary": "Datumsangaben müssen im Format JJJJ-MM-TT vorliegen",
                    "value": {
                      "date_of_birth": [
                        "Date has wrong format. Use one of these formats instead: YYYY-MM-DD."
                      ]
                    }
                  },
                  "Unsupported parsed_address key": {
                    "summary": "Nur die sieben dokumentierten Schlüssel sind zulässig",
                    "value": {
                      "parsed_address": {
                        "zipcode": "Unsupported key. Allowed keys: address_type, city, region, street_1, street_2, postal_code, country"
                      }
                    }
                  },
                  "Invalid parsed_address country": {
                    "summary": "Verschachteltes Land muss Alpha-2 sein, nicht Alpha-3",
                    "value": {
                      "parsed_address": {
                        "country": "Invalid ISO 3166-1 alpha-2 country code."
                      }
                    }
                  },
                  "extra_fields not an object": {
                    "summary": "extra_fields muss ein JSON-Objekt sein",
                    "value": {
                      "extra_fields": [
                        "This field must be a JSON object."
                      ]
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Fehlende Anmeldedaten oder unzureichende Berechtigungen. Ein fehlender Schlüssel führt zu einer `403`-Antwort; ein falscher, widerrufener oder abgelaufener Schlüssel führt zu einer `401`-Antwort.",
            "content": {
              "application/json": {
                "examples": {
                  "Invalid Credentials": {
                    "summary": "Fehlender oder ungültiger x-api-key",
                    "value": {
                      "detail": "Authentication credentials were not provided or are invalid."
                    }
                  },
                  "Missing Privilege": {
                    "summary": "Dem Berechtigungsnachweis fehlt die Berechtigung write:sessions",
                    "value": {
                      "detail": "You do not have permission to perform this action."
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Unbekannte Sitzung, Sitzung in einem nicht bearbeitbaren Status oder kein KYC-Datensatz zum Patchen vorhanden. Jeder Fall hat eine eindeutige `detail`-Meldung (siehe Beispiele). Die Suche nach der unbekannten Sitzung läuft vor den Anmeldedatenprüfungen ab.",
            "content": {
              "application/json": {
                "examples": {
                  "Unknown session": {
                    "summary": "Keine Sitzung mit dieser ID in Ihrer Anwendung (oder sie wurde gelöscht)",
                    "value": {
                      "detail": "Not found."
                    }
                  },
                  "Wrong session state": {
                    "summary": "Sitzung existiert, hat aber nicht den Status Genehmigt / Abgelehnt / In Prüfung / Kyc Abgelaufen",
                    "value": {
                      "detail": "No Session matches the given query."
                    }
                  },
                  "No KYC record": {
                    "summary": "Der Workflow hat nie einen Schritt zur Ausweisverifizierung ausgeführt",
                    "value": {
                      "detail": "The session does not have a KYC."
                    }
                  },
                  "No KYC for node": {
                    "summary": "node_id angegeben, aber es existiert kein KYC dafür",
                    "value": {
                      "detail": "The session does not have a KYC for node 'feature_missing'."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Dediziertes Rate-Limit überschritten – 10 KYC-Datenaktualisierungen pro Minute pro API-Schlüssel (abgelehnte Anfragen zählen zum Kontingent). Das gemeinsame Schreibkontingent von 300/min kann ebenfalls mit einer eigenen Meldung auslösen. Überprüfen Sie `Retry-After` und die Antwort-Header `X-RateLimit-*`, bevor Sie es erneut versuchen.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string"
                    }
                  }
                },
                "examples": {
                  "Rate limited": {
                    "summary": "KYC-Aktualisierungsbudget aufgebraucht",
                    "value": {
                      "detail": "Session KYC data update rate limit exceeded. You can make up to 10 requests per minute."
                    }
                  }
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X PATCH \\\n  https://verification.didit.me/v3/session/11111111-2222-3333-4444-555555555555/update-data/ \\\n  -H 'x-api-key: YOUR_API_KEY' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\n    \"first_name\": \"Carmen\",\n    \"last_name\": \"Espanola Espanola\",\n    \"date_of_birth\": \"1980-01-01\",\n    \"issuing_state\": \"ESP\",\n    \"parsed_address\": {\n      \"street_1\": \"Avda de Madrid 34\",\n      \"city\": \"Madrid\",\n      \"postal_code\": \"28013\",\n      \"country\": \"ES\"\n    }\n  }'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.sessions.update_data(\n    \"11111111-2222-3333-4444-555555555555\",\n    date_of_birth=\"1980-01-01\",\n    issuing_state=\"ESP\",\n    first_name=\"Carmen\",\n    last_name=\"Espanola Espanola\",\n    marital_status=\"MARRIED\",\n    extra_fields={\"blood_group\": \"O+\"},\n    parsed_address={\n        \"city\": \"Madrid\",\n        \"street_1\": \"Avda de Madrid 34\",\n        \"postal_code\": \"28013\",\n        \"country\": \"ES\",\n    },\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.sessions.updateData(\"11111111-2222-3333-4444-555555555555\", {\n  date_of_birth: \"1980-01-01\",\n  issuing_state: \"ESP\",\n  first_name: \"Carmen\",\n  last_name: \"Espanola Espanola\",\n  marital_status: \"MARRIED\",\n  extra_fields: { blood_group: \"O+\" },\n  parsed_address: {\n    city: \"Madrid\",\n    street_1: \"Avda de Madrid 34\",\n    postal_code: \"28013\",\n    country: \"ES\",\n  },\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Sessions.UpdateData(ctx, \"11111111-2222-3333-4444-555555555555\", didit.SessionsUpdateDataParams{\n\tDateOfBirth:   didit.String(\"1980-01-01\"),\n\tIssuingState:  didit.String(\"ESP\"),\n\tFirstName:     didit.String(\"Carmen\"),\n\tLastName:      didit.String(\"Espanola Espanola\"),\n\tMaritalStatus: didit.Some(didit.SessionsUpdateDataParamsMaritalStatus(\"MARRIED\")),\n\tExtraFields:   didit.Some(map[string]any{\"blood_group\": \"O+\"}),\n\tParsedAddress: didit.Some(didit.SessionsUpdateDataParamsParsedAddress{\n\t\tCity:       didit.String(\"Madrid\"),\n\t\tStreet1:    didit.String(\"Avda de Madrid 34\"),\n\t\tPostalCode: didit.String(\"28013\"),\n\t\tCountry:    didit.String(\"ES\"),\n\t}),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import java.time.LocalDate;\nimport java.util.Map;\nimport me.didit.Didit;\nimport me.didit.types.SessionsUpdateDataParams;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.sessions().updateData(\"11111111-2222-3333-4444-555555555555\", SessionsUpdateDataParams.builder()\n        .dateOfBirth(LocalDate.parse(\"1980-01-01\"))\n        .issuingState(\"ESP\")\n        .firstName(\"Carmen\")\n        .lastName(\"Espanola Espanola\")\n        .maritalStatus(SessionsUpdateDataParams.MaritalStatus.of(\"MARRIED\"))\n        .extraFields(Map.of(\"blood_group\", \"O+\"))\n        .parsedAddress(SessionsUpdateDataParams.ParsedAddress.builder()\n                .city(\"Madrid\")\n                .street1(\"Avda de Madrid 34\")\n                .postalCode(\"28013\")\n                .country(\"ES\")\n                .build())\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->sessions->updateData('11111111-2222-3333-4444-555555555555', [\n    'date_of_birth' => '1980-01-01',\n    'issuing_state' => 'ESP',\n    'first_name' => 'Carmen',\n    'last_name' => 'Espanola Espanola',\n    'marital_status' => 'MARRIED',\n    'extra_fields' => ['blood_group' => 'O+'],\n    'parsed_address' => [\n        'city' => 'Madrid',\n        'street_1' => 'Avda de Madrid 34',\n        'postal_code' => '28013',\n        'country' => 'ES',\n    ],\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.sessions.update_data(\n  \"11111111-2222-3333-4444-555555555555\",\n  date_of_birth: \"1980-01-01\",\n  issuing_state: \"ESP\",\n  first_name: \"Carmen\",\n  last_name: \"Espanola Espanola\",\n  marital_status: \"MARRIED\",\n  extra_fields: { blood_group: \"O+\" },\n  parsed_address: {\n    city: \"Madrid\",\n    street_1: \"Avda de Madrid 34\",\n    postal_code: \"28013\",\n    country: \"ES\",\n  }\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Collections.Generic;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Sessions.UpdateDataAsync(\"11111111-2222-3333-4444-555555555555\", new SessionsUpdateDataParams\n{\n    DateOfBirth = \"1980-01-01\",\n    IssuingState = \"ESP\",\n    FirstName = \"Carmen\",\n    LastName = \"Espanola Espanola\",\n    MaritalStatus = new SessionsUpdateDataParamsMaritalStatus(\"MARRIED\"),\n    ExtraFields = new Dictionary<string, object> { [\"blood_group\"] = \"O+\" },\n    ParsedAddress = new SessionsUpdateDataParamsParsedAddress\n    {\n        City = \"Madrid\",\n        Street1 = \"Avda de Madrid 34\",\n        PostalCode = \"28013\",\n        Country = \"ES\",\n    },\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ]
      }
    },
    "/v3/session/{sessionId}/features/{nodeId}/update-status/": {
      "patch": {
        "summary": "Status einer einzelnen Funktion (Schritt) aktualisieren",
        "description": "Setzen Sie den Status einer einzelnen Verifizierungsfunktion (Schritt) innerhalb einer Sitzung. Adressieren Sie die Funktion über deren Workflow-Graph-`nodeId`. Bei Workflows ohne Graph, deren Schritte keinen Knoten haben, verwenden Sie `default` und übergeben Sie zusätzlich `feature_type`, um anzugeben, welchen Schritt Sie meinen.\n\nFunktioniert sowohl für Sitzungen der Benutzerverifizierung (KYC) als auch der Unternehmensverifizierung (KYB) und für jeden Schritttyp: ID/OCR, Liveness, Gesichtsabgleich, NFC, AML, Adressnachweis, Telefon, E-Mail, Datenbankvalidierung, Fragebogen sowie die KYB-Prüfungen für Register / Dokumente / Schlüsselpersonen. Dieser Endpoint ist für Standalone-API-Sitzungen (`session_type = API`) **nicht** verfügbar.\n\n`new_status` muss `Approved`, `Declined` oder `In Review` sein und sich vom aktuellen Status der Funktion unterscheiden.\n\n**Wann das Überschreiben angewendet wird.** Ohne `defer_until_flow_finishes` (oder mit `false`) wird das Überschreiben wie gewohnt sofort angewendet; befindet sich die Person noch im Ablauf, wird es als `forced` protokolliert. Mit `defer_until_flow_finishes: true`, während sich die Person noch im Ablauf befindet (die Sitzung ist `Not Started`, `In Progress` oder `Resubmitted` und noch nicht abgeschlossen), wird das Überschreiben als `pending_until_flow_finishes` gespeichert und angewendet, sobald der Ablauf beendet ist, nachdem der Ablauf seine eigene Entscheidung getroffen hat. Bei einer Sitzung, deren Ablauf bereits beendet ist, wird es in jedem Fall sofort angewendet. Ein wartendes Überschreiben wird stattdessen storniert, wenn die Person den Schritt vor Abschluss wiederholt, wenn ein neueres Überschreiben für dieselbe Prüfung es ersetzt, wenn die Sitzung den Ablauf unvollendet verlässt (abgebrochen, abgelaufen oder mitten im Ablauf entschieden) oder wenn Sie es mit `POST /v3/session/{sessionId}/features/overrides/{overrideId}/cancel/` stornieren. Rufen Sie die Überschreibungen einer Sitzung mit `GET /v3/session/{sessionId}/features/overrides/` ab.\n\n**Auswirkung auf die Sitzung.** Eine Sitzung, die bereits eine Entscheidung hat, behält diese: Nur die Prüfung ändert sich. Wenn die Sitzung noch keine Entscheidung hat und ihr Workflow genau auf diesen Schritt wartet, schließt das Anwenden des Überschreibens den Schritt ab: Der Workflow wird fortgesetzt, spätere Schritte werden ausgeführt, und ein Status-Knoten kann die Sitzungsentscheidung festlegen und `status.updated` auslösen.\n\n**Webhooks und Aktivität.** Ein `data.updated`-Webhook wird ausgelöst, wenn das Überschreiben angewendet wird (sofort oder nach Abschluss des Ablaufs), niemals während es wartet oder storniert wird. Jedes Überschreiben wird in den Aktivitäten der Sitzung als `FEATURE_OVERRIDE_PENDING`, `FEATURE_OVERRIDE_APPLIED` oder `FEATURE_OVERRIDE_CANCELLED` zusammen mit dem Ersteller protokolliert; der Eintrag der Anfrage enthält Ihren `comment`.\n\nAuthentifizieren Sie sich mit Ihrem API-Schlüssel (`x-api-key`) oder einem Benutzer-Autorisierungs-Header mit der Berechtigung `write:sessions`; ein API-Schlüssel mit Scopes benötigt Schreibzugriff auf Entscheidungen.",
        "operationId": "patch_v3_session_update_feature_status",
        "x-didit-sdk": {
          "resource": "sessions",
          "method": "update_feature_status",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Sessions"
        ],
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "parameters": [
          {
            "in": "path",
            "name": "sessionId",
            "required": true,
            "description": "UUID der Verifizierungssitzung. Akzeptiert sowohl Benutzer- (KYC) als auch Unternehmens- (KYB) Sitzungs-IDs — der Dienst löst die ID über beide Sitzungstypen hinweg auf.",
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "11111111-2222-3333-4444-555555555555"
            }
          },
          {
            "in": "path",
            "name": "nodeId",
            "required": true,
            "description": "Workflow-Graph-Knoten-ID der zu aktualisierenden Funktion (beispielsweise `feature_ocr_1`). Verwenden Sie den literalen Wert `default` für Nicht-Graph-Workflows (Einzelschritt-Workflows), bei denen die Funktion keine Knoten-ID besitzt.",
            "schema": {
              "type": "string",
              "example": "feature_ocr_1"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "new_status"
                ],
                "properties": {
                  "new_status": {
                    "type": "string",
                    "description": "Zielstatus für diese Funktion. Muss vom aktuellen Wert abweichen.",
                    "enum": [
                      "Approved",
                      "Declined",
                      "In Review"
                    ],
                    "example": "Approved"
                  },
                  "comment": {
                    "type": "string",
                    "description": "Optionale Freitextnotiz, die im Prüfungsprotokoll der Sitzung für diese Funktionsänderung aufgezeichnet wird.",
                    "example": "Document manually verified by compliance."
                  },
                  "feature_type": {
                    "type": "string",
                    "enum": [
                      "ID_VERIFICATION",
                      "OCR",
                      "OCR_BACK",
                      "NFC",
                      "LIVENESS",
                      "FACE",
                      "AGE_ESTIMATION",
                      "AGE_VERIFICATION",
                      "FACE_SEARCH",
                      "FACE_MATCH",
                      "IP_ANALYSIS",
                      "AML",
                      "PHONE",
                      "PHONE_VERIFICATION",
                      "EMAIL",
                      "EMAIL_VERIFICATION",
                      "POA",
                      "PROOF_OF_ADDRESS",
                      "DATABASE_VALIDATION",
                      "DATA_VALIDATION",
                      "QUESTIONNAIRE",
                      "DOCUMENT_AI",
                      "KYB_REGISTRY",
                      "KYB_DOCUMENTS",
                      "KYB_KEY_PEOPLE",
                      "BANK_VERIFICATION",
                      "GEOLOCATION"
                    ],
                    "description": "Auf welche Art von Schritt abgezielt werden soll. Erforderlich bei Nicht-Graph-Workflows (`nodeId` = `default`), bei denen die Schritte keinen gemeinsamen Knoten haben; andernfalls optional. Ein unbekannter Wert gibt `400` zurück.",
                    "example": "LIVENESS"
                  },
                  "defer_until_flow_finishes": {
                    "type": "boolean",
                    "default": false,
                    "description": "Solange sich die Person noch im Ablauf befindet, wird die Überschreibung als `pending_until_flow_finishes` gespeichert und angewendet, sobald der Ablauf beendet ist, anstatt sofort. Wenn weggelassen oder `false`, wird die Überschreibung sofort angewendet. Bei einer Sitzung, deren Ablauf bereits beendet ist, wird sie in jedem Fall sofort angewendet.",
                    "example": false
                  }
                }
              },
              "examples": {
                "Apply Now": {
                  "summary": "Den Ausweisschritt sofort genehmigen",
                  "value": {
                    "new_status": "Approved",
                    "comment": "Document manually verified by compliance."
                  }
                },
                "Wait For The Flow": {
                  "summary": "Den Liveness-Schritt genehmigen, sobald die Person den Ablauf beendet hat",
                  "value": {
                    "new_status": "Approved",
                    "comment": "Liveness retried with a reviewer present.",
                    "defer_until_flow_finishes": true
                  }
                },
                "Non-graph Workflow": {
                  "summary": "Auf den Liveness-Schritt eines Workflows ohne Knoten abzielen (nodeId = default)",
                  "value": {
                    "new_status": "In Review",
                    "feature_type": "LIVENESS"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Der Override wurde erfasst. `new_status` ist der gespeicherte Status der Prüfung: der angeforderte, sobald der Override angewendet wurde, der unveränderte, während er auf den Abschluss des Ablaufs wartet. `override` gibt an, was eingetreten ist.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "session_id": {
                      "type": "string",
                      "format": "uuid"
                    },
                    "node_id": {
                      "type": "string",
                      "nullable": true,
                      "description": "Der Workflow-Knoten des aktualisierten Schritts oder `null` für einen Schritt ohne Knoten (der `default`-Pfad in einem Workflow ohne Graph).",
                      "example": "feature_ocr_1"
                    },
                    "feature_type": {
                      "type": "string",
                      "description": "Modellname der aktualisierten Funktion (z. B. `KYC`, `Face`, `FaceMatch`, `AML`, `POA`).",
                      "example": "KYC"
                    },
                    "new_status": {
                      "type": "string",
                      "description": "Der gespeicherte Status der Überprüfung: der angefragte, sobald der Override angewendet wurde; der unveränderte, während der Override auf den Abschluss des Workflows wartet.",
                      "example": "Approved"
                    },
                    "override": {
                      "$ref": "#/components/schemas/FeatureStatusOverride"
                    }
                  },
                  "required": [
                    "session_id",
                    "node_id",
                    "feature_type",
                    "new_status",
                    "override"
                  ]
                },
                "examples": {
                  "Applied": {
                    "summary": "Der Override wurde sofort angewendet",
                    "value": {
                      "session_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
                      "node_id": "feature_ocr_1",
                      "feature_type": "KYC",
                      "new_status": "Approved",
                      "override": {
                        "id": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
                        "node_id": "feature_ocr_1",
                        "feature_type": "",
                        "feature_model": "KYC",
                        "previous_status": "In Review",
                        "new_status": "Approved",
                        "state": "applied",
                        "forced": false,
                        "reason": "Document manually verified by compliance.",
                        "requested_by": {
                          "email": "reviewer@example.com",
                          "name": "Alex Reviewer",
                          "type": "CONSOLE_USER"
                        },
                        "requested_at": "2026-10-13T09:15:00Z",
                        "applied_at": "2026-10-13T09:15:00Z",
                        "cancelled_at": null,
                        "cancel_reason": null
                      }
                    }
                  },
                  "Waiting For The Flow": {
                    "summary": "defer_until_flow_finishes, während sich die Person noch im Ablauf befindet",
                    "value": {
                      "session_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
                      "node_id": "feature_liveness_1",
                      "feature_type": "Face",
                      "new_status": "Declined",
                      "override": {
                        "id": "9b2f4c1e-8d3a-4e5f-a6b7-c8d9e0f1a2b3",
                        "node_id": "feature_liveness_1",
                        "feature_type": "",
                        "feature_model": "Face",
                        "previous_status": "Declined",
                        "new_status": "Approved",
                        "state": "pending_until_flow_finishes",
                        "forced": false,
                        "reason": "Liveness retried with a reviewer present.",
                        "requested_by": {
                          "email": "reviewer@example.com",
                          "name": "Alex Reviewer",
                          "type": "CONSOLE_USER"
                        },
                        "requested_at": "2026-10-13T09:15:00Z",
                        "applied_at": null,
                        "cancelled_at": null,
                        "cancel_reason": null
                      }
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Validierungsfehler. Wird zurückgegeben, wenn `new_status` ungültig oder unverändert ist, wenn `feature_type` unbekannt ist oder wenn die Sitzung eine eigenständige API-Sitzung ist.",
            "content": {
              "application/json": {
                "examples": {
                  "Same Status": {
                    "summary": "new_status entspricht dem aktuellen Status",
                    "value": {
                      "new_status": [
                        "The new status is the same as the current status."
                      ]
                    }
                  },
                  "API Session": {
                    "summary": "Funktionsstatus kann bei Standalone-API-Sitzungen nicht geändert werden",
                    "value": [
                      "Cannot change feature status for API sessions."
                    ]
                  },
                  "Unknown feature_type": {
                    "summary": "feature_type ist kein bekannter Schritttyp",
                    "value": {
                      "feature_type": [
                        "Unknown feature_type 'SELFIE'."
                      ]
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Der API-Schlüssel mit eingeschränktem Geltungsbereich ist abgelaufen.",
            "content": {
              "application/json": {
                "examples": {
                  "Expired API Key": {
                    "summary": "API-Schlüssel mit eingeschränktem Berechtigungsumfang nach Ablaufdatum",
                    "value": {
                      "detail": "This API key has expired."
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Fehlende Anmeldedaten oder unzureichende Berechtigungen.",
            "content": {
              "application/json": {
                "examples": {
                  "Invalid Credentials": {
                    "summary": "Fehlender oder ungültiger x-api-key",
                    "value": {
                      "detail": "Authentication credentials were not provided or are invalid."
                    }
                  },
                  "Missing Privilege": {
                    "summary": "Dem API-Schlüssel fehlt die Berechtigung write:sessions",
                    "value": {
                      "detail": "You do not have permission to perform this action."
                    }
                  },
                  "Scoped Key Without Access": {
                    "summary": "API-Schlüssel mit eingeschränktem Berechtigungsumfang ohne Schreibzugriff auf Entscheidungen",
                    "value": {
                      "detail": "This API key has no write access to decisions."
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Die Sitzung wurde nicht gefunden, oder sie besitzt keine Funktion mit der angegebenen `nodeId`.",
            "content": {
              "application/json": {
                "examples": {
                  "Session Not Found": {
                    "summary": "Unbekannte session_id",
                    "value": {
                      "detail": "Session not found."
                    }
                  },
                  "Feature Not Found": {
                    "summary": "Keine Funktion für diese node_id",
                    "value": {
                      "detail": "No feature found with node_id 'feature_ocr_1' in this session."
                    }
                  }
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X PATCH \\\n  https://verification.didit.me/v3/session/11111111-2222-3333-4444-555555555555/features/feature_ocr_1/update-status/ \\\n  -H 'x-api-key: YOUR_API_KEY' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\n    \"new_status\": \"Approved\",\n    \"comment\": \"Document manually verified by compliance.\"\n  }'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.sessions.update_feature_status(\n    \"11111111-2222-3333-4444-555555555555\",\n    \"feature_ocr_1\",\n    new_status=\"Approved\",\n    comment=\"Document manually verified by compliance.\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.sessions.updateFeatureStatus(\n  \"11111111-2222-3333-4444-555555555555\",\n  \"feature_ocr_1\",\n  {\n    new_status: \"Approved\",\n    comment: \"Document manually verified by compliance.\",\n  },\n);\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Sessions.UpdateFeatureStatus(ctx, \"11111111-2222-3333-4444-555555555555\", \"feature_ocr_1\", didit.SessionsUpdateFeatureStatusParams{\n\tNewStatus: \"Approved\",\n\tComment:   didit.String(\"Document manually verified by compliance.\"),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\nimport me.didit.types.SessionsUpdateFeatureStatusParams;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.sessions().updateFeatureStatus(\"11111111-2222-3333-4444-555555555555\", \"feature_ocr_1\", SessionsUpdateFeatureStatusParams.builder()\n        .newStatus(SessionsUpdateFeatureStatusParams.NewStatus.of(\"Approved\"))\n        .comment(\"Document manually verified by compliance.\")\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->sessions->updateFeatureStatus('11111111-2222-3333-4444-555555555555', 'feature_ocr_1', [\n    'new_status' => 'Approved',\n    'comment' => 'Document manually verified by compliance.',\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.sessions.update_feature_status(\n  \"11111111-2222-3333-4444-555555555555\",\n  \"feature_ocr_1\",\n  new_status: \"Approved\",\n  comment: \"Document manually verified by compliance.\"\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Sessions.UpdateFeatureStatusAsync(\"11111111-2222-3333-4444-555555555555\", \"feature_ocr_1\", new SessionsUpdateFeatureStatusParams\n{\n    NewStatus = \"Approved\",\n    Comment = \"Document manually verified by compliance.\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ]
      }
    },
    "/v3/session/{sessionId}/update-aml-hit-status/": {
      "patch": {
        "summary": "Prüfungsstatus eines AML-Treffers aktualisieren",
        "description": "Legen Sie den Prüfungsstatus eines **einzelnen AML-Treffers** fest (eine potenzielle Übereinstimmung mit Sanktionen / PEP / Beobachtungsliste / negativen Medienberichten), der durch das AML-Screening zurückgegeben wurde, ohne die übergeordnete Sitzungsentscheidung zu ändern. Identifizieren Sie den Treffer anhand seiner `hit_id` (die `id` eines Eintrags im `hits`-Array der AML-Prüfung — siehe Sitzungsentscheidung). Eine im früheren Format zurückgegebene Treffer-ID wird weiterhin akzeptiert; die Antwort benennt den Treffer immer anhand seiner aktuellen `id`.\n\n`review_status` ist einer der Werte `Unreviewed`, `Confirmed Match`, `False Positive` oder `Inconclusive`. Entscheidungen des Prüfers bleiben über Aktualisierungen der laufenden Überwachung hinweg erhalten, sodass ein von Ihnen als `False Positive` markierter Treffer so bleibt, wenn der Anbieter ein erneutes Screening durchführt.\n\nEin erfolgreicher Aufruf löst einen `data.updated`-Webhook aus und hängt einen Aktivitätseintrag (mit Akteurszuordnung) an den Prüfpfad der Sitzung an. Übergeben Sie bei Graph-Workflows mit mehreren AML-Prüfungen `node_id`, um eine bestimmte Prüfung anzusteuern.\n\nAuthentifizieren Sie sich mit Ihrem API-Schlüssel (`x-api-key`) oder einem Benutzer-Autorisierungs-Header — beide müssen die Berechtigung `write:sessions` enthalten.",
        "operationId": "patch_v3_session_update_aml_hit_status",
        "x-didit-sdk": {
          "resource": "sessions",
          "method": "update_aml_hit_status",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Sessions"
        ],
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "parameters": [
          {
            "in": "path",
            "name": "sessionId",
            "required": true,
            "description": "UUID der Verifizierungssitzung. Akzeptiert sowohl Benutzer- (KYC) als auch Unternehmens- (KYB) Sitzungs-IDs — der Dienst löst die ID über beide Sitzungstypen hinweg auf.",
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "11111111-2222-3333-4444-555555555555"
            }
          },
          {
            "in": "query",
            "name": "node_id",
            "required": false,
            "description": "Workflow-Graph-Knoten-ID. Nur erforderlich, wenn die Sitzung mehrere AML-Prüfungen umfasst (eine pro Knoten); bei Sitzungen mit einer einzigen AML-Prüfung weglassen.",
            "schema": {
              "type": "string",
              "example": "feature_aml_1"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "hit_id",
                  "review_status"
                ],
                "properties": {
                  "hit_id": {
                    "type": "string",
                    "description": "Die `id` des Treffers im `hits`-Array der AML-Prüfung (`hit_...`). Eine Treffer-ID, die im früheren Format zurückgegeben wurde, wird weiterhin akzeptiert.",
                    "example": "hit_7c1e9a40b2d35f86e0a4c912"
                  },
                  "review_status": {
                    "type": "string",
                    "description": "Der neue Prüfstatus für den Treffer.",
                    "enum": [
                      "Unreviewed",
                      "Confirmed Match",
                      "False Positive",
                      "Inconclusive"
                    ],
                    "example": "False Positive"
                  },
                  "node_id": {
                    "type": "string",
                    "description": "Optionale Graph-Knoten-ID. Verwenden Sie diese (hier oder als Abfrageparameter), wenn die Sitzung mehrere AML-Prüfungen umfasst.",
                    "example": "feature_aml_1"
                  }
                }
              },
              "example": {
                "hit_id": "hit_7c1e9a40b2d35f86e0a4c912",
                "review_status": "False Positive"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Hit-Prüfstatus aktualisiert.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "message",
                    "hit_id",
                    "review_status"
                  ],
                  "properties": {
                    "message": {
                      "type": "string",
                      "description": "Immer `Hit status updated successfully`."
                    },
                    "hit_id": {
                      "type": "string",
                      "description": "Die `id` des aktualisierten Treffers, wie von der Sitzungsentscheidung zurückgegeben, auch wenn die Anfrage den Treffer über eine ID im früheren Format benannt hat."
                    },
                    "review_status": {
                      "type": "string",
                      "enum": [
                        "Unreviewed",
                        "Confirmed Match",
                        "False Positive",
                        "Inconclusive"
                      ],
                      "description": "Der Prüfstatus, der jetzt für den Treffer gespeichert ist."
                    }
                  }
                },
                "example": {
                  "message": "Hit status updated successfully",
                  "hit_id": "hit_7c1e9a40b2d35f86e0a4c912",
                  "review_status": "False Positive"
                }
              }
            }
          },
          "400": {
            "description": "Validierungsfehler – `hit_id` ist leer oder `review_status` ist keiner der zulässigen Werte.",
            "content": {
              "application/json": {
                "example": {
                  "review_status": [
                    "\"Maybe\" is not a valid choice."
                  ]
                }
              }
            }
          },
          "403": {
            "description": "Fehlende Anmeldedaten oder unzureichende Berechtigungen. Ein fehlender Schlüssel führt zu einer `403`-Antwort; ein falscher, widerrufener oder abgelaufener Schlüssel führt zu einer `401`-Antwort.",
            "content": {
              "application/json": {
                "examples": {
                  "Invalid Credentials": {
                    "summary": "Fehlender oder ungültiger x-api-key",
                    "value": {
                      "detail": "Authentication credentials were not provided or are invalid."
                    }
                  },
                  "Missing Privilege": {
                    "summary": "Dem API-Schlüssel fehlt die Berechtigung write:sessions",
                    "value": {
                      "detail": "You do not have permission to perform this action."
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Die Sitzung wurde nicht gefunden, die Sitzung verfügt über keine AML-Prüfung (optional für die angegebene `node_id`), oder kein Treffer entspricht `hit_id`.",
            "content": {
              "application/json": {
                "examples": {
                  "No AML Check": {
                    "summary": "Sitzung hat keine AML-Prüfung",
                    "value": {
                      "detail": "The session does not have an AML check."
                    }
                  },
                  "Hit Not Found": {
                    "summary": "Unbekannte hit_id",
                    "value": {
                      "detail": "Hit with ID 'hit_9d2e7f41c0a8b3e65d1f0c47' not found in the AML check."
                    }
                  }
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X PATCH \\\n  https://verification.didit.me/v3/session/11111111-2222-3333-4444-555555555555/update-aml-hit-status/ \\\n  -H 'x-api-key: YOUR_API_KEY' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\n    \"hit_id\": \"abc123\",\n    \"review_status\": \"False Positive\"\n  }'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.sessions.update_aml_hit_status(\n    \"11111111-2222-3333-4444-555555555555\",\n    hit_id=\"hit_7c1e9a40b2d35f86e0a4c912\",\n    review_status=\"False Positive\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.sessions.updateAmlHitStatus(\"11111111-2222-3333-4444-555555555555\", {\n  hit_id: \"hit_7c1e9a40b2d35f86e0a4c912\",\n  review_status: \"False Positive\",\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Sessions.UpdateAMLHitStatus(ctx, \"11111111-2222-3333-4444-555555555555\", didit.SessionsUpdateAMLHitStatusParams{\n\tHitID:        \"hit_7c1e9a40b2d35f86e0a4c912\",\n\tReviewStatus: \"False Positive\",\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\nimport me.didit.types.SessionsUpdateAmlHitStatusParams;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.sessions().updateAmlHitStatus(\"11111111-2222-3333-4444-555555555555\", SessionsUpdateAmlHitStatusParams.builder()\n        .hitId(\"hit_7c1e9a40b2d35f86e0a4c912\")\n        .reviewStatus(SessionsUpdateAmlHitStatusParams.ReviewStatus.of(\"False Positive\"))\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->sessions->updateAmlHitStatus('11111111-2222-3333-4444-555555555555', [\n    'hit_id' => 'hit_7c1e9a40b2d35f86e0a4c912',\n    'review_status' => 'False Positive',\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.sessions.update_aml_hit_status(\n  \"11111111-2222-3333-4444-555555555555\",\n  hit_id: \"hit_7c1e9a40b2d35f86e0a4c912\",\n  review_status: \"False Positive\"\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Sessions.UpdateAmlHitStatusAsync(\"11111111-2222-3333-4444-555555555555\", new SessionsUpdateAmlHitStatusParams\n{\n    HitId = \"hit_7c1e9a40b2d35f86e0a4c912\",\n    ReviewStatus = \"False Positive\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ]
      }
    },
    "/v3/session/{sessionId}/bulk-update-aml-hit-status/": {
      "patch": {
        "summary": "Prüfungsstatus von AML-Treffern per Massenaktion aktualisieren",
        "description": "Den Prüfstatus von **mehreren AML-Treffern** in einem einzigen Aufruf aktualisieren. Übergeben Sie `hit_updates`, eine Liste von `{ hit_id, review_status }`-Paaren. `review_status` ist einer der Werte `Unreviewed`, `Confirmed Match`, `False Positive` oder `Inconclusive`.\n\nDie Aktualisierung erfolgt nach dem Alles-oder-Nichts-Prinzip: Wenn eine `hit_id` in der AML-Prüfung nicht gefunden wird, gibt die Anfrage `404` zurück und kein Treffer wird geändert. Ein erfolgreicher Aufruf löst einen einzelnen `data.updated`-Webhook aus und erfasst einen einzelnen Aktivitätseintrag für alle Änderungen. Übergeben Sie bei Graph-Workflows mit mehreren AML-Prüfungen `node_id`, um eine bestimmte Prüfung anzusteuern.\n\nAuthentifizieren Sie sich mit Ihrem API-Schlüssel (`x-api-key`) oder einem Benutzer-Autorisierungs-Header – beide müssen die Berechtigung `write:sessions` besitzen.",
        "operationId": "patch_v3_session_bulk_update_aml_hit_status",
        "x-didit-sdk": {
          "resource": "sessions",
          "method": "bulk_update_aml_hit_status",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Sessions"
        ],
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "parameters": [
          {
            "in": "path",
            "name": "sessionId",
            "required": true,
            "description": "UUID der Verifizierungssitzung. Akzeptiert sowohl Benutzer- (KYC) als auch Unternehmens- (KYB) Sitzungs-IDs — der Dienst löst die ID über beide Sitzungstypen hinweg auf.",
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "11111111-2222-3333-4444-555555555555"
            }
          },
          {
            "in": "query",
            "name": "node_id",
            "required": false,
            "description": "Workflow-Graph-Knoten-ID. Nur erforderlich, wenn die Sitzung mehrere AML-Prüfungen umfasst (eine pro Knoten); bei Sitzungen mit einer einzigen AML-Prüfung weglassen.",
            "schema": {
              "type": "string",
              "example": "feature_aml_1"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "hit_updates"
                ],
                "properties": {
                  "hit_updates": {
                    "type": "array",
                    "description": "Nicht-leere Liste von Treffer-Aktualisierungen.",
                    "items": {
                      "type": "object",
                      "required": [
                        "hit_id",
                        "review_status"
                      ],
                      "properties": {
                        "hit_id": {
                          "type": "string",
                          "example": "hit_7c1e9a40b2d35f86e0a4c912",
                          "description": "Die `id` des Treffers im `hits`-Array der AML-Prüfung (`hit_...`). Eine Treffer-ID, die im früheren Format zurückgegeben wurde, wird weiterhin akzeptiert."
                        },
                        "review_status": {
                          "type": "string",
                          "enum": [
                            "Unreviewed",
                            "Confirmed Match",
                            "False Positive",
                            "Inconclusive"
                          ],
                          "example": "Confirmed Match"
                        }
                      }
                    }
                  },
                  "node_id": {
                    "type": "string",
                    "description": "Optionale Graph-Knoten-ID. Verwenden Sie diese (hier oder als Abfrageparameter), wenn die Sitzung mehrere AML-Prüfungen umfasst.",
                    "example": "feature_aml_1"
                  }
                }
              },
              "example": {
                "hit_updates": [
                  {
                    "hit_id": "hit_7c1e9a40b2d35f86e0a4c912",
                    "review_status": "Confirmed Match"
                  },
                  {
                    "hit_id": "hit_3b8f20d6a91c4e75f0b2d6a8",
                    "review_status": "False Positive"
                  }
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Alle Treffer aktualisiert.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "message",
                    "updated_hits"
                  ],
                  "properties": {
                    "message": {
                      "type": "string",
                      "description": "`Updated {n} hit(s) successfully`, wobei `n` die Anzahl der Einträge in `hit_updates` ist."
                    },
                    "updated_hits": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      },
                      "description": "Die `id` des Treffers, den jeder Eintrag in `hit_updates` benennt, wie von der Sitzungsentscheidung zurückgegeben, in der Reihenfolge der Anfrage, einschließlich Treffern, deren Status sich nicht geändert hat."
                    }
                  }
                },
                "example": {
                  "message": "Updated 2 hit(s) successfully",
                  "updated_hits": [
                    "hit_7c1e9a40b2d35f86e0a4c912",
                    "hit_3b8f20d6a91c4e75f0b2d6a8"
                  ]
                }
              }
            }
          },
          "400": {
            "description": "Validierungsfehler – `hit_updates` ist leer, oder bei einem Eintrag fehlt `hit_id` / `review_status` oder enthält einen ungültigen Wert.",
            "content": {
              "application/json": {
                "example": {
                  "hit_updates": [
                    "hit_updates cannot be empty"
                  ]
                }
              }
            }
          },
          "403": {
            "description": "Fehlende Anmeldedaten oder unzureichende Berechtigungen. Ein fehlender Schlüssel führt zu einer `403`-Antwort; ein falscher, widerrufener oder abgelaufener Schlüssel führt zu einer `401`-Antwort.",
            "content": {
              "application/json": {
                "examples": {
                  "Invalid Credentials": {
                    "summary": "Fehlender oder ungültiger x-api-key",
                    "value": {
                      "detail": "Authentication credentials were not provided or are invalid."
                    }
                  },
                  "Missing Privilege": {
                    "summary": "Dem API-Schlüssel fehlt die Berechtigung write:sessions",
                    "value": {
                      "detail": "You do not have permission to perform this action."
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Die Sitzung wurde nicht gefunden, die Sitzung verfügt über keine AML-Prüfung, oder eine oder mehrere `hit_id`s existieren nicht (in diesem Fall wird kein Treffer geändert).",
            "content": {
              "application/json": {
                "example": {
                  "detail": "Hits not found: hit_9d2e7f41c0a8b3e65d1f0c47"
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X PATCH \\\n  https://verification.didit.me/v3/session/11111111-2222-3333-4444-555555555555/bulk-update-aml-hit-status/ \\\n  -H 'x-api-key: YOUR_API_KEY' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\n    \"hit_updates\": [\n      { \"hit_id\": \"abc123\", \"review_status\": \"Confirmed Match\" },\n      { \"hit_id\": \"def456\", \"review_status\": \"False Positive\" }\n    ]\n  }'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.sessions.bulk_update_aml_hit_status(\n    \"11111111-2222-3333-4444-555555555555\",\n    hit_updates=[{\n        \"hit_id\": \"hit_7c1e9a40b2d35f86e0a4c912\",\n        \"review_status\": \"Confirmed Match\",\n    }, {\n        \"hit_id\": \"hit_3b8f20d6a91c4e75f0b2d6a8\",\n        \"review_status\": \"False Positive\",\n    }],\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.sessions.bulkUpdateAmlHitStatus(\"11111111-2222-3333-4444-555555555555\", {\n  hit_updates: [{\n    hit_id: \"hit_7c1e9a40b2d35f86e0a4c912\",\n    review_status: \"Confirmed Match\",\n  }, {\n    hit_id: \"hit_3b8f20d6a91c4e75f0b2d6a8\",\n    review_status: \"False Positive\",\n  }],\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Sessions.BulkUpdateAMLHitStatus(ctx, \"11111111-2222-3333-4444-555555555555\", didit.SessionsBulkUpdateAMLHitStatusParams{\n\tHitUpdates: []didit.SessionsBulkUpdateAMLHitStatusParamsHitUpdates{{\n\t\tHitID:        \"hit_7c1e9a40b2d35f86e0a4c912\",\n\t\tReviewStatus: \"Confirmed Match\",\n\t}, {\n\t\tHitID:        \"hit_3b8f20d6a91c4e75f0b2d6a8\",\n\t\tReviewStatus: \"False Positive\",\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;\nimport me.didit.Didit;\nimport me.didit.types.SessionsBulkUpdateAmlHitStatusParams;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.sessions().bulkUpdateAmlHitStatus(\"11111111-2222-3333-4444-555555555555\", SessionsBulkUpdateAmlHitStatusParams.builder()\n        .hitUpdates(List.of(\n                SessionsBulkUpdateAmlHitStatusParams.HitUpdates.builder()\n                        .hitId(\"hit_7c1e9a40b2d35f86e0a4c912\")\n                        .reviewStatus(SessionsBulkUpdateAmlHitStatusParams.HitUpdates.ReviewStatus.of(\"Confirmed Match\"))\n                        .build(),\n                SessionsBulkUpdateAmlHitStatusParams.HitUpdates.builder()\n                        .hitId(\"hit_3b8f20d6a91c4e75f0b2d6a8\")\n                        .reviewStatus(SessionsBulkUpdateAmlHitStatusParams.HitUpdates.ReviewStatus.of(\"False Positive\"))\n                        .build()))\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->sessions->bulkUpdateAmlHitStatus('11111111-2222-3333-4444-555555555555', [\n    'hit_updates' => [[\n        'hit_id' => 'hit_7c1e9a40b2d35f86e0a4c912',\n        'review_status' => 'Confirmed Match',\n    ], [\n        'hit_id' => 'hit_3b8f20d6a91c4e75f0b2d6a8',\n        'review_status' => 'False Positive',\n    ]],\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.sessions.bulk_update_aml_hit_status(\n  \"11111111-2222-3333-4444-555555555555\",\n  hit_updates: [{\n    hit_id: \"hit_7c1e9a40b2d35f86e0a4c912\",\n    review_status: \"Confirmed Match\",\n  }, {\n    hit_id: \"hit_3b8f20d6a91c4e75f0b2d6a8\",\n    review_status: \"False Positive\",\n  }]\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Sessions.BulkUpdateAmlHitStatusAsync(\"11111111-2222-3333-4444-555555555555\", new SessionsBulkUpdateAmlHitStatusParams\n{\n    HitUpdates = new SessionsBulkUpdateAmlHitStatusParamsHitUpdates[]\n    {\n        new()\n        {\n            HitId = \"hit_7c1e9a40b2d35f86e0a4c912\",\n            ReviewStatus = \"Confirmed Match\",\n        },\n        new()\n        {\n            HitId = \"hit_3b8f20d6a91c4e75f0b2d6a8\",\n            ReviewStatus = \"False Positive\",\n        },\n    },\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ]
      }
    },
    "/v3/session/{sessionId}/update-poa-data/": {
      "patch": {
        "summary": "Aus dem Adressnachweisdokument extrahierte Adressnachweisdaten in einer Verifizierungssitzung aktualisieren",
        "description": "Korrigieren Sie nach Abschluss der Verifizierung die aus dem Adressnachweis-Dokument des Benutzers — Verbrauchsabrechnung, Kontoauszug oder ein anderer Adressnachweis — extrahierten Felder: Aussteller, Datumsangaben, den aufgedruckten Namen, die Adresse selbst sowie Bankdaten. Jedes Feld im Body ist optional: Nur die von Ihnen übermittelten Schlüssel werden geschrieben, alles andere bleibt unverändert (`PATCH`-Semantik).\n\nDie Sitzung muss zu Ihrer Anwendung gehören und den Status `Approved`, `Declined`, `In Review` oder `Kyc Expired` aufweisen. Sitzungen in jedem anderen Zustand (z. B. noch `In Progress`) geben `404` mit `\"No Session matches the given query.\"` zurück — zu unterscheiden vom `\"Not found.\"`, das bei einer unbekannten oder gelöschten `sessionId` zurückgegeben wird. Die Sitzung muss zudem einen POA-Datensatz enthalten: Sitzungen, deren Workflow nie einen Adressnachweis-Schritt ausgeführt hat, geben `404` zurück (`\"The session does not have a POA.\"`). Bei Graph-Workflows mit mehreren POA-Schritten können Sie mit `node_id` (Query-Parameter oder Body-Feld) einen bestimmten Schritt ansteuern; wird dieser weggelassen, wird der aktuellste POA-Datensatz aktualisiert.\n\n`extra_fields` wird Schlüssel für Schlüssel zusammengeführt: Neun bekannte Schlüssel (`bank_iban`, `additional_names`, …) werden direkt in dedizierte POA-Spalten geschrieben, jeder andere Schlüssel wird als benutzerdefiniertes Extra beibehalten, und `null` / `\"\"` löscht einen Schlüssel. `poa_parsed_address` akzeptiert nur die sieben dokumentierten Schlüssel und berechnet `formatted_address` / `poa_formatted_address` nach jeder Bearbeitung neu. Wenn sich der Freitext `poa_address` ändert, führt der Server unter Umständen auch ein erneutes Geocoding durch und aktualisiert die strukturierte Adresse (bei Sandbox-Sitzungen übersprungen).\n\nAnders als bei der KYC-Variante dieses Endpoints wird der [`data.updated`-Webhook](/de/integration/webhooks) (Auslöser `manual_review`) nur ausgelöst, wenn sich mindestens ein gespeicherter Wert **tatsächlich geändert hat** — das erneute Senden identischer Werte ist ein stiller No-Op. Wenn sich Werte ändern, wird ein `POA_DATA_UPDATED`-Aktivitätseintrag, der die geänderten Felder mit vorherigen und neuen Werten festhält, an die `reviews` der Sitzung angehängt; dieser ist in [Entscheidung abrufen](#get-/v3/session/-sessionId-/decision/) und in der Aktivitäts-Zeitleiste der Konsole sichtbar. Der Status und die Entscheidung der Sitzung werden **nicht** neu bewertet — verwenden Sie [Status aktualisieren](#patch-/v3/session/-sessionId-/update-status/), um das Ergebnis zu ändern.\n\nAkzeptiert einen API-Schlüssel oder ein Konsolen-Benutzer-Token; in beiden Fällen benötigt das verwendete Anmeldemittel die Berechtigung `write:sessions`. Fehler bei der Authentifizierung und Autorisierung geben jeweils `403` zurück — diese API antwortet niemals mit `401`. Beachten Sie, dass die Sitzungsabfrage vor der Prüfung der Anmeldedaten ausgeführt wird, sodass eine unbekannte `sessionId` selbst bei fehlenden Anmeldedaten `404` zurückgibt. Dieser Endpoint verfügt über ein dediziertes Rate-Limit von 10 Anfragen pro Minute pro API-Schlüssel (ungültige Anfragen zählen ebenfalls mit); das gemeinsame Schreibkontingent von 300 Anfragen pro Minute gilt ebenfalls.\n\nEin leerer JSON-Body `{}` ist ein No-Op: Er gibt `200` zurück und spiegelt den aktuellen POA-Datensatz wider, ohne den Webhook auszulösen (`has_changes` bleibt false).",
        "operationId": "patch_v3_session_update_poa_data",
        "x-didit-sdk": {
          "resource": "sessions",
          "method": "update_poa_data",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Sessions"
        ],
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "parameters": [
          {
            "name": "sessionId",
            "in": "path",
            "required": true,
            "description": "UUID der Sitzung zur Benutzerverifizierung (KYC), deren angehängten Adressnachweis-Datensatz (POA) Sie korrigieren.",
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "11111111-2222-3333-4444-555555555555"
            }
          },
          {
            "name": "node_id",
            "in": "query",
            "required": false,
            "description": "Workflow-Graph-Knoten, dessen POA-Datensatz aktualisiert werden soll, bei Graph-Workflows mit mehreren Adressnachweis-Schritten (wird auch als `node_id`-Body-Feld akzeptiert). Wenn nicht angegeben, wird der jüngste POA-Datensatz der Sitzung aktualisiert. Falls für den angegebenen Knoten kein POA existiert, gibt der Aufruf `404` zurück (`\"The session does not have a POA for node '<node_id>'.\"`).",
            "schema": {
              "type": "string",
              "example": "feature_poa"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "description": "Alle Felder optional – senden Sie nur das, was Sie ändern möchten.",
                "properties": {
                  "issuing_state": {
                    "type": "string",
                    "nullable": true,
                    "description": "Land, das das POA-Dokument ausgestellt hat, ISO 3166-1 Alpha-3. Groß-/Kleinschreibung wird nicht berücksichtigt (in Großbuchstaben normalisiert); ungültige Codes geben `400` zurück.",
                    "example": "ESP"
                  },
                  "document_type": {
                    "type": "string",
                    "enum": [
                      "UTILITY_BILL",
                      "BANK_STATEMENT",
                      "GOVERNMENT_ISSUED_DOCUMENT",
                      "OTHER_POA_DOCUMENT",
                      "UNKNOWN"
                    ],
                    "description": "POA-Dokumentkategorie. Werte sind in Großbuchstaben — kleingeschriebene Varianten wie `utility_bill` geben `400` zurück.",
                    "example": "UTILITY_BILL"
                  },
                  "document_language": {
                    "type": "string",
                    "maxLength": 50,
                    "nullable": true,
                    "description": "Sprache des Dokuments, typischerweise ein ISO 639-1-Code (z. B. `es`). Freitext — wird nicht als Sprachcode validiert.",
                    "example": "es"
                  },
                  "issuer": {
                    "type": "string",
                    "maxLength": 255,
                    "nullable": true,
                    "description": "Organisation, die das Dokument ausgestellt hat (Versorgungsunternehmen, Bank, Behörde).",
                    "example": "Energy Provider S.A."
                  },
                  "issue_date": {
                    "type": "string",
                    "format": "date",
                    "nullable": true,
                    "description": "Ausstellungsdatum des POA-Dokuments im Format `YYYY-MM-DD`. Jedes andere Format gibt `400` zurück.",
                    "example": "2026-04-12"
                  },
                  "poa_address": {
                    "type": "string",
                    "nullable": true,
                    "description": "Freitextadresse, wie auf dem Dokument aufgedruckt. Wenn sich dieser Wert ändert (nur bei Nicht-Sandbox-Sitzungen) und die strukturierte Adresse noch fehlt oder unvollständig ist, führt der Server im Hintergrund derselben Anfrage ein erneutes Geocoding durch und kann `poa_parsed_address` / `poa_formatted_address` mit dem Geocoder-Ergebnis überschreiben. Das erneute Geocoding erfordert außerdem, dass `issuing_state` im Adressnachweis-Datensatz vorhanden ist.",
                    "example": "Avda de Madrid 34, 28013 Madrid"
                  },
                  "name_on_document": {
                    "type": "string",
                    "maxLength": 255,
                    "nullable": true,
                    "description": "Empfängername wie auf dem Dokument aufgedruckt.",
                    "example": "Carmen Espanola"
                  },
                  "extra_fields": {
                    "type": "object",
                    "additionalProperties": true,
                    "nullable": true,
                    "description": "Dokumentspezifische Zusatzfelder, Schlüssel für Schlüssel zusammengeführt. Neun Schlüssel sind dedizierten POA-Spalten zugeordnet: `bank_account_number`, `bank_iban`, `bank_sort_code`, `bank_routing_number`, `bank_swift_bic`, `bank_branch_name`, `bank_branch_address`, `document_phone_number` und `additional_names` (muss eine Liste von Zeichenfolgen oder `null` sein, andernfalls `400`). Jeder andere Schlüssel wird als benutzerdefiniertes Zusatzfeld gespeichert. Semantik pro Schlüssel: Ein Wert setzt den Schlüssel; `null` oder `\"\"` löscht ihn. Muss ein JSON-Objekt sein, andernfalls `400`."
                  },
                  "poa_parsed_address": {
                    "type": "object",
                    "nullable": true,
                    "description": "Strukturierte Adresse. Nur diese verschachtelten Schlüssel werden akzeptiert: `address_type`, `city`, `region`, `street_1`, `street_2`, `postal_code`, `country` – jeder andere Schlüssel gibt `400` zurück. Semantik pro Schlüssel: Ein Wert setzt den Schlüssel, `null` entfernt ihn. `formatted_address` (und die übergeordnete `poa_formatted_address`) wird serverseitig neu berechnet, indem `street_1`, `street_2`, `city`, `region`, `postal_code` und `country` zusammengefügt werden – Sie können sie nicht direkt festlegen.",
                    "properties": {
                      "address_type": {
                        "type": "string",
                        "nullable": true,
                        "description": "Freiform-Adressklassifizierung (z. B. `home`)."
                      },
                      "city": {
                        "type": "string",
                        "nullable": true,
                        "example": "Madrid"
                      },
                      "region": {
                        "type": "string",
                        "nullable": true,
                        "description": "Bundesland / Provinz / autonome Gemeinschaft."
                      },
                      "street_1": {
                        "type": "string",
                        "nullable": true,
                        "example": "Avda de Madrid 34"
                      },
                      "street_2": {
                        "type": "string",
                        "nullable": true
                      },
                      "postal_code": {
                        "type": "string",
                        "nullable": true,
                        "example": "28013"
                      },
                      "country": {
                        "type": "string",
                        "nullable": true,
                        "description": "ISO 3166-1 Alpha-2-Ländercode. Die Eingabe in Kleinbuchstaben wird in Großbuchstaben normalisiert; Alpha-3-Codes werden mit `400` abgelehnt.",
                        "example": "ES"
                      }
                    }
                  }
                }
              },
              "examples": {
                "Correct issuer and address": {
                  "summary": "Dokumentenklassifizierung, Aussteller und die strukturierte Adresse korrigieren",
                  "value": {
                    "issuing_state": "ESP",
                    "document_type": "BANK_STATEMENT",
                    "issuer": "Banco Example S.A.",
                    "issue_date": "2026-05-02",
                    "name_on_document": "Carmen Espanola",
                    "poa_address": "Avda de Madrid 34, 28013 Madrid",
                    "extra_fields": {
                      "bank_iban": "ES9121000418450200051332",
                      "additional_names": [
                        "Carmen E. Espanola"
                      ]
                    },
                    "poa_parsed_address": {
                      "street_1": "Avda de Madrid 34",
                      "city": "Madrid",
                      "postal_code": "28013",
                      "country": "ES"
                    }
                  }
                },
                "Remove a banking detail": {
                  "summary": "Einen Schlüssel für ein zusätzliches Feld löschen, den Rest behalten",
                  "value": {
                    "extra_fields": {
                      "bank_iban": null
                    }
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "POA-Daten aktualisiert. Gibt den **vollständigen aktuellen POA-Datensatz** zurück (jedes aktualisierbare Feld mit seinem gespeicherten Wert, plus die vollständige `extra_fields`-Map, `poa_parsed_address` und `poa_formatted_address`) — nicht nur die von Ihnen übermittelten Felder. Der Webhook `data.updated` wird nur ausgelöst, wenn sich mindestens ein Wert tatsächlich geändert hat.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "issuing_state": {
                      "type": "string",
                      "nullable": true,
                      "description": "Land, das das POA-Dokument ausgestellt hat, ISO 3166-1 Alpha-3. Groß-/Kleinschreibung wird nicht berücksichtigt (in Großbuchstaben normalisiert); ungültige Codes geben `400` zurück.",
                      "example": "ESP"
                    },
                    "document_type": {
                      "type": "string",
                      "enum": [
                        "UTILITY_BILL",
                        "BANK_STATEMENT",
                        "GOVERNMENT_ISSUED_DOCUMENT",
                        "OTHER_POA_DOCUMENT",
                        "UNKNOWN"
                      ],
                      "description": "POA-Dokumentkategorie. Werte sind in Großbuchstaben — kleingeschriebene Varianten wie `utility_bill` geben `400` zurück.",
                      "example": "UTILITY_BILL"
                    },
                    "document_language": {
                      "type": "string",
                      "maxLength": 50,
                      "nullable": true,
                      "description": "Sprache des Dokuments, typischerweise ein ISO 639-1-Code (z. B. `es`). Freitext — wird nicht als Sprachcode validiert.",
                      "example": "es"
                    },
                    "issuer": {
                      "type": "string",
                      "maxLength": 255,
                      "nullable": true,
                      "description": "Organisation, die das Dokument ausgestellt hat (Versorgungsunternehmen, Bank, Behörde).",
                      "example": "Energy Provider S.A."
                    },
                    "issue_date": {
                      "type": "string",
                      "format": "date",
                      "nullable": true,
                      "description": "Ausstellungsdatum des POA-Dokuments im Format `YYYY-MM-DD`. Jedes andere Format gibt `400` zurück.",
                      "example": "2026-04-12"
                    },
                    "poa_address": {
                      "type": "string",
                      "nullable": true,
                      "description": "Freitextadresse, wie auf dem Dokument aufgedruckt. Wenn sich dieser Wert ändert (nur bei Nicht-Sandbox-Sitzungen) und die strukturierte Adresse noch fehlt oder unvollständig ist, führt der Server im Hintergrund derselben Anfrage ein erneutes Geocoding durch und kann `poa_parsed_address` / `poa_formatted_address` mit dem Geocoder-Ergebnis überschreiben.",
                      "example": "Avda de Madrid 34, 28013 Madrid"
                    },
                    "name_on_document": {
                      "type": "string",
                      "maxLength": 255,
                      "nullable": true,
                      "description": "Empfängername wie auf dem Dokument aufgedruckt.",
                      "example": "Carmen Espanola"
                    },
                    "extra_fields": {
                      "type": "object",
                      "additionalProperties": true,
                      "nullable": true,
                      "description": "In der Antwort immer vorhanden: die neun bekannten Schlüssel (mit `null` für nicht gesetzte Werte, wobei `additional_names` standardmäßig `[]` ist) sowie alle zuvor gespeicherten benutzerdefinierten Schlüssel."
                    },
                    "poa_parsed_address": {
                      "type": "object",
                      "nullable": true,
                      "description": "Aktuelle strukturierte Adresse oder `null`, falls keine vorhanden ist. Enthält die neu berechnete `formatted_address` zusammen mit den sieben bearbeitbaren Schlüsseln. Wird so zurückgegeben, wie gespeichert – nach einem serverseitigen Geocoding kann sie neben den bearbeitbaren Schlüsseln auch Buchhaltungsschlüssel (z. B. `raw_results`) enthalten.",
                      "properties": {
                        "address_type": {
                          "type": "string",
                          "nullable": true,
                          "description": "Freiform-Adressklassifizierung (z. B. `home`)."
                        },
                        "city": {
                          "type": "string",
                          "nullable": true,
                          "example": "Madrid"
                        },
                        "region": {
                          "type": "string",
                          "nullable": true,
                          "description": "Bundesland / Provinz / autonome Gemeinschaft."
                        },
                        "street_1": {
                          "type": "string",
                          "nullable": true,
                          "example": "Avda de Madrid 34"
                        },
                        "street_2": {
                          "type": "string",
                          "nullable": true
                        },
                        "postal_code": {
                          "type": "string",
                          "nullable": true,
                          "example": "28013"
                        },
                        "country": {
                          "type": "string",
                          "nullable": true,
                          "description": "ISO 3166-1 Alpha-2-Ländercode. Die Eingabe in Kleinbuchstaben wird in Großbuchstaben normalisiert; Alpha-3-Codes werden mit `400` abgelehnt.",
                          "example": "ES"
                        },
                        "formatted_address": {
                          "type": "string",
                          "nullable": true,
                          "description": "Zusammengefasste, lesbare Form der strukturierten Adresse. Wird nach jeder Bearbeitung von `poa_parsed_address` serverseitig neu berechnet.",
                          "example": "Avda de Madrid 34, Madrid, 28013, ES"
                        }
                      }
                    },
                    "poa_formatted_address": {
                      "type": "string",
                      "nullable": true,
                      "description": "Kopie der neu berechneten `formatted_address` auf oberster Ebene, synchronisiert gehalten, wenn sich die strukturierte Adresse ändert.",
                      "example": "Avda de Madrid 34, Madrid, 28013, ES"
                    }
                  }
                },
                "examples": {
                  "Updated POA": {
                    "summary": "Vollständiger POA-Datensatz nach der Korrektur",
                    "value": {
                      "issuing_state": "ESP",
                      "document_type": "BANK_STATEMENT",
                      "document_language": "es",
                      "issuer": "Banco Example S.A.",
                      "issue_date": "2026-05-02",
                      "poa_address": "Avda de Madrid 34, 28013 Madrid",
                      "name_on_document": "Carmen Espanola",
                      "extra_fields": {
                        "bank_account_number": null,
                        "bank_iban": "ES9121000418450200051332",
                        "bank_sort_code": null,
                        "bank_routing_number": null,
                        "bank_swift_bic": null,
                        "bank_branch_name": null,
                        "bank_branch_address": null,
                        "document_phone_number": null,
                        "additional_names": [
                          "Carmen E. Espanola"
                        ]
                      },
                      "poa_parsed_address": {
                        "city": "Madrid",
                        "street_1": "Avda de Madrid 34",
                        "postal_code": "28013",
                        "country": "ES",
                        "formatted_address": "Avda de Madrid 34, Madrid, 28013, ES"
                      },
                      "poa_formatted_address": "Avda de Madrid 34, Madrid, 28013, ES"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Validierungsfehler. Feldfehler werden als `{\"<field>\": [\"<message>\"]}` zurückgegeben; Fehler bei verschachtelten Schlüsseln unter `poa_parsed_address` / `extra_fields` verwenden einen Objektwert: `{\"extra_fields\": {\"<key>\": \"<message>\"}}`.",
            "content": {
              "application/json": {
                "examples": {
                  "Invalid document type": {
                    "summary": "Enum ist in Großbuchstaben – Varianten in Kleinbuchstaben werden abgelehnt",
                    "value": {
                      "document_type": [
                        "\"utility_bill\" is not a valid choice."
                      ]
                    }
                  },
                  "Invalid issuing state": {
                    "summary": "issuing_state ist kein ISO 3166-1 alpha-3",
                    "value": {
                      "issuing_state": [
                        "Invalid ISO 3166-1 alpha-3 country code for issuing_state."
                      ]
                    }
                  },
                  "additional_names not a list": {
                    "summary": "additional_names akzeptiert eine Liste von Zeichenketten oder null",
                    "value": {
                      "extra_fields": {
                        "additional_names": "Must be a list or null."
                      }
                    }
                  },
                  "Unsupported poa_parsed_address key": {
                    "summary": "Nur die sieben dokumentierten Schlüssel sind zulässig",
                    "value": {
                      "poa_parsed_address": {
                        "zipcode": "Unsupported key. Allowed keys: address_type, city, region, street_1, street_2, postal_code, country"
                      }
                    }
                  },
                  "Bad date format": {
                    "summary": "Datumsangaben müssen im Format JJJJ-MM-TT vorliegen",
                    "value": {
                      "issue_date": [
                        "Date has wrong format. Use one of these formats instead: YYYY-MM-DD."
                      ]
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Fehlende Anmeldedaten oder unzureichende Berechtigungen. Ein fehlender Schlüssel führt zu einer `403`-Antwort; ein falscher, widerrufener oder abgelaufener Schlüssel führt zu einer `401`-Antwort.",
            "content": {
              "application/json": {
                "examples": {
                  "Invalid Credentials": {
                    "summary": "Fehlender oder ungültiger x-api-key",
                    "value": {
                      "detail": "Authentication credentials were not provided or are invalid."
                    }
                  },
                  "Missing Privilege": {
                    "summary": "Dem Berechtigungsnachweis fehlt die Berechtigung write:sessions",
                    "value": {
                      "detail": "You do not have permission to perform this action."
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Unbekannte Sitzung, Sitzung in einem nicht bearbeitbaren Status oder kein POA-Datensatz zum Patchen vorhanden. Jeder Fall hat eine eindeutige `detail`-Meldung (siehe Beispiele). Die Suche nach der unbekannten Sitzung läuft vor den Anmeldedatenprüfungen ab.",
            "content": {
              "application/json": {
                "examples": {
                  "Unknown session": {
                    "summary": "Keine Sitzung mit dieser ID in Ihrer Anwendung (oder sie wurde gelöscht)",
                    "value": {
                      "detail": "Not found."
                    }
                  },
                  "Wrong session state": {
                    "summary": "Sitzung existiert, hat aber nicht den Status Genehmigt / Abgelehnt / In Prüfung / Kyc Abgelaufen",
                    "value": {
                      "detail": "No Session matches the given query."
                    }
                  },
                  "No POA record": {
                    "summary": "Der Workflow hat nie einen Schritt für den Adressnachweis ausgeführt",
                    "value": {
                      "detail": "The session does not have a POA."
                    }
                  },
                  "No POA for node": {
                    "summary": "node_id angegeben, aber es existiert kein POA dafür",
                    "value": {
                      "detail": "The session does not have a POA for node 'feature_missing'."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Dediziertes Rate-Limit überschritten – 10 POA-Datenaktualisierungen pro Minute pro API-Schlüssel (abgelehnte Anfragen zählen zum Kontingent). Das geteilte Schreibkontingent von 300/Min. kann ebenfalls mit einer eigenen Meldung auslösen. Überprüfen Sie `Retry-After` und die Antwort-Header `X-RateLimit-*`, bevor Sie es erneut versuchen.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string"
                    }
                  }
                },
                "examples": {
                  "Rate limited": {
                    "summary": "POA-Aktualisierungsbudget erschöpft",
                    "value": {
                      "detail": "Session POA data update rate limit exceeded. You can make up to 10 requests per minute."
                    }
                  }
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X PATCH \\\n  https://verification.didit.me/v3/session/11111111-2222-3333-4444-555555555555/update-poa-data/ \\\n  -H 'x-api-key: YOUR_API_KEY' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\n    \"issuing_state\": \"ESP\",\n    \"document_type\": \"BANK_STATEMENT\",\n    \"issuer\": \"Banco Example S.A.\",\n    \"issue_date\": \"2026-05-02\",\n    \"name_on_document\": \"Carmen Espanola\",\n    \"poa_address\": \"Avda de Madrid 34, 28013 Madrid\",\n    \"extra_fields\": {\n      \"bank_iban\": \"ES9121000418450200051332\"\n    },\n    \"poa_parsed_address\": {\n      \"city\": \"Madrid\",\n      \"postal_code\": \"28013\",\n      \"country\": \"ES\"\n    }\n  }'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.sessions.update_poa_data(\n    \"11111111-2222-3333-4444-555555555555\",\n    issuing_state=\"ESP\",\n    document_type=\"BANK_STATEMENT\",\n    issuer=\"Banco Example S.A.\",\n    issue_date=\"2026-05-02\",\n    poa_address=\"Avda de Madrid 34, 28013 Madrid\",\n    name_on_document=\"Carmen Espanola\",\n    extra_fields={\"bank_iban\": \"ES9121000418450200051332\", \"additional_names\": [\"Carmen E. Espanola\"]},\n    poa_parsed_address={\n        \"city\": \"Madrid\",\n        \"street_1\": \"Avda de Madrid 34\",\n        \"postal_code\": \"28013\",\n        \"country\": \"ES\",\n    },\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.sessions.updatePoaData(\"11111111-2222-3333-4444-555555555555\", {\n  issuing_state: \"ESP\",\n  document_type: \"BANK_STATEMENT\",\n  issuer: \"Banco Example S.A.\",\n  issue_date: \"2026-05-02\",\n  poa_address: \"Avda de Madrid 34, 28013 Madrid\",\n  name_on_document: \"Carmen Espanola\",\n  extra_fields: { bank_iban: \"ES9121000418450200051332\", additional_names: [\"Carmen E. Espanola\"] },\n  poa_parsed_address: {\n    city: \"Madrid\",\n    street_1: \"Avda de Madrid 34\",\n    postal_code: \"28013\",\n    country: \"ES\",\n  },\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Sessions.UpdatePOAData(ctx, \"11111111-2222-3333-4444-555555555555\", didit.SessionsUpdatePOADataParams{\n\tIssuingState:   didit.String(\"ESP\"),\n\tDocumentType:   didit.Some(didit.SessionsUpdatePOADataParamsDocumentType(\"BANK_STATEMENT\")),\n\tIssuer:         didit.String(\"Banco Example S.A.\"),\n\tIssueDate:      didit.String(\"2026-05-02\"),\n\tPOAAddress:     didit.String(\"Avda de Madrid 34, 28013 Madrid\"),\n\tNameOnDocument: didit.String(\"Carmen Espanola\"),\n\tExtraFields:    didit.Some(map[string]any{\"bank_iban\": \"ES9121000418450200051332\", \"additional_names\": []any{\"Carmen E. Espanola\"}}),\n\tPOAParsedAddress: didit.Some(didit.SessionsUpdatePOADataParamsPOAParsedAddress{\n\t\tCity:       didit.String(\"Madrid\"),\n\t\tStreet1:    didit.String(\"Avda de Madrid 34\"),\n\t\tPostalCode: didit.String(\"28013\"),\n\t\tCountry:    didit.String(\"ES\"),\n\t}),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import java.time.LocalDate;\nimport java.util.List;\nimport java.util.Map;\nimport me.didit.Didit;\nimport me.didit.types.SessionsUpdatePoaDataParams;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.sessions().updatePoaData(\"11111111-2222-3333-4444-555555555555\", SessionsUpdatePoaDataParams.builder()\n        .issuingState(\"ESP\")\n        .documentType(SessionsUpdatePoaDataParams.DocumentType.of(\"BANK_STATEMENT\"))\n        .issuer(\"Banco Example S.A.\")\n        .issueDate(LocalDate.parse(\"2026-05-02\"))\n        .poaAddress(\"Avda de Madrid 34, 28013 Madrid\")\n        .nameOnDocument(\"Carmen Espanola\")\n        .extraFields(Map.of(\"bank_iban\", \"ES9121000418450200051332\", \"additional_names\", List.of(\"Carmen E. Espanola\")))\n        .poaParsedAddress(SessionsUpdatePoaDataParams.PoaParsedAddress.builder()\n                .city(\"Madrid\")\n                .street1(\"Avda de Madrid 34\")\n                .postalCode(\"28013\")\n                .country(\"ES\")\n                .build())\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->sessions->updatePoaData('11111111-2222-3333-4444-555555555555', [\n    'issuing_state' => 'ESP',\n    'document_type' => 'BANK_STATEMENT',\n    'issuer' => 'Banco Example S.A.',\n    'issue_date' => '2026-05-02',\n    'poa_address' => 'Avda de Madrid 34, 28013 Madrid',\n    'name_on_document' => 'Carmen Espanola',\n    'extra_fields' => ['bank_iban' => 'ES9121000418450200051332', 'additional_names' => ['Carmen E. Espanola']],\n    'poa_parsed_address' => [\n        'city' => 'Madrid',\n        'street_1' => 'Avda de Madrid 34',\n        'postal_code' => '28013',\n        'country' => 'ES',\n    ],\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.sessions.update_poa_data(\n  \"11111111-2222-3333-4444-555555555555\",\n  issuing_state: \"ESP\",\n  document_type: \"BANK_STATEMENT\",\n  issuer: \"Banco Example S.A.\",\n  issue_date: \"2026-05-02\",\n  poa_address: \"Avda de Madrid 34, 28013 Madrid\",\n  name_on_document: \"Carmen Espanola\",\n  extra_fields: { bank_iban: \"ES9121000418450200051332\", additional_names: [\"Carmen E. Espanola\"] },\n  poa_parsed_address: {\n    city: \"Madrid\",\n    street_1: \"Avda de Madrid 34\",\n    postal_code: \"28013\",\n    country: \"ES\",\n  }\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Collections.Generic;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Sessions.UpdatePoaDataAsync(\"11111111-2222-3333-4444-555555555555\", new SessionsUpdatePoaDataParams\n{\n    IssuingState = \"ESP\",\n    DocumentType = new SessionsUpdatePoaDataParamsDocumentType(\"BANK_STATEMENT\"),\n    Issuer = \"Banco Example S.A.\",\n    IssueDate = \"2026-05-02\",\n    PoaAddress = \"Avda de Madrid 34, 28013 Madrid\",\n    NameOnDocument = \"Carmen Espanola\",\n    ExtraFields = new Dictionary<string, object> { [\"bank_iban\"] = \"ES9121000418450200051332\", [\"additional_names\"] = new object[] { \"Carmen E. Espanola\" } },\n    PoaParsedAddress = new SessionsUpdatePoaDataParamsPoaParsedAddress\n    {\n        City = \"Madrid\",\n        Street1 = \"Avda de Madrid 34\",\n        PostalCode = \"28013\",\n        Country = \"ES\",\n    },\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ]
      }
    },
    "/v3/session/{sessionId}/kyb/{companyUuid}/update-data/": {
      "patch": {
        "summary": "Aus dem Register extrahierte Unternehmensdaten für eine Sitzung zur Unternehmensverifizierung (KYB) aktualisieren",
        "description": "Korrigieren Sie die aus dem Register extrahierten Unternehmensdaten in einer Sitzung der Unternehmensverifizierung (KYB) – Unternehmensname, Registernummer, Adressen, Status, Kontaktdaten –, identifiziert durch `companyUuid`. Typische Aufrufer sind Compliance-Analysten, die einen Registerlesefehler korrigieren, oder Ihr Backoffice, das korrigierte Unternehmensdaten synchronisiert. Jedes Feld im Body ist optional (`PATCH`-Semantik); ein leerer JSON-Body (`{}`) ist ein No-Op, der lediglich den aktuellen Unternehmensdatensatz wiedergibt.\n\nÄnderungen werden an zwei Stellen gleichzeitig geschrieben: Felder mit einer kanonischen Unternehmensspalte (Name, Registernummer, Land, Gründungsdatum, Steuernummer, Typ, Statuswerte, Kapitalfelder (`registered_capital`, `registered_capital_amount`, `registered_capital_currency`), alternative Namen, Art des Geschäfts, Website, E-Mail, Telefon, LEI, Standort und `legal_address` → `registered_address`) aktualisieren diese Spalte, und **jeder** übermittelte Schlüssel wird auch in den `registry_data`-Snapshot eingefügt (Datumsangaben als ISO-Strings), damit die Ansicht \"aus dem Register extrahiert\" die Korrektur widerspiegelt. Felder ohne Spalte – `region`, `registration_date`, `dissolution_date`, `control_scheme` – landen ausschließlich in `registry_data`. `user_provided_data` (was der Endbenutzer im gehosteten Ablauf bestätigt hat) wird niemals angetastet, und `last_console_edit_at` wird bei jedem nicht-leeren PATCH mit einem Zeitstempel versehen.\n\nIm Gegensatz zu den KYC/POA-Aktualisierungs-Endpoints gibt es **keine Sitzungsstatus-Beschränkung**: Das Unternehmen kann zu jedem Zeitpunkt im Lebenszyklus der Business-Sitzung bearbeitet werden. Das Unternehmen muss zu der Sitzung im Pfad und zu Ihrer Anwendung gehören (andernfalls `404` mit `\"KYB company does not belong to the given session.\"`). Jeder nicht-leere PATCH löst den `data.updated`-[Webhook](/de/integration/webhooks) für die Business-Sitzung aus (Auslöser `console_registry_edit`) – selbst dann, wenn die übermittelten Werte mit den gespeicherten übereinstimmen. Der Status und die Entscheidung der Sitzung werden **nicht** neu bewertet, und es wird kein Prüfungs-/Audit-Eintrag erfasst.\n\nAkzeptiert einen API-Schlüssel oder ein Benutzer-Token der Konsole; in beiden Fällen benötigt der Berechtigungsnachweis die Berechtigung `write:businesses`. Authentifizierungs- und Berechtigungsfehler geben beide `403` zurück – diese API antwortet niemals mit `401`. Beachten Sie, dass der Sitzungsabruf vor den Berechtigungsprüfungen erfolgt, sodass eine unbekannte `sessionId` selbst bei fehlenden Berechtigungsnachweisen `404` zurückgibt. Es gilt das geteilte Schreibbudget von 300 Anfragen pro Minute pro API-Schlüssel.\n\nFür Sitzungen der Benutzerverifizierung ist das KYC-Pendant `PATCH /v3/session/{sessionId}/update-data/`; um die Sitzungsentscheidung selbst zu ändern, verwenden Sie `PATCH /v3/session/{sessionId}/update-status/`.",
        "operationId": "patch_v3_session_kyb_company_update_data",
        "x-didit-sdk": {
          "resource": "sessions",
          "method": "update_kyb_company_data",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Sessions"
        ],
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "parameters": [
          {
            "name": "sessionId",
            "in": "path",
            "required": true,
            "description": "UUID der übergeordneten Sitzung zur Unternehmensverifizierung (KYB).",
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "33333333-4444-5555-6666-777777777777"
            }
          },
          {
            "name": "companyUuid",
            "in": "path",
            "required": true,
            "description": "UUID des zu aktualisierenden Unternehmensdatensatzes (`registry_checks[].company.uuid` in der Entscheidung der Unternehmenssitzung). Muss zu der durch `sessionId` referenzierten Sitzung gehören.",
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "88888888-9999-aaaa-bbbb-cccccccccccc"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "description": "Alle Felder optional – senden Sie nur das, was Sie ändern möchten. Angegebene Felder aktualisieren die kanonischen Unternehmensspalten (sofern vorhanden) und werden in den `registry_data`-Snapshot zusammengeführt.",
                "properties": {
                  "company_name": {
                    "type": "string",
                    "maxLength": 255,
                    "description": "Offizieller Name des Unternehmens. Wird in die kanonische Spalte und den Register-Snapshot geschrieben.",
                    "example": "Docs Probe Corp"
                  },
                  "registration_number": {
                    "type": "string",
                    "maxLength": 100,
                    "description": "Offizielle Registernummer beim Unternehmensregister.",
                    "example": "DPC-001"
                  },
                  "country_code": {
                    "type": "string",
                    "maxLength": 2,
                    "description": "Gründungsland, ISO 3166-1 Alpha-2. Groß-/Kleinschreibung wird nicht berücksichtigt (`us` wird als `US` gespeichert). Alpha-3-Codes überschreiten das Limit von 2 Zeichen und führen zu `400`.",
                    "example": "US"
                  },
                  "region": {
                    "type": "string",
                    "maxLength": 10,
                    "nullable": true,
                    "description": "Unterteilungs- / Regions-Tag, sofern das Register über eines verfügt (z. B. US-Bundesstaat). Nur im Register-Snapshot gespeichert – es hat keine kanonische Spalte."
                  },
                  "incorporation_date": {
                    "type": "string",
                    "format": "date",
                    "description": "Gründungsdatum im Format `YYYY-MM-DD`. Wie jedes andere Feld optional – der `PATCH` ist partiell. Jedes andere Datumsformat gibt `400` zurück.",
                    "example": "2015-04-12"
                  },
                  "registration_date": {
                    "type": "string",
                    "format": "date",
                    "nullable": true,
                    "description": "Eintragungsdatum, sofern das Register dieses von der Gründung unterscheidet. Wird nur im Register-Snapshot gespeichert."
                  },
                  "dissolution_date": {
                    "type": "string",
                    "format": "date",
                    "nullable": true,
                    "description": "Auflösungsdatum für Unternehmen, die nicht mehr aktiv sind. Wird nur im Register-Snapshot gespeichert."
                  },
                  "tax_number": {
                    "type": "string",
                    "maxLength": 100,
                    "description": "Steueridentifikationsnummer."
                  },
                  "legal_address": {
                    "type": "string",
                    "description": "Rechtliche / eingetragene Adresse. Serverseitig als Alias für die kanonische Spalte `registered_address` definiert — die Antwort gibt sie unter `registered_address` zurück, während der Register-Snapshot den von Ihnen gesendeten Schlüssel `legal_address` beibehält.",
                    "example": "1 Example Plaza, Wilmington, DE 19801"
                  },
                  "company_type": {
                    "type": "string",
                    "maxLength": 100,
                    "description": "Art der juristischen Person (z. B. `Limited Liability Company`, `PLC`, `GmbH`).",
                    "example": "Limited Liability Company"
                  },
                  "registry_status": {
                    "type": "string",
                    "enum": [
                      "active",
                      "dissolved",
                      "deregistered",
                      "see full details",
                      "authorised",
                      "appointed representative",
                      "unauthorised",
                      "inactive",
                      "no longer authorised",
                      "closed",
                      "struck off"
                    ],
                    "nullable": true,
                    "description": "Vom Register gemeldeter Unternehmensstatus. Kleingeschrieben, einige Werte enthalten Leerzeichen (z. B. `struck off`, `no longer authorised`). Jeder andere Wert gibt `400` zurück.",
                    "example": "active"
                  },
                  "verification_status": {
                    "type": "string",
                    "enum": [
                      "verified",
                      "failed",
                      "unknown"
                    ],
                    "nullable": true,
                    "description": "Ergebnis der Registerverifizierung. Jeder andere Wert gibt `400` zurück.",
                    "example": "verified"
                  },
                  "alternative_names": {
                    "type": "string",
                    "description": "Handelsnamen, frühere rechtliche Namen, DBA-Namen (Freitext)."
                  },
                  "nature_of_business": {
                    "type": "string",
                    "description": "Kurzbeschreibung der Geschäftstätigkeit des Unternehmens.",
                    "example": "Software development"
                  },
                  "registered_capital": {
                    "type": "string",
                    "maxLength": 100,
                    "description": "Für Menschen lesbares Stammkapital (z. B. `USD 50000`). Verwenden Sie `registered_capital_amount` + `registered_capital_currency` für strukturierte Werte oder dieses Feld für Freitext.",
                    "example": "USD 50000"
                  },
                  "registered_capital_amount": {
                    "type": "number",
                    "format": "double",
                    "nullable": true,
                    "description": "Numerischer Betrag des Stammkapitals (bis zu 20 Ziffern, 2 Dezimalstellen). Setzt die Spalte `registered_capital_amount` und wird als Dezimal-String in `registry_data` gespiegelt; die Antwort gibt ihn als Dezimal-String zurück (z. B. `\"1500000.50\"`)."
                  },
                  "registered_capital_currency": {
                    "type": "string",
                    "maxLength": 3,
                    "nullable": true,
                    "description": "ISO 4217-Währungscode für `registered_capital_amount`. Ohne Berücksichtigung von Groß-/Kleinschreibung (`usd` wird als `USD` gespeichert); Werte, die nicht genau 3 Buchstaben lang sind, geben `400` mit der ISO 4217-Meldung zurück. Setzt die kanonische Spalte `registered_capital_currency` und wird in `registry_data` gespiegelt.",
                    "example": "USD"
                  },
                  "website": {
                    "type": "string",
                    "maxLength": 500,
                    "description": "Website des Unternehmens. Reine Domains werden akzeptiert und mit einem `https://`-Präfix normalisiert (`docsprobe.example.com` wird als `https://docsprobe.example.com` gespeichert); Werte, die die URL-Validierung weiterhin nicht bestehen, geben `400` zurück.",
                    "example": "https://docsprobe.example.com"
                  },
                  "email": {
                    "type": "string",
                    "format": "email",
                    "description": "Beim Register hinterlegte Kontakt-E-Mail.",
                    "example": "legal@docsprobe.example.com"
                  },
                  "phone": {
                    "type": "string",
                    "maxLength": 50,
                    "description": "Telefonnummer des Kontakts. Darf nur `+`, Ziffern, Leerzeichen, Bindestriche, Punkte oder Klammern enthalten, mit insgesamt 7-15 Ziffern – andernfalls `400`.",
                    "example": "+1 302 555 0143"
                  },
                  "legal_entity_identifier": {
                    "type": "string",
                    "maxLength": 50,
                    "description": "LEI, sofern das Unternehmen einen besitzt."
                  },
                  "location_of_registration": {
                    "type": "string",
                    "maxLength": 255,
                    "description": "Stadt / Unterteilung des zuständigen Registers."
                  },
                  "vat_number": {
                    "type": "string",
                    "maxLength": 64,
                    "description": "EU-USt-IdNr. Wird nur in den `registry_data`-Snapshot zusammengeführt – eine Bearbeitung hier führt die Validierung von USt-IdNr. und Steuernummer nicht erneut aus, sodass `vat_validation_status` und die anderen `vat_*`-Ergebnisfelder unverändert bleiben."
                  },
                  "control_scheme": {
                    "type": "string",
                    "description": "Kontroll-/Governance-System, sofern vom Register bereitgestellt. Wird ausschließlich im Register-Snapshot gespeichert."
                  }
                }
              },
              "examples": {
                "Correct registry data": {
                  "summary": "Die aus dem Unternehmensregister extrahierten Felder des Unternehmens korrigieren",
                  "value": {
                    "company_name": "Docs Probe Corp",
                    "registration_number": "DPC-001",
                    "country_code": "US",
                    "incorporation_date": "2015-04-12",
                    "company_type": "Limited Liability Company",
                    "legal_address": "1 Example Plaza, Wilmington, DE 19801",
                    "registry_status": "active",
                    "verification_status": "verified",
                    "website": "docsprobe.example.com",
                    "email": "legal@docsprobe.example.com",
                    "phone": "+1 302 555 0143",
                    "registered_capital": "USD 50000",
                    "nature_of_business": "Software development"
                  }
                },
                "Single field": {
                  "summary": "Nur die Schlüssel, die Sie senden, werden geschrieben",
                  "value": {
                    "registry_status": "dissolved"
                  }
                },
                "No-op": {
                  "summary": "Ein leerer Body gibt den aktuellen Datensatz zurück, ohne den Webhook auszulösen",
                  "value": {}
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Unternehmensdaten aktualisiert (oder bei leerem Anfragetext unverändert zurückgegeben). Gibt den vollständigen KYB-Unternehmensdatensatz zurück – im selben Format wie `registry_checks[].company` bei der Entscheidung der Unternehmenssitzung. Beachten Sie, dass `legal_address` als `registered_address` zurückgegeben wird. `registered_capital_amount`/`registered_capital_currency` befüllen ihre kanonischen Spalten und werden in `registry_data` gespiegelt.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "description": "Vollständiger KYB-Unternehmensdatensatz – dieselbe Struktur wie das `company`-Objekt innerhalb von `registry_checks[]` bei der Entscheidung der Unternehmenssitzung.",
                  "properties": {
                    "uuid": {
                      "type": "string",
                      "format": "uuid",
                      "description": "Kennung des Unternehmensdatensatzes (der Pfadparameter `companyUuid`)."
                    },
                    "node_id": {
                      "type": "string",
                      "nullable": true,
                      "description": "Workflow-Graph-Knoten, zu dem dieser Unternehmensdatensatz gehört, wenn der Workflow graphbasiert ist."
                    },
                    "status": {
                      "type": "string",
                      "description": "Lebenszyklusstatus der Funktion für die Registerprüfung (z. B. `Not Finished`, `Approved`, `Declined`, `In Review`)."
                    },
                    "registry_status": {
                      "type": "string",
                      "nullable": true,
                      "description": "Vom Register gemeldeter Unternehmensstatus (z. B. `active`, `dissolved`, `struck off`)."
                    },
                    "data_resolved": {
                      "type": "boolean",
                      "description": "`true`, wenn die Unternehmensdaten vollständig sind – für manuell eingegebene Unternehmen immer `true`; für aus einem Register bezogene Unternehmen `true`, sobald der Registerabruf abgeschlossen ist."
                    },
                    "company_name": {
                      "type": "string",
                      "nullable": true
                    },
                    "registration_number": {
                      "type": "string",
                      "nullable": true
                    },
                    "country_code": {
                      "type": "string",
                      "nullable": true,
                      "description": "Gründungsland nach ISO 3166-1 Alpha-2."
                    },
                    "region": {
                      "type": "string",
                      "nullable": true
                    },
                    "company_type": {
                      "type": "string",
                      "nullable": true
                    },
                    "incorporation_date": {
                      "type": "string",
                      "format": "date",
                      "nullable": true
                    },
                    "registered_address": {
                      "type": "string",
                      "nullable": true,
                      "description": "Kanonische eingetragene Adresse — wird aktualisiert, wenn Sie `legal_address` senden."
                    },
                    "tax_number": {
                      "type": "string",
                      "nullable": true
                    },
                    "risk_level": {
                      "type": "string",
                      "nullable": true
                    },
                    "verification_status": {
                      "type": "string",
                      "nullable": true,
                      "description": "`verified`, `failed` oder `unknown`."
                    },
                    "is_from_registry": {
                      "type": "boolean",
                      "description": "`true`, wenn das Unternehmen über eine Registersuche vorausgefüllt statt manuell eingegeben wurde."
                    },
                    "fetch_status": {
                      "type": "string",
                      "nullable": true,
                      "description": "Lebenszyklus des Registerabrufs für aus Registern stammende Unternehmen (`pending` / `resolved`); `null` für manuelle Einträge."
                    },
                    "alternative_names": {
                      "type": "string",
                      "nullable": true,
                      "description": "Alternative Namen, Handelsnamen, frühere Namen oder Unternehmensnamen in der Originalsprache als Text, sofern gemeldet."
                    },
                    "nature_of_business": {
                      "type": "string",
                      "nullable": true
                    },
                    "registered_capital": {
                      "type": "string",
                      "nullable": true
                    },
                    "registered_capital_amount": {
                      "type": "string",
                      "nullable": true,
                      "description": "Kanonische Spalte. Wird als Dezimal-String zurückgegeben (z. B. `\"2750000.00\"`)."
                    },
                    "registered_capital_currency": {
                      "type": "string",
                      "nullable": true,
                      "description": "Kanonische Spalte. Wird durch den Register-Workflow oder durch Konsolen-/API-Bearbeitungen über diesen Endpoint festgelegt."
                    },
                    "website": {
                      "type": "string",
                      "nullable": true
                    },
                    "email": {
                      "type": "string",
                      "nullable": true
                    },
                    "phone": {
                      "type": "string",
                      "nullable": true
                    },
                    "legal_entity_identifier": {
                      "type": "string",
                      "nullable": true
                    },
                    "location_of_registration": {
                      "type": "string",
                      "nullable": true
                    },
                    "vat_number": {
                      "type": "string",
                      "nullable": true,
                      "description": "EU-USt-IdNr., wenn während des gehosteten Registerschritts erfasst oder nachträglich bearbeitet."
                    },
                    "vat_validation_status": {
                      "type": "string",
                      "enum": [
                        "valid",
                        "invalid",
                        "format_valid",
                        "invalid_format",
                        "could_not_validate",
                        "not_applicable"
                      ],
                      "description": "Ergebnis der Validierung der USt-IdNr. oder, falls keine vorhanden ist, der `tax_number` bei der Registerübermittlung. `valid` / `invalid`: entschieden durch das offizielle Register des Landes (EU-VIES, Norwegen, Schweiz, Brasilien, Kolumbien, Costa Rica, Ecuador, Paraguay; Polen auch über sein nationales USt-Register). `format_valid` / `invalid_format`: entschieden durch die Format- und Prüfzifferregeln des Landes, wenn kein Register abgefragt werden kann. `could_not_validate`: das Register war nicht verfügbar. `not_applicable`: keine Nummer, ein Land ohne Register oder Regeln oder eine Sandbox-Sitzung."
                    },
                    "vat_validated_number": {
                      "type": "string",
                      "nullable": true,
                      "description": "Die geprüfte Nummer, wie sie der Quelle bekannt ist (beispielsweise die aus einer französischen SIREN oder einer niederländischen RSIN abgeleitete Umsatzsteuer-Identifikationsnummer). `null`, wenn keine Prüfung durchgeführt wurde."
                    },
                    "vat_validation_source": {
                      "type": "string",
                      "nullable": true,
                      "enum": [
                        "eu_vies",
                        "pl_vat_white_list",
                        "no_brreg",
                        "ch_uid_register",
                        "br_receita_federal",
                        "co_rues",
                        "cr_hacienda",
                        "ec_sri",
                        "py_dnit",
                        "format_rules",
                        null
                      ],
                      "description": "Die Quelle, die `vat_validation_status` festgelegt hat: ein offizielles Register oder `format_rules`. `null`, wenn keine Prüfung durchgeführt wurde."
                    },
                    "vat_validated_name": {
                      "type": "string",
                      "nullable": true,
                      "description": "Name, der bei der Quelle registriert ist, die die Nummer validiert hat, sofern sie einen offenlegt. Wird nur gesetzt, wenn der Status `valid` ist."
                    },
                    "vat_validated_address": {
                      "type": "string",
                      "nullable": true,
                      "description": "Bei der Quelle registrierte Adresse, die die Nummer validiert hat, sofern diese eine offenlegt. Wird nur festgelegt, wenn der Status `valid` ist."
                    },
                    "vat_checked_at": {
                      "type": "string",
                      "format": "date-time",
                      "nullable": true,
                      "description": "Zeitstempel der Prüfung. `null`, wenn keine Prüfung durchgeführt wurde."
                    },
                    "financial_summary": {
                      "type": "object",
                      "nullable": true,
                      "additionalProperties": true
                    },
                    "officers": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "additionalProperties": true
                      },
                      "description": "Dem Unternehmen zugeordnete Geschäftsführer / leitende Angestellte, einschließlich des KYC-Fortschritts pro Person."
                    },
                    "beneficial_owners": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "additionalProperties": true
                      },
                      "description": "Dem Unternehmen zugeordnete wirtschaftlich Berechtigte, einschließlich des personenspezifischen KYC-Fortschritts."
                    },
                    "addresses": {
                      "type": "array",
                      "nullable": true,
                      "items": {
                        "type": "object",
                        "additionalProperties": true
                      },
                      "description": "Adressdetail aus dem Register, sofern vom Register zurückgegeben."
                    },
                    "industries": {
                      "type": "array",
                      "nullable": true,
                      "items": {
                        "type": "object",
                        "additionalProperties": true
                      },
                      "description": "Register-Branchenklassifizierung, sofern verfügbar."
                    },
                    "accounts": {
                      "type": "object",
                      "nullable": true,
                      "additionalProperties": true,
                      "description": "Register-Einreichungsdaten, sofern verfügbar. Jahresmeldungen und Hauptversammlungen verwenden last_annual_return_date und last_agm_date; sie unterscheiden sich von Finanzabschlüssen."
                    },
                    "registry_data": {
                      "$ref": "#/components/schemas/KYBRegistryData"
                    },
                    "user_provided_data": {
                      "type": "object",
                      "nullable": true,
                      "additionalProperties": true,
                      "description": "Was der Endbenutzer während des gehosteten Schritts zur Bestätigung des Registers eingegeben hat. Wird von diesem Endpoint niemals geändert."
                    },
                    "confirmed_by_user_at": {
                      "type": "string",
                      "format": "date-time",
                      "nullable": true,
                      "description": "Wann der Endbenutzer die Unternehmensdaten im gehosteten Ablauf bestätigt hat."
                    },
                    "last_console_edit_at": {
                      "type": "string",
                      "format": "date-time",
                      "nullable": true,
                      "description": "Wird bei jedem erfolgreichen, nicht-leeren PATCH gestempelt, damit Benutzeroberflächen den Kontext \"vom Operator bearbeitet\" anzeigen können."
                    },
                    "is_editable": {
                      "type": "boolean",
                      "description": "`true`, solange der Endbenutzer die aus dem Register bezogenen Daten im gehosteten Ablauf noch bearbeiten kann (aus dem Register bezogen und noch nicht bestätigt)."
                    }
                  }
                },
                "examples": {
                  "Updated company": {
                    "summary": "Vollständiger Unternehmensdatensatz nach der Korrektur",
                    "value": {
                      "uuid": "6b9479f5-6769-46c8-baf1-df63bbbc5f8c",
                      "node_id": null,
                      "status": "Not Finished",
                      "registry_status": "active",
                      "data_resolved": true,
                      "company_name": "Docs Probe Corp",
                      "registration_number": "DPC-001",
                      "country_code": "US",
                      "region": null,
                      "company_type": "Limited Liability Company",
                      "incorporation_date": "2015-04-12",
                      "registered_address": "1 Example Plaza, Wilmington, DE 19801",
                      "tax_number": null,
                      "risk_level": null,
                      "verification_status": "verified",
                      "is_from_registry": false,
                      "fetch_status": null,
                      "alternative_names": null,
                      "nature_of_business": "Software development",
                      "registered_capital": "USD 50000",
                      "registered_capital_amount": null,
                      "registered_capital_currency": "USD",
                      "website": "https://docsprobe.example.com",
                      "email": "legal@docsprobe.example.com",
                      "phone": "+1 302 555 0143",
                      "legal_entity_identifier": null,
                      "location_of_registration": null,
                      "financial_summary": null,
                      "officers": [],
                      "beneficial_owners": [],
                      "addresses": null,
                      "industries": null,
                      "accounts": null,
                      "registry_data": {
                        "company_name": "Docs Probe Corp",
                        "registration_number": "DPC-001",
                        "country_code": "US",
                        "incorporation_date": "2015-04-12",
                        "legal_address": "1 Example Plaza, Wilmington, DE 19801",
                        "company_type": "Limited Liability Company",
                        "registry_status": "active",
                        "verification_status": "verified",
                        "nature_of_business": "Software development",
                        "registered_capital": "USD 50000",
                        "registered_capital_currency": "USD",
                        "website": "https://docsprobe.example.com",
                        "email": "legal@docsprobe.example.com",
                        "phone": "+1 302 555 0143"
                      },
                      "user_provided_data": null,
                      "confirmed_by_user_at": null,
                      "last_console_edit_at": "2026-06-12T00:02:34.276061Z",
                      "is_editable": false
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Validierungsfehler. Feldfehler werden als `{\"<field>\": [\"<message>\"]}` zurückgegeben. Prüfungen der maximalen Länge werden vor Formatprüfungen ausgeführt, sodass `country_code: \"USA\"` die Begrenzung auf 2 Zeichen anstelle der ISO-Meldung meldet.",
            "content": {
              "application/json": {
                "examples": {
                  "Alpha-3 country code": {
                    "summary": "country_code muss Alpha-2 sein – Längenprüfung greift zuerst",
                    "value": {
                      "country_code": [
                        "Ensure this field has no more than 2 characters."
                      ]
                    }
                  },
                  "Non-alphabetic country code": {
                    "summary": "2 Zeichen, aber keine Buchstaben",
                    "value": {
                      "country_code": [
                        "country_code must be a 2-letter ISO 3166-1 alpha-2 code."
                      ]
                    }
                  },
                  "Invalid currency": {
                    "summary": "3 Zeichen, aber kein ISO-4217-Code",
                    "value": {
                      "registered_capital_currency": [
                        "Currency must be a 3-letter ISO 4217 code (e.g. USD, EUR, GBP)."
                      ]
                    }
                  },
                  "Invalid phone": {
                    "summary": "Die Telefonnummer besteht die Prüfung auf Format / Ziffernanzahl nicht",
                    "value": {
                      "phone": [
                        "Invalid phone number format."
                      ]
                    }
                  },
                  "Invalid registry status": {
                    "summary": "registry_status nicht im Enum",
                    "value": {
                      "registry_status": [
                        "\"liquidated\" is not a valid choice."
                      ]
                    }
                  },
                  "Invalid email": {
                    "summary": "Ungültige E-Mail-Adresse",
                    "value": {
                      "email": [
                        "Enter a valid email address."
                      ]
                    }
                  },
                  "Invalid website": {
                    "summary": "Wert besteht die URL-Validierung selbst nach https://-Normalisierung nicht",
                    "value": {
                      "website": [
                        "Enter a valid URL."
                      ]
                    }
                  },
                  "Bad date format": {
                    "summary": "Datumsangaben müssen im Format JJJJ-MM-TT vorliegen",
                    "value": {
                      "incorporation_date": [
                        "Date has wrong format. Use one of these formats instead: YYYY-MM-DD."
                      ]
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Fehlende Anmeldedaten oder unzureichende Berechtigungen. Ein fehlender Schlüssel führt zu einer `403`-Antwort; ein falscher, widerrufener oder abgelaufener Schlüssel führt zu einer `401`-Antwort.",
            "content": {
              "application/json": {
                "examples": {
                  "Invalid Credentials": {
                    "summary": "Fehlender oder ungültiger x-api-key",
                    "value": {
                      "detail": "Authentication credentials were not provided or are invalid."
                    }
                  },
                  "Missing Privilege": {
                    "summary": "Dem Berechtigungsnachweis fehlt die Berechtigung write:businesses",
                    "value": {
                      "detail": "You do not have permission to perform this action."
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Unbekannte Sitzung, unbekanntes Unternehmen oder ein Unternehmen, das zu einer anderen Sitzung gehört. Jeder Fall hat eine eindeutige `detail`-Meldung (siehe Beispiele). Die Suche nach der unbekannten Sitzung läuft vor den Anmeldedatenprüfungen ab.",
            "content": {
              "application/json": {
                "examples": {
                  "Unknown session": {
                    "summary": "Keine Sitzung mit dieser ID in Ihrer Anwendung (oder sie wurde gelöscht)",
                    "value": {
                      "detail": "Not found."
                    }
                  },
                  "Unknown company": {
                    "summary": "Kein Unternehmen mit dieser UUID in Ihrer Anwendung",
                    "value": {
                      "detail": "No KYBCompany matches the given query."
                    }
                  },
                  "Company / session mismatch": {
                    "summary": "companyUuid existiert, gehört aber zu einer anderen Sitzung",
                    "value": {
                      "detail": "KYB company does not belong to the given session."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Gemeinsames Schreib-Rate-Limit überschritten (300 POST/PATCH/DELETE-Anfragen pro Minute pro API-Schlüssel). Prüfen Sie `Retry-After` und die `X-RateLimit-*`-Antwort-Header vor einem Wiederholungsversuch.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string"
                    }
                  }
                },
                "examples": {
                  "Rate limited": {
                    "summary": "Schreibbudget aufgebraucht",
                    "value": {
                      "detail": "Write request rate limit exceeded. You can make up to 300 requests per minute."
                    }
                  }
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X PATCH \\\n  https://verification.didit.me/v3/session/33333333-4444-5555-6666-777777777777/kyb/88888888-9999-aaaa-bbbb-cccccccccccc/update-data/ \\\n  -H 'x-api-key: YOUR_API_KEY' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\n    \"company_name\": \"Docs Probe Corp\",\n    \"registration_number\": \"DPC-001\",\n    \"country_code\": \"US\",\n    \"incorporation_date\": \"2015-04-12\",\n    \"company_type\": \"Limited Liability Company\",\n    \"legal_address\": \"1 Example Plaza, Wilmington, DE 19801\",\n    \"registry_status\": \"active\"\n  }'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.sessions.update_kyb_company_data(\n    \"33333333-4444-5555-6666-777777777777\",\n    \"88888888-9999-aaaa-bbbb-cccccccccccc\",\n    company_name=\"Docs Probe Corp\",\n    registration_number=\"DPC-001\",\n    country_code=\"US\",\n    incorporation_date=\"2015-04-12\",\n    legal_address=\"1 Example Plaza, Wilmington, DE 19801\",\n    company_type=\"Limited Liability Company\",\n    registry_status=\"active\",\n    verification_status=\"verified\",\n    nature_of_business=\"Software development\",\n    registered_capital=\"USD 50000\",\n    website=\"docsprobe.example.com\",\n    email=\"legal@docsprobe.example.com\",\n    phone=\"+1 302 555 0143\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.sessions.updateKybCompanyData(\n  \"33333333-4444-5555-6666-777777777777\",\n  \"88888888-9999-aaaa-bbbb-cccccccccccc\",\n  {\n    company_name: \"Docs Probe Corp\",\n    registration_number: \"DPC-001\",\n    country_code: \"US\",\n    incorporation_date: \"2015-04-12\",\n    legal_address: \"1 Example Plaza, Wilmington, DE 19801\",\n    company_type: \"Limited Liability Company\",\n    registry_status: \"active\",\n    verification_status: \"verified\",\n    nature_of_business: \"Software development\",\n    registered_capital: \"USD 50000\",\n    website: \"docsprobe.example.com\",\n    email: \"legal@docsprobe.example.com\",\n    phone: \"+1 302 555 0143\",\n  },\n);\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Sessions.UpdateKYBCompanyData(ctx, \"33333333-4444-5555-6666-777777777777\", \"88888888-9999-aaaa-bbbb-cccccccccccc\", didit.SessionsUpdateKYBCompanyDataParams{\n\tCompanyName:        didit.String(\"Docs Probe Corp\"),\n\tRegistrationNumber: didit.String(\"DPC-001\"),\n\tCountryCode:        didit.String(\"US\"),\n\tIncorporationDate:  didit.String(\"2015-04-12\"),\n\tLegalAddress:       didit.String(\"1 Example Plaza, Wilmington, DE 19801\"),\n\tCompanyType:        didit.String(\"Limited Liability Company\"),\n\tRegistryStatus:     didit.Some(didit.SessionsUpdateKYBCompanyDataParamsRegistryStatus(\"active\")),\n\tVerificationStatus: didit.Some(didit.SessionsUpdateKYBCompanyDataParamsVerificationStatus(\"verified\")),\n\tNatureOfBusiness:   didit.String(\"Software development\"),\n\tRegisteredCapital:  didit.String(\"USD 50000\"),\n\tWebsite:            didit.String(\"docsprobe.example.com\"),\n\tEmail:              didit.String(\"legal@docsprobe.example.com\"),\n\tPhone:              didit.String(\"+1 302 555 0143\"),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import java.time.LocalDate;\nimport me.didit.Didit;\nimport me.didit.types.SessionsUpdateKybCompanyDataParams;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.sessions().updateKybCompanyData(\"33333333-4444-5555-6666-777777777777\", \"88888888-9999-aaaa-bbbb-cccccccccccc\", SessionsUpdateKybCompanyDataParams.builder()\n        .companyName(\"Docs Probe Corp\")\n        .registrationNumber(\"DPC-001\")\n        .countryCode(\"US\")\n        .incorporationDate(LocalDate.parse(\"2015-04-12\"))\n        .legalAddress(\"1 Example Plaza, Wilmington, DE 19801\")\n        .companyType(\"Limited Liability Company\")\n        .registryStatus(SessionsUpdateKybCompanyDataParams.RegistryStatus.of(\"active\"))\n        .verificationStatus(SessionsUpdateKybCompanyDataParams.VerificationStatus.of(\"verified\"))\n        .natureOfBusiness(\"Software development\")\n        .registeredCapital(\"USD 50000\")\n        .website(\"docsprobe.example.com\")\n        .email(\"legal@docsprobe.example.com\")\n        .phone(\"+1 302 555 0143\")\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->sessions->updateKybCompanyData('33333333-4444-5555-6666-777777777777', '88888888-9999-aaaa-bbbb-cccccccccccc', [\n    'company_name' => 'Docs Probe Corp',\n    'registration_number' => 'DPC-001',\n    'country_code' => 'US',\n    'incorporation_date' => '2015-04-12',\n    'legal_address' => '1 Example Plaza, Wilmington, DE 19801',\n    'company_type' => 'Limited Liability Company',\n    'registry_status' => 'active',\n    'verification_status' => 'verified',\n    'nature_of_business' => 'Software development',\n    'registered_capital' => 'USD 50000',\n    'website' => 'docsprobe.example.com',\n    'email' => 'legal@docsprobe.example.com',\n    'phone' => '+1 302 555 0143',\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.sessions.update_kyb_company_data(\n  \"33333333-4444-5555-6666-777777777777\",\n  \"88888888-9999-aaaa-bbbb-cccccccccccc\",\n  company_name: \"Docs Probe Corp\",\n  registration_number: \"DPC-001\",\n  country_code: \"US\",\n  incorporation_date: \"2015-04-12\",\n  legal_address: \"1 Example Plaza, Wilmington, DE 19801\",\n  company_type: \"Limited Liability Company\",\n  registry_status: \"active\",\n  verification_status: \"verified\",\n  nature_of_business: \"Software development\",\n  registered_capital: \"USD 50000\",\n  website: \"docsprobe.example.com\",\n  email: \"legal@docsprobe.example.com\",\n  phone: \"+1 302 555 0143\"\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Sessions.UpdateKybCompanyDataAsync(\"33333333-4444-5555-6666-777777777777\", \"88888888-9999-aaaa-bbbb-cccccccccccc\", new SessionsUpdateKybCompanyDataParams\n{\n    CompanyName = \"Docs Probe Corp\",\n    RegistrationNumber = \"DPC-001\",\n    CountryCode = \"US\",\n    IncorporationDate = \"2015-04-12\",\n    LegalAddress = \"1 Example Plaza, Wilmington, DE 19801\",\n    CompanyType = \"Limited Liability Company\",\n    RegistryStatus = new SessionsUpdateKybCompanyDataParamsRegistryStatus(\"active\"),\n    VerificationStatus = new SessionsUpdateKybCompanyDataParamsVerificationStatus(\"verified\"),\n    NatureOfBusiness = \"Software development\",\n    RegisteredCapital = \"USD 50000\",\n    Website = \"docsprobe.example.com\",\n    Email = \"legal@docsprobe.example.com\",\n    Phone = \"+1 302 555 0143\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ]
      }
    },
    "/v3/session/{sessionId}/kyb/parties/{partyUuid}/": {
      "patch": {
        "summary": "Eine Partei des Typs „Schlüsselpersonen“ bei einer Sitzung zur Unternehmensverifizierung (KYB) überspringen (oder erneut anfordern)",
        "description": "Befreien Sie eine Partei aus den Schlüsselpersonen von der Verifizierung oder nehmen Sie sie wieder in den Prüfumfang auf. Dies ist der Notausstieg für Operatoren bei einer Partei, die ihre eigene Prüfung niemals abschließen kann – meistens, weil die an einen UBO oder Geschäftsführer übergebene individuelle KYC-Sitzung gelöscht wurde, was den Status dieses untergeordneten Elements einfriert und das KYB mit dem Status `Awaiting User` blockiert, ohne dass etwas diesen weiterbringen könnte.\n\nDas Setzen von `is_skipped: true` entfernt die Partei aus der Aggregation der Schlüsselpersonen und berechnet den `KYBKeyPeopleCheck` sowie den Status der übergeordneten Sitzung sofort neu, sodass die Unternehmenssitzung abgeschlossen und anschließend genehmigt oder abgelehnt werden kann. Das Senden von `is_skipped: false` nimmt die Partei wieder in den Prüfumfang auf, und die Prüfung wartet wieder auf sie.\n\nIm Gegensatz zum antragstellerseitigen Überspringen im gehosteten Schlüsselpersonen-Bildschirm wird dieser Endpoint **nicht** durch die Einstellung `allow_skip` der Rolle beschränkt – dieses Flag schränkt ein, was der Antragsteller entscheiden darf, nicht, was Ihr Analyst überschreiben darf. `requires_verification` bleibt bewusst unverändert, sodass eine überschriebene Partei als `requires_verification: true` **und** `is_skipped: true` ausgewiesen wird und der Datensatz weiterhin zeigt, was die Regeln verlangt haben.\n\nDie Partei muss zur Sitzung im Pfad gehören (andernfalls `404` mit `\"Party does not belong to the given session.\"` ) und zu Ihrer Anwendung. Ein PATCH, der das Flag tatsächlich ändert, löst den `data.updated`-[Webhook](/de/integration/webhooks) auf der Unternehmenssitzung mit dem Auslöser `console_key_people_skip` aus; ein PATCH, der das Flag auf seinen aktuellen Wert setzt, ist ein No-Op, der die Partei unverändert zurückgibt.\n\nAkzeptiert einen API-Schlüssel oder ein Token eines Konsolenbenutzers; in beiden Fällen benötigt der Berechtigungsnachweis die Berechtigung `write:businesses`.",
        "operationId": "patch_v3_session_kyb_party_update",
        "x-didit-sdk": {
          "resource": "sessions",
          "method": "update_kyb_party",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Sessions"
        ],
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "parameters": [
          {
            "name": "sessionId",
            "in": "path",
            "required": true,
            "description": "UUID der übergeordneten Sitzung zur Unternehmensverifizierung (KYB).",
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "33333333-4444-5555-6666-777777777777"
            }
          },
          {
            "name": "partyUuid",
            "in": "path",
            "required": true,
            "description": "UUID der zu aktualisierenden Partei der Schlüsselpersonen (`key_people_checks[].submitted.parties[].uuid` in der Entscheidung der Unternehmenssitzung). Muss zu der durch `sessionId` referenzierten Sitzung gehören.",
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "0a3f1e2c-7c2f-4a1b-9d55-2f8d2a5d6b41"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "is_skipped"
                ],
                "properties": {
                  "is_skipped": {
                    "type": "boolean",
                    "description": "`true` stellt die Partei von der Verifizierung frei, sodass die Prüfung der Schlüsselpersonen ohne sie abgeschlossen werden kann; `false` nimmt sie wieder in den Prüfumfang auf.",
                    "example": true
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Partei aktualisiert (oder unverändert zurückgegeben, wenn das Flag diesen Wert bereits hatte). Gibt die Partei zurück – im selben Format wie ein Eintrag von `key_people_checks[].submitted.parties[]` in der Entscheidung zur Unternehmenssitzung.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "description": "Datensatz einer Schlüsselperson – entspricht der Struktur eines Eintrags in `key_people_checks[].submitted.parties[]` in der Entscheidung der Unternehmenssitzung.",
                  "properties": {
                    "uuid": {
                      "type": "string",
                      "format": "uuid",
                      "description": "Parteien-ID."
                    },
                    "entity_type": {
                      "type": "string",
                      "enum": [
                        "person",
                        "company"
                      ],
                      "description": "Gibt an, ob die Partei eine Einzelperson oder ein Unternehmen ist."
                    },
                    "name": {
                      "type": "string",
                      "description": "Anzeigename der Partei."
                    },
                    "is_skipped": {
                      "type": "boolean",
                      "description": "Gibt an, ob die Partei von der Verifizierung ausgenommen ist."
                    },
                    "requires_verification": {
                      "type": "boolean",
                      "description": "Was die Rollen- und Schwellenwertregeln verlangt haben. Bleibt von diesem Endpoint unberührt."
                    },
                    "kyc_session_status": {
                      "type": "string",
                      "nullable": true,
                      "description": "Status der verknüpften individuellen KYC-Sitzung, eingefroren zum Löschzeitpunkt, falls die Sitzung gelöscht wurde."
                    },
                    "kyc_session_url": {
                      "type": "string",
                      "nullable": true,
                      "description": "Link zur verknüpften individuellen KYC-Sitzung. `null`, wenn keine vorhanden ist oder wenn sie gelöscht wurde."
                    },
                    "kyc_session_deleted": {
                      "type": "boolean",
                      "description": "Die verknüpfte individuelle KYC-Sitzung wurde gelöscht, sodass sie niemals abgeschlossen werden kann."
                    },
                    "kyb_sub_session_deleted": {
                      "type": "boolean",
                      "description": "Gegenstück zu `kyc_session_deleted` für Unternehmensparteien."
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Validierungsfehler im Request-Body. `is_skipped` ist das einzige Feld, das dieser Endpoint liest, und es ist erforderlich. Feldfehler werden als `{\"<field>\": [\"<message>\"]}` zurückgegeben. Die Body-Validierung wird *nach* dem Nachschlagen der Partei ausgeführt; wird also ein fehlerhaftes `is_skipped` an eine nicht existierende Partei gesendet, wird `404` und nicht `400` gemeldet.",
            "content": {
              "application/json": {
                "examples": {
                  "Missing is_skipped": {
                    "summary": "Leerer Body oder ein Body, der `is_skipped` auslässt",
                    "value": {
                      "is_skipped": [
                        "This field is required."
                      ]
                    }
                  },
                  "Non-boolean is_skipped": {
                    "summary": "Wert ist kein boolescher Wert – `\"maybe\"`, `2`, `[]`. Boolesche Werte sowie `\"true\"`/`\"false\"`, `1`/`0` und `\"yes\"`/`\"no\"` werden alle akzeptiert",
                    "value": {
                      "is_skipped": [
                        "Must be a valid boolean."
                      ]
                    }
                  },
                  "Null is_skipped": {
                    "summary": "`is_skipped` ist vorhanden, aber `null`",
                    "value": {
                      "is_skipped": [
                        "This field may not be null."
                      ]
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Fehlende Anmeldedaten oder unzureichende Berechtigungen. Ein fehlender Schlüssel führt zu einer `403`-Antwort; ein falscher, widerrufener oder abgelaufener Schlüssel führt zu einer `401`-Antwort.",
            "content": {
              "application/json": {
                "examples": {
                  "Invalid Credentials": {
                    "summary": "Fehlender oder ungültiger x-api-key",
                    "value": {
                      "detail": "Authentication credentials were not provided or are invalid."
                    }
                  },
                  "Missing Privilege": {
                    "summary": "Dem Berechtigungsnachweis fehlt die Berechtigung write:businesses",
                    "value": {
                      "detail": "You do not have permission to perform this action."
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Unbekannte Partei oder eine Partei, die zu einer anderen Sitzung gehört. Jeder Fall hat eine eindeutige `detail`-Meldung (siehe Beispiele). Anmeldedaten- und Berechtigungsprüfungen laufen vor der Parteisuche ab, sodass ein nicht autorisierter Aufruf `403` statt `404` zurückgibt. Es gibt keine separate Sitzungssuche: Eine unbekannte `sessionId` in Kombination mit einer Ihnen zugeordneten Partei gibt die Abweichungsmeldung aus.",
            "content": {
              "application/json": {
                "examples": {
                  "Unknown party": {
                    "summary": "Keine Partei mit dieser UUID in Ihrer Anwendung",
                    "value": {
                      "detail": "Not found."
                    }
                  },
                  "Party / session mismatch": {
                    "summary": "partyUuid existiert, hängt aber an einer anderen Sitzung",
                    "value": {
                      "detail": "Party does not belong to the given session."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Gemeinsames Schreib-Rate-Limit überschritten (300 POST/PATCH/DELETE-Anfragen pro Minute pro API-Schlüssel). Prüfen Sie `Retry-After` und die `X-RateLimit-*`-Antwort-Header vor einem Wiederholungsversuch.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string"
                    }
                  }
                },
                "examples": {
                  "Rate limited": {
                    "summary": "Schreibbudget aufgebraucht",
                    "value": {
                      "detail": "Write request rate limit exceeded. You can make up to 300 requests per minute."
                    }
                  }
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.sessions.update_kyb_party(\n    \"33333333-4444-5555-6666-777777777777\",\n    \"0a3f1e2c-7c2f-4a1b-9d55-2f8d2a5d6b41\",\n    is_skipped=True,\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.sessions.updateKybParty(\n  \"33333333-4444-5555-6666-777777777777\",\n  \"0a3f1e2c-7c2f-4a1b-9d55-2f8d2a5d6b41\",\n  {\n    is_skipped: true,\n  },\n);\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Sessions.UpdateKYBParty(ctx, \"33333333-4444-5555-6666-777777777777\", \"0a3f1e2c-7c2f-4a1b-9d55-2f8d2a5d6b41\", didit.SessionsUpdateKYBPartyParams{\n\tIsSkipped: true,\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\nimport me.didit.types.SessionsUpdateKybPartyParams;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.sessions().updateKybParty(\"33333333-4444-5555-6666-777777777777\", \"0a3f1e2c-7c2f-4a1b-9d55-2f8d2a5d6b41\", SessionsUpdateKybPartyParams.builder()\n        .isSkipped(true)\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->sessions->updateKybParty('33333333-4444-5555-6666-777777777777', '0a3f1e2c-7c2f-4a1b-9d55-2f8d2a5d6b41', [\n    'is_skipped' => true,\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.sessions.update_kyb_party(\n  \"33333333-4444-5555-6666-777777777777\",\n  \"0a3f1e2c-7c2f-4a1b-9d55-2f8d2a5d6b41\",\n  is_skipped: true\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Sessions.UpdateKybPartyAsync(\"33333333-4444-5555-6666-777777777777\", \"0a3f1e2c-7c2f-4a1b-9d55-2f8d2a5d6b41\", new SessionsUpdateKybPartyParams\n{\n    IsSkipped = true,\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ]
      }
    },
    "/v3/travel-rule/settings/": {
      "get": {
        "summary": "Travel Rule-Einstellungen abrufen",
        "description": "Die Travel Rule-Einstellungen und das VASP-Profil der Anwendung abrufen. Erstellt beim ersten Abrufen automatisch eine Standard-Einstellungszeile (deaktiviert) und ein leeres Profil.",
        "operationId": "getTravelRuleSettings",
        "x-didit-sdk": {
          "resource": "travel_rule",
          "method": "retrieve_settings",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Travel Rule"
        ],
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X GET https://verification.didit.me/v3/travel-rule/settings/ \\\n  -H 'x-api-key: YOUR_API_KEY'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.travel_rule.retrieve_settings()\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.travelRule.retrieveSettings();\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.TravelRule.RetrieveSettings(ctx)\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.travelRule().retrieveSettings();\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->travelRule->retrieveSettings();\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.travel_rule.retrieve_settings\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.TravelRule.RetrieveSettingsAsync();\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "responses": {
          "200": {
            "description": "Aktuelle Einstellungen zur Travel Rule und VASP-Profil.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TravelRuleSettingsDetail"
                },
                "examples": {
                  "Disabled (default)": {
                    "value": {
                      "is_enabled": false,
                      "jurisdiction": "EU",
                      "name_matching_strictness": "DEFAULT",
                      "confirmation_timeout_hours": 48,
                      "timeout_outcome": "HOLD",
                      "threshold_amount": "0.00",
                      "inbound_auto_accept": true,
                      "allow_self_declaration": true,
                      "allow_screenshot_proof": true,
                      "auto_wallet_verification": true,
                      "vasp_attribution_enabled": true,
                      "legal_name": "",
                      "lei": "",
                      "compliance_email": "",
                      "is_discoverable": true,
                      "counterparty_screening_enabled": false,
                      "sunrise_policy": "",
                      "sunrise_jurisdictions": [
                        "CO",
                        "KH",
                        "VN"
                      ],
                      "non_responsive_policy": "",
                      "travel_address": "",
                      "disabled_networks": [],
                      "networks": {
                        "gtr": {
                          "rail": "GTR",
                          "mode": "unavailable",
                          "state": "didit_onboarding",
                          "reason": "didit_membership_not_live",
                          "platform_available": false,
                          "connected": false,
                          "participant": null,
                          "vasps_reachable": 0,
                          "routed_30d": 0
                        },
                        "trust": {
                          "rail": "TRUST",
                          "mode": "unavailable",
                          "state": "unavailable",
                          "reason": "own_membership_only",
                          "platform_available": false,
                          "connected": false,
                          "participant": null,
                          "vasps_reachable": 0,
                          "routed_30d": 0
                        },
                        "verifyvasp": {
                          "rail": "VERIFYVASP",
                          "mode": "unavailable",
                          "state": "didit_onboarding",
                          "reason": "didit_membership_not_live",
                          "platform_available": false,
                          "connected": false,
                          "participant": null,
                          "vasps_reachable": 0,
                          "routed_30d": 0
                        },
                        "sygna": {
                          "rail": "SYGNA",
                          "mode": "unavailable",
                          "state": "didit_onboarding",
                          "reason": "didit_membership_not_live",
                          "platform_available": false,
                          "connected": false,
                          "participant": null,
                          "vasps_reachable": 0,
                          "routed_30d": 0
                        }
                      },
                      "didit_network": {
                        "listed": false,
                        "missing": [
                          "travel_rule_off",
                          "legal_name_missing",
                          "compliance_email_missing"
                        ],
                        "compliance_email_confirmed": false
                      }
                    }
                  }
                }
              }
            }
          }
        }
      },
      "put": {
        "summary": "Travel-Rule-Einstellungen aktualisieren",
        "description": "Erstellt oder aktualisiert (Upsert) die Travel-Rule-Einstellungen und das VASP-Profil der Anwendung. Partielles Update — senden Sie nur die Felder, die Sie ändern möchten. Das Setzen von `is_enabled: true` erfordert einen nicht leeren `legal_name` (bereits gespeichert oder in derselben Anfrage enthalten), andernfalls wird 400 zurückgegeben.",
        "operationId": "updateTravelRuleSettings",
        "x-didit-sdk": {
          "resource": "travel_rule",
          "method": "update_settings",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Travel Rule"
        ],
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TravelRuleSettingsUpdate"
              },
              "example": {
                "is_enabled": true,
                "legal_name": "Origin CASP SL",
                "jurisdiction": "EU",
                "name_matching_strictness": "DEFAULT",
                "confirmation_timeout_hours": 48,
                "timeout_outcome": "HOLD",
                "is_discoverable": true
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X PUT https://verification.didit.me/v3/travel-rule/settings/ \\\n  -H 'x-api-key: YOUR_API_KEY' -H 'Content-Type: application/json' \\\n  -d '{\"is_enabled\": true, \"legal_name\": \"Origin CASP SL\", \"jurisdiction\": \"EU\"}'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.travel_rule.update_settings(\n    is_enabled=True,\n    legal_name=\"Origin CASP SL\",\n    jurisdiction=\"EU\",\n    name_matching_strictness=\"DEFAULT\",\n    confirmation_timeout_hours=48,\n    timeout_outcome=\"HOLD\",\n    is_discoverable=True,\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.travelRule.updateSettings({\n  is_enabled: true,\n  legal_name: \"Origin CASP SL\",\n  jurisdiction: \"EU\",\n  name_matching_strictness: \"DEFAULT\",\n  confirmation_timeout_hours: 48,\n  timeout_outcome: \"HOLD\",\n  is_discoverable: true,\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.TravelRule.UpdateSettings(ctx, didit.TravelRuleSettingsUpdate{\n\tIsEnabled:                didit.Bool(true),\n\tLegalName:                didit.String(\"Origin CASP SL\"),\n\tJurisdiction:             didit.String(\"EU\"),\n\tNameMatchingStrictness:   didit.Some(didit.TravelRuleSettingsUpdateNameMatchingStrictness(\"DEFAULT\")),\n\tConfirmationTimeoutHours: didit.Int(48),\n\tTimeoutOutcome:           didit.Some(didit.TravelRuleSettingsUpdateTimeoutOutcome(\"HOLD\")),\n\tIsDiscoverable:           didit.Bool(true),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\nimport me.didit.types.TravelRuleSettingsUpdate;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.travelRule().updateSettings(TravelRuleSettingsUpdate.builder()\n        .isEnabled(true)\n        .legalName(\"Origin CASP SL\")\n        .jurisdiction(\"EU\")\n        .nameMatchingStrictness(TravelRuleSettingsUpdate.NameMatchingStrictness.of(\"DEFAULT\"))\n        .confirmationTimeoutHours(48L)\n        .timeoutOutcome(TravelRuleSettingsUpdate.TimeoutOutcome.of(\"HOLD\"))\n        .isDiscoverable(true)\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->travelRule->updateSettings([\n    'is_enabled' => true,\n    'legal_name' => 'Origin CASP SL',\n    'jurisdiction' => 'EU',\n    'name_matching_strictness' => 'DEFAULT',\n    'confirmation_timeout_hours' => 48,\n    'timeout_outcome' => 'HOLD',\n    'is_discoverable' => true,\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.travel_rule.update_settings(\n  is_enabled: true,\n  legal_name: \"Origin CASP SL\",\n  jurisdiction: \"EU\",\n  name_matching_strictness: \"DEFAULT\",\n  confirmation_timeout_hours: 48,\n  timeout_outcome: \"HOLD\",\n  is_discoverable: true\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.TravelRule.UpdateSettingsAsync(new TravelRuleSettingsUpdate\n{\n    IsEnabled = true,\n    LegalName = \"Origin CASP SL\",\n    Jurisdiction = \"EU\",\n    NameMatchingStrictness = new TravelRuleSettingsUpdateNameMatchingStrictness(\"DEFAULT\"),\n    ConfirmationTimeoutHours = 48,\n    TimeoutOutcome = new TravelRuleSettingsUpdateTimeoutOutcome(\"HOLD\"),\n    IsDiscoverable = true,\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "responses": {
          "200": {
            "description": "Aktualisierte Einstellungen und Profil im gleichen Format wie GET.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TravelRuleSettingsDetail"
                }
              }
            }
          },
          "400": {
            "description": "Validierungsfehler, z. B. Aktivierung ohne legal_name, eine sunrise_policy oder non_responsive_policy abweichend von HOLD, REJECT, PROCEED oder leer, ein unbekanntes Feld in `matching_rules` oder eine Auswahl bei `data_sharing_fields`, die die Auftraggeber-Verpflichtungen der Rechtsordnung Ihrer Jurisdiktion nicht erfüllen kann (die Fehler werden nach Entitätstyp unter `data_sharing_fields` aufgeführt).",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                },
                "example": {
                  "legal_name": [
                    "legal_name is required to enable travel rule."
                  ]
                }
              }
            }
          }
        }
      }
    },
    "/v3/travel-rule/settings/compliance-email/confirmation/": {
      "post": {
        "summary": "Compliance-E-Mail-Bestätigung senden",
        "description": "Sendet einen einmaligen Bestätigungslink an die compliance_email Ihres VASP-Profils. Durch Öffnen des Links und Klicken auf die Bestätigungsschaltfläche wird die Adresse bestätigt, was das Didit-Netzwerk benötigt, bevor Ihr Profil gelistet wird. Eine neue Anfrage ersetzt den vorherigen Link; der Link funktioniert nicht mehr, wenn sich die Compliance-E-Mail ändert. Eine E-Mail pro Minute pro Adresse.",
        "operationId": "sendTravelRuleComplianceEmailConfirmation",
        "x-didit-sdk": {
          "resource": "travel_rule",
          "method": "send_compliance_email_confirmation",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Travel Rule"
        ],
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X POST https://verification.didit.me/v3/travel-rule/settings/compliance-email/confirmation/ \\\n  -H 'x-api-key: YOUR_API_KEY'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.travel_rule.send_compliance_email_confirmation()\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.travelRule.sendComplianceEmailConfirmation();\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.TravelRule.SendComplianceEmailConfirmation(ctx)\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.travelRule().sendComplianceEmailConfirmation();\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->travelRule->sendComplianceEmailConfirmation();\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.travel_rule.send_compliance_email_confirmation\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.TravelRule.SendComplianceEmailConfirmationAsync();\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "responses": {
          "202": {
            "description": "Die Bestätigungs-E-Mail wurde gesendet.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "sent_to": {
                      "type": "string",
                      "format": "email"
                    }
                  }
                },
                "example": {
                  "sent_to": "compliance@your-vasp.example"
                }
              }
            }
          },
          "400": {
            "description": "Es ist keine Compliance-E-Mail festgelegt, oder sie wurde bereits bestätigt.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    }
                  }
                },
                "examples": {
                  "No compliance email": {
                    "value": {
                      "compliance_email": [
                        "Set a compliance email before confirming it."
                      ]
                    }
                  },
                  "Already confirmed": {
                    "value": {
                      "compliance_email": [
                        "This compliance email is already confirmed."
                      ]
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Vor weniger als einer Minute wurde eine Bestätigung an diese Adresse gesendet."
          },
          "503": {
            "description": "Die E-Mail konnte nicht gesendet werden. Es wurde nichts geändert; versuchen Sie es gleich noch einmal."
          }
        }
      }
    },
    "/v3/travel-rule/wallet-addresses/": {
      "get": {
        "summary": "Einträge im Wallet-Adressbuch auflisten",
        "description": "Paginierte Liste des Travel Rule-Wallet-Adressbuchs Ihrer Anwendung, die neuesten zuerst.",
        "operationId": "listTravelRuleWalletAddresses",
        "x-didit-sdk": {
          "resource": "travel_rule.wallet_addresses",
          "method": "list",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Travel Rule"
        ],
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "schema": {
              "type": "integer",
              "default": 50,
              "minimum": 1
            }
          },
          {
            "name": "offset",
            "in": "query",
            "schema": {
              "type": "integer",
              "default": 0,
              "minimum": 0
            }
          }
        ],
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X GET https://verification.didit.me/v3/travel-rule/wallet-addresses/ \\\n  -H 'x-api-key: YOUR_API_KEY'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nfor item in client.travel_rule.wallet_addresses.list():\n    print(item)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nfor await (const item of didit.travelRule.walletAddresses.list()) {\n  console.log(item);\n}"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\niter := client.TravelRule.WalletAddresses.ListAutoPaging(ctx, didit.TravelRuleWalletAddressesListParams{})\nfor iter.Next() {\n\tfmt.Printf(\"%+v\\n\", iter.Current())\n}\nif err := iter.Err(); err != nil {\n\tlog.Fatal(err)\n}"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nfor (var item : client.travelRule().walletAddresses().list()) {\n    System.out.println(item);\n}"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\nforeach ($didit->travelRule->walletAddresses->list() as $item) {\n    print_r($item->toArray());\n}"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\ndidit.travel_rule.wallet_addresses.list.auto_paging_each do |item|\n  puts item.to_h\nend"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nawait foreach (var item in await client.TravelRule.WalletAddresses.ListAsync())\n{\n    Console.WriteLine(JsonSerializer.Serialize(item));\n}"
          }
        ],
        "responses": {
          "200": {
            "description": "Paginierte Wallet-Adressbucheinträge.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "count": {
                      "type": "integer"
                    },
                    "next": {
                      "type": "string",
                      "nullable": true
                    },
                    "previous": {
                      "type": "string",
                      "nullable": true
                    },
                    "results": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/WalletAddressEntry"
                      }
                    }
                  }
                }
              }
            }
          }
        }
      },
      "post": {
        "summary": "Wallet-Adresse registrieren",
        "description": "Einen Eintrag zu Ihrem Travel-Rule-Wallet-Adressbuch hinzufügen, damit eingehende Transfers über die INTERNAL-Schiene damit abgeglichen werden können.",
        "operationId": "createTravelRuleWalletAddress",
        "x-didit-sdk": {
          "resource": "travel_rule.wallet_addresses",
          "method": "create",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Travel Rule"
        ],
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/WalletAddressEntryCreate"
              },
              "example": {
                "address": "0xBeneficiaryWallet01",
                "chain": "ETH",
                "holder_name": "Ana Diaz",
                "holder_vendor_data": "user-042",
                "self_declared": true
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X POST https://verification.didit.me/v3/travel-rule/wallet-addresses/ \\\n  -H 'x-api-key: YOUR_API_KEY' -H 'Content-Type: application/json' \\\n  -d '{\"address\": \"0xBeneficiaryWallet01\", \"chain\": \"ETH\", \"holder_name\": \"Ana Diaz\", \"self_declared\": true}'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.travel_rule.wallet_addresses.create(\n    address=\"0xBeneficiaryWallet01\",\n    chain=\"ETH\",\n    holder_vendor_data=\"user-042\",\n    holder_name=\"Ana Diaz\",\n    self_declared=True,\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.travelRule.walletAddresses.create({\n  address: \"0xBeneficiaryWallet01\",\n  chain: \"ETH\",\n  holder_vendor_data: \"user-042\",\n  holder_name: \"Ana Diaz\",\n  self_declared: true,\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.TravelRule.WalletAddresses.Create(ctx, didit.WalletAddressEntryCreate{\n\tAddress:          \"0xBeneficiaryWallet01\",\n\tChain:            didit.String(\"ETH\"),\n\tHolderVendorData: didit.String(\"user-042\"),\n\tHolderName:       didit.String(\"Ana Diaz\"),\n\tSelfDeclared:     didit.Bool(true),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\nimport me.didit.types.WalletAddressEntryCreate;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.travelRule().walletAddresses().create(WalletAddressEntryCreate.builder()\n        .address(\"0xBeneficiaryWallet01\")\n        .chain(\"ETH\")\n        .holderVendorData(\"user-042\")\n        .holderName(\"Ana Diaz\")\n        .selfDeclared(true)\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->travelRule->walletAddresses->create([\n    'address' => '0xBeneficiaryWallet01',\n    'chain' => 'ETH',\n    'holder_vendor_data' => 'user-042',\n    'holder_name' => 'Ana Diaz',\n    'self_declared' => true,\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.travel_rule.wallet_addresses.create(\n  address: \"0xBeneficiaryWallet01\",\n  chain: \"ETH\",\n  holder_vendor_data: \"user-042\",\n  holder_name: \"Ana Diaz\",\n  self_declared: true\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.TravelRule.WalletAddresses.CreateAsync(new WalletAddressEntryCreate\n{\n    Address = \"0xBeneficiaryWallet01\",\n    Chain = \"ETH\",\n    HolderVendorData = \"user-042\",\n    HolderName = \"Ana Diaz\",\n    SelfDeclared = true,\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "responses": {
          "201": {
            "description": "Der erstellte Eintrag.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WalletAddressEntry"
                }
              }
            }
          },
          "400": {
            "description": "Eine doppelte Wallet (Adresse, Chain und Memo) für diese Anwendung, ein Memo oder eine X-Adresse, die die Chain nicht übertragen kann, eine fehlende `address`, eine ungültige `travel_address`, `self_declared: true`, während `allow_self_declaration` deaktiviert ist, oder `self_declared: true`, während `ownership_validation_mode` auf `FULL` gesetzt ist.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                },
                "examples": {
                  "Duplicate entry": {
                    "value": {
                      "address": [
                        "A wallet address entry with this address and chain already exists."
                      ]
                    }
                  },
                  "Invalid travel address": {
                    "value": {
                      "travel_address": [
                        "Invalid travel address."
                      ]
                    }
                  },
                  "Self-declaration disabled": {
                    "value": {
                      "self_declared": [
                        "Self-declared ownership is disabled for this application."
                      ]
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/v3/travel-rule/wallet-addresses/{entry_uuid}/": {
      "patch": {
        "summary": "Metadaten des Wallet-Adressinhabers aktualisieren",
        "description": "Partielle Aktualisierung von holder_name, holder_vendor_data, entity_type und travel_address. Das Setzen von travel_address weist dem Eintrag eine TRP-Routing-Adresse zu; ungültige Werte werden mit 400 abgelehnt. Die Antwort gibt nur diese vier Felder zurück.",
        "operationId": "updateTravelRuleWalletAddress",
        "x-didit-sdk": {
          "resource": "travel_rule.wallet_addresses",
          "method": "update",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Travel Rule"
        ],
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "parameters": [
          {
            "name": "entry_uuid",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/WalletAddressEntryUpdate"
              },
              "example": {
                "holder_name": "Ana Updated",
                "travel_address": "ta2ih1MicegQ3JqiKz9xT89KsSuwaDJYw8DgzmeSEp1h9tduJcNDZ5SgKLEHeyGMcS1s2HgbM6undFrMQknhM5aTXw3G9KBzi16hx"
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X PATCH https://verification.didit.me/v3/travel-rule/wallet-addresses/{entry_uuid}/ \\\n  -H 'x-api-key: YOUR_API_KEY' -H 'Content-Type: application/json' \\\n  -d '{\"holder_name\": \"Ana Updated\", \"travel_address\": \"ta2ih1MicegQ3JqiKz9xT89KsSuwaDJYw8DgzmeSEp1h9tduJcNDZ5SgKLEHeyGMcS1s2HgbM6undFrMQknhM5aTXw3G9KBzi16hx\"}'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.travel_rule.wallet_addresses.update(\n    \"11111111-2222-3333-4444-555555555555\",\n    holder_name=\"Ana Updated\",\n    travel_address=\"ta2ih1MicegQ3JqiKz9xT89KsSuwaDJYw8DgzmeSEp1h9tduJcNDZ5SgKLEHeyGMcS1s2HgbM6undFrMQknhM5aTXw3G9KBzi16hx\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.travelRule.walletAddresses.update(\"11111111-2222-3333-4444-555555555555\", {\n  holder_name: \"Ana Updated\",\n  travel_address: \"ta2ih1MicegQ3JqiKz9xT89KsSuwaDJYw8DgzmeSEp1h9tduJcNDZ5SgKLEHeyGMcS1s2HgbM6undFrMQknhM5aTXw3G9KBzi16hx\",\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.TravelRule.WalletAddresses.Update(ctx, \"11111111-2222-3333-4444-555555555555\", didit.WalletAddressEntryUpdateParam{\n\tHolderName:    didit.String(\"Ana Updated\"),\n\tTravelAddress: didit.String(\"ta2ih1MicegQ3JqiKz9xT89KsSuwaDJYw8DgzmeSEp1h9tduJcNDZ5SgKLEHeyGMcS1s2HgbM6undFrMQknhM5aTXw3G9KBzi16hx\"),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\nimport me.didit.types.WalletAddressEntryUpdate;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.travelRule().walletAddresses().update(\"11111111-2222-3333-4444-555555555555\", WalletAddressEntryUpdate.builder()\n        .holderName(\"Ana Updated\")\n        .travelAddress(\"ta2ih1MicegQ3JqiKz9xT89KsSuwaDJYw8DgzmeSEp1h9tduJcNDZ5SgKLEHeyGMcS1s2HgbM6undFrMQknhM5aTXw3G9KBzi16hx\")\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->travelRule->walletAddresses->update('11111111-2222-3333-4444-555555555555', [\n    'holder_name' => 'Ana Updated',\n    'travel_address' => 'ta2ih1MicegQ3JqiKz9xT89KsSuwaDJYw8DgzmeSEp1h9tduJcNDZ5SgKLEHeyGMcS1s2HgbM6undFrMQknhM5aTXw3G9KBzi16hx',\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.travel_rule.wallet_addresses.update(\n  \"11111111-2222-3333-4444-555555555555\",\n  holder_name: \"Ana Updated\",\n  travel_address: \"ta2ih1MicegQ3JqiKz9xT89KsSuwaDJYw8DgzmeSEp1h9tduJcNDZ5SgKLEHeyGMcS1s2HgbM6undFrMQknhM5aTXw3G9KBzi16hx\"\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.TravelRule.WalletAddresses.UpdateAsync(\"11111111-2222-3333-4444-555555555555\", new WalletAddressEntryUpdate\n{\n    HolderName = \"Ana Updated\",\n    TravelAddress = \"ta2ih1MicegQ3JqiKz9xT89KsSuwaDJYw8DgzmeSEp1h9tduJcNDZ5SgKLEHeyGMcS1s2HgbM6undFrMQknhM5aTXw3G9KBzi16hx\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "responses": {
          "200": {
            "description": "Die aktualisierten Felder.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WalletAddressEntryUpdate"
                }
              }
            }
          },
          "400": {
            "description": "`travel_address` ist keine gültige Travel Address.",
            "content": {
              "application/json": {
                "examples": {
                  "Invalid travel address": {
                    "value": {
                      "travel_address": [
                        "Invalid travel address."
                      ]
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Unbekannter oder gelöschter Eintrag."
          }
        }
      },
      "delete": {
        "summary": "Eine Adresse löschen",
        "description": "Löscht den Eintrag zusammen mit seinen Eigentumsnachweisen und den darin gespeicherten Screenshots. Er wird ab sofort nicht mehr mit neuen Überweisungen abgeglichen und die Adresse wird für eine erneute Registrierung freigegeben. Überweisungen, die die Wallet bereits verwendet haben, behalten ihren eigenen Datensatz dazu, der weiterhin unverändert ausgelesen wird. Die Löschung ist unwiderruflich.",
        "operationId": "deleteTravelRuleWalletAddress",
        "x-didit-sdk": {
          "resource": "travel_rule.wallet_addresses",
          "method": "delete",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Travel Rule"
        ],
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "parameters": [
          {
            "name": "entry_uuid",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X DELETE https://verification.didit.me/v3/travel-rule/wallet-addresses/{entry_uuid}/ \\\n  -H 'x-api-key: YOUR_API_KEY'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nclient.travel_rule.wallet_addresses.delete(\n    \"11111111-2222-3333-4444-555555555555\",\n)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nawait didit.travelRule.walletAddresses.delete(\"11111111-2222-3333-4444-555555555555\");"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nif err := client.TravelRule.WalletAddresses.Delete(ctx, \"11111111-2222-3333-4444-555555555555\"); err != nil {\n\tlog.Fatal(err)\n}"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nclient.travelRule().walletAddresses().delete(\"11111111-2222-3333-4444-555555555555\");"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$didit->travelRule->walletAddresses->delete('11111111-2222-3333-4444-555555555555');"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\ndidit.travel_rule.wallet_addresses.delete(\"11111111-2222-3333-4444-555555555555\")"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nawait client.TravelRule.WalletAddresses.DeleteAsync(\"11111111-2222-3333-4444-555555555555\");"
          }
        ],
        "responses": {
          "204": {
            "description": "Gelöscht."
          },
          "404": {
            "description": "Unbekannter oder bereits gelöschter Eintrag."
          },
          "503": {
            "description": "`wallet_address_deletion_incomplete`: Eine gespeicherte Datei konnte nicht gelöscht werden, daher wurde der Löschvorgang vor Abschluss abgebrochen. Der Adressbucheintrag ist weiterhin vorhanden; wiederholen Sie dieselbe Anfrage, um ihn abzuschließen.",
            "content": {
              "application/json": {
                "example": {
                  "detail": "A stored file could not be deleted, so the deletion stopped before it finished. Try again.",
                  "code": "wallet_address_deletion_incomplete"
                }
              }
            }
          }
        }
      }
    },
    "/v3/travel-rule/vasps/": {
      "get": {
        "summary": "VASP-Verzeichnis durchsuchen",
        "description": "Paginierte, nach Namen sortierte Suche im VASP-Verzeichnis: die geteilten Verzeichniseinträge, die Didit aus dem vorläufigen ESMA-MiCA-Register, dem öffentlichen TRISA-Verzeichnis, dem globalen LEI-Register und eigener Kuration sowie den Mitgliedern des Didit-Netzwerks erstellt. Jede Zeile enthält die Routen, die Ihre Anwendung heute dorthin hat. Das Profil Ihrer eigenen Anwendung wird niemals aufgeführt. Die Zeilen enthalten außerdem die geteilte Due-Diligence-Bewertung und die eigene Entscheidung, das Entitäts-Screening und die Fragebögen Ihrer Anwendung.",
        "operationId": "listTravelRuleVasps",
        "tags": [
          "Travel Rule"
        ],
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "parameters": [
          {
            "name": "search",
            "in": "query",
            "schema": {
              "type": "string",
              "maxLength": 255
            },
            "description": "Ein Namens- oder Alias-Fragment (ohne Berücksichtigung der Groß-/Kleinschreibung), eine exakte LEI oder eine Domain (example.com oder eine URL darauf). Mitglieder des Didit-Netzwerks werden anhand ihres rechtlichen Namens, ihrer LEI oder der Domain ihrer Compliance-E-Mail zugeordnet."
          },
          {
            "name": "network",
            "in": "query",
            "schema": {
              "type": "string",
              "enum": [
                "GTR",
                "TRUST",
                "VERIFYVASP",
                "SYGNA",
                "TRISA"
              ]
            },
            "description": "Nur Verzeichniseinträge, die das Mitgliederverzeichnis eines Netzwerks derzeit auflistet."
          },
          {
            "name": "jurisdiction",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "ISO 3166 Alpha-2- oder Alpha-3-Ländercode. 400 für jeden anderen Wert."
          },
          {
            "name": "reachable",
            "in": "query",
            "schema": {
              "type": "boolean"
            },
            "description": "true: Nur VASPs, zu denen Ihre Anwendung eine verfügbare Route hat (einschließlich Mitgliedern des Didit-Netzwerks). false: Nur Verzeichniseinträge, die sie derzeit nicht erreichen kann."
          },
          {
            "name": "kind",
            "in": "query",
            "schema": {
              "type": "string",
              "enum": [
                "directory",
                "didit"
              ]
            },
            "description": "Nur Verzeichniseinträge oder nur Mitglieder des Didit-Netzwerks."
          },
          {
            "name": "risk",
            "in": "query",
            "schema": {
              "type": "string",
              "enum": [
                "LOW",
                "MEDIUM",
                "HIGH"
              ]
            },
            "description": "Nur Verzeichniseinträge, deren risk_level in diesem Bereich liegt. Mitglieder des Didit-Netzwerks, die nicht bewertet werden, stimmen niemals überein."
          },
          {
            "name": "responsiveness",
            "in": "query",
            "schema": {
              "type": "string",
              "enum": [
                "RESPONSIVE",
                "UNRESPONSIVE",
                "UNKNOWN"
              ]
            },
            "description": "Nur Verzeichniseinträge, deren responsiveness.status diesem Wert entspricht. Mitglieder des Didit-Netzwerks stimmen niemals überein."
          },
          {
            "name": "limit",
            "in": "query",
            "schema": {
              "type": "integer",
              "default": 50,
              "minimum": 1
            }
          },
          {
            "name": "offset",
            "in": "query",
            "schema": {
              "type": "integer",
              "default": 0,
              "minimum": 0
            }
          }
        ],
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X GET 'https://verification.didit.me/v3/travel-rule/vasps/?search=counterparty&reachable=true' \\\n  -H 'x-api-key: YOUR_API_KEY'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nfor item in client.travel_rule.list_vasps():\n    print(item)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nfor await (const item of didit.travelRule.listVasps()) {\n  console.log(item);\n}"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\niter := client.TravelRule.ListVASPsAutoPaging(ctx, didit.TravelRuleListVASPsParams{})\nfor iter.Next() {\n\tfmt.Printf(\"%+v\\n\", iter.Current())\n}\nif err := iter.Err(); err != nil {\n\tlog.Fatal(err)\n}"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nfor (var item : client.travelRule().listVasps()) {\n    System.out.println(item);\n}"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\nforeach ($didit->travelRule->listVasps() as $item) {\n    print_r($item->toArray());\n}"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\ndidit.travel_rule.list_vasps.auto_paging_each do |item|\n  puts item.to_h\nend"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nawait foreach (var item in await client.TravelRule.ListVaspsAsync())\n{\n    Console.WriteLine(JsonSerializer.Serialize(item));\n}"
          }
        ],
        "responses": {
          "200": {
            "description": "Paginierte, nach Namen sortierte VASP-Verzeichnis-Ergebnisse.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "count": {
                      "type": "integer"
                    },
                    "next": {
                      "type": "string",
                      "nullable": true
                    },
                    "previous": {
                      "type": "string",
                      "nullable": true
                    },
                    "results": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/VaspDirectoryEntry"
                      }
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Ein Filter ist ungültig: Der Body benennt jedes Feld, beispielsweise ein unbekanntes Netzwerk, einen unbekannten Ländercode, eine unbekannte Risikostufe oder einen unbekannten Reaktionsstatus.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    }
                  }
                },
                "example": {
                  "jurisdiction": [
                    "Use an ISO 3166 alpha-2 or alpha-3 country code."
                  ],
                  "network": [
                    "\"SWIFT\" is not a valid choice."
                  ]
                }
              }
            }
          }
        },
        "x-didit-sdk": {
          "resource": "travel_rule",
          "method": "list_vasps",
          "auth": "api_key",
          "server": true
        }
      }
    },
    "/v3/travel-rule/vasps/{vasp_id}/": {
      "get": {
        "summary": "Eintrag aus dem VASP-Verzeichnis abrufen",
        "description": "Ein Verzeichniseintrag oder Didit-Netzwerkmitglied anhand der von der Suche zurückgegebenen ID, mit denselben Feldern und den Routen, über die Ihre Anwendung darauf zugreifen kann.",
        "operationId": "getTravelRuleVasp",
        "x-didit-sdk": {
          "resource": "travel_rule",
          "method": "retrieve_vasp",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Travel Rule"
        ],
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "parameters": [
          {
            "name": "vasp_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Die ID einer Zeile aus der Antwort von GET /v3/travel-rule/vasps/."
          }
        ],
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X GET https://verification.didit.me/v3/travel-rule/vasps/{vasp_id}/ \\\n  -H 'x-api-key: YOUR_API_KEY'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.travel_rule.retrieve_vasp(\n    \"11111111-2222-3333-4444-555555555555\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.travelRule.retrieveVasp(\"11111111-2222-3333-4444-555555555555\");\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.TravelRule.RetrieveVASP(ctx, \"11111111-2222-3333-4444-555555555555\")\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.travelRule().retrieveVasp(\"11111111-2222-3333-4444-555555555555\");\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->travelRule->retrieveVasp('11111111-2222-3333-4444-555555555555');\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.travel_rule.retrieve_vasp(\"11111111-2222-3333-4444-555555555555\")\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.TravelRule.RetrieveVaspAsync(\"11111111-2222-3333-4444-555555555555\");\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "responses": {
          "200": {
            "description": "Der Eintrag.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VaspDirectoryEntry"
                }
              }
            }
          },
          "404": {
            "description": "Kein Eintrag und kein gelistetes Didit-Netzwerkmitglied besitzt diese ID.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string"
                    }
                  }
                },
                "example": {
                  "detail": "No directory entry has this id."
                }
              }
            }
          }
        }
      }
    },
    "/v3/travel-rule/vasps/{vasp_id}/decision/": {
      "get": {
        "summary": "Ihre Entscheidung zu einem VASP abrufen",
        "description": "Die Entscheidung Ihrer Anwendung über eine Gegenpartei (einen Verzeichniseintrag oder ein Mitglied des Didit-Netzwerks): genehmigt, eingeschränkt oder blockiert. Eine Entität einer Marke ohne eigene Entscheidung folgt der Entscheidung der Marke, die in inherited_from genannt wird. Nur für Ihre Anwendung sichtbar.",
        "operationId": "getTravelRuleVaspDecision",
        "x-didit-sdk": {
          "resource": "travel_rule",
          "method": "retrieve_vasp_decision",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Travel Rule"
        ],
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "parameters": [
          {
            "name": "vasp_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Die ID einer Zeile aus der Antwort von GET /v3/travel-rule/vasps/: ein Verzeichniseintrag oder ein Mitglied des Didit-Netzwerks."
          }
        ],
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X GET https://verification.didit.me/v3/travel-rule/vasps/{vasp_id}/decision/ \\\n  -H 'x-api-key: YOUR_API_KEY'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.travel_rule.retrieve_vasp_decision(\n    \"11111111-2222-3333-4444-555555555555\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.travelRule.retrieveVaspDecision(\"11111111-2222-3333-4444-555555555555\");\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.TravelRule.RetrieveVASPDecision(ctx, \"11111111-2222-3333-4444-555555555555\")\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.travelRule().retrieveVaspDecision(\"11111111-2222-3333-4444-555555555555\");\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->travelRule->retrieveVaspDecision('11111111-2222-3333-4444-555555555555');\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.travel_rule.retrieve_vasp_decision(\"11111111-2222-3333-4444-555555555555\")\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.TravelRule.RetrieveVaspDecisionAsync(\"11111111-2222-3333-4444-555555555555\");\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "responses": {
          "200": {
            "description": "Die geltende Entscheidung oder null.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TravelRuleCounterpartyDecisionResponse"
                },
                "examples": {
                  "Own decision": {
                    "value": {
                      "decision": {
                        "decision": "APPROVED",
                        "reason": "Licensed in DE, questionnaire reviewed",
                        "decided_by": "",
                        "updated_at": "2026-10-14T10:05:00Z",
                        "inherited_from": null
                      }
                    }
                  },
                  "Inherited from the brand": {
                    "value": {
                      "decision": {
                        "decision": "BLOCKED",
                        "reason": "Group refused after review",
                        "decided_by": "",
                        "updated_at": "2026-10-14T10:05:00Z",
                        "inherited_from": {
                          "id": "5e4d3c2b-1a0f-4e9d-8c7b-6a5f4e3d2c1b",
                          "name": "Example Group"
                        }
                      }
                    }
                  },
                  "No decision": {
                    "value": {
                      "decision": null
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Kein Verzeichniseintrag und kein gelistetes Didit-Netzwerkmitglied besitzt diese ID. Ihr eigenes VASP-Profil ist niemals eine Gegenpartei von Ihnen.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string"
                    }
                  }
                },
                "example": {
                  "detail": "No directory entry or Didit network member has this id."
                }
              }
            }
          }
        }
      },
      "put": {
        "summary": "Ihre Entscheidung zu einem VASP festlegen",
        "description": "Treffen oder ändern Sie die Entscheidung Ihrer Anwendung zu einer Gegenpartei: APPROVED, RESTRICTED oder BLOCKED, mit einem optionalen Grund. Dies ändert niemals den gemeinsamen Verzeichniseintrag und wirkt sich nur über Ihre Transaktionsregeln aus (counterparty_dd_status). Eine Entscheidung zu einer Marke gilt auch für jede ihrer Einheiten, die keine eigene Entscheidung hat.",
        "operationId": "updateTravelRuleVaspDecision",
        "x-didit-sdk": {
          "resource": "travel_rule",
          "method": "update_vasp_decision",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Travel Rule"
        ],
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "parameters": [
          {
            "name": "vasp_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Die ID einer Zeile aus der Antwort von GET /v3/travel-rule/vasps/: ein Verzeichniseintrag oder ein Mitglied des Didit-Netzwerks."
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TravelRuleCounterpartyDecisionRequest"
              },
              "example": {
                "decision": "BLOCKED",
                "reason": "Unlicensed in its home jurisdiction"
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X PUT https://verification.didit.me/v3/travel-rule/vasps/{vasp_id}/decision/ \\\n  -H 'x-api-key: YOUR_API_KEY' -H 'Content-Type: application/json' \\\n  -d '{\"decision\": \"BLOCKED\", \"reason\": \"Unlicensed in its home jurisdiction\"}'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.travel_rule.update_vasp_decision(\n    \"11111111-2222-3333-4444-555555555555\",\n    decision=\"BLOCKED\",\n    reason=\"Unlicensed in its home jurisdiction\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.travelRule.updateVaspDecision(\"11111111-2222-3333-4444-555555555555\", {\n  decision: \"BLOCKED\",\n  reason: \"Unlicensed in its home jurisdiction\",\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.TravelRule.UpdateVASPDecision(ctx, \"11111111-2222-3333-4444-555555555555\", didit.TravelRuleCounterpartyDecisionRequest{\n\tDecision: \"BLOCKED\",\n\tReason:   didit.String(\"Unlicensed in its home jurisdiction\"),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\nimport me.didit.types.TravelRuleCounterpartyDecisionRequest;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.travelRule().updateVaspDecision(\"11111111-2222-3333-4444-555555555555\", TravelRuleCounterpartyDecisionRequest.builder()\n        .decision(TravelRuleCounterpartyDecisionRequest.Decision.of(\"BLOCKED\"))\n        .reason(\"Unlicensed in its home jurisdiction\")\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->travelRule->updateVaspDecision('11111111-2222-3333-4444-555555555555', [\n    'decision' => 'BLOCKED',\n    'reason' => 'Unlicensed in its home jurisdiction',\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.travel_rule.update_vasp_decision(\n  \"11111111-2222-3333-4444-555555555555\",\n  decision: \"BLOCKED\",\n  reason: \"Unlicensed in its home jurisdiction\"\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.TravelRule.UpdateVaspDecisionAsync(\"11111111-2222-3333-4444-555555555555\", new TravelRuleCounterpartyDecisionRequest\n{\n    Decision = \"BLOCKED\",\n    Reason = \"Unlicensed in its home jurisdiction\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "responses": {
          "200": {
            "description": "Die Entscheidung, wie sie jetzt gilt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TravelRuleCounterpartyDecisionResponse"
                },
                "example": {
                  "decision": {
                    "decision": "BLOCKED",
                    "reason": "Unlicensed in its home jurisdiction",
                    "decided_by": "",
                    "updated_at": "2026-10-14T10:05:00Z",
                    "inherited_from": null
                  }
                }
              }
            }
          },
          "400": {
            "description": "Die Entscheidung fehlt oder ist nicht APPROVED, RESTRICTED oder BLOCKED, oder die Begründung ist länger als 255 Zeichen.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    }
                  }
                },
                "example": {
                  "decision": [
                    "\"MAYBE\" is not a valid choice."
                  ]
                }
              }
            }
          },
          "404": {
            "description": "Kein Verzeichniseintrag und kein gelistetes Didit-Netzwerkmitglied besitzt diese ID. Ihr eigenes VASP-Profil ist niemals eine Gegenpartei von Ihnen.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string"
                    }
                  }
                },
                "example": {
                  "detail": "No directory entry or Didit network member has this id."
                }
              }
            }
          }
        }
      },
      "delete": {
        "summary": "Ihre Entscheidung zu einem VASP zurücksetzen",
        "description": "Entfernen Sie die eigene Entscheidung Ihrer Anwendung zu einer Gegenpartei. Die Antwort zeigt die danach geltende Entscheidung: null oder für eine Einheit einer Marke die Entscheidung der Marke, der die Einheit wieder folgt.",
        "operationId": "clearTravelRuleVaspDecision",
        "x-didit-sdk": {
          "resource": "travel_rule",
          "method": "clear_vasp_decision",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Travel Rule"
        ],
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "parameters": [
          {
            "name": "vasp_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Die ID einer Zeile aus der Antwort von GET /v3/travel-rule/vasps/: ein Verzeichniseintrag oder ein Mitglied des Didit-Netzwerks."
          }
        ],
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X DELETE https://verification.didit.me/v3/travel-rule/vasps/{vasp_id}/decision/ \\\n  -H 'x-api-key: YOUR_API_KEY'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.travel_rule.clear_vasp_decision(\n    \"11111111-2222-3333-4444-555555555555\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.travelRule.clearVaspDecision(\"11111111-2222-3333-4444-555555555555\");\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.TravelRule.ClearVASPDecision(ctx, \"11111111-2222-3333-4444-555555555555\")\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.travelRule().clearVaspDecision(\"11111111-2222-3333-4444-555555555555\");\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->travelRule->clearVaspDecision('11111111-2222-3333-4444-555555555555');\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.travel_rule.clear_vasp_decision(\"11111111-2222-3333-4444-555555555555\")\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.TravelRule.ClearVaspDecisionAsync(\"11111111-2222-3333-4444-555555555555\");\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "responses": {
          "200": {
            "description": "Die Entscheidung wurde gelöscht; der Body zeigt die jetzt gültige Entscheidung.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TravelRuleCounterpartyDecisionResponse"
                },
                "example": {
                  "decision": null
                }
              }
            }
          },
          "404": {
            "description": "Keine Gegenpartei besitzt diese ID, oder Ihre Anwendung hat keine eigene Entscheidung dazu getroffen (eine Entscheidung, die sie lediglich von ihrer Marke erbt, kann hier nicht zurückgesetzt werden: Setzen Sie die der Marke zurück).",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string"
                    }
                  }
                },
                "examples": {
                  "Unknown id": {
                    "value": {
                      "detail": "No directory entry or Didit network member has this id."
                    }
                  },
                  "No decision of its own": {
                    "value": {
                      "detail": "This application has no decision of its own on this counterparty."
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/v3/travel-rule/vasps/{vasp_id}/screening/": {
      "get": {
        "summary": "Entitätsprüfung eines VASPs abrufen",
        "description": "Gibt an, ob das Screening von Gegenparteien für Ihre Anwendung aktiviert ist, was ein Screening Ihre Organisation kostet, wie lange ein Ergebnis aktuell bleibt, sowie Ihr letztes Screening der Gegenpartei auf Sanktionen und negative Medienberichte. Das Abrufen ist kostenlos.",
        "operationId": "getTravelRuleVaspScreening",
        "x-didit-sdk": {
          "resource": "travel_rule",
          "method": "retrieve_vasp_screening",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Travel Rule"
        ],
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "parameters": [
          {
            "name": "vasp_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Die ID einer Zeile aus der Antwort von GET /v3/travel-rule/vasps/: ein Verzeichniseintrag oder ein Mitglied des Didit-Netzwerks."
          }
        ],
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X GET https://verification.didit.me/v3/travel-rule/vasps/{vasp_id}/screening/ \\\n  -H 'x-api-key: YOUR_API_KEY'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.travel_rule.retrieve_vasp_screening(\n    \"11111111-2222-3333-4444-555555555555\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.travelRule.retrieveVaspScreening(\"11111111-2222-3333-4444-555555555555\");\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.TravelRule.RetrieveVASPScreening(ctx, \"11111111-2222-3333-4444-555555555555\")\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.travelRule().retrieveVaspScreening(\"11111111-2222-3333-4444-555555555555\");\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->travelRule->retrieveVaspScreening('11111111-2222-3333-4444-555555555555');\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.travel_rule.retrieve_vasp_screening(\"11111111-2222-3333-4444-555555555555\")\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.TravelRule.RetrieveVaspScreeningAsync(\"11111111-2222-3333-4444-555555555555\");\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "responses": {
          "200": {
            "description": "Ihre Screening-Einstellung, deren Preis und Ihr aktuellstes Screening.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TravelRuleCounterpartyScreeningStatus"
                },
                "example": {
                  "enabled": true,
                  "price": "0.20",
                  "fresh_days": 30,
                  "screening": {
                    "id": "7a1d2c3b-4e5f-4a6b-8c7d-9e0f1a2b3c4d",
                    "status": "Approved",
                    "total_hits": 0,
                    "score": null,
                    "screened_at": "2026-10-14T09:58:00Z",
                    "fresh": true,
                    "flagged": false
                  }
                }
              }
            }
          },
          "403": {
            "description": "Im Vertrag Ihrer Organisation ist kein Tarif für das Screening von Gegenparteien konfiguriert.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string"
                    }
                  }
                },
                "example": {
                  "detail": "No contract rate is configured for this usage type."
                }
              }
            }
          },
          "404": {
            "description": "Kein Verzeichniseintrag und kein gelistetes Didit-Netzwerkmitglied besitzt diese ID. Ihr eigenes VASP-Profil ist niemals eine Gegenpartei von Ihnen.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string"
                    }
                  }
                },
                "example": {
                  "detail": "No directory entry or Didit network member has this id."
                }
              }
            }
          }
        }
      },
      "post": {
        "summary": "Einen VASP screenen",
        "description": "Überprüfen Sie die Gegenpartei-Entität für Ihre Anwendung auf Sanktionen und negative Medienberichte. Opt-in: counterparty_screening_enabled muss in Ihren Travel Rule-Einstellungen aktiviert sein. Jedes neue Screening wird zum Preis für das AML-Screening von Unternehmen Ihrer Organisation abgerechnet; stattdessen wird ein Screening zurückgegeben, das jünger als 30 Tage ist (200, nicht abgerechnet), es sei denn, Sie senden refresh: true. Pro Anwendung wird jeweils nur ein Screening einer Gegenpartei ausgeführt. Das Ergebnis ist für Ihre Anwendung privat. Sandbox-Anwendungen werden niemals überprüft.",
        "operationId": "screenTravelRuleVasp",
        "x-didit-sdk": {
          "resource": "travel_rule",
          "method": "screen_vasp",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Travel Rule"
        ],
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "parameters": [
          {
            "name": "vasp_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Die ID einer Zeile aus der Antwort von GET /v3/travel-rule/vasps/: ein Verzeichniseintrag oder ein Mitglied des Didit-Netzwerks."
          }
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TravelRuleCounterpartyScreeningRequest"
              },
              "example": {
                "refresh": false
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X POST https://verification.didit.me/v3/travel-rule/vasps/{vasp_id}/screening/ \\\n  -H 'x-api-key: YOUR_API_KEY' -H 'Content-Type: application/json' \\\n  -d '{\"refresh\": false}'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.travel_rule.screen_vasp(\n    \"11111111-2222-3333-4444-555555555555\",\n    refresh=False,\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.travelRule.screenVasp(\"11111111-2222-3333-4444-555555555555\", {\n  refresh: false,\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.TravelRule.ScreenVASP(ctx, \"11111111-2222-3333-4444-555555555555\", didit.TravelRuleCounterpartyScreeningRequest{\n\tRefresh: didit.Bool(false),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\nimport me.didit.types.TravelRuleCounterpartyScreeningRequest;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.travelRule().screenVasp(\"11111111-2222-3333-4444-555555555555\", TravelRuleCounterpartyScreeningRequest.builder()\n        .refresh(false)\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->travelRule->screenVasp('11111111-2222-3333-4444-555555555555', [\n    'refresh' => false,\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.travel_rule.screen_vasp(\n  \"11111111-2222-3333-4444-555555555555\",\n  refresh: false\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.TravelRule.ScreenVaspAsync(\"11111111-2222-3333-4444-555555555555\", new TravelRuleCounterpartyScreeningRequest\n{\n    Refresh = false,\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "responses": {
          "200": {
            "description": "Ein aktuelles Screening existierte bereits und wurde zurückgegeben. Es wurde nichts in Rechnung gestellt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TravelRuleCounterpartyScreeningResult"
                },
                "example": {
                  "outcome": "reused",
                  "screening": {
                    "id": "7a1d2c3b-4e5f-4a6b-8c7d-9e0f1a2b3c4d",
                    "status": "Approved",
                    "total_hits": 0,
                    "score": null,
                    "screened_at": "2026-10-14T09:58:00Z",
                    "fresh": true,
                    "flagged": false
                  }
                }
              }
            }
          },
          "201": {
            "description": "Ein neues Screening wurde durchgeführt und in Rechnung gestellt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TravelRuleCounterpartyScreeningResult"
                },
                "example": {
                  "outcome": "screened",
                  "screening": {
                    "id": "7a1d2c3b-4e5f-4a6b-8c7d-9e0f1a2b3c4d",
                    "status": "In Review",
                    "total_hits": 2,
                    "score": 85.0,
                    "screened_at": "2026-10-14T09:58:00Z",
                    "fresh": true,
                    "flagged": true
                  }
                }
              }
            }
          },
          "400": {
            "description": "Der Body ist ungültig oder die Gegenpartei hat keinen Namen für das Screening.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    }
                  }
                },
                "example": {
                  "detail": [
                    "This counterparty has no name to screen."
                  ]
                }
              }
            }
          },
          "403": {
            "description": "Das Guthaben Ihrer Organisation reicht für das Screening nicht aus (Code insufficient_credits; es wurde nichts ausgeführt und nichts abgerechnet), oder für Ihren Vertrag ist kein Tarif dafür konfiguriert.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string"
                    },
                    "code": {
                      "type": "string"
                    }
                  }
                },
                "example": {
                  "detail": "You don't have enough credits to perform this request. Please top up at https://business.didit.me",
                  "code": "insufficient_credits"
                }
              }
            }
          },
          "404": {
            "description": "Kein Verzeichniseintrag und kein gelistetes Didit-Netzwerkmitglied besitzt diese ID. Ihr eigenes VASP-Profil ist niemals eine Gegenpartei von Ihnen.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string"
                    }
                  }
                },
                "example": {
                  "detail": "No directory entry or Didit network member has this id."
                }
              }
            }
          },
          "409": {
            "description": "Es wurde nichts ausgeführt und nichts abgerechnet: Das Gegenpartei-Screening ist für Ihre Anwendung deaktiviert, die Anwendung ist eine Sandbox-Anwendung oder ein Screening dieser Gegenpartei wird bereits ausgeführt.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string"
                    }
                  }
                },
                "examples": {
                  "Screening off": {
                    "value": {
                      "detail": "Counterparty screening is turned off. Enable it in the Travel Rule settings first."
                    }
                  },
                  "Sandbox application": {
                    "value": {
                      "detail": "Counterparty screening does not run for sandbox applications."
                    }
                  },
                  "Already running": {
                    "value": {
                      "detail": "A screening of this counterparty is already running. Try again in a moment."
                    }
                  }
                }
              }
            }
          },
          "502": {
            "description": "Das Screening konnte nicht abgeschlossen werden. Es wurde nichts in Rechnung gestellt; versuchen Sie es gleich noch einmal.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string"
                    }
                  }
                },
                "example": {
                  "detail": "The screening provider did not answer. Try again in a moment."
                }
              }
            }
          }
        }
      }
    },
    "/v3/travel-rule/vasps/{vasp_id}/questionnaires/": {
      "get": {
        "summary": "Sorgfaltspflicht-Fragebögen mit einem VASP auflisten",
        "description": "Jeder Due-Diligence-Fragebogen, den Ihre Anwendung an die Gegenpartei gesendet hat, der neueste zuerst, mit seinem Status und, sobald beantwortet, den Antworten. Nur für Ihre Anwendung sichtbar.",
        "operationId": "listTravelRuleVaspQuestionnaires",
        "x-didit-sdk": {
          "resource": "travel_rule",
          "method": "list_vasp_questionnaires",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Travel Rule"
        ],
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "parameters": [
          {
            "name": "vasp_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Die ID einer Zeile aus der Antwort von GET /v3/travel-rule/vasps/: ein Verzeichniseintrag oder ein Mitglied des Didit-Netzwerks."
          }
        ],
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X GET https://verification.didit.me/v3/travel-rule/vasps/{vasp_id}/questionnaires/ \\\n  -H 'x-api-key: YOUR_API_KEY'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.travel_rule.list_vasp_questionnaires(\n    \"11111111-2222-3333-4444-555555555555\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.travelRule.listVaspQuestionnaires(\"11111111-2222-3333-4444-555555555555\");\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.TravelRule.ListVASPQuestionnaires(ctx, \"11111111-2222-3333-4444-555555555555\")\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.travelRule().listVaspQuestionnaires(\"11111111-2222-3333-4444-555555555555\");\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->travelRule->listVaspQuestionnaires('11111111-2222-3333-4444-555555555555');\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.travel_rule.list_vasp_questionnaires(\"11111111-2222-3333-4444-555555555555\")\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.TravelRule.ListVaspQuestionnairesAsync(\"11111111-2222-3333-4444-555555555555\");\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "responses": {
          "200": {
            "description": "Ihre Fragebögen mit dieser Gegenpartei.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TravelRuleCounterpartyQuestionnaireList"
                },
                "example": {
                  "questionnaires": [
                    {
                      "id": "3f9e8d7c-6b5a-4c3d-9e2f-1a0b9c8d7e6f",
                      "status": "SENT",
                      "form_version": "1",
                      "sent_to": "travelrule@counterparty.example",
                      "sent_at": "2026-10-14T10:00:00Z",
                      "expires_at": "2026-11-13T10:00:00Z",
                      "answered_at": null,
                      "valid_until": null,
                      "current": false,
                      "answers": {}
                    },
                    {
                      "id": "8b7a6c5d-4e3f-4a2b-9c1d-0e9f8a7b6c5d",
                      "status": "ANSWERED",
                      "form_version": "1",
                      "sent_to": "travelrule@counterparty.example",
                      "sent_at": "2026-09-02T08:00:00Z",
                      "expires_at": "2026-10-02T08:00:00Z",
                      "answered_at": "2026-09-04T15:20:00Z",
                      "valid_until": "2027-09-04T15:20:00Z",
                      "current": true,
                      "answers": {
                        "legal_name": "Example Counterparty VASP, incorporated in the example jurisdiction.",
                        "licensing": "Crypto-asset service provider authorised under MiCA by its national regulator, licence active.",
                        "jurisdictions": "EU and EEA. We do not serve the United States.",
                        "aml_program": "Written AML/CFT policy, annual independent review, last completed in March 2026.",
                        "compliance_officer": "Head of Compliance, reachable at compliance@counterparty.example.",
                        "sanctions_screening": "Customers at onboarding and daily; counterparties on every transfer.",
                        "transaction_monitoring": "Rule-based monitoring with analyst review; suspicious activity reports filed with the FIU.",
                        "travel_rule": "TRP and email; we answer requests within one business day.",
                        "custody": "Segregated customer wallets held with a qualified custodian, insured.",
                        "ownership": "No shareholder holds 25 percent or more; parent company Example Holding Group.",
                        "record_keeping": "Five-year record-keeping for Travel Rule and transaction data, as our regulator requires.",
                        "data_protection": "Encrypted at rest and in transit, stored in the EU."
                      }
                    }
                  ]
                }
              }
            }
          },
          "404": {
            "description": "Kein Verzeichniseintrag und kein gelistetes Didit-Netzwerkmitglied besitzt diese ID. Ihr eigenes VASP-Profil ist niemals eine Gegenpartei von Ihnen.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string"
                    }
                  }
                },
                "example": {
                  "detail": "No directory entry or Didit network member has this id."
                }
              }
            }
          }
        }
      },
      "post": {
        "summary": "Due-Diligence-Fragebogen an einen VASP senden",
        "description": "Didits Standard-Due-Diligence-Fragebogen per E-Mail an eine hinterlegte Compliance-Adresse der Gegenpartei mit einem Antwortlink zur einmaligen Verwendung senden. Die Gegenpartei hat 30 Tage Zeit, jede Frage zu beantworten; die Antworten bleiben 365 Tage lang gültig. Ein erneutes Senden ersetzt Ihren früheren unbeantworteten Fragebogen an dieselbe Gegenpartei, dessen Link ungültig wird. Eine E-Mail pro Minute pro Adresse.",
        "operationId": "sendTravelRuleVaspQuestionnaire",
        "x-didit-sdk": {
          "resource": "travel_rule",
          "method": "send_vasp_questionnaire",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Travel Rule"
        ],
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "parameters": [
          {
            "name": "vasp_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Die ID einer Zeile aus der Antwort von GET /v3/travel-rule/vasps/: ein Verzeichniseintrag oder ein Mitglied des Didit-Netzwerks."
          }
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TravelRuleCounterpartyQuestionnaireRequest"
              },
              "example": {
                "sent_to": "travelrule@counterparty.example"
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X POST https://verification.didit.me/v3/travel-rule/vasps/{vasp_id}/questionnaires/ \\\n  -H 'x-api-key: YOUR_API_KEY' -H 'Content-Type: application/json' \\\n  -d '{\"sent_to\": \"travelrule@counterparty.example\"}'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.travel_rule.send_vasp_questionnaire(\n    \"11111111-2222-3333-4444-555555555555\",\n    sent_to=\"travelrule@counterparty.example\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.travelRule.sendVaspQuestionnaire(\"11111111-2222-3333-4444-555555555555\", {\n  sent_to: \"travelrule@counterparty.example\",\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.TravelRule.SendVASPQuestionnaire(ctx, \"11111111-2222-3333-4444-555555555555\", didit.TravelRuleCounterpartyQuestionnaireRequest{\n\tSentTo: didit.String(\"travelrule@counterparty.example\"),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\nimport me.didit.types.TravelRuleCounterpartyQuestionnaireRequest;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.travelRule().sendVaspQuestionnaire(\"11111111-2222-3333-4444-555555555555\", TravelRuleCounterpartyQuestionnaireRequest.builder()\n        .sentTo(\"travelrule@counterparty.example\")\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->travelRule->sendVaspQuestionnaire('11111111-2222-3333-4444-555555555555', [\n    'sent_to' => 'travelrule@counterparty.example',\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.travel_rule.send_vasp_questionnaire(\n  \"11111111-2222-3333-4444-555555555555\",\n  sent_to: \"travelrule@counterparty.example\"\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.TravelRule.SendVaspQuestionnaireAsync(\"11111111-2222-3333-4444-555555555555\", new TravelRuleCounterpartyQuestionnaireRequest\n{\n    SentTo = \"travelrule@counterparty.example\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "responses": {
          "202": {
            "description": "Der Fragebogen wurde per E-Mail versendet.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TravelRuleCounterpartyQuestionnaire"
                },
                "example": {
                  "id": "3f9e8d7c-6b5a-4c3d-9e2f-1a0b9c8d7e6f",
                  "status": "SENT",
                  "form_version": "1",
                  "sent_to": "travelrule@counterparty.example",
                  "sent_at": "2026-10-14T10:00:00Z",
                  "expires_at": "2026-11-13T10:00:00Z",
                  "answered_at": null,
                  "valid_until": null,
                  "current": false,
                  "answers": {}
                }
              }
            }
          },
          "400": {
            "description": "sent_to ist keine gültige E-Mail-Adresse oder keine hinterlegte Compliance-Adresse der Gegenpartei, oder für die Gegenpartei ist keine Compliance-Adresse hinterlegt.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    }
                  }
                },
                "examples": {
                  "Not on record": {
                    "value": {
                      "sent_to": [
                        "Send the questionnaire to a compliance address on record for this counterparty."
                      ]
                    }
                  },
                  "No address": {
                    "value": {
                      "sent_to": [
                        "No compliance address is on record for this counterparty. Add a contact for it first."
                      ]
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Kein Verzeichniseintrag und kein gelistetes Didit-Netzwerkmitglied besitzt diese ID. Ihr eigenes VASP-Profil ist niemals eine Gegenpartei von Ihnen.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string"
                    }
                  }
                },
                "example": {
                  "detail": "No directory entry or Didit network member has this id."
                }
              }
            }
          },
          "429": {
            "description": "Ein Fragebogen wurde vor weniger als einer Minute an diese Adresse gesendet."
          },
          "503": {
            "description": "Die E-Mail konnte nicht gesendet werden und es wurde kein Fragebogen erstellt. Versuchen Sie es gleich noch einmal."
          }
        }
      }
    },
    "/v3/transactions/{transaction_id}/travel-rule/": {
      "patch": {
        "summary": "Auftraggeber-Wallet eines Travel-Rule-Transfers abschließen, abbrechen, erneut senden oder aktualisieren",
        "description": "Geben Sie `payment_txn_id` an, um den On-Chain-Hash zu melden und einen ausgehenden COMPLETED-Transfer auf FINISHED zu setzen (sein Gegenstück auf der INTERNAL-Schiene wird ebenfalls auf FINISHED gesetzt), `{\"action\": \"cancel\"}`, um einen nicht-terminalen Transfer abzubrechen, oder `{\"action\": \"resend\"}` zu verwenden, um einen ausgehenden Transfer, der in COUNTERPARTY_VASP_NOT_FOUND, COUNTERPARTY_VASP_NOT_REACHABLE oder NOT_ENOUGH_COUNTERPARTY_DATA feststeckt, erneut weiterzuleiten (verbessern Sie zuerst die Daten der Gegenpartei, z. B. durch Hinzufügen einer travel_address zum Eintrag der Ziel-Wallet). resend gilt nur für ausgehende Transfers. `{\"action\": \"update_compliance_email\", \"compliance_email\": \"desk@example.com\"}` ersetzt die Compliance-E-Mail eines ausgehenden Transfers in einem dieser drei Status, die Behebung des Problems `reason: email_undeliverable`: Der Status ändert sich nicht, und das nächste `resend` sendet die Anfrage an diese Adresse. Ein erneutes Senden wird in eine Warteschlange eingereiht und nicht innerhalb der Anfrage ausgeführt: Die Antwort zeigt den Transfer wieder in AWAITING_COUNTERPARTY mit einem Timeline-Eintrag `resend queued` und einer eingereihten `delivery`, und wohin der Transfer geleitet wurde, wird als Webhook-Ereignis `travel_rule.status.updated` übermittelt. Wenn der Transfer über GTR, VerifyVASP oder Sygna Bridge lief, erfährt das Netzwerk den On-Chain-Hash oder den Abbruch nach der Antwort mit Wiederholungsversuchen; `delivery` zeigt den Status dieser Nachricht an. `{\"action\": \"update_originator_wallet\", \"wallet_address\": \"...\"}` erfasst die Wallet, von der das Guthaben bei einem ausgehenden Transfer tatsächlich abging, beispielsweise die Adresse, von der eine UTXO-Auszahlung gesendet wurde, anstelle der von Ihnen deklarierten Haupt-Wallet. Dadurch wird nur der Datensatz geändert: Es wird nichts erneut an die Gegenpartei gesendet und der Status bleibt erhalten. Der Auftraggeber wird zu `chain_details.originator` mit `source: updated`, die Änderung wird mit der vorherigen und der neuen Wallet zur `timeline` hinzugefügt, und das Gegenstück des Transfers auf der INTERNAL-Schiene wird auf die gleiche Weise aktualisiert. `{\"action\": \"beneficiary_vasp\", \"beneficiary_vasp\": \"<directory VASP id>\"}` benennt die Gegenpartei selbst, wenn die Ermittlung fehlgeschlagen ist, bei einem ausgehenden Transfer in COUNTERPARTY_VASP_NOT_FOUND, COUNTERPARTY_VASP_NOT_REACHABLE oder NOT_ENOUGH_COUNTERPARTY_DATA: Der Transfer wird an diesen VASP weitergeleitet und erneut gesendet.",
        "operationId": "patchTravelRuleTransfer",
        "x-didit-sdk": {
          "resource": "transactions.travel_rule",
          "method": "update_transfer",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Travel Rule"
        ],
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "parameters": [
          {
            "name": "transaction_id",
            "in": "path",
            "required": true,
            "description": "Stabile Transaktions-UUID von Didit, zu der der Transfer gehört.",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TravelRuleTransferPatchRequest"
              },
              "examples": {
                "Finish": {
                  "value": {
                    "payment_txn_id": "0xchainhash"
                  }
                },
                "Cancel": {
                  "value": {
                    "action": "cancel"
                  }
                },
                "Resend": {
                  "value": {
                    "action": "resend"
                  }
                },
                "Update compliance email": {
                  "value": {
                    "action": "update_compliance_email",
                    "compliance_email": "desk@example.com"
                  }
                },
                "Update originator wallet": {
                  "value": {
                    "action": "update_originator_wallet",
                    "wallet_address": "bc1qOriginatorInputAddress01"
                  }
                },
                "Name the counterparty": {
                  "value": {
                    "action": "beneficiary_vasp",
                    "beneficiary_vasp": "9f1c2b34-5d6e-4f70-8a91-b2c3d4e5f607"
                  }
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X PATCH https://verification.didit.me/v3/transactions/{transaction_id}/travel-rule/ \\\n  -H 'x-api-key: YOUR_API_KEY' -H 'Content-Type: application/json' \\\n  -d '{\"payment_txn_id\": \"0xchainhash\"}'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.transactions.travel_rule.update_transfer(\n    \"11111111-2222-3333-4444-555555555555\",\n    payment_txn_id=\"0xchainhash\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.transactions.travelRule.updateTransfer(\"11111111-2222-3333-4444-555555555555\", {\n  payment_txn_id: \"0xchainhash\",\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Transactions.TravelRule.UpdateTransfer(ctx, \"11111111-2222-3333-4444-555555555555\", didit.TravelRuleTransferPatchRequest{\n\tPaymentTxnID: didit.String(\"0xchainhash\"),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\nimport me.didit.types.TravelRuleTransferPatchRequest;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.transactions().travelRule().updateTransfer(\"11111111-2222-3333-4444-555555555555\", TravelRuleTransferPatchRequest.builder()\n        .paymentTxnId(\"0xchainhash\")\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->transactions->travelRule->updateTransfer('11111111-2222-3333-4444-555555555555', [\n    'payment_txn_id' => '0xchainhash',\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.transactions.travel_rule.update_transfer(\n  \"11111111-2222-3333-4444-555555555555\",\n  payment_txn_id: \"0xchainhash\"\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Transactions.TravelRule.UpdateTransferAsync(\"11111111-2222-3333-4444-555555555555\", new TravelRuleTransferPatchRequest\n{\n    PaymentTxnId = \"0xchainhash\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "responses": {
          "200": {
            "description": "Der aktualisierte Transfer. Nach `update_compliance_email` bleibt sein Status unverändert und er behält `reason: email_undeliverable` bis zum nächsten `resend` bei.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TravelRuleTransferDetail"
                }
              }
            }
          },
          "400": {
            "description": "Weder payment_txn_id noch eine unterstützte Aktion wurde angegeben, `compliance_email` fehlt oder ist bei `update_compliance_email` keine E-Mail-Adresse, oder, bei `update_originator_wallet`, keine wallet_address, eine Wallet oder ein Memo, die bzw. das die Blockchain des Transfers nicht übertragen kann, oder eine Wallet, die nicht zu den UTXO-Inputs des Transfers gehört, oder `beneficiary_vasp` fehlt oder ist keine gültige Verzeichnis-VASP-ID.",
            "content": {
              "application/json": {
                "examples": {
                  "No action": {
                    "value": {
                      "detail": [
                        "Provide payment_txn_id, action=cancel, action=resend, action=beneficiary_vasp, action=update_originator_wallet or action=update_compliance_email."
                      ]
                    }
                  },
                  "Invalid compliance email": {
                    "value": {
                      "compliance_email": [
                        "Enter a valid email address."
                      ]
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Unbekannte Transaktion, die Transaktion weist keinen Travel-Rule-Transfer auf oder (bei der Aktion `beneficiary_vasp`) es ist kein Verzeichniseintrag mit dieser ID vorhanden."
          },
          "409": {
            "description": "Der Transfer befindet sich nicht in einem Status, der diesen Vorgang erlaubt (z. B. nicht COMPLETED/ausgehend für finish, bereits endgültig für cancel oder kein ausgehender Transfer in einem erneut sendbaren Status für resend). `update_compliance_email` antwortet mit `409` bei einem eingehenden Transfer sowie bei einem ausgehenden Transfer außerhalb von COUNTERPARTY_VASP_NOT_FOUND, COUNTERPARTY_VASP_NOT_REACHABLE und NOT_ENOUGH_COUNTERPARTY_DATA. `update_originator_wallet` antwortet mit `409` bei einem eingehenden, abgebrochenen oder abgelaufenen Transfer. `beneficiary_vasp` antwortet mit `409`, es sei denn, der Transfer ist ausgehend und befindet sich in COUNTERPARTY_VASP_NOT_FOUND, COUNTERPARTY_VASP_NOT_REACHABLE oder NOT_ENOUGH_COUNTERPARTY_DATA.",
            "content": {
              "application/json": {
                "examples": {
                  "Cancel from a terminal status": {
                    "value": {
                      "detail": "Transfer is already in a terminal state."
                    }
                  },
                  "Resend not allowed": {
                    "value": {
                      "detail": "Transfer cannot be resent from its current state."
                    }
                  },
                  "Finish not allowed": {
                    "value": {
                      "detail": "Transfer must be an outbound transfer in COMPLETED status to finish."
                    }
                  },
                  "Compliance email cannot change": {
                    "value": {
                      "detail": "The compliance email of this transfer cannot change from its current state."
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/v3/transactions/{transaction_id}/travel-rule/ownership/": {
      "post": {
        "summary": "Wallet-Inhaberschaft bestätigen oder ablehnen",
        "description": "Lösen Sie einen Transfer auf, der auf die Wallet-Inhaberschaft wartet: Rufen Sie ihn auf Ihrer eigenen Seite des Transfers auf, wenn er UNCONFIRMED_OWNERSHIP ist oder wenn es sich um einen eingehenden Transfer in ON_HOLD handelt. Das Bestätigen markiert den passenden Eintrag im Wallet-Adressbuch als hinsichtlich der Wallet-Inhaberschaft verifiziert (für einen eingehenden ON_HOLD-Transfer ohne Eintrag erstellt Didit einen aus beneficiary_data.wallet_address) und führt den Namensabgleich des Begünstigten auf beiden Seiten des Transfers aus; eine Ablehnung lehnt beide Seiten ab. Ein eingehender Transfer, dessen Einzahlung bereits abgewickelt wurde, wechselt zu FINISHED, wenn der Abgleich erfolgreich ist. Wenn die Gegenpartei-Wallet als selbstverwahrte Wallet deklariert wurde (counterparty.payment_method.method_type: unhosted_wallet), erfasst das Bestätigen, dass der Kunde verifiziert hat, wer diese Wallet kontrolliert, und schließt den Transfer in beiden Richtungen ab (COMPLETED) oder setzt ihn auf FINISHED für eine eingehende Einzahlung, deren On-Chain-Hash bereits bekannt ist. Die verifizierte Wallet ist die der Gegenpartei: das Ziel einer ausgehenden Abhebung oder die Quelle (Wallet des Auftraggebers) einer eingehenden Einzahlung. Befindet sie sich noch nicht in Ihrem Wallet-Adressbuch, fügt Didit sie als hinsichtlich der Wallet-Inhaberschaft verifiziert unter dem Namen der Gegenpartei hinzu; enthält das Adressbuch sie bereits unter einem anderen Inhabernamen, wechselt der Transfer zu COUNTERPARTY_MISMATCHED_DATA. Bei einem eingehenden TRP-Transfer in UNCONFIRMED_OWNERSHIP, ON_HOLD oder COUNTERPARTY_MISMATCHED_DATA sendet Didit stattdessen Ihre Entscheidung an den auftraggebenden VASP: Eine Genehmigung gibt die Zahlungsadresse zurück (wallet_address oder die Adresse des übereinstimmenden Eintrags) und setzt den Transfer auf COMPLETED; eine Ablehnung lehnt ihn ab. Derselbe Aufruf entscheidet auch über einen eingehenden Transfer, den eine GTR- oder Sygna-Bridge-Gegenpartei gesendet hat und der auf Ihre Überprüfung wartet (`UNCONFIRMED_OWNERSHIP`, `ON_HOLD` oder `COUNTERPARTY_MISMATCHED_DATA`): `confirmed: true` genehmigt ihn (übergeben Sie `wallet_address`, wenn der Transfer keine angibt) und `confirmed: false` lehnt ihn ab; dem Netzwerk wird nach der Antwort mit Wiederholungsversuchen geantwortet. VerifyVASP nimmt seine Antwort direkt bei der Anfrage entgegen, sodass ein VerifyVASP-Transfer, der Ihre Prüfung erfordern würde, sofort abgelehnt wird und nicht später entschieden werden kann.",
        "operationId": "confirmTravelRuleOwnership",
        "x-didit-sdk": {
          "resource": "transactions.travel_rule",
          "method": "confirm_ownership",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Travel Rule"
        ],
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "parameters": [
          {
            "name": "transaction_id",
            "in": "path",
            "required": true,
            "description": "Stabile UUID von Didit der Transaktion, die Ihre Anwendung für diesen Transfer hält: die Transaktion der Begünstigtenseite bei einem Transfer über die Schiene INTERNAL oder die von Ihnen erstellte Transaktion (ausgehend oder eingehend), wenn die Wallet der Gegenpartei als selbstverwahrt deklariert wurde.",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TravelRuleOwnershipConfirmRequest"
              },
              "example": {
                "confirmed": true
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X POST https://verification.didit.me/v3/transactions/{transaction_id}/travel-rule/ownership/ \\\n  -H 'x-api-key: YOUR_API_KEY' -H 'Content-Type: application/json' \\\n  -d '{\"confirmed\": true}'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.transactions.travel_rule.confirm_ownership(\n    \"11111111-2222-3333-4444-555555555555\",\n    confirmed=True,\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.transactions.travelRule.confirmOwnership(\"11111111-2222-3333-4444-555555555555\", {\n  confirmed: true,\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Transactions.TravelRule.ConfirmOwnership(ctx, \"11111111-2222-3333-4444-555555555555\", didit.TravelRuleOwnershipConfirmRequest{\n\tConfirmed: true,\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\nimport me.didit.types.TravelRuleOwnershipConfirmRequest;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.transactions().travelRule().confirmOwnership(\"11111111-2222-3333-4444-555555555555\", TravelRuleOwnershipConfirmRequest.builder()\n        .confirmed(true)\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->transactions->travelRule->confirmOwnership('11111111-2222-3333-4444-555555555555', [\n    'confirmed' => true,\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.transactions.travel_rule.confirm_ownership(\n  \"11111111-2222-3333-4444-555555555555\",\n  confirmed: true\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Transactions.TravelRule.ConfirmOwnershipAsync(\"11111111-2222-3333-4444-555555555555\", new TravelRuleOwnershipConfirmRequest\n{\n    Confirmed = true,\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "responses": {
          "200": {
            "description": "Der aktualisierte Transfer. Bei einem eingehenden Transfer bleiben die originator_data/beneficiary_data der Gegenpartei maskiert (`data_masked: true`), bis die Eigentümerstruktur bestätigt ist; danach zeichnet `data_unmasked` auf, wann, warum und durch wen dies geschah.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TravelRuleTransferDetail"
                }
              }
            }
          },
          "409": {
            "description": "Der Transfer wartet nicht auf die Eigentumsbestätigung, kein Eintrag im Wallet-Adressbuch stimmt mit der Wallet der Gegenpartei überein, ein INTERNAL-Transfer von einem anderen Didit-Kunden erfordert einen Kontrollnachweis (eine signierte Nachricht oder eine Testeinzahlung), bevor er bestätigt werden kann, oder ein Netzwerk-Transfer wurde bereits über sein Netzwerk beantwortet (ein VerifyVASP-Transfer oder ein GTR- oder Sygna-Bridge-Transfer, über den Sie oder Didit bereits entschieden haben).",
            "content": {
              "application/json": {
                "examples": {
                  "Not awaiting confirmation": {
                    "value": {
                      "detail": "Transfer is not awaiting ownership confirmation."
                    }
                  },
                  "No matching address book entry": {
                    "value": {
                      "detail": "wallet address entry no longer available"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Validierungsfehler: confirmed fehlt, eine eingehende TRP-Genehmigung hat keine wallet_address und keine Adresse als Fallback, oder `confirmed: true` bei einem deklarierten Transfer zu einer selbstverwahrten Wallet, der keine Gegenpartei-Wallet benennt und bei dem keine `wallet_address` übermittelt wurde.",
            "content": {
              "application/json": {
                "examples": {
                  "No payment address": {
                    "value": {
                      "wallet_address": [
                        "wallet_address is required to approve."
                      ]
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Unbekannte Transaktion oder die Transaktion weist keinen Travel-Rule-Transfer auf."
          },
          "502": {
            "description": "Nur bei eingehenden TRP-Transfers: Didit konnte Ihre Entscheidung nicht an das auftraggebende VASP übermitteln, sodass sich der Transferstatus nicht ändert.",
            "content": {
              "application/json": {
                "examples": {
                  "Callback not delivered": {
                    "value": {
                      "detail": "Counterparty inquiry-resolution callback could not be delivered."
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/v3/transactions/{transaction_id}/travel-rule/messages/": {
      "get": {
        "summary": "Travel Rule-Nachrichten auflisten",
        "description": "Nachrichten und Dokumentanfragen, die mit dem VASP der Gegenpartei zu dieser Übertragung ausgetauscht wurden.",
        "operationId": "listTravelRuleMessages",
        "x-didit-sdk": {
          "resource": "transactions.travel_rule",
          "method": "list_messages",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Travel Rule"
        ],
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "parameters": [
          {
            "name": "transaction_id",
            "in": "path",
            "required": true,
            "description": "Stabile Transaktions-UUID von Didit, zu der der Transfer gehört.",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X GET https://verification.didit.me/v3/transactions/{transaction_id}/travel-rule/messages/ \\\n  -H 'x-api-key: YOUR_API_KEY'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.transactions.travel_rule.list_messages(\n    \"11111111-2222-3333-4444-555555555555\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.transactions.travelRule.listMessages(\"11111111-2222-3333-4444-555555555555\");\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Transactions.TravelRule.ListMessages(ctx, \"11111111-2222-3333-4444-555555555555\")\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.transactions().travelRule().listMessages(\"11111111-2222-3333-4444-555555555555\");\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->transactions->travelRule->listMessages('11111111-2222-3333-4444-555555555555');\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\ndidit.transactions.travel_rule.list_messages(\"11111111-2222-3333-4444-555555555555\").each do |item|\n  puts item.to_h\nend"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Transactions.TravelRule.ListMessagesAsync(\"11111111-2222-3333-4444-555555555555\");\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "responses": {
          "200": {
            "description": "Die Nachrichten, älteste zuerst.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/TravelRuleMessage"
                  }
                }
              }
            }
          },
          "404": {
            "description": "Unbekannte Transaktion oder unbekanntes Token, oder kein Travel-Rule-Transfer für die Transaktion vorhanden."
          }
        }
      },
      "post": {
        "summary": "Travel-Rule-Nachricht oder Dokumentenanforderung senden",
        "description": "Sendet eine Nachricht oder eine Dokumentenanforderung an den Gegenpartei-VASP. Funktioniert bei INTERNAL-Transfers (der andere Didit-Kunde sieht sie auf seiner Seite des Paares) und EMAIL-Transfers (die Gegenpartei erhält eine E-Mail und antwortet im Abholportal). Ein Transfer über TRP, GTR, TRUST, VerifyVASP oder Sygna übermittelt keine Nachrichten, da diese Protokolle keine Nachrichten unterstützen. Limits: 100 Nachrichten pro Transfer, 5000 Zeichen pro Textkörper, 10 angeforderte Dokumente, 5 Dateien mit jeweils 10 MB.",
        "operationId": "createTravelRuleMessage",
        "x-didit-sdk": {
          "resource": "transactions.travel_rule",
          "method": "create_message",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Travel Rule"
        ],
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "parameters": [
          {
            "name": "transaction_id",
            "in": "path",
            "required": true,
            "description": "Stabile Transaktions-UUID von Didit, zu der der Transfer gehört.",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TravelRuleMessageCreateRequest"
              },
              "example": {
                "kind": "DOCUMENT_REQUEST",
                "body": "Please confirm the date of birth of the beneficiary.",
                "requested_documents": [
                  "Proof of address"
                ]
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/TravelRuleMessageCreateRequest"
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X POST https://verification.didit.me/v3/transactions/{transaction_id}/travel-rule/messages/ \\\n  -H 'x-api-key: YOUR_API_KEY' -H 'Content-Type: application/json' \\\n  -d '{\"kind\": \"DOCUMENT_REQUEST\", \"body\": \"Please confirm the date of birth of the beneficiary.\", \"requested_documents\": [\"Proof of address\"]}'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.transactions.travel_rule.create_message(\n    \"11111111-2222-3333-4444-555555555555\",\n    kind=\"DOCUMENT_REQUEST\",\n    body=\"Please confirm the date of birth of the beneficiary.\",\n    requested_documents=[\"Proof of address\"],\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.transactions.travelRule.createMessage(\"11111111-2222-3333-4444-555555555555\", {\n  kind: \"DOCUMENT_REQUEST\",\n  body: \"Please confirm the date of birth of the beneficiary.\",\n  requested_documents: [\"Proof of address\"],\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Transactions.TravelRule.CreateMessage(ctx, \"11111111-2222-3333-4444-555555555555\", didit.TravelRuleMessageCreateRequest{\n\tKind:               didit.Some(didit.TravelRuleMessageCreateRequestKind(\"DOCUMENT_REQUEST\")),\n\tBody:               didit.String(\"Please confirm the date of birth of the beneficiary.\"),\n\tRequestedDocuments: didit.Some([]string{\"Proof of address\"}),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import java.util.List;\nimport me.didit.Didit;\nimport me.didit.types.TravelRuleMessageCreateRequest;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.transactions().travelRule().createMessage(\"11111111-2222-3333-4444-555555555555\", TravelRuleMessageCreateRequest.builder()\n        .kind(TravelRuleMessageCreateRequest.Kind.of(\"DOCUMENT_REQUEST\"))\n        .body(\"Please confirm the date of birth of the beneficiary.\")\n        .requestedDocuments(List.of(\"Proof of address\"))\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->transactions->travelRule->createMessage('11111111-2222-3333-4444-555555555555', [\n    'kind' => 'DOCUMENT_REQUEST',\n    'body' => 'Please confirm the date of birth of the beneficiary.',\n    'requested_documents' => ['Proof of address'],\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.transactions.travel_rule.create_message(\n  \"11111111-2222-3333-4444-555555555555\",\n  kind: \"DOCUMENT_REQUEST\",\n  body: \"Please confirm the date of birth of the beneficiary.\",\n  requested_documents: [\"Proof of address\"]\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Transactions.TravelRule.CreateMessageAsync(\"11111111-2222-3333-4444-555555555555\", new TravelRuleMessageCreateRequest\n{\n    Kind = new TravelRuleMessageCreateRequestKind(\"DOCUMENT_REQUEST\"),\n    Body = \"Please confirm the date of birth of the beneficiary.\",\n    RequestedDocuments = new string[] { \"Proof of address\" },\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "responses": {
          "201": {
            "description": "Die gespeicherte Nachricht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TravelRuleMessage"
                }
              }
            }
          },
          "400": {
            "description": "Ungültiger Body, ein nicht akzeptierter Dateityp oder eine nicht akzeptierte Dateigröße, mehr als 100 Nachrichten bei der Übertragung oder ein `reply_to`, das keine Nachricht dieser Übertragung ist.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                },
                "example": {
                  "requested_documents": [
                    "Name at least one document the counterparty should send."
                  ]
                }
              }
            }
          },
          "404": {
            "description": "Unbekannte Transaktion oder unbekanntes Token, oder kein Travel-Rule-Transfer für die Transaktion vorhanden."
          },
          "409": {
            "description": "Keine Nachricht kann die Gegenpartei erreichen. `detail` nennt den Grund: Der Transfer läuft über eine Netzwerkroute (TRP, GTR, TRUST, VerifyVASP oder Sygna), hat noch keine Gegenpartei, die Daten eines INTERNAL-Transfers stimmten nicht mit dem Wallet-Inhaber überein, sodass nichts beim Empfänger ankam, oder der Abruflink eines EMAIL-Transfers ist abgelaufen oder der Transfer ist geschlossen.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/v3/travel-rule/pickup/{token}/": {
      "get": {
        "summary": "Abholinformationen für E-Mail-Rail abrufen",
        "description": "Öffentlich, nicht authentifiziert. Ermöglicht einem Nicht-Didit-Gegenpartei-VASP eine Vorschau des ausstehenden Austauschs über den per E-Mail gesendeten Abruf-Link. Das Token selbst dient der Authentifizierung.",
        "operationId": "getTravelRulePickup",
        "x-didit-sdk": {
          "resource": "travel_rule",
          "method": "retrieve_pickup",
          "auth": "public",
          "server": false
        },
        "tags": [
          "Travel Rule"
        ],
        "security": [
          {}
        ],
        "parameters": [
          {
            "name": "token",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "contact",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "Der `?contact=`-Wert des Links, der Kontakt, an den der Link gesendet wurde. Wird unverändert als `contact` zurückgegeben; er wird nicht validiert."
          }
        ],
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl https://verification.didit.me/v3/travel-rule/pickup/{token}/"
          }
        ],
        "responses": {
          "200": {
            "description": "Abholvorschau.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TravelRulePickupInfo"
                },
                "example": {
                  "reference": "33333333-4444-5555-6666-777777777777",
                  "requested_at": "2026-07-05T10:00:00Z",
                  "originator_vasp_name": "Origin CASP SL",
                  "originator_vasp_lei": "529900EXAMPLEORIG001",
                  "recipient_vasp_name": "Example Counterparty VASP",
                  "language": "es",
                  "amount": "0.250000000000000000",
                  "currency": "ETH",
                  "fiat_amount": "",
                  "fiat_currency": "",
                  "chain": "ETH",
                  "beneficiary_wallet": "0xede2d7e4f5b097e6391ab6bbcf2f47a53f4778cb",
                  "status": "AWAITING_COUNTERPARTY",
                  "ivms_version": "ivms101.2023",
                  "deadline_at": "2026-07-07T10:00:00Z",
                  "reminders_sent": 0,
                  "contact": "",
                  "decline_reasons": [
                    "data_mismatch",
                    "not_our_customer",
                    "wallet_not_hosted",
                    "sanctions",
                    "risk_appetite",
                    "jurisdiction",
                    "insufficient_data",
                    "other"
                  ],
                  "join_invitation": {
                    "eligible": false,
                    "url": ""
                  },
                  "originator_data": {
                    "name": "Jane Doe",
                    "wallet_address": "0x77ccff0cc624a53cd8b8d8703ced826710211ec7"
                  },
                  "beneficiary_data": {
                    "name": "Ana Diaz",
                    "wallet_address": "0xede2d7e4f5b097e6391ab6bbcf2f47a53f4778cb"
                  },
                  "ivms_request": {
                    "originator": {
                      "originatorPersons": [
                        {
                          "naturalPerson": {
                            "name": {
                              "nameIdentifier": [
                                {
                                  "primaryIdentifier": "Doe",
                                  "secondaryIdentifier": "Jane",
                                  "nameIdentifierType": "LEGL"
                                }
                              ]
                            }
                          }
                        }
                      ],
                      "accountNumber": [
                        "0x77ccff0cc624a53cd8b8d8703ced826710211ec7"
                      ]
                    },
                    "beneficiary": {
                      "beneficiaryPersons": [
                        {
                          "naturalPerson": {
                            "name": {
                              "nameIdentifier": [
                                {
                                  "primaryIdentifier": "Diaz",
                                  "secondaryIdentifier": "Ana",
                                  "nameIdentifierType": "LEGL"
                                }
                              ]
                            }
                          }
                        }
                      ],
                      "accountNumber": [
                        "0xede2d7e4f5b097e6391ab6bbcf2f47a53f4778cb"
                      ]
                    }
                  },
                  "data_masked": false
                }
              }
            }
          },
          "404": {
            "description": "Unbekanntes Token."
          },
          "410": {
            "description": "Das Zeitfenster ist geschlossen: Die Gegenpartei hat bereits geantwortet, der Transfer hat AWAITING_COUNTERPARTY verlassen oder die Frist ist abgelaufen."
          }
        }
      }
    },
    "/v3/travel-rule/pickup/{token}/respond/": {
      "post": {
        "summary": "Auf eine E-Mail-Rail-Abholung antworten",
        "description": "Öffentlich, nicht authentifiziert. Akzeptiert oder lehnt den Austausch über den per E-Mail gesendeten Abruf-Link ab. Bei Annahme wird beneficiary_name anhand der Richtlinie name_matching_strictness des Auftraggebers überprüft.",
        "operationId": "respondTravelRulePickup",
        "x-didit-sdk": {
          "resource": "travel_rule",
          "method": "respond_pickup",
          "auth": "public",
          "server": false
        },
        "tags": [
          "Travel Rule"
        ],
        "security": [
          {}
        ],
        "parameters": [
          {
            "name": "token",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "contact",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "Der `?contact=`-Wert des Links. Wird verwendet, wenn der Anfragetext kein `contact` übermittelt."
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TravelRulePickupRespondRequest"
              },
              "example": {
                "decision": "accept",
                "beneficiary_name": "Carlos Ruiz"
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X POST https://verification.didit.me/v3/travel-rule/pickup/{token}/respond/ \\\n  -H 'Content-Type: application/json' \\\n  -d '{\"decision\": \"accept\", \"beneficiary_name\": \"Carlos Ruiz\"}'"
          }
        ],
        "responses": {
          "200": {
            "description": "Der resultierende Austauschstatus: COMPLETED oder COUNTERPARTY_MISMATCHED_DATA nach einer Annahme, COUNTERPARTY_VASP_GENERAL_DECLINE nach einer Ablehnung, die auch `decline_reason` zurückgibt.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "status": {
                      "type": "string"
                    },
                    "decline_reason": {
                      "type": "string",
                      "description": "Vorhanden nach einer Ablehnung."
                    }
                  }
                },
                "examples": {
                  "accepted": {
                    "value": {
                      "status": "COMPLETED"
                    }
                  },
                  "declined": {
                    "value": {
                      "status": "COUNTERPARTY_VASP_GENERAL_DECLINE",
                      "decline_reason": "not_our_customer"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Ein Feld ist ungültig: zum Beispiel fehlt `decision` oder ist nicht `accept` oder `decline`, `decline_detail` fehlt bei einer Ablehnung mit `decline_reason: other`, eine `ivms_response`, die kein IVMS-101-Objekt ist oder länger als 16384 Zeichen ist, oder ein `contact` im Body, der keine UUID ist (`{\"contact\": [\"Must be a valid UUID.\"]}`).",
            "content": {
              "application/json": {
                "example": {
                  "decline_detail": [
                    "Say what the reason is when you choose another reason."
                  ]
                }
              }
            }
          },
          "404": {
            "description": "Unbekanntes Token."
          },
          "410": {
            "description": "Das Zeitfenster ist geschlossen: Die Gegenpartei hat bereits geantwortet, der Transfer hat AWAITING_COUNTERPARTY verlassen oder die Frist ist abgelaufen."
          }
        }
      }
    },
    "/v3/travel-rule/pickup/{token}/messages/": {
      "get": {
        "summary": "Abholnachrichten auflisten",
        "description": "Öffentlich, nicht authentifiziert. Die Nachrichten einer Übertragung über die EMAIL-Schiene, wie der Gegenpartei-VASP sie liest: Was der Kunde gesendet hat, ist `INBOUND` und mit dem VASP-Namen des Kunden signiert. Das Token dient der Authentifizierung.",
        "operationId": "listTravelRulePickupMessages",
        "x-didit-sdk": {
          "resource": "travel_rule",
          "method": "list_pickup_messages",
          "auth": "public",
          "server": false
        },
        "tags": [
          "Travel Rule"
        ],
        "security": [
          {}
        ],
        "parameters": [
          {
            "name": "token",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl https://verification.didit.me/v3/travel-rule/pickup/{token}/messages/"
          }
        ],
        "responses": {
          "200": {
            "description": "Die Nachrichten, älteste zuerst, von der Seite der Gegenpartei.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/TravelRuleMessage"
                  }
                }
              }
            }
          },
          "404": {
            "description": "Unbekanntes Token."
          },
          "410": {
            "description": "Der Abhol-Link ist abgelaufen oder der Transfer ist geschlossen."
          }
        }
      },
      "post": {
        "summary": "Im Abholportal antworten",
        "description": "Öffentlich, nicht authentifiziert. Der Gegenpartei-VASP antwortet bei einer Übertragung über die EMAIL-Schiene. Identischer Textkörper wie bei den Nachrichten der Transaktion; Anhänge müssen im Format PDF, PNG, JPEG oder WebP vorliegen. Das Token dient der Authentifizierung.",
        "operationId": "createTravelRulePickupMessage",
        "x-didit-sdk": {
          "resource": "travel_rule",
          "method": "create_pickup_message",
          "auth": "public",
          "server": false
        },
        "tags": [
          "Travel Rule"
        ],
        "security": [
          {}
        ],
        "parameters": [
          {
            "name": "token",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TravelRuleMessageCreateRequest"
              },
              "example": {
                "kind": "MESSAGE",
                "body": "Attached is the proof of address of the wallet holder."
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/TravelRuleMessageCreateRequest"
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X POST https://verification.didit.me/v3/travel-rule/pickup/{token}/messages/ \\\n  -H 'Content-Type: application/json' \\\n  -d '{\"kind\": \"MESSAGE\", \"body\": \"Attached is the proof of address of the wallet holder.\"}'"
          }
        ],
        "responses": {
          "201": {
            "description": "Die gespeicherte Nachricht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TravelRuleMessage"
                }
              }
            }
          },
          "400": {
            "description": "Ungültiger Body, ein nicht akzeptierter Dateityp oder eine nicht akzeptierte Dateigröße, mehr als 100 Nachrichten bei der Übertragung oder ein `reply_to`, das keine Nachricht dieser Übertragung ist.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                },
                "example": {
                  "requested_documents": [
                    "Name at least one document the counterparty should send."
                  ]
                }
              }
            }
          },
          "404": {
            "description": "Unbekanntes Token."
          },
          "410": {
            "description": "Der Abhol-Link ist abgelaufen oder der Transfer ist geschlossen."
          }
        }
      }
    },
    "/v3/travel-rule/inbound/": {
      "post": {
        "summary": "Eingehenden Transfer nach Einzahlung (Sunrise) registrieren",
        "description": "Travel Rule-Daten für eine Krypto-Einzahlung registrieren, die bereits vor einem Umtausch On-Chain abgewickelt wurde. Erstellt eine eingehende travelRule-Transaktion (oder verwendet eine nicht beanspruchte Einzahlung wieder) und gleicht den Transfer mit Ihrem Wallet-Adressbuch ab. Bei einer neu erstellten Transaktion sendet Didit zuerst den Webhook transaction.created und danach die travel_rule.status.updated-Webhooks.",
        "operationId": "registerTravelRuleInbound",
        "x-didit-sdk": {
          "resource": "travel_rule",
          "method": "register_inbound",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Travel Rule"
        ],
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TravelRuleInboundRequest"
              },
              "example": {
                "chain": "ETH",
                "txid": "0xdeposit-hash",
                "wallet_address": "0xYourDepositWallet",
                "amount": "500.00",
                "currency": "USDC",
                "originator_data": {
                  "name": "Origin CASP SL"
                },
                "beneficiary_data": {
                  "name": "Ana Diaz"
                },
                "originating_vasp": {
                  "name": "Origin CASP SL",
                  "lei": "",
                  "travel_address": "ta9JbXbsBSuS5ozArJRFVgvBHMVnDGUnrPPChSZYQsuZTn3kPrJXUQ7RSLUEJ5KjyPvr8C9sAxmPtZfGsQVKCi4n8ShxP9BkbDdbtjtA9aumNybAZ1BxC"
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X POST https://verification.didit.me/v3/travel-rule/inbound/ \\\n  -H 'x-api-key: YOUR_API_KEY' -H 'Content-Type: application/json' \\\n  -d '{\"chain\":\"ETH\",\"txid\":\"0xdeposit-hash\",\"wallet_address\":\"0xYourDepositWallet\",\"amount\":\"500.00\",\"currency\":\"USDC\"}'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.travel_rule.register_inbound(\n    chain=\"ETH\",\n    txid=\"0xdeposit-hash\",\n    wallet_address=\"0xYourDepositWallet\",\n    amount=\"500.00\",\n    currency=\"USDC\",\n    originator_data={\"name\": \"Origin CASP SL\"},\n    beneficiary_data={\"name\": \"Ana Diaz\"},\n    originating_vasp={\n        \"name\": \"Origin CASP SL\",\n        \"lei\": \"\",\n        \"travel_address\": \"ta9JbXbsBSuS5ozArJRFVgvBHMVnDGUnrPPChSZYQsuZTn3kPrJXUQ7RSLUEJ5KjyPvr8C9sAxmPtZfGsQVKCi4n8ShxP9BkbDdbtjtA9aumNybAZ1BxC\",\n    },\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.travelRule.registerInbound({\n  chain: \"ETH\",\n  txid: \"0xdeposit-hash\",\n  wallet_address: \"0xYourDepositWallet\",\n  amount: \"500.00\",\n  currency: \"USDC\",\n  originator_data: { name: \"Origin CASP SL\" },\n  beneficiary_data: { name: \"Ana Diaz\" },\n  originating_vasp: {\n    name: \"Origin CASP SL\",\n    lei: \"\",\n    travel_address: \"ta9JbXbsBSuS5ozArJRFVgvBHMVnDGUnrPPChSZYQsuZTn3kPrJXUQ7RSLUEJ5KjyPvr8C9sAxmPtZfGsQVKCi4n8ShxP9BkbDdbtjtA9aumNybAZ1BxC\",\n  },\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.TravelRule.RegisterInbound(ctx, didit.TravelRuleInboundRequest{\n\tChain:           \"ETH\",\n\tTxid:            \"0xdeposit-hash\",\n\tWalletAddress:   \"0xYourDepositWallet\",\n\tAmount:          \"500.00\",\n\tCurrency:        \"USDC\",\n\tOriginatorData:  didit.Some(map[string]any{\"name\": \"Origin CASP SL\"}),\n\tBeneficiaryData: didit.Some(map[string]any{\"name\": \"Ana Diaz\"}),\n\tOriginatingVASP: didit.Some(didit.TravelRuleInboundRequestOriginatingVASP{\n\t\tName:          didit.String(\"Origin CASP SL\"),\n\t\tLei:           didit.String(\"\"),\n\t\tTravelAddress: didit.String(\"ta9JbXbsBSuS5ozArJRFVgvBHMVnDGUnrPPChSZYQsuZTn3kPrJXUQ7RSLUEJ5KjyPvr8C9sAxmPtZfGsQVKCi4n8ShxP9BkbDdbtjtA9aumNybAZ1BxC\"),\n\t}),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import java.util.Map;\nimport me.didit.Didit;\nimport me.didit.types.TravelRuleInboundRequest;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.travelRule().registerInbound(TravelRuleInboundRequest.builder()\n        .chain(\"ETH\")\n        .txid(\"0xdeposit-hash\")\n        .walletAddress(\"0xYourDepositWallet\")\n        .amount(\"500.00\")\n        .currency(\"USDC\")\n        .originatorData(Map.of(\"name\", \"Origin CASP SL\"))\n        .beneficiaryData(Map.of(\"name\", \"Ana Diaz\"))\n        .originatingVasp(TravelRuleInboundRequest.OriginatingVasp.builder()\n                .name(\"Origin CASP SL\")\n                .lei(\"\")\n                .travelAddress(\"ta9JbXbsBSuS5ozArJRFVgvBHMVnDGUnrPPChSZYQsuZTn3kPrJXUQ7RSLUEJ5KjyPvr8C9sAxmPtZfGsQVKCi4n8ShxP9BkbDdbtjtA9aumNybAZ1BxC\")\n                .build())\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->travelRule->registerInbound([\n    'chain' => 'ETH',\n    'txid' => '0xdeposit-hash',\n    'wallet_address' => '0xYourDepositWallet',\n    'amount' => '500.00',\n    'currency' => 'USDC',\n    'originator_data' => ['name' => 'Origin CASP SL'],\n    'beneficiary_data' => ['name' => 'Ana Diaz'],\n    'originating_vasp' => [\n        'name' => 'Origin CASP SL',\n        'lei' => '',\n        'travel_address' => 'ta9JbXbsBSuS5ozArJRFVgvBHMVnDGUnrPPChSZYQsuZTn3kPrJXUQ7RSLUEJ5KjyPvr8C9sAxmPtZfGsQVKCi4n8ShxP9BkbDdbtjtA9aumNybAZ1BxC',\n    ],\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.travel_rule.register_inbound(\n  chain: \"ETH\",\n  txid: \"0xdeposit-hash\",\n  wallet_address: \"0xYourDepositWallet\",\n  amount: \"500.00\",\n  currency: \"USDC\",\n  originator_data: { name: \"Origin CASP SL\" },\n  beneficiary_data: { name: \"Ana Diaz\" },\n  originating_vasp: {\n    name: \"Origin CASP SL\",\n    lei: \"\",\n    travel_address: \"ta9JbXbsBSuS5ozArJRFVgvBHMVnDGUnrPPChSZYQsuZTn3kPrJXUQ7RSLUEJ5KjyPvr8C9sAxmPtZfGsQVKCi4n8ShxP9BkbDdbtjtA9aumNybAZ1BxC\",\n  }\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Collections.Generic;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.TravelRule.RegisterInboundAsync(new TravelRuleInboundRequest\n{\n    Chain = \"ETH\",\n    Txid = \"0xdeposit-hash\",\n    WalletAddress = \"0xYourDepositWallet\",\n    Amount = \"500.00\",\n    Currency = \"USDC\",\n    OriginatorData = new Dictionary<string, object> { [\"name\"] = \"Origin CASP SL\" },\n    BeneficiaryData = new Dictionary<string, object> { [\"name\"] = \"Ana Diaz\" },\n    OriginatingVasp = new TravelRuleInboundRequestOriginatingVasp\n    {\n        Name = \"Origin CASP SL\",\n        Lei = \"\",\n        TravelAddress = \"ta9JbXbsBSuS5ozArJRFVgvBHMVnDGUnrPPChSZYQsuZTn3kPrJXUQ7RSLUEJ5KjyPvr8C9sAxmPtZfGsQVKCi4n8ShxP9BkbDdbtjtA9aumNybAZ1BxC\",\n    },\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "responses": {
          "200": {
            "description": "Ein Transfer für diese txid und wallet_address war bereits registriert; der bestehende wird unverändert zurückgegeben (created ist false).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TravelRuleInboundResponse"
                }
              }
            }
          },
          "201": {
            "description": "Ein neuer Travel Rule-Transfer wurde registriert, bei einer neuen eingehenden Transaktion oder bei einer bestehenden nicht beanspruchten Einzahlung (created ist true).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TravelRuleInboundResponse"
                }
              }
            }
          },
          "400": {
            "description": "Ein Pflichtfeld (`chain`, `txid`, `wallet_address`, `amount`, `currency`) fehlt, `originating_vasp.lei` ist kein gültiger LEI, `originating_vasp.travel_address` ist keine gültige Travel Address, ein Memo, eine X-Adresse oder ein `utxo`, die die Blockchain nicht übertragen kann, oder `originator_data` / `beneficiary_data`, das kein Objekt ist.",
            "content": {
              "application/json": {
                "examples": {
                  "Missing field": {
                    "value": {
                      "txid": [
                        "This field is required."
                      ]
                    }
                  },
                  "Invalid LEI": {
                    "value": {
                      "originating_vasp": {
                        "lei": [
                          "Invalid LEI: expected 20 alphanumeric characters (ISO 17442)."
                        ]
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/v3/travel-rule/test-vasp/inbound/": {
      "post": {
        "summary": "Einen eingehenden Transfer vom Didit-Test-VASP auslösen (Sandbox)",
        "description": "Nur für Sandbox-Anwendungen. Der Didit Test VASP sendet Ihrer Anwendung einen eingehenden Travel Rule-Transfer, sodass Sie die Empfängerseite eines Krypto-Handelsplatzes vor dem Produktivstart durchgehend testen können. Der Transfer wird nach derselben Logik gebucht und entschieden, die ein echter eingehender Transfer aus einem Netzwerk auf Ihr Wallet-Adressbuch anwendet, sodass sich der Posteingang, die Entscheidung und der Ablauf zur Ermittlung der Eigentümerstruktur der Wallet genau wie in der Produktionsumgebung verhalten. Nichts verlässt Didit. Eine Live-Anwendung erhält 400. Senden Sie dieselbe `reference` erneut, um den Transfer abzurufen, den der erste Aufruf gebucht hat, anstatt einen zweiten zu erstellen.",
        "operationId": "triggerTravelRuleTestVaspInbound",
        "x-didit-sdk": {
          "resource": "transactions.travel_rule",
          "method": "trigger_test_vasp_inbound",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Travel Rule"
        ],
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TravelRuleTestVaspInboundRequest"
              },
              "example": {
                "beneficiary_wallet_address": "0xYourSandboxWallet",
                "scenario": "accept",
                "amount": "1",
                "reference": "demo-001"
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X POST https://verification.didit.me/v3/travel-rule/test-vasp/inbound/ \\\n  -H 'x-api-key: YOUR_SANDBOX_API_KEY' -H 'Content-Type: application/json' \\\n  -d '{\"beneficiary_wallet_address\":\"0xYourSandboxWallet\",\"scenario\":\"accept\",\"reference\":\"demo-001\"}'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.transactions.travel_rule.trigger_test_vasp_inbound(\n    beneficiary_wallet_address=\"0xYourSandboxWallet\",\n    scenario=\"accept\",\n    amount=\"1\",\n    reference=\"demo-001\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.transactions.travelRule.triggerTestVaspInbound({\n  beneficiary_wallet_address: \"0xYourSandboxWallet\",\n  scenario: \"accept\",\n  amount: \"1\",\n  reference: \"demo-001\",\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Transactions.TravelRule.TriggerTestVASPInbound(ctx, didit.TravelRuleTestVASPInboundRequest{\n\tBeneficiaryWalletAddress: \"0xYourSandboxWallet\",\n\tScenario:                 didit.Some(didit.TravelRuleTestVASPInboundRequestScenario(\"accept\")),\n\tAmount:                   didit.String(\"1\"),\n\tReference:                didit.String(\"demo-001\"),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\nimport me.didit.types.TravelRuleTestVaspInboundRequest;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.transactions().travelRule().triggerTestVaspInbound(TravelRuleTestVaspInboundRequest.builder()\n        .beneficiaryWalletAddress(\"0xYourSandboxWallet\")\n        .scenario(TravelRuleTestVaspInboundRequest.Scenario.of(\"accept\"))\n        .amount(\"1\")\n        .reference(\"demo-001\")\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->transactions->travelRule->triggerTestVaspInbound([\n    'beneficiary_wallet_address' => '0xYourSandboxWallet',\n    'scenario' => 'accept',\n    'amount' => '1',\n    'reference' => 'demo-001',\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.transactions.travel_rule.trigger_test_vasp_inbound(\n  beneficiary_wallet_address: \"0xYourSandboxWallet\",\n  scenario: \"accept\",\n  amount: \"1\",\n  reference: \"demo-001\"\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Transactions.TravelRule.TriggerTestVaspInboundAsync(new TravelRuleTestVaspInboundRequest\n{\n    BeneficiaryWalletAddress = \"0xYourSandboxWallet\",\n    Scenario = new TravelRuleTestVaspInboundRequestScenario(\"accept\"),\n    Amount = \"1\",\n    Reference = \"demo-001\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "responses": {
          "201": {
            "description": "Der eingehende Transfer wurde verbucht und entschieden. Eine Wiederholung mit derselben `reference` gibt denselben Body zurück.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TravelRuleTestVaspInboundResponse"
                }
              }
            }
          },
          "400": {
            "description": "Ungültiger Body, ein unbekanntes oder nicht unterstütztes `scenario` oder die Anwendung ist eine Live-Anwendung.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "409": {
            "description": "Der Transfer konnte nicht gebucht werden, beispielsweise weil Travel Rule für die Anwendung nicht aktiviert ist.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/v3/travel-rule/widget-session/": {
      "post": {
        "summary": "Widget-Sitzung zum Nachweis der Wallet-Inhaberschaft erstellen",
        "description": "Erstellen Sie eine gehostete Widget-URL/einen Token für den Wallet-Eigentumsnachweis. Leiten Sie den Kunden an die zurückgegebene URL weiter, um die Kontrolle über eine Wallet nachzuweisen (Signieren von Nachrichten, Satoshi-Test, Screenshot oder Eigenerklärung). Das Widget ist in diesem Release rein webbasiert - öffnen Sie die URL im Systembrowser oder einem Custom Tab, niemals innerhalb einer Webview eines mobilen SDKs.",
        "operationId": "createTravelRuleWidgetSession",
        "x-didit-sdk": {
          "resource": "travel_rule",
          "method": "create_widget_session",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Travel Rule"
        ],
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TravelRuleWidgetSessionCreate"
              },
              "example": {
                "wallet_address": "0xd3b62acb76fb27a7f8961ec40fa11746b113aca9",
                "chain": "ETH",
                "holder_name": "Jane Doe",
                "vendor_data": "user-042",
                "transaction_id": "99999999-aaaa-bbbb-cccc-dddddddddddd",
                "expires_in_minutes": 60
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X POST https://verification.didit.me/v3/travel-rule/widget-session/ \\\n  -H 'x-api-key: YOUR_API_KEY' -H 'Content-Type: application/json' \\\n  -d '{\"wallet_address\":\"0xd3b62acb76fb27a7f8961ec40fa11746b113aca9\",\"chain\":\"ETH\",\"holder_name\":\"Jane Doe\",\"transaction_id\":\"99999999-aaaa-bbbb-cccc-dddddddddddd\"}'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.travel_rule.create_widget_session(\n    wallet_address=\"0xd3b62acb76fb27a7f8961ec40fa11746b113aca9\",\n    chain=\"ETH\",\n    holder_name=\"Jane Doe\",\n    vendor_data=\"user-042\",\n    transaction_id=\"99999999-aaaa-bbbb-cccc-dddddddddddd\",\n    expires_in_minutes=60,\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.travelRule.createWidgetSession({\n  wallet_address: \"0xd3b62acb76fb27a7f8961ec40fa11746b113aca9\",\n  chain: \"ETH\",\n  holder_name: \"Jane Doe\",\n  vendor_data: \"user-042\",\n  transaction_id: \"99999999-aaaa-bbbb-cccc-dddddddddddd\",\n  expires_in_minutes: 60,\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.TravelRule.CreateWidgetSession(ctx, didit.TravelRuleWidgetSessionCreate{\n\tWalletAddress:    didit.String(\"0xd3b62acb76fb27a7f8961ec40fa11746b113aca9\"),\n\tChain:            didit.String(\"ETH\"),\n\tHolderName:       didit.String(\"Jane Doe\"),\n\tVendorData:       didit.String(\"user-042\"),\n\tTransactionID:    didit.String(\"99999999-aaaa-bbbb-cccc-dddddddddddd\"),\n\tExpiresInMinutes: didit.Int(60),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\nimport me.didit.types.TravelRuleWidgetSessionCreate;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.travelRule().createWidgetSession(TravelRuleWidgetSessionCreate.builder()\n        .walletAddress(\"0xd3b62acb76fb27a7f8961ec40fa11746b113aca9\")\n        .chain(\"ETH\")\n        .holderName(\"Jane Doe\")\n        .vendorData(\"user-042\")\n        .transactionId(\"99999999-aaaa-bbbb-cccc-dddddddddddd\")\n        .expiresInMinutes(60L)\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->travelRule->createWidgetSession([\n    'wallet_address' => '0xd3b62acb76fb27a7f8961ec40fa11746b113aca9',\n    'chain' => 'ETH',\n    'holder_name' => 'Jane Doe',\n    'vendor_data' => 'user-042',\n    'transaction_id' => '99999999-aaaa-bbbb-cccc-dddddddddddd',\n    'expires_in_minutes' => 60,\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.travel_rule.create_widget_session(\n  wallet_address: \"0xd3b62acb76fb27a7f8961ec40fa11746b113aca9\",\n  chain: \"ETH\",\n  holder_name: \"Jane Doe\",\n  vendor_data: \"user-042\",\n  transaction_id: \"99999999-aaaa-bbbb-cccc-dddddddddddd\",\n  expires_in_minutes: 60\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.TravelRule.CreateWidgetSessionAsync(new TravelRuleWidgetSessionCreate\n{\n    WalletAddress = \"0xd3b62acb76fb27a7f8961ec40fa11746b113aca9\",\n    Chain = \"ETH\",\n    HolderName = \"Jane Doe\",\n    VendorData = \"user-042\",\n    TransactionId = \"99999999-aaaa-bbbb-cccc-dddddddddddd\",\n    ExpiresInMinutes = 60,\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "responses": {
          "201": {
            "description": "Die erstellte Widget-Sitzung.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TravelRuleWidgetSessionResponse"
                }
              }
            }
          },
          "400": {
            "description": "Ungültiger Body: `callback_url` ist keine absolute http(s)-URL, `expires_in_minutes` liegt außerhalb von 5 bis 10080, `transaction_id` ist keine UUID oder ein Feld überschreitet sein Limit.",
            "content": {
              "application/json": {
                "examples": {
                  "Invalid callback_url": {
                    "value": {
                      "callback_url": [
                        "callback_url must be an absolute http(s) URL."
                      ]
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "`transaction_id` bezeichnet keinen Travel-Rule-Transfer in dieser Anwendung."
          }
        }
      }
    },
    "/v3/travel-rule/widget/{token}/": {
      "get": {
        "summary": "Kontext des Wallet-Eigentums-Widgets abrufen",
        "description": "Öffentlicher Lese-Endpoint, über das Widget-Sitzungs-Token adressiert – kein API-Schlüssel erforderlich. Gibt den Widget-Kontext sowie den Status jedes Proofs zurück, sodass Sie ihn per Polling abfragen können, um den Abschluss zu erkennen; completed_at wird ungleich null, sobald ein Proof verifiziert ist. Ein SATOSHI_TEST-Proof kann den Status PENDING haben, während die Einzahlung On-Chain erkannt, aber noch unbestätigt ist – ein Hintergrundjob prüft ihn automatisch erneut und schließt ihn ab, sobald die Einzahlung bestätigt wird; während des Wartens ist daher keine clientseitige Aktion erforderlich. Jeder Proof enthält die Felder, die seine Methode benötigt: deposit_address, expected_amount und ein eigenes expires_at für SATOSHI_TEST; challenge für MESSAGE_SIGNING. Bevorzugen Sie den Webhook travel_rule.status.updated gegenüber Polling, wenn die Sitzung mit einem Transfer verknüpft ist.",
        "operationId": "getTravelRuleWidgetContext",
        "x-didit-sdk": {
          "resource": "travel_rule",
          "method": "retrieve_widget_context",
          "auth": "public",
          "server": false
        },
        "tags": [
          "Travel Rule"
        ],
        "security": [
          {}
        ],
        "parameters": [
          {
            "name": "token",
            "in": "path",
            "required": true,
            "description": "Opakes Sitzungs-Token, das zurückgegeben wird, wenn die Widget-Sitzung erstellt wurde.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl https://verification.didit.me/v3/travel-rule/widget/{token}/"
          }
        ],
        "responses": {
          "200": {
            "description": "Der Widget-Kontext und die Nachweisstatus.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TravelRuleWidgetContext"
                }
              }
            }
          },
          "404": {
            "description": "Unbekanntes Token."
          },
          "410": {
            "description": "Die Sitzung ist abgelaufen, ohne abgeschlossen zu werden."
          }
        }
      }
    },
    "/v3/travel-rule/widget/{token}/vasps/": {
      "get": {
        "summary": "VASPs über das Wallet-Widget suchen",
        "description": "Öffentlicher Lese-Endpoint, über das Widget-Sitzungs-Token adressiert, kein API-Schlüssel erforderlich: die VASP-Auswahl des Endbenutzer-Widgets. Dieselbe Suche und dieselben Filter wie bei GET /v3/travel-rule/vasps/ für die Anwendung des Widgets, beantwortet jedoch nur, um welchen VASP es sich jeweils handelt und ob dieser erreichbar ist.",
        "operationId": "listTravelRuleWidgetVasps",
        "x-didit-sdk": {
          "resource": "travel_rule",
          "method": "list_widget_vasps",
          "auth": "public",
          "server": false
        },
        "tags": [
          "Travel Rule"
        ],
        "security": [
          {}
        ],
        "parameters": [
          {
            "name": "token",
            "in": "path",
            "required": true,
            "description": "Opakes Sitzungs-Token, das zurückgegeben wird, wenn die Widget-Sitzung erstellt wurde.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "search",
            "in": "query",
            "schema": {
              "type": "string",
              "maxLength": 255
            },
            "description": "Ein Namens- oder Alias-Fragment (ohne Berücksichtigung der Groß-/Kleinschreibung), eine exakte LEI oder eine Domain (example.com oder eine URL darauf). Mitglieder des Didit-Netzwerks werden anhand ihres rechtlichen Namens, ihrer LEI oder der Domain ihrer Compliance-E-Mail zugeordnet."
          },
          {
            "name": "network",
            "in": "query",
            "schema": {
              "type": "string",
              "enum": [
                "GTR",
                "TRUST",
                "VERIFYVASP",
                "SYGNA",
                "TRISA"
              ]
            },
            "description": "Nur Verzeichniseinträge, die das Mitgliederverzeichnis eines Netzwerks derzeit auflistet."
          },
          {
            "name": "jurisdiction",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "ISO 3166 Alpha-2- oder Alpha-3-Ländercode. 400 für jeden anderen Wert."
          },
          {
            "name": "reachable",
            "in": "query",
            "schema": {
              "type": "boolean"
            },
            "description": "true: Nur VASPs, zu denen Ihre Anwendung eine verfügbare Route hat (einschließlich Mitgliedern des Didit-Netzwerks). false: Nur Verzeichniseinträge, die sie derzeit nicht erreichen kann."
          },
          {
            "name": "kind",
            "in": "query",
            "schema": {
              "type": "string",
              "enum": [
                "directory",
                "didit"
              ]
            },
            "description": "Nur Verzeichniseinträge oder nur Mitglieder des Didit-Netzwerks."
          },
          {
            "name": "limit",
            "in": "query",
            "schema": {
              "type": "integer",
              "default": 50,
              "minimum": 1
            }
          },
          {
            "name": "offset",
            "in": "query",
            "schema": {
              "type": "integer",
              "default": 0,
              "minimum": 0
            }
          }
        ],
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl 'https://verification.didit.me/v3/travel-rule/widget/{token}/vasps/?search=counterparty'"
          }
        ],
        "responses": {
          "200": {
            "description": "Paginierte, nach Namen sortierte Ergebnisse.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "count": {
                      "type": "integer"
                    },
                    "next": {
                      "type": "string",
                      "nullable": true
                    },
                    "previous": {
                      "type": "string",
                      "nullable": true
                    },
                    "results": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/VaspDirectoryWidgetEntry"
                      }
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Ein Filter ist ungültig: Der Body benennt jedes Feld, beispielsweise ein unbekanntes Netzwerk oder einen unbekannten Ländercode.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    }
                  }
                },
                "example": {
                  "jurisdiction": [
                    "Use an ISO 3166 alpha-2 or alpha-3 country code."
                  ],
                  "network": [
                    "\"SWIFT\" is not a valid choice."
                  ]
                }
              }
            }
          },
          "404": {
            "description": "Unbekanntes Token."
          },
          "410": {
            "description": "Die Sitzung ist abgelaufen."
          }
        }
      },
      "post": {
        "summary": "Gegenpartei-VASP im Wallet-Widget auswählen",
        "description": "Öffentlicher Schreib-Endpoint, über das Widget-Sitzungs-Token adressiert, kein API-Schlüssel erforderlich: Der Endbenutzer hat den Ziel-VASP ausgewählt, den die automatische Erkennung nicht ermitteln konnte. Wird nur von ausgehenden Transfers im Status COUNTERPARTY_VASP_NOT_FOUND, COUNTERPARTY_VASP_NOT_REACHABLE oder NOT_ENOUGH_COUNTERPARTY_DATA akzeptiert. Der Transfer wird an diesen VASP weitergeleitet und erneut gesendet; die automatische Erkennung überschreibt diese Auswahl niemals.",
        "operationId": "selectTravelRuleWidgetVasp",
        "x-didit-sdk": {
          "resource": "travel_rule",
          "method": "select_widget_vasp",
          "auth": "public",
          "server": false
        },
        "tags": [
          "Travel Rule"
        ],
        "security": [
          {}
        ],
        "parameters": [
          {
            "name": "token",
            "in": "path",
            "required": true,
            "description": "Opakes Sitzungs-Token, das zurückgegeben wird, wenn die Widget-Sitzung erstellt wurde.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "vasp"
                ],
                "properties": {
                  "vasp": {
                    "type": "string",
                    "format": "uuid",
                    "description": "Die `id` eines VASPs von `GET /v3/travel-rule/widget/{token}/vasps/`."
                  }
                }
              },
              "example": {
                "vasp": "9f1c2b34-5d6e-4f70-8a91-b2c3d4e5f607"
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X POST https://verification.didit.me/v3/travel-rule/widget/{token}/vasps/ \\\n  -H 'Content-Type: application/json' \\\n  -d '{\"vasp\": \"9f1c2b34-5d6e-4f70-8a91-b2c3d4e5f607\"}'"
          }
        ],
        "responses": {
          "200": {
            "description": "Die Auswahl wurde erfasst und der Transfer wird erneut gesendet.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string"
                    },
                    "transfer_status": {
                      "type": "string",
                      "description": "Der Transferstatus nach der Auswahl."
                    },
                    "counterparty_vasp": {
                      "type": "string",
                      "description": "Der Name des VASP, den der Endbenutzer ausgewählt hat."
                    }
                  }
                },
                "example": {
                  "detail": "Counterparty VASP selected; the transfer is being resent.",
                  "transfer_status": "AWAITING_COUNTERPARTY",
                  "counterparty_vasp": "Northwind Exchange"
                }
              }
            }
          },
          "400": {
            "description": "`vasp` fehlt, oder kein Live-Verzeichniseintrag hat diese ID.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    }
                  }
                },
                "example": {
                  "vasp": [
                    "No directory entry has this id."
                  ]
                }
              }
            }
          },
          "404": {
            "description": "Unbekanntes Token."
          },
          "409": {
            "description": "Die Widget-Sitzung ist nicht mit einem Travel-Rule-Transfer verknüpft, oder der Transfer ist kein ausgehender Transfer in einem Status, der eine Gegenpartei akzeptiert."
          },
          "410": {
            "description": "Die Sitzung ist abgelaufen."
          }
        }
      }
    },
    "/v3/organization/{organization_id}/application/{application_id}/vendor-users/toggle-ongoing-monitoring/": {
      "patch": {
        "summary": "Laufende AML-Überwachung für Benutzer umschalten",
        "description": "Aktiviert oder deaktiviert die laufende AML-Überwachung auf Benutzerebene. Pro Benutzer wird genau ein überwachtes AML-Screening beibehalten; für Benutzer ohne jegliches AML-Screening (z. B. importierte Benutzer) wird zuerst eines erstellt und geprüft, abgerechnet als reguläres AML-Screening. Setzen Sie estimate_only, um Anzahlen und Kosten ohne Schreibzugriff in der Vorschau anzuzeigen. Batches von 20 oder weniger werden synchron aufgelöst (200, COMPLETED); größere Batches geben 202 zurück und laufen asynchron.",
        "operationId": "toggle_vendor_users_ongoing_monitoring",
        "x-didit-sdk": {
          "resource": "users",
          "method": "set_ongoing_monitoring",
          "auth": "api_key",
          "server": true,
          "scope": "application"
        },
        "tags": [
          "Users"
        ],
        "parameters": [
          {
            "name": "organization_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "UUID der Organisation."
          },
          {
            "name": "application_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Anwendungs-UUID."
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/OngoingMonitoringToggleRequest"
              },
              "example": {
                "is_enabled": true,
                "didit_internal_id_list": [
                  "5b9a0000-0000-4000-8000-00000000f00d"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Schätzung (bei estimate_only) oder der abgeschlossene Job für kleine Batches, die inline verarbeitet wurden.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OngoingMonitoringToggleResult"
                }
              }
            }
          },
          "202": {
            "description": "Größere Batches werden asynchron verarbeitet; fragen Sie den Job-Endpoint mit der zurückgegebenen job_id ab.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OngoingMonitoringJob"
                }
              }
            }
          },
          "403": {
            "description": "Fehlendes write:sessions-Privileg oder unzureichendes Guthaben zur Aktivierung (die Schätzung ist im Fehler-Body enthalten)."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "x-codeSamples": [
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.users.set_ongoing_monitoring(\n    is_enabled=True,\n    didit_internal_id_list=[\"5b9a0000-0000-4000-8000-00000000f00d\"],\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.users.setOngoingMonitoring({\n  is_enabled: true,\n  didit_internal_id_list: [\"5b9a0000-0000-4000-8000-00000000f00d\"],\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.Users.SetOngoingMonitoring(ctx, didit.OngoingMonitoringToggleRequest{\n\tIsEnabled:           true,\n\tDiditInternalIDList: didit.Some([]string{\"5b9a0000-0000-4000-8000-00000000f00d\"}),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import java.util.List;\nimport me.didit.Didit;\nimport me.didit.types.OngoingMonitoringToggleRequest;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.users().setOngoingMonitoring(OngoingMonitoringToggleRequest.builder()\n        .isEnabled(true)\n        .diditInternalIdList(List.of(\"5b9a0000-0000-4000-8000-00000000f00d\"))\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\n$didit = new DiditClient();\n\n$result = $didit->users->setOngoingMonitoring([\n    'is_enabled' => true,\n    'didit_internal_id_list' => ['5b9a0000-0000-4000-8000-00000000f00d'],\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.users.set_ongoing_monitoring(\n  is_enabled: true,\n  didit_internal_id_list: [\"5b9a0000-0000-4000-8000-00000000f00d\"]\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.Users.SetOngoingMonitoringAsync(new OngoingMonitoringToggleRequest\n{\n    IsEnabled = true,\n    DiditInternalIdList = new string[] { \"5b9a0000-0000-4000-8000-00000000f00d\" },\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ]
      }
    },
    "/v3/organization/{organization_id}/application/{application_id}/vendor-users/toggle-ongoing-monitoring/{job_id}/": {
      "get": {
        "summary": "Laufenden AML-Überwachungsauftrag abrufen",
        "description": "Fortschritt und Zähler pro Ergebnis eines Monitoring-Umschaltjobs. Alle paar Sekunden abfragen, solange der Status PENDING oder PROCESSING lautet.",
        "operationId": "get_vendor_users_ongoing_monitoring_job",
        "x-didit-sdk": {
          "resource": "users",
          "method": "retrieve_ongoing_monitoring_job",
          "auth": "api_key",
          "server": true,
          "scope": "application"
        },
        "tags": [
          "Users"
        ],
        "parameters": [
          {
            "name": "organization_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "UUID der Organisation."
          },
          {
            "name": "application_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Anwendungs-UUID."
          },
          {
            "name": "job_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "UUID des Überwachungs-Jobs, die vom Umschalt-Endpoint zurückgegeben wird."
          }
        ],
        "responses": {
          "200": {
            "description": "Der Job.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OngoingMonitoringJob"
                }
              }
            }
          },
          "404": {
            "description": "Unbekannter Job für diese Anwendung."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "x-codeSamples": [
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.users.retrieve_ongoing_monitoring_job(\n    \"11111111-2222-3333-4444-555555555555\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.users.retrieveOngoingMonitoringJob(\"11111111-2222-3333-4444-555555555555\");\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.Users.RetrieveOngoingMonitoringJob(ctx, \"11111111-2222-3333-4444-555555555555\")\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.users().retrieveOngoingMonitoringJob(\"11111111-2222-3333-4444-555555555555\");\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\n$didit = new DiditClient();\n\n$result = $didit->users->retrieveOngoingMonitoringJob('11111111-2222-3333-4444-555555555555');\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.users.retrieve_ongoing_monitoring_job(\"11111111-2222-3333-4444-555555555555\")\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.Users.RetrieveOngoingMonitoringJobAsync(\"11111111-2222-3333-4444-555555555555\");\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ]
      }
    },
    "/v3/organization/{organization_id}/application/{application_id}/vendor-businesses/toggle-ongoing-monitoring/": {
      "patch": {
        "summary": "Laufende AML-Überwachung für Unternehmen umschalten",
        "description": "Äquivalent zur Benutzerumschaltung auf Unternehmensebene: ein überwachtes AML-Screening pro Unternehmen, wobei Unternehmen ohne AML-Screening zuerst gescreent werden (Unternehmensentität). Derselbe Vertrag für estimate_only, den Inline-Fast-Path und den asynchronen Job.",
        "operationId": "toggle_vendor_businesses_ongoing_monitoring",
        "x-didit-sdk": {
          "resource": "businesses",
          "method": "set_ongoing_monitoring",
          "auth": "api_key",
          "server": true,
          "scope": "application"
        },
        "tags": [
          "Businesses"
        ],
        "parameters": [
          {
            "name": "organization_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "UUID der Organisation."
          },
          {
            "name": "application_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Anwendungs-UUID."
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/OngoingMonitoringToggleRequest"
              },
              "example": {
                "is_enabled": true,
                "didit_internal_id_list": [
                  "b0000000-0000-4000-8000-0000000000b1"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Schätzung (bei estimate_only) oder der abgeschlossene Job für kleine Batches, die inline verarbeitet wurden.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OngoingMonitoringToggleResult"
                }
              }
            }
          },
          "202": {
            "description": "Größere Batches werden asynchron verarbeitet; fragen Sie den Job-Endpoint mit der zurückgegebenen job_id ab.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OngoingMonitoringJob"
                }
              }
            }
          },
          "403": {
            "description": "Fehlendes write:sessions-Privileg oder unzureichendes Guthaben zur Aktivierung (die Schätzung ist im Fehler-Body enthalten)."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "x-codeSamples": [
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.businesses.set_ongoing_monitoring(\n    is_enabled=True,\n    didit_internal_id_list=[\"b0000000-0000-4000-8000-0000000000b1\"],\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.businesses.setOngoingMonitoring({\n  is_enabled: true,\n  didit_internal_id_list: [\"b0000000-0000-4000-8000-0000000000b1\"],\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.Businesses.SetOngoingMonitoring(ctx, didit.OngoingMonitoringToggleRequest{\n\tIsEnabled:           true,\n\tDiditInternalIDList: didit.Some([]string{\"b0000000-0000-4000-8000-0000000000b1\"}),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import java.util.List;\nimport me.didit.Didit;\nimport me.didit.types.OngoingMonitoringToggleRequest;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.businesses().setOngoingMonitoring(OngoingMonitoringToggleRequest.builder()\n        .isEnabled(true)\n        .diditInternalIdList(List.of(\"b0000000-0000-4000-8000-0000000000b1\"))\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\n$didit = new DiditClient();\n\n$result = $didit->businesses->setOngoingMonitoring([\n    'is_enabled' => true,\n    'didit_internal_id_list' => ['b0000000-0000-4000-8000-0000000000b1'],\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.businesses.set_ongoing_monitoring(\n  is_enabled: true,\n  didit_internal_id_list: [\"b0000000-0000-4000-8000-0000000000b1\"]\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.Businesses.SetOngoingMonitoringAsync(new OngoingMonitoringToggleRequest\n{\n    IsEnabled = true,\n    DiditInternalIdList = new string[] { \"b0000000-0000-4000-8000-0000000000b1\" },\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ]
      }
    },
    "/v3/organization/{organization_id}/application/{application_id}/vendor-businesses/toggle-ongoing-monitoring/{job_id}/": {
      "get": {
        "summary": "Laufenden AML-Überwachungsauftrag abrufen",
        "description": "Fortschritt und Zähler pro Ergebnis eines Monitoring-Umschaltjobs. Alle paar Sekunden abfragen, solange der Status PENDING oder PROCESSING lautet.",
        "operationId": "get_vendor_businesses_ongoing_monitoring_job",
        "x-didit-sdk": {
          "resource": "businesses",
          "method": "retrieve_ongoing_monitoring_job",
          "auth": "api_key",
          "server": true,
          "scope": "application"
        },
        "tags": [
          "Businesses"
        ],
        "parameters": [
          {
            "name": "organization_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "UUID der Organisation."
          },
          {
            "name": "application_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Anwendungs-UUID."
          },
          {
            "name": "job_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "UUID des Überwachungs-Jobs, die vom Umschalt-Endpoint zurückgegeben wird."
          }
        ],
        "responses": {
          "200": {
            "description": "Der Job.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OngoingMonitoringJob"
                }
              }
            }
          },
          "404": {
            "description": "Unbekannter Job für diese Anwendung."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "x-codeSamples": [
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.businesses.retrieve_ongoing_monitoring_job(\n    \"11111111-2222-3333-4444-555555555555\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.businesses.retrieveOngoingMonitoringJob(\"11111111-2222-3333-4444-555555555555\");\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.Businesses.RetrieveOngoingMonitoringJob(ctx, \"11111111-2222-3333-4444-555555555555\")\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.businesses().retrieveOngoingMonitoringJob(\"11111111-2222-3333-4444-555555555555\");\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\n$didit = new DiditClient();\n\n$result = $didit->businesses->retrieveOngoingMonitoringJob('11111111-2222-3333-4444-555555555555');\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.businesses.retrieve_ongoing_monitoring_job(\"11111111-2222-3333-4444-555555555555\")\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.Businesses.RetrieveOngoingMonitoringJobAsync(\"11111111-2222-3333-4444-555555555555\");\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ]
      }
    },
    "/v3/organization/{organization_id}/application/{application_id}/businesses/toggle-ongoing-monitoring/": {
      "patch": {
        "summary": "Laufende AML-Überwachung für Unternehmenssitzungen umschalten",
        "description": "Umschalter auf Sitzungsebene für KYB-Verifizierungen, adressiert über die Sitzungsnummer. Für Sitzungen ohne AML-Screening wird eines erstellt und an die Sitzung selbst angehängt. Derselbe Vertrag für estimate_only, den Inline-Fast-Path und asynchrone Jobs wie bei den Endpoints auf Benutzerebene. Ersetzt das veraltete synchrone Verhalten, bei dem Sitzungen ohne AML-Screening übersprungen wurden.",
        "operationId": "toggle_business_sessions_ongoing_monitoring",
        "x-didit-sdk": {
          "resource": "businesses",
          "method": "set_session_ongoing_monitoring",
          "auth": "api_key",
          "server": true,
          "scope": "application"
        },
        "tags": [
          "Businesses"
        ],
        "parameters": [
          {
            "name": "organization_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "UUID der Organisation."
          },
          {
            "name": "application_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Anwendungs-UUID."
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "is_enabled"
                ],
                "properties": {
                  "is_enabled": {
                    "type": "boolean",
                    "description": "true, um die Überwachung zu aktivieren, false, um sie zu deaktivieren."
                  },
                  "estimate_only": {
                    "type": "boolean",
                    "default": false,
                    "description": "Wenn true, wird die Kostenschätzung zurückgegeben und es werden keine Schreibvorgänge ausgeführt."
                  },
                  "update_all": {
                    "type": "boolean",
                    "default": false,
                    "description": "Auf jede Entität der Anwendung anwenden (eingegrenzt durch die filter_*-Parameter, sofern vorhanden)."
                  },
                  "filter_search": {
                    "type": "string"
                  },
                  "filter_status": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    }
                  },
                  "filter_country": {
                    "type": "string"
                  },
                  "filter_date_from": {
                    "type": "string",
                    "format": "date"
                  },
                  "filter_date_to": {
                    "type": "string",
                    "format": "date"
                  },
                  "session_numbers": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    },
                    "description": "Nummern der Unternehmenssitzungen, die umgeschaltet werden sollen. Erforderlich, sofern update_all (oder das Legacy-Alias toggle_all) nicht true ist."
                  },
                  "toggle_all": {
                    "type": "boolean",
                    "default": false,
                    "description": "Veralteter Alias für update_all."
                  },
                  "filter_workflow_id": {
                    "type": "string"
                  }
                }
              },
              "example": {
                "is_enabled": true,
                "session_numbers": [
                  "1001",
                  "1002"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Schätzung (bei estimate_only) oder der abgeschlossene Job für kleine Batches, die inline verarbeitet wurden.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OngoingMonitoringToggleResult"
                }
              }
            }
          },
          "202": {
            "description": "Größere Batches werden asynchron verarbeitet; fragen Sie den Job-Endpoint mit der zurückgegebenen job_id ab.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OngoingMonitoringJob"
                }
              }
            }
          },
          "403": {
            "description": "Fehlendes write:sessions-Privileg oder unzureichendes Guthaben zur Aktivierung (die Schätzung ist im Fehler-Body enthalten)."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "x-codeSamples": [
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.businesses.set_session_ongoing_monitoring(\n    is_enabled=True,\n    session_numbers=[\"1001\", \"1002\"],\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.businesses.setSessionOngoingMonitoring({\n  is_enabled: true,\n  session_numbers: [\"1001\", \"1002\"],\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.Businesses.SetSessionOngoingMonitoring(ctx, didit.BusinessesSetSessionOngoingMonitoringParams{\n\tIsEnabled:      true,\n\tSessionNumbers: didit.Some([]string{\"1001\", \"1002\"}),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import java.util.List;\nimport me.didit.Didit;\nimport me.didit.types.BusinessesSetSessionOngoingMonitoringParams;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.businesses().setSessionOngoingMonitoring(BusinessesSetSessionOngoingMonitoringParams.builder()\n        .isEnabled(true)\n        .sessionNumbers(List.of(\"1001\", \"1002\"))\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\n$didit = new DiditClient();\n\n$result = $didit->businesses->setSessionOngoingMonitoring([\n    'is_enabled' => true,\n    'session_numbers' => ['1001', '1002'],\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.businesses.set_session_ongoing_monitoring(\n  is_enabled: true,\n  session_numbers: [\"1001\", \"1002\"]\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.Businesses.SetSessionOngoingMonitoringAsync(new BusinessesSetSessionOngoingMonitoringParams\n{\n    IsEnabled = true,\n    SessionNumbers = new string[] { \"1001\", \"1002\" },\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ]
      }
    },
    "/v3/organization/{organization_id}/application/{application_id}/businesses/toggle-ongoing-monitoring/{job_id}/": {
      "get": {
        "summary": "Laufenden AML-Überwachungsauftrag abrufen",
        "description": "Fortschritt und Zähler pro Ergebnis eines Monitoring-Umschaltjobs. Alle paar Sekunden abfragen, solange der Status PENDING oder PROCESSING lautet.",
        "operationId": "get_business_sessions_ongoing_monitoring_job",
        "x-didit-sdk": {
          "resource": "businesses",
          "method": "retrieve_session_ongoing_monitoring_job",
          "auth": "api_key",
          "server": true,
          "scope": "application"
        },
        "tags": [
          "Businesses"
        ],
        "parameters": [
          {
            "name": "organization_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "UUID der Organisation."
          },
          {
            "name": "application_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Anwendungs-UUID."
          },
          {
            "name": "job_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "UUID des Überwachungs-Jobs, die vom Umschalt-Endpoint zurückgegeben wird."
          }
        ],
        "responses": {
          "200": {
            "description": "Der Job.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OngoingMonitoringJob"
                }
              }
            }
          },
          "404": {
            "description": "Unbekannter Job für diese Anwendung."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "x-codeSamples": [
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.businesses.retrieve_session_ongoing_monitoring_job(\n    \"11111111-2222-3333-4444-555555555555\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.businesses.retrieveSessionOngoingMonitoringJob(\"11111111-2222-3333-4444-555555555555\");\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.Businesses.RetrieveSessionOngoingMonitoringJob(ctx, \"11111111-2222-3333-4444-555555555555\")\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.businesses().retrieveSessionOngoingMonitoringJob(\"11111111-2222-3333-4444-555555555555\");\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\n$didit = new DiditClient();\n\n$result = $didit->businesses->retrieveSessionOngoingMonitoringJob('11111111-2222-3333-4444-555555555555');\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.businesses.retrieve_session_ongoing_monitoring_job(\"11111111-2222-3333-4444-555555555555\")\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.Businesses.RetrieveSessionOngoingMonitoringJobAsync(\"11111111-2222-3333-4444-555555555555\");\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ]
      }
    },
    "/v3/organization/{organization_id}/application/{application_id}/cases/": {
      "get": {
        "summary": "Fälle auflisten",
        "description": "Fälle für die Anwendung auflisten, neueste zuerst. Unterstützt Filterung, Suche und Sortierung; siehe Abfrageparameter. Paginiert mit `limit`/`offset`.",
        "operationId": "list_cases",
        "x-didit-sdk": {
          "resource": "cases",
          "method": "list",
          "auth": "api_key",
          "server": true,
          "scope": "application"
        },
        "tags": [
          "Cases"
        ],
        "parameters": [
          {
            "name": "organization_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "UUID der Organisation."
          },
          {
            "name": "application_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Anwendungs-UUID."
          },
          {
            "name": "limit",
            "in": "query",
            "schema": {
              "type": "integer",
              "default": 50,
              "minimum": 1
            },
            "description": "Seitengröße. Standardmäßig 50."
          },
          {
            "name": "offset",
            "in": "query",
            "schema": {
              "type": "integer",
              "default": 0,
              "minimum": 0
            },
            "description": "Nullbasierter Offset des ersten Datensatzes."
          },
          {
            "name": "status__in",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "Kommagetrennte Liste der einzuschließenden Status, z. B. OPEN,AWAITING_USER."
          },
          {
            "name": "priority",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "Kommagetrennte Liste der einzuschließenden Prioritäten."
          },
          {
            "name": "source__in",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "Kommagetrennte Liste der einzuschließenden Quellen."
          },
          {
            "name": "blueprint",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Auf Fälle mit diesem Blueprint filtern."
          },
          {
            "name": "assigned_to",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Auf Fälle filtern, die diesem Benutzer zugewiesen sind."
          },
          {
            "name": "unassigned",
            "in": "query",
            "schema": {
              "type": "boolean"
            },
            "description": "true für nicht zugewiesene Fälle, false für zugewiesene Fälle."
          },
          {
            "name": "tag",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "Auf Fälle filtern, die genau diesen Tag aufweisen."
          },
          {
            "name": "search",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "Stimmt mit title, case_number, tag, dem Namen, der UUID oder der externen ID der betroffenen Person sowie der verknüpften Sitzungs-UUID oder Transaktions-UUID überein."
          },
          {
            "name": "date_from",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date"
            },
            "description": "Untergrenze für das Erstellungsdatum (inklusiv)."
          },
          {
            "name": "date_to",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date"
            },
            "description": "Obergrenze für das Erstellungsdatum (inklusiv)."
          },
          {
            "name": "due_before",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date-time"
            },
            "description": "due_at Obergrenze."
          },
          {
            "name": "overdue",
            "in": "query",
            "schema": {
              "type": "boolean"
            },
            "description": "true, um nur überfällige Fälle im Status open/awaiting-user zurückzugeben."
          },
          {
            "name": "ordering",
            "in": "query",
            "schema": {
              "type": "string",
              "enum": [
                "created_at",
                "-created_at",
                "due_at",
                "-due_at"
              ],
              "default": "-created_at"
            },
            "description": "Sortierreihenfolge. due_at sortiert Nullwerte zuletzt."
          }
        ],
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X GET 'https://verification.didit.me/v3/organization/11111111-2222-3333-4444-555555555555/application/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/cases/?status__in=OPEN,AWAITING_USER&ordering=-due_at' \\\n  -H 'x-api-key: YOUR_API_KEY'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nfor item in client.cases.list():\n    print(item)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nfor await (const item of didit.cases.list()) {\n  console.log(item);\n}"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\niter := client.Cases.ListAutoPaging(ctx, didit.CasesListParams{})\nfor iter.Next() {\n\tfmt.Printf(\"%+v\\n\", iter.Current())\n}\nif err := iter.Err(); err != nil {\n\tlog.Fatal(err)\n}"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nfor (var item : client.cases().list()) {\n    System.out.println(item);\n}"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\n$didit = new DiditClient();\n\nforeach ($didit->cases->list() as $item) {\n    print_r($item->toArray());\n}"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\ndidit.cases.list.auto_paging_each do |item|\n  puts item.to_h\nend"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nawait foreach (var item in await client.Cases.ListAsync())\n{\n    Console.WriteLine(JsonSerializer.Serialize(item));\n}"
          }
        ],
        "responses": {
          "200": {
            "description": "Paginierte Fallliste.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "count": {
                      "type": "integer",
                      "description": "Anzahl der übereinstimmenden Zeilen. Exakt bis 100, darüber aus Performancegründen auf 100 begrenzt. Verlassen Sie sich darauf, dass `next` null ist, um die letzte Seite zu erkennen."
                    },
                    "next": {
                      "type": "string",
                      "nullable": true,
                      "description": "Absolute URL der nächsten Seite oder null."
                    },
                    "previous": {
                      "type": "string",
                      "nullable": true,
                      "description": "Absolute URL der vorherigen Seite oder null."
                    },
                    "results": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/CaseListItem"
                      }
                    }
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      },
      "post": {
        "summary": "Fall erstellen",
        "description": "Erstellen Sie einen Fall, der an genau einem Subjekt (einem Benutzer oder einem Unternehmen) verankert ist, entweder direkt oder durch Ableitung des Subjekts aus einer angehängten Sitzungs-/Transaktionsverknüpfung. Die Quelle ist für über die API erstellte Fälle immer `MANUAL`.",
        "operationId": "create_case",
        "x-didit-sdk": {
          "resource": "cases",
          "method": "create",
          "auth": "api_key",
          "server": true,
          "scope": "application"
        },
        "tags": [
          "Cases"
        ],
        "parameters": [
          {
            "name": "organization_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "UUID der Organisation."
          },
          {
            "name": "application_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Anwendungs-UUID."
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "title"
                ],
                "properties": {
                  "title": {
                    "type": "string",
                    "maxLength": 255
                  },
                  "blueprint": {
                    "type": "string",
                    "format": "uuid",
                    "nullable": true,
                    "description": "CaseBlueprint-UUID. Weglassen für keine Vorlage."
                  },
                  "priority": {
                    "type": "string",
                    "enum": [
                      "LOW",
                      "MEDIUM",
                      "HIGH"
                    ],
                    "default": "MEDIUM"
                  },
                  "due_at": {
                    "type": "string",
                    "format": "date-time",
                    "nullable": true
                  },
                  "tags": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    }
                  },
                  "subject": {
                    "type": "object",
                    "description": "Erforderlich, es sei denn, links ist angegeben; das einzige Subjekt des Falls.",
                    "properties": {
                      "type": {
                        "type": "string",
                        "enum": [
                          "user",
                          "business"
                        ]
                      },
                      "uuid": {
                        "type": "string",
                        "format": "uuid"
                      }
                    }
                  },
                  "links": {
                    "type": "array",
                    "description": "Sitzungen/Unternehmenssitzungen/Transaktionen, die bei der Erstellung verknüpft werden sollen, z. B. [{\"entity_type\": \"transaction\", \"entity_uuid\": \"...\"}]. Wenn das Subjekt weggelassen wird, wird das Subjekt vom Eigentümer der ersten Verknüpfung abgeleitet.",
                    "items": {
                      "type": "object"
                    }
                  },
                  "assigned_to": {
                    "type": "string",
                    "format": "uuid",
                    "nullable": true,
                    "description": "UUID des Benutzers, die sofort zugewiesen werden soll."
                  },
                  "review_duplicates": {
                    "type": "boolean",
                    "default": false,
                    "description": "Bestehende Untersuchungen vor dem Erstellen des Falls erneut prüfen. Wenn true, erfordert ein Subjekt mit bestehenden Fällen einen nicht leeren separate_incident_reason. Die Konsole aktiviert diesen Schutz immer. Das Weglassen behält das bisherige API-Verhalten bei."
                  },
                  "separate_incident_reason": {
                    "type": "string",
                    "maxLength": 1000
                  },
                  "source_context": {
                    "$ref": "#/components/schemas/CaseDuplicateCaseFraudSourceContextRequest"
                  }
                }
              },
              "example": {
                "title": "Manual - Jane Doe",
                "blueprint": "b1de0000-0000-4000-8000-000000000002",
                "priority": "HIGH",
                "subject": {
                  "type": "user",
                  "uuid": "5b9a0000-0000-4000-8000-00000000f00d"
                },
                "tags": [
                  "review"
                ]
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X POST 'https://verification.didit.me/v3/organization/11111111-2222-3333-4444-555555555555/application/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/cases/' \\\n  -H 'x-api-key: YOUR_API_KEY' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\"title\": \"Manual - Jane Doe\", \"blueprint\": \"b1de0000-0000-4000-8000-000000000002\", \"priority\": \"HIGH\", \"subject\": {\"type\": \"user\", \"uuid\": \"5b9a0000-0000-4000-8000-00000000f00d\"}, \"tags\": [\"review\"]}'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.cases.create(\n    title=\"Manual - Jane Doe\",\n    blueprint=\"b1de0000-0000-4000-8000-000000000002\",\n    priority=\"HIGH\",\n    tags=[\"review\"],\n    subject={\n        \"type\": \"user\",\n        \"uuid\": \"5b9a0000-0000-4000-8000-00000000f00d\",\n    },\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.cases.create({\n  title: \"Manual - Jane Doe\",\n  blueprint: \"b1de0000-0000-4000-8000-000000000002\",\n  priority: \"HIGH\",\n  tags: [\"review\"],\n  subject: {\n    type: \"user\",\n    uuid: \"5b9a0000-0000-4000-8000-00000000f00d\",\n  },\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.Cases.Create(ctx, didit.CasesCreateParams{\n\tTitle:     \"Manual - Jane Doe\",\n\tBlueprint: didit.String(\"b1de0000-0000-4000-8000-000000000002\"),\n\tPriority:  didit.Some(didit.CasesCreateParamsPriority(\"HIGH\")),\n\tTags:      didit.Some([]string{\"review\"}),\n\tSubject: didit.Some(didit.CasesCreateParamsSubject{\n\t\tType: didit.Some(didit.CasesCreateParamsSubjectType(\"user\")),\n\t\tUUID: didit.String(\"5b9a0000-0000-4000-8000-00000000f00d\"),\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;\nimport me.didit.Didit;\nimport me.didit.types.CasesCreateParams;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.cases().create(CasesCreateParams.builder()\n        .title(\"Manual - Jane Doe\")\n        .blueprint(\"b1de0000-0000-4000-8000-000000000002\")\n        .priority(CasesCreateParams.Priority.of(\"HIGH\"))\n        .tags(List.of(\"review\"))\n        .subject(CasesCreateParams.Subject.builder()\n                .type(CasesCreateParams.Subject.Type.of(\"user\"))\n                .uuid(\"5b9a0000-0000-4000-8000-00000000f00d\")\n                .build())\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\n$didit = new DiditClient();\n\n$result = $didit->cases->create([\n    'title' => 'Manual - Jane Doe',\n    'blueprint' => 'b1de0000-0000-4000-8000-000000000002',\n    'priority' => 'HIGH',\n    'tags' => ['review'],\n    'subject' => [\n        'type' => 'user',\n        'uuid' => '5b9a0000-0000-4000-8000-00000000f00d',\n    ],\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.cases.create(\n  title: \"Manual - Jane Doe\",\n  blueprint: \"b1de0000-0000-4000-8000-000000000002\",\n  priority: \"HIGH\",\n  tags: [\"review\"],\n  subject: {\n    type: \"user\",\n    uuid: \"5b9a0000-0000-4000-8000-00000000f00d\",\n  }\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.Cases.CreateAsync(new CasesCreateParams\n{\n    Title = \"Manual - Jane Doe\",\n    Blueprint = \"b1de0000-0000-4000-8000-000000000002\",\n    Priority = new CasesCreateParamsPriority(\"HIGH\"),\n    Tags = new string[] { \"review\" },\n    Subject = new CasesCreateParamsSubject\n    {\n        Type = new CasesCreateParamsSubjectType(\"user\"),\n        Uuid = \"5b9a0000-0000-4000-8000-00000000f00d\",\n    },\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "responses": {
          "201": {
            "description": "Fall erstellt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CaseDetail"
                }
              }
            }
          },
          "400": {
            "description": "Weder subject noch links angegeben, oder subject/blueprint/assignee wurde nicht gefunden.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "409": {
            "description": "Die Duplikatprüfung ist aktiviert und es wurde ein bestehender Fall ohne Grund für einen separaten Vorfall gefunden. Es wurde kein Fall erstellt."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/v3/organization/{organization_id}/application/{application_id}/cases/{case_uuid}/": {
      "get": {
        "summary": "Fall abrufen",
        "description": "Einen Fall mit dem Betroffenen, Vorlage, Notizen, Ereignissen, Verknüpfungen und Checkliste abrufen.",
        "operationId": "get_case",
        "x-didit-sdk": {
          "resource": "cases",
          "method": "retrieve",
          "auth": "api_key",
          "server": true,
          "scope": "application"
        },
        "tags": [
          "Cases"
        ],
        "parameters": [
          {
            "name": "organization_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "UUID der Organisation."
          },
          {
            "name": "application_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Anwendungs-UUID."
          },
          {
            "name": "case_uuid",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "c1a5e000-0000-4000-8000-000000000001"
            },
            "description": "Fall-UUID."
          }
        ],
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X GET 'https://verification.didit.me/v3/organization/11111111-2222-3333-4444-555555555555/application/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/cases/c1a5e000-0000-4000-8000-000000000001/' \\\n  -H 'x-api-key: YOUR_API_KEY'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.cases.retrieve(\n    \"c1a5e000-0000-4000-8000-000000000001\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.cases.retrieve(\"c1a5e000-0000-4000-8000-000000000001\");\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.Cases.Retrieve(ctx, \"c1a5e000-0000-4000-8000-000000000001\")\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.cases().retrieve(\"c1a5e000-0000-4000-8000-000000000001\");\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\n$didit = new DiditClient();\n\n$result = $didit->cases->retrieve('c1a5e000-0000-4000-8000-000000000001');\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.cases.retrieve(\"c1a5e000-0000-4000-8000-000000000001\")\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.Cases.RetrieveAsync(\"c1a5e000-0000-4000-8000-000000000001\");\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "responses": {
          "200": {
            "description": "Falldetails.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CaseDetail"
                }
              }
            }
          },
          "404": {
            "description": "Fall (oder verschachtelte Ressource) in dieser Anwendung nicht gefunden.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      },
      "patch": {
        "summary": "Fall aktualisieren",
        "description": "Titel, Priorität, Fälligkeitsdatum, Tags oder zuständiges Prüferteam des Falls aktualisieren. Übertragen Sie nur die Felder, die Sie ändern möchten; weggelassene Felder behalten ihren Wert. `tags` ersetzt die gesamte Tag-Liste. `team` akzeptiert die UUID eines aktiven Prüferteams dieser Anwendung (Listenabruf über `GET .../cases/teams/`) oder null, um die Zuweisung aufzuheben. Erfordert einen API-Schlüssel mit Vollzugriff oder `write:cases` für ein Konsolenmitglied: Ein Schlüssel mit eingeschränktem Zugriff erhält 403. Protokolliert je nach Änderung die Ereignisse PRIORITY_CHANGED, DUE_DATE_CHANGED, TAG_ADDED, TAG_REMOVED und TEAM_CHANGED; eine Titeländerung wird ohne Timeline-Ereignis gespeichert. Gibt den aktualisierten Fall zurück.",
        "operationId": "update_case",
        "x-didit-sdk": {
          "resource": "cases",
          "method": "update",
          "auth": "api_key",
          "server": true,
          "scope": "application"
        },
        "tags": [
          "Cases"
        ],
        "parameters": [
          {
            "name": "organization_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "UUID der Organisation."
          },
          {
            "name": "application_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Anwendungs-UUID."
          },
          {
            "name": "case_uuid",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "c1a5e000-0000-4000-8000-000000000001"
            },
            "description": "Fall-UUID."
          }
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "title": {
                    "type": "string",
                    "maxLength": 255,
                    "description": "Neuer Falltitel."
                  },
                  "priority": {
                    "type": "string",
                    "enum": [
                      "LOW",
                      "MEDIUM",
                      "HIGH"
                    ]
                  },
                  "due_at": {
                    "type": "string",
                    "format": "date-time",
                    "nullable": true,
                    "description": "Neue Frist. Senden Sie null, um sie zu löschen."
                  },
                  "tags": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    },
                    "description": "Die vollständige Tag-Liste. Sie ersetzt die aktuellen Tags."
                  },
                  "team": {
                    "type": "string",
                    "format": "uuid",
                    "nullable": true,
                    "description": "UUID des Prüfungsteams, dem der Fall gehört. Es muss ein aktives Team dieser Anwendung sein. Senden Sie null, um das Team zu entfernen."
                  }
                }
              },
              "examples": {
                "Change priority and deadline": {
                  "value": {
                    "priority": "HIGH",
                    "due_at": "2026-11-01T00:00:00Z"
                  }
                },
                "Move the case to a team": {
                  "value": {
                    "team": "3fa85f64-5717-4562-b3fc-2c963f66afa6"
                  }
                },
                "Clear the team": {
                  "value": {
                    "team": null
                  }
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X PATCH 'https://verification.didit.me/v3/organization/11111111-2222-3333-4444-555555555555/application/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/cases/c1a5e000-0000-4000-8000-000000000001/' \\\n  -H 'x-api-key: YOUR_API_KEY' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\"priority\": \"HIGH\", \"due_at\": \"2026-08-01T00:00:00Z\"}'"
          },
          {
            "lang": "curl",
            "label": "curl (change team)",
            "source": "curl -X PATCH 'https://verification.didit.me/v3/organization/11111111-2222-3333-4444-555555555555/application/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/cases/c1a5e000-0000-4000-8000-000000000001/' \\\n  -H 'x-api-key: YOUR_API_KEY' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\"team\": \"3fa85f64-5717-4562-b3fc-2c963f66afa6\"}'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.cases.update(\n    \"c1a5e000-0000-4000-8000-000000000001\",\n    priority=\"HIGH\",\n    due_at=\"2026-11-01T00:00:00Z\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.cases.update(\"c1a5e000-0000-4000-8000-000000000001\", {\n  priority: \"HIGH\",\n  due_at: \"2026-11-01T00:00:00Z\",\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.Cases.Update(ctx, \"c1a5e000-0000-4000-8000-000000000001\", didit.CasesUpdateParams{\n\tPriority: didit.Some(didit.CasesUpdateParamsPriority(\"HIGH\")),\n\tDueAt:    didit.Time(time.Date(2026, 11, 1, 0, 0, 0, 0, time.UTC)),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import java.time.OffsetDateTime;\nimport me.didit.Didit;\nimport me.didit.types.CasesUpdateParams;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.cases().update(\"c1a5e000-0000-4000-8000-000000000001\", CasesUpdateParams.builder()\n        .priority(CasesUpdateParams.Priority.of(\"HIGH\"))\n        .dueAt(OffsetDateTime.parse(\"2026-11-01T00:00:00Z\"))\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\n$didit = new DiditClient();\n\n$result = $didit->cases->update('c1a5e000-0000-4000-8000-000000000001', [\n    'priority' => 'HIGH',\n    'due_at' => '2026-11-01T00:00:00Z',\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.cases.update(\n  \"c1a5e000-0000-4000-8000-000000000001\",\n  priority: \"HIGH\",\n  due_at: \"2026-11-01T00:00:00Z\"\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.Cases.UpdateAsync(\"c1a5e000-0000-4000-8000-000000000001\", new CasesUpdateParams\n{\n    Priority = new CasesUpdateParamsPriority(\"HIGH\"),\n    DueAt = DateTimeOffset.Parse(\"2026-11-01T00:00:00Z\"),\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "responses": {
          "200": {
            "description": "Aktualisierter Fall.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CaseDetail"
                }
              }
            }
          },
          "400": {
            "description": "Ein Feld hat die Validierung nicht bestanden. Der Body ist nach Feldnamen gegliedert. `team` wird abgelehnt, wenn es kein aktives Prüfteam dieser Anwendung ist.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    }
                  }
                },
                "examples": {
                  "Team not active in this application": {
                    "value": {
                      "team": [
                        "Choose an active team of this application."
                      ]
                    }
                  },
                  "Invalid priority": {
                    "value": {
                      "priority": [
                        "\"URGENT\" is not a valid choice."
                      ]
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Der API-Schlüssel gehört zu einer anderen Anwendung oder ist ein Schlüssel mit eingeschränktem Zugriff: Cases-Endpoints erfordern einen Schlüssel mit Vollzugriff. Ein Konsolen-Mitgliedstoken benötigt `write:cases`.",
            "content": {
              "application/json": {
                "examples": {
                  "Restricted API Key": {
                    "summary": "API-Schlüssel mit eingeschränktem Zugriff",
                    "value": {
                      "detail": "This API key has no access to this endpoint."
                    }
                  },
                  "Missing Privilege": {
                    "summary": "Console-Mitglied ohne write:cases oder Schlüssel einer anderen Anwendung",
                    "value": {
                      "detail": "You do not have permission to perform this action."
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Fall in dieser Anwendung nicht gefunden.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string"
                    }
                  }
                },
                "example": {
                  "detail": "No Case matches the given query."
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      },
      "delete": {
        "summary": "Fall löschen",
        "description": "Einen Fall dauerhaft löschen. Die zugehörigen Entwürfe regulatorischer Berichte werden mitgelöscht. Verknüpfte Verifizierungen, Personen, Unternehmen und Transaktionen werden nicht gelöscht. Es gibt keinen Endpoint zur Wiederherstellung.\n\nEnthält der Fall einen finalisierten regulatorischen Bericht, wird die gesamte Anfrage mit `409` abgelehnt und nichts gelöscht. Der Body verwendet `code: in_filed_report` und gibt für jeden Bericht `uuid`, `report_number`, `report_type` und `case_uuid` an. Löschen Sie die Berichte und wiederholen Sie die Anfrage anschließend.",
        "operationId": "delete_case",
        "x-didit-sdk": {
          "resource": "cases",
          "method": "delete",
          "auth": "api_key",
          "server": true,
          "scope": "application"
        },
        "tags": [
          "Cases"
        ],
        "parameters": [
          {
            "name": "organization_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "UUID der Organisation."
          },
          {
            "name": "application_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Anwendungs-UUID."
          },
          {
            "name": "case_uuid",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "c1a5e000-0000-4000-8000-000000000001"
            },
            "description": "Fall-UUID."
          }
        ],
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X DELETE 'https://verification.didit.me/v3/organization/11111111-2222-3333-4444-555555555555/application/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/cases/c1a5e000-0000-4000-8000-000000000001/' \\\n  -H 'x-api-key: YOUR_API_KEY'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nclient.cases.delete(\n    \"c1a5e000-0000-4000-8000-000000000001\",\n)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nawait didit.cases.delete(\"c1a5e000-0000-4000-8000-000000000001\");"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nif err := client.Cases.Delete(ctx, \"c1a5e000-0000-4000-8000-000000000001\"); err != nil {\n\tlog.Fatal(err)\n}"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nclient.cases().delete(\"c1a5e000-0000-4000-8000-000000000001\");"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\n$didit = new DiditClient();\n\n$didit->cases->delete('c1a5e000-0000-4000-8000-000000000001');"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\ndidit.cases.delete(\"c1a5e000-0000-4000-8000-000000000001\")"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nawait client.Cases.DeleteAsync(\"c1a5e000-0000-4000-8000-000000000001\");"
          }
        ],
        "responses": {
          "204": {
            "description": "Fall gelöscht."
          },
          "403": {
            "description": "Der Schlüssel kann keine Fälle löschen. Er erfordert einen Vollzugriffsschlüssel mit `write:cases`.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Der Fall existiert in dieser Anwendung nicht oder wurde bereits gelöscht.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          },
          "409": {
            "description": "Der Fall hat einen finalisierten regulatorischen Bericht. Es wird nichts gelöscht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/InFiledReportError"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/v3/organization/{organization_id}/application/{application_id}/cases/{case_uuid}/assign/": {
      "post": {
        "summary": "Fall zuweisen oder Zuweisung aufheben",
        "description": "Den Fall einem Benutzer zuweisen oder die Zuweisung aufheben, indem assignee_user_id: null gesendet wird. assignee_email/assignee_name legen automatisch eine Benutzerzeile an, falls der zugewiesene Benutzer noch nicht existiert.",
        "operationId": "assign_case",
        "x-didit-sdk": {
          "resource": "cases",
          "method": "assign",
          "auth": "api_key",
          "server": true,
          "scope": "application"
        },
        "tags": [
          "Cases"
        ],
        "parameters": [
          {
            "name": "organization_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "UUID der Organisation."
          },
          {
            "name": "application_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Anwendungs-UUID."
          },
          {
            "name": "case_uuid",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "c1a5e000-0000-4000-8000-000000000001"
            },
            "description": "Fall-UUID."
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "assignee_user_id"
                ],
                "properties": {
                  "assignee_user_id": {
                    "type": "string",
                    "format": "uuid",
                    "nullable": true,
                    "description": "null zum Aufheben der Zuweisung."
                  },
                  "assignee_email": {
                    "type": "string",
                    "format": "email",
                    "nullable": true
                  },
                  "assignee_name": {
                    "type": "string",
                    "nullable": true
                  }
                }
              },
              "example": {
                "assignee_user_id": "9a000000-0000-4000-8000-0000000000aa"
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X POST 'https://verification.didit.me/v3/organization/11111111-2222-3333-4444-555555555555/application/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/cases/c1a5e000-0000-4000-8000-000000000001/assign/' \\\n  -H 'x-api-key: YOUR_API_KEY' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\"assignee_user_id\": \"9a000000-0000-4000-8000-0000000000aa\"}'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.cases.assign(\n    \"c1a5e000-0000-4000-8000-000000000001\",\n    assignee_user_id=\"9a000000-0000-4000-8000-0000000000aa\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.cases.assign(\"c1a5e000-0000-4000-8000-000000000001\", {\n  assignee_user_id: \"9a000000-0000-4000-8000-0000000000aa\",\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.Cases.Assign(ctx, \"c1a5e000-0000-4000-8000-000000000001\", didit.CasesAssignParams{\n\tAssigneeUserID: didit.String(\"9a000000-0000-4000-8000-0000000000aa\"),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\nimport me.didit.types.CasesAssignParams;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.cases().assign(\"c1a5e000-0000-4000-8000-000000000001\", CasesAssignParams.builder()\n        .assigneeUserId(\"9a000000-0000-4000-8000-0000000000aa\")\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\n$didit = new DiditClient();\n\n$result = $didit->cases->assign('c1a5e000-0000-4000-8000-000000000001', [\n    'assignee_user_id' => '9a000000-0000-4000-8000-0000000000aa',\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.cases.assign(\n  \"c1a5e000-0000-4000-8000-000000000001\",\n  assignee_user_id: \"9a000000-0000-4000-8000-0000000000aa\"\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.Cases.AssignAsync(\"c1a5e000-0000-4000-8000-000000000001\", new CasesAssignParams\n{\n    AssigneeUserId = \"9a000000-0000-4000-8000-0000000000aa\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "responses": {
          "200": {
            "description": "Fall zugewiesen/Zuweisung aufgehoben.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CaseDetail"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/v3/organization/{organization_id}/application/{application_id}/cases/{case_uuid}/resolve/": {
      "post": {
        "summary": "Fall lösen",
        "description": "Schließen Sie den Fall mit einer von fünf Entscheidungen ab: FALSE_POSITIVE (kein Bedenken festgestellt), VALID_THREAT (Bedenken bestätigt), INCONCLUSIVE, REQUIREMENTS_NOT_MET oder REQUIREMENTS_SATISFIED. Wird mit 400 blockiert, wenn die Checkliste der Vorlage nicht optional ist und noch Punkte unvollständig sind, oder wenn die Vorlage eine Notiz zur Entscheidung verlangt und keine angegeben wird. Wenn die Vorlage des Falls einen Vier-Augen-Prüferschritt (four_eyes_checker_blueprint) enthält, wird die Entscheidung vorgemerkt (case.pending_resolution) und der Fall wechselt zur Prüfer-Vorlage, anstatt sofort abgeschlossen zu werden; ein anderer Prüfer muss approve oder reject-approval aufrufen. Reichen Sie eine Vier-Augen-Entscheidung als Console-Mitglied ein: Bei einer Entscheidung, die ein API-Schlüssel übermittelt, wird kein Ersteller erfasst, sodass approve und reject-approval für jeden Aufrufer 403 zurückgeben. Bei einer Vier-Augen-Vorlage können Sie mit `checker` das Mitglied benennen, das genehmigen muss: In diesem Fall kann nur dieses Mitglied die Entscheidung genehmigen oder ablehnen, und das Feld `checker` in der Antwort nennt dieses Mitglied. Ohne `checker` wartet die Entscheidung in der Warteschlange der Prüfer-Vorlage. Das Senden von `checker` bei einer Vorlage ohne Prüferschritt gibt 400 zurück.",
        "operationId": "resolve_case",
        "x-didit-sdk": {
          "resource": "cases",
          "method": "resolve",
          "auth": "api_key",
          "server": true,
          "scope": "application"
        },
        "tags": [
          "Cases"
        ],
        "parameters": [
          {
            "name": "organization_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "UUID der Organisation."
          },
          {
            "name": "application_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Anwendungs-UUID."
          },
          {
            "name": "case_uuid",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "c1a5e000-0000-4000-8000-000000000001"
            },
            "description": "Fall-UUID."
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "resolution"
                ],
                "properties": {
                  "resolution": {
                    "type": "string",
                    "enum": [
                      "FALSE_POSITIVE",
                      "VALID_THREAT",
                      "INCONCLUSIVE",
                      "REQUIREMENTS_NOT_MET",
                      "REQUIREMENTS_SATISFIED"
                    ]
                  },
                  "note": {
                    "type": "string",
                    "nullable": true,
                    "description": "Erforderlich, wenn der Blueprint require_resolution_note festlegt."
                  },
                  "checker": {
                    "type": "string",
                    "format": "uuid",
                    "nullable": true,
                    "description": "Nur für Vier-Augen-Blueprints. Die Benutzer-UUID des Mitglieds, das diesen Beschluss genehmigen muss (dieselbe ID wie `assigned_to.uuid` bei einem Fall oder `members[].user_id` in einem Prüfungsteam). Das Mitglied muss Fallzugriff auf diese Anwendung haben und darf nicht der Sachbearbeiter sein, der den Beschluss einreicht. Weglassen oder null übergeben, um den Beschluss der Prüfer-Warteschlange zu überlassen."
                  }
                }
              },
              "examples": {
                "Resolve": {
                  "value": {
                    "resolution": "FALSE_POSITIVE",
                    "note": "Confirmed legitimate activity after reviewing documents."
                  }
                },
                "Four-eyes blueprint with a named checker": {
                  "value": {
                    "resolution": "VALID_THREAT",
                    "note": "Document tampering confirmed.",
                    "checker": "3fa85f64-5717-4562-b3fc-2c963f66afa6"
                  }
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X POST 'https://verification.didit.me/v3/organization/11111111-2222-3333-4444-555555555555/application/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/cases/c1a5e000-0000-4000-8000-000000000001/resolve/' \\\n  -H 'x-api-key: YOUR_API_KEY' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\"resolution\": \"FALSE_POSITIVE\", \"note\": \"Confirmed legitimate activity after reviewing documents.\"}'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.cases.resolve(\n    \"c1a5e000-0000-4000-8000-000000000001\",\n    resolution=\"FALSE_POSITIVE\",\n    note=\"Confirmed legitimate activity after reviewing documents.\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.cases.resolve(\"c1a5e000-0000-4000-8000-000000000001\", {\n  resolution: \"FALSE_POSITIVE\",\n  note: \"Confirmed legitimate activity after reviewing documents.\",\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.Cases.Resolve(ctx, \"c1a5e000-0000-4000-8000-000000000001\", didit.CasesResolveParams{\n\tResolution: \"FALSE_POSITIVE\",\n\tNote:       didit.String(\"Confirmed legitimate activity after reviewing documents.\"),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\nimport me.didit.types.CasesResolveParams;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.cases().resolve(\"c1a5e000-0000-4000-8000-000000000001\", CasesResolveParams.builder()\n        .resolution(CasesResolveParams.Resolution.of(\"FALSE_POSITIVE\"))\n        .note(\"Confirmed legitimate activity after reviewing documents.\")\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\n$didit = new DiditClient();\n\n$result = $didit->cases->resolve('c1a5e000-0000-4000-8000-000000000001', [\n    'resolution' => 'FALSE_POSITIVE',\n    'note' => 'Confirmed legitimate activity after reviewing documents.',\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.cases.resolve(\n  \"c1a5e000-0000-4000-8000-000000000001\",\n  resolution: \"FALSE_POSITIVE\",\n  note: \"Confirmed legitimate activity after reviewing documents.\"\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.Cases.ResolveAsync(\"c1a5e000-0000-4000-8000-000000000001\", new CasesResolveParams\n{\n    Resolution = \"FALSE_POSITIVE\",\n    Note = \"Confirmed legitimate activity after reviewing documents.\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "responses": {
          "200": {
            "description": "Abgeschlossen oder zur 4-Augen-Genehmigung vorgemerkt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CaseDetail"
                }
              }
            }
          },
          "400": {
            "description": "Der Fallabschluss wurde verweigert. Nicht-Feld-Fehler werden als Liste von Zeichenfolgen zurückgegeben: eine unvollständige Checkliste, eine fehlende erforderliche Notiz oder ein `checker`, der nicht überprüft werden konnte oder kein aktiver Prüfer mit Fallzugriff auf diese Anwendung ist. `checker`-Fehler werden nach dem Feld geschlüsselt: Das benannte Mitglied ist der Compliance-Beauftragte, der den Fallabschluss einreicht, oder die Vorlage des Falls hat keinen Checker-Schritt.",
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "array",
                      "items": {
                        "type": "string"
                      }
                    },
                    {
                      "type": "object",
                      "additionalProperties": {
                        "type": "array",
                        "items": {
                          "type": "string"
                        }
                      }
                    }
                  ]
                },
                "examples": {
                  "Incomplete checklist": {
                    "value": [
                      "Case has incomplete checklist items: Verify source of funds"
                    ]
                  },
                  "Resolution note required": {
                    "value": [
                      "A resolution note is required to resolve this case."
                    ]
                  },
                  "Reviewer access could not be verified": {
                    "value": [
                      "Reviewer access could not be verified. Try again."
                    ]
                  },
                  "Checker is not an active reviewer": {
                    "value": [
                      "Choose an active reviewer with case access to this application."
                    ]
                  },
                  "Checker is the submitting officer": {
                    "value": {
                      "checker": [
                        "The officer who submitted the resolution cannot be its checker."
                      ]
                    }
                  },
                  "Policy has no checker step": {
                    "value": {
                      "checker": [
                        "This review policy has no checker step, so the case resolves directly."
                      ]
                    }
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/v3/organization/{organization_id}/application/{application_id}/cases/{case_uuid}/reopen/": {
      "post": {
        "summary": "Fall wiedereröffnen",
        "description": "Setzt einen Fall im Status awaiting-user oder resolved wieder auf open zurück und leert resolution, resolution_notes, resolved_at sowie resolved_by_email.",
        "operationId": "reopen_case",
        "x-didit-sdk": {
          "resource": "cases",
          "method": "reopen",
          "auth": "api_key",
          "server": true,
          "scope": "application"
        },
        "tags": [
          "Cases"
        ],
        "parameters": [
          {
            "name": "organization_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "UUID der Organisation."
          },
          {
            "name": "application_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Anwendungs-UUID."
          },
          {
            "name": "case_uuid",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "c1a5e000-0000-4000-8000-000000000001"
            },
            "description": "Fall-UUID."
          }
        ],
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X POST 'https://verification.didit.me/v3/organization/11111111-2222-3333-4444-555555555555/application/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/cases/c1a5e000-0000-4000-8000-000000000001/reopen/' \\\n  -H 'x-api-key: YOUR_API_KEY'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.cases.reopen(\n    \"c1a5e000-0000-4000-8000-000000000001\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.cases.reopen(\"c1a5e000-0000-4000-8000-000000000001\");\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.Cases.Reopen(ctx, \"c1a5e000-0000-4000-8000-000000000001\")\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.cases().reopen(\"c1a5e000-0000-4000-8000-000000000001\");\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\n$didit = new DiditClient();\n\n$result = $didit->cases->reopen('c1a5e000-0000-4000-8000-000000000001');\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.cases.reopen(\"c1a5e000-0000-4000-8000-000000000001\")\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.Cases.ReopenAsync(\"c1a5e000-0000-4000-8000-000000000001\");\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "responses": {
          "200": {
            "description": "Fall wiedereröffnen.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CaseDetail"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/v3/organization/{organization_id}/application/{application_id}/cases/{case_uuid}/request-info/": {
      "post": {
        "summary": "Informationen anfordern (wartet auf den Benutzer)",
        "description": "Verschiebt einen offenen Fall nach awaiting_user, während weitere Informationen vom verifizierten Benutzer eingeholt werden. Schlägt mit 400 fehl, wenn eine Lösung derzeit auf eine Vier-Augen-Freigabe wartet.",
        "operationId": "request_case_info",
        "x-didit-sdk": {
          "resource": "cases",
          "method": "request_info",
          "auth": "api_key",
          "server": true,
          "scope": "application"
        },
        "tags": [
          "Cases"
        ],
        "parameters": [
          {
            "name": "organization_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "UUID der Organisation."
          },
          {
            "name": "application_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Anwendungs-UUID."
          },
          {
            "name": "case_uuid",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "c1a5e000-0000-4000-8000-000000000001"
            },
            "description": "Fall-UUID."
          }
        ],
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X POST 'https://verification.didit.me/v3/organization/11111111-2222-3333-4444-555555555555/application/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/cases/c1a5e000-0000-4000-8000-000000000001/request-info/' \\\n  -H 'x-api-key: YOUR_API_KEY'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.cases.request_info(\n    \"c1a5e000-0000-4000-8000-000000000001\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.cases.requestInfo(\"c1a5e000-0000-4000-8000-000000000001\");\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.Cases.RequestInfo(ctx, \"c1a5e000-0000-4000-8000-000000000001\")\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.cases().requestInfo(\"c1a5e000-0000-4000-8000-000000000001\");\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\n$didit = new DiditClient();\n\n$result = $didit->cases->requestInfo('c1a5e000-0000-4000-8000-000000000001');\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.cases.request_info(\"c1a5e000-0000-4000-8000-000000000001\")\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.Cases.RequestInfoAsync(\"c1a5e000-0000-4000-8000-000000000001\");\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "responses": {
          "200": {
            "description": "Informationen anfordern (wartet auf den Benutzer).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CaseDetail"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/v3/organization/{organization_id}/application/{application_id}/cases/{case_uuid}/escalate/": {
      "post": {
        "summary": "Fall eskalieren",
        "description": "Verschiebt den Fall zum konfigurierten escalation_blueprint seines Blueprints. Erfordert, dass beim aktuellen Blueprint escalation_enabled aktiviert und ein escalation_blueprint festgelegt ist, andernfalls 400.",
        "operationId": "escalate_case",
        "x-didit-sdk": {
          "resource": "cases",
          "method": "escalate",
          "auth": "api_key",
          "server": true,
          "scope": "application"
        },
        "tags": [
          "Cases"
        ],
        "parameters": [
          {
            "name": "organization_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "UUID der Organisation."
          },
          {
            "name": "application_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Anwendungs-UUID."
          },
          {
            "name": "case_uuid",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "c1a5e000-0000-4000-8000-000000000001"
            },
            "description": "Fall-UUID."
          }
        ],
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X POST 'https://verification.didit.me/v3/organization/11111111-2222-3333-4444-555555555555/application/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/cases/c1a5e000-0000-4000-8000-000000000001/escalate/' \\\n  -H 'x-api-key: YOUR_API_KEY'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.cases.escalate(\n    \"c1a5e000-0000-4000-8000-000000000001\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.cases.escalate(\"c1a5e000-0000-4000-8000-000000000001\");\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.Cases.Escalate(ctx, \"c1a5e000-0000-4000-8000-000000000001\")\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.cases().escalate(\"c1a5e000-0000-4000-8000-000000000001\");\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\n$didit = new DiditClient();\n\n$result = $didit->cases->escalate('c1a5e000-0000-4000-8000-000000000001');\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.cases.escalate(\"c1a5e000-0000-4000-8000-000000000001\")\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.Cases.EscalateAsync(\"c1a5e000-0000-4000-8000-000000000001\");\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "responses": {
          "200": {
            "description": "Fall eskalieren.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CaseDetail"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/v3/organization/{organization_id}/application/{application_id}/cases/{case_uuid}/transfer/": {
      "post": {
        "summary": "Fall übertragen",
        "description": "Verschiebt den Fall zu einem anderen, aktiven Blueprint derselben Anwendung. Erfordert, dass beim aktuellen Blueprint transfer_enabled aktiviert ist, andernfalls 400.",
        "operationId": "transfer_case",
        "x-didit-sdk": {
          "resource": "cases",
          "method": "transfer",
          "auth": "api_key",
          "server": true,
          "scope": "application"
        },
        "tags": [
          "Cases"
        ],
        "parameters": [
          {
            "name": "organization_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "UUID der Organisation."
          },
          {
            "name": "application_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Anwendungs-UUID."
          },
          {
            "name": "case_uuid",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "c1a5e000-0000-4000-8000-000000000001"
            },
            "description": "Fall-UUID."
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "target_blueprint"
                ],
                "properties": {
                  "target_blueprint": {
                    "type": "string",
                    "format": "uuid"
                  }
                }
              },
              "example": {
                "target_blueprint": "b1de0000-0000-4000-8000-000000000002"
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X POST 'https://verification.didit.me/v3/organization/11111111-2222-3333-4444-555555555555/application/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/cases/c1a5e000-0000-4000-8000-000000000001/transfer/' \\\n  -H 'x-api-key: YOUR_API_KEY' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\"target_blueprint\": \"b1de0000-0000-4000-8000-000000000002\"}'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.cases.transfer(\n    \"c1a5e000-0000-4000-8000-000000000001\",\n    target_blueprint=\"b1de0000-0000-4000-8000-000000000002\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.cases.transfer(\"c1a5e000-0000-4000-8000-000000000001\", {\n  target_blueprint: \"b1de0000-0000-4000-8000-000000000002\",\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.Cases.Transfer(ctx, \"c1a5e000-0000-4000-8000-000000000001\", didit.CasesTransferParams{\n\tTargetBlueprint: \"b1de0000-0000-4000-8000-000000000002\",\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\nimport me.didit.types.CasesTransferParams;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.cases().transfer(\"c1a5e000-0000-4000-8000-000000000001\", CasesTransferParams.builder()\n        .targetBlueprint(\"b1de0000-0000-4000-8000-000000000002\")\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\n$didit = new DiditClient();\n\n$result = $didit->cases->transfer('c1a5e000-0000-4000-8000-000000000001', [\n    'target_blueprint' => 'b1de0000-0000-4000-8000-000000000002',\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.cases.transfer(\n  \"c1a5e000-0000-4000-8000-000000000001\",\n  target_blueprint: \"b1de0000-0000-4000-8000-000000000002\"\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.Cases.TransferAsync(\"c1a5e000-0000-4000-8000-000000000001\", new CasesTransferParams\n{\n    TargetBlueprint = \"b1de0000-0000-4000-8000-000000000002\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "responses": {
          "200": {
            "description": "Fall übertragen.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CaseDetail"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/v3/organization/{organization_id}/application/{application_id}/cases/{case_uuid}/approve/": {
      "post": {
        "summary": "Gestaffelte Lösung genehmigen (Vier-Augen-Prinzip)",
        "description": "Wendet eine durch resolve vorbereitete Lösung auf einen Vier-Augen-Blueprint an. Der Aufrufer muss ein anderer Prüfer als derjenige sein, der sie eingereicht hat, andernfalls 403. Wenn die Lösung einen Prüfer benennt (`checker` des Falls), kann nur dieses Mitglied sie genehmigen: Jeder andere Aufrufer, einschließlich eines API-Schlüssels, erhält 403.",
        "operationId": "approve_case_resolution",
        "x-didit-sdk": {
          "resource": "cases",
          "method": "approve_resolution",
          "auth": "api_key",
          "server": true,
          "scope": "application"
        },
        "tags": [
          "Cases"
        ],
        "parameters": [
          {
            "name": "organization_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "UUID der Organisation."
          },
          {
            "name": "application_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Anwendungs-UUID."
          },
          {
            "name": "case_uuid",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "c1a5e000-0000-4000-8000-000000000001"
            },
            "description": "Fall-UUID."
          }
        ],
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X POST 'https://verification.didit.me/v3/organization/11111111-2222-3333-4444-555555555555/application/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/cases/c1a5e000-0000-4000-8000-000000000001/approve/' \\\n  -H 'x-api-key: YOUR_API_KEY'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.cases.approve_resolution(\n    \"c1a5e000-0000-4000-8000-000000000001\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.cases.approveResolution(\"c1a5e000-0000-4000-8000-000000000001\");\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.Cases.ApproveResolution(ctx, \"c1a5e000-0000-4000-8000-000000000001\")\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.cases().approveResolution(\"c1a5e000-0000-4000-8000-000000000001\");\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\n$didit = new DiditClient();\n\n$result = $didit->cases->approveResolution('c1a5e000-0000-4000-8000-000000000001');\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.cases.approve_resolution(\"c1a5e000-0000-4000-8000-000000000001\")\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.Cases.ApproveResolutionAsync(\"c1a5e000-0000-4000-8000-000000000001\");\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "responses": {
          "200": {
            "description": "Entscheidung angewendet.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CaseDetail"
                }
              }
            }
          },
          "409": {
            "description": "Fall hat keinen Beschluss, der auf Genehmigung wartet.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Der Aufrufer kann diesen Beschluss nicht genehmigen: Er hat ihn eingereicht, der Fall hat keinen erfassten Ersteller oder der Beschluss benennt einen anderen Prüfer. Ein API-Schlüssel erhält immer diesen 403-Fehler, wenn ein Prüfer benannt ist.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string"
                    }
                  }
                },
                "examples": {
                  "Caller submitted the resolution": {
                    "value": {
                      "detail": "The officer who submitted the resolution cannot approve it."
                    }
                  },
                  "No recorded maker": {
                    "value": {
                      "detail": "Case has no recorded maker for this pending resolution; approve is not permitted."
                    }
                  },
                  "Caller is not the named checker": {
                    "value": {
                      "detail": "Only the named checker can approve this resolution."
                    }
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/v3/organization/{organization_id}/application/{application_id}/cases/{case_uuid}/reject-approval/": {
      "post": {
        "summary": "Vorbereitete Entscheidung ablehnen (Vier-Augen-Prinzip)",
        "description": "Eine durch resolve vorbereitete Entscheidung ablehnen und den Fall an den Blueprint seines Erstellers zurückgeben. Der Aufrufer muss ein anderer Beauftragter sein als derjenige, der sie eingereicht hat, andernfalls 403. Wenn die Entscheidung einen Prüfer benennt (den `checker` des Falls), kann nur dieses Mitglied sie ablehnen: Jeder andere Aufrufer, einschließlich eines API-Schlüssels, erhält 403.",
        "operationId": "reject_case_resolution",
        "x-didit-sdk": {
          "resource": "cases",
          "method": "reject_resolution",
          "auth": "api_key",
          "server": true,
          "scope": "application"
        },
        "tags": [
          "Cases"
        ],
        "parameters": [
          {
            "name": "organization_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "UUID der Organisation."
          },
          {
            "name": "application_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Anwendungs-UUID."
          },
          {
            "name": "case_uuid",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "c1a5e000-0000-4000-8000-000000000001"
            },
            "description": "Fall-UUID."
          }
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "notes": {
                    "type": "string",
                    "nullable": true
                  }
                }
              },
              "example": {
                "notes": "Needs a clearer rationale before this can be approved."
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X POST 'https://verification.didit.me/v3/organization/11111111-2222-3333-4444-555555555555/application/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/cases/c1a5e000-0000-4000-8000-000000000001/reject-approval/' \\\n  -H 'x-api-key: YOUR_API_KEY' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\"notes\": \"Needs a clearer rationale before this can be approved.\"}'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.cases.reject_resolution(\n    \"c1a5e000-0000-4000-8000-000000000001\",\n    notes=\"Needs a clearer rationale before this can be approved.\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.cases.rejectResolution(\"c1a5e000-0000-4000-8000-000000000001\", {\n  notes: \"Needs a clearer rationale before this can be approved.\",\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.Cases.RejectResolution(ctx, \"c1a5e000-0000-4000-8000-000000000001\", didit.CasesRejectResolutionParams{\n\tNotes: didit.String(\"Needs a clearer rationale before this can be approved.\"),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\nimport me.didit.types.CasesRejectResolutionParams;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.cases().rejectResolution(\"c1a5e000-0000-4000-8000-000000000001\", CasesRejectResolutionParams.builder()\n        .notes(\"Needs a clearer rationale before this can be approved.\")\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\n$didit = new DiditClient();\n\n$result = $didit->cases->rejectResolution('c1a5e000-0000-4000-8000-000000000001', [\n    'notes' => 'Needs a clearer rationale before this can be approved.',\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.cases.reject_resolution(\n  \"c1a5e000-0000-4000-8000-000000000001\",\n  notes: \"Needs a clearer rationale before this can be approved.\"\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.Cases.RejectResolutionAsync(\"c1a5e000-0000-4000-8000-000000000001\", new CasesRejectResolutionParams\n{\n    Notes = \"Needs a clearer rationale before this can be approved.\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "responses": {
          "200": {
            "description": "Entscheidung abgelehnt, Fall an den Maker-Blueprint zurückgegeben.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CaseDetail"
                }
              }
            }
          },
          "409": {
            "description": "Fall hat keinen Beschluss, der auf Genehmigung wartet.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Der Aufrufer kann diesen Beschluss nicht ablehnen: Er hat ihn eingereicht, der Fall hat keinen erfassten Ersteller oder der Beschluss benennt einen anderen Prüfer. Ein API-Schlüssel erhält immer diesen 403-Fehler, wenn ein Prüfer benannt ist.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string"
                    }
                  }
                },
                "examples": {
                  "Caller submitted the resolution": {
                    "value": {
                      "detail": "The officer who submitted the resolution cannot reject it."
                    }
                  },
                  "No recorded maker": {
                    "value": {
                      "detail": "Case has no recorded maker for this pending resolution; reject is not permitted."
                    }
                  },
                  "Caller is not the named checker": {
                    "value": {
                      "detail": "Only the named checker can reject this resolution."
                    }
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/v3/organization/{organization_id}/application/{application_id}/cases/{case_uuid}/entity-actions/": {
      "post": {
        "operationId": "apply_case_entity_action",
        "x-didit-sdk": {
          "resource": "cases",
          "method": "apply_entity_action",
          "auth": "api_key",
          "server": true,
          "scope": "application"
        },
        "parameters": [
          {
            "in": "path",
            "name": "organization_id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "required": true
          },
          {
            "in": "path",
            "name": "application_id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "required": true
          },
          {
            "in": "path",
            "name": "case_uuid",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "required": true
          }
        ],
        "tags": [
          "Case Management"
        ],
        "requestBody": {
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/CaseActionCaseEntityActionRequest"
              }
            },
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CaseActionCaseEntityActionRequest"
              },
              "example": {
                "client_reference": "e1a00000-0000-4000-8000-000000000001",
                "action": "add_tags",
                "tags": [
                  "source-of-funds-reviewed"
                ]
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/CaseActionCaseEntityActionRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CaseActionCaseEntityActionResult"
                }
              }
            },
            "description": ""
          },
          "409": {
            "description": "Die Referenz gehört zu einer anderen Aktions-Payload."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "description": "Wendet eine explizite Aktion auf den Gegenstand des Falls an. Geben Sie eine eindeutige client_reference an, um einen Aktionsbeleg zu erhalten und Wiederholungsversuche idempotent zu machen. Die erneute Verwendung dieser Referenz mit einer anderen Payload gibt 409 zurück. Prüfen Sie bei Angabe einer Referenz receipt.status, selbst wenn der HTTP-Status 200 lautet: FAILED bedeutet, dass keine Aktion angewendet wurde. Das Wiederholen einer fehlgeschlagenen Anfrage führt sie nicht erneut aus, es sei denn, retry ist true. Das Weglassen von client_reference behält die Legacy-Antwort bei.",
        "x-codeSamples": [
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.cases.apply_entity_action(\n    \"11111111-2222-3333-4444-555555555555\",\n    client_reference=\"e1a00000-0000-4000-8000-000000000001\",\n    action=\"add_tags\",\n    tags=[\"source-of-funds-reviewed\"],\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.cases.applyEntityAction(\"11111111-2222-3333-4444-555555555555\", {\n  client_reference: \"e1a00000-0000-4000-8000-000000000001\",\n  action: \"add_tags\",\n  tags: [\"source-of-funds-reviewed\"],\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.Cases.ApplyEntityAction(ctx, \"11111111-2222-3333-4444-555555555555\", didit.CaseActionCaseEntityActionRequest{\n\tClientReference: didit.String(\"e1a00000-0000-4000-8000-000000000001\"),\n\tAction:          didit.CaseActionActionEnum(\"add_tags\"),\n\tTags:            didit.Some([]string{\"source-of-funds-reviewed\"}),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import java.util.List;\nimport me.didit.Didit;\nimport me.didit.types.CaseActionActionEnum;\nimport me.didit.types.CaseActionCaseEntityActionRequest;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.cases().applyEntityAction(\"11111111-2222-3333-4444-555555555555\", CaseActionCaseEntityActionRequest.builder()\n        .clientReference(\"e1a00000-0000-4000-8000-000000000001\")\n        .action(CaseActionActionEnum.of(\"add_tags\"))\n        .tags(List.of(\"source-of-funds-reviewed\"))\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\n$didit = new DiditClient();\n\n$result = $didit->cases->applyEntityAction('11111111-2222-3333-4444-555555555555', [\n    'client_reference' => 'e1a00000-0000-4000-8000-000000000001',\n    'action' => 'add_tags',\n    'tags' => ['source-of-funds-reviewed'],\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.cases.apply_entity_action(\n  \"11111111-2222-3333-4444-555555555555\",\n  client_reference: \"e1a00000-0000-4000-8000-000000000001\",\n  action: \"add_tags\",\n  tags: [\"source-of-funds-reviewed\"]\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.Cases.ApplyEntityActionAsync(\"11111111-2222-3333-4444-555555555555\", new CaseActionCaseEntityActionRequest\n{\n    ClientReference = \"e1a00000-0000-4000-8000-000000000001\",\n    Action = \"add_tags\",\n    Tags = new string[] { \"source-of-funds-reviewed\" },\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ]
      }
    },
    "/v3/organization/{organization_id}/application/{application_id}/cases/{case_uuid}/print/": {
      "get": {
        "summary": "Fall drucken (PDF)",
        "description": "Rendern Sie den vollständigen Fall (Zusammenfassung, Betreff, Checklist-Status, Notizen, angehängte Sitzungen/Transaktionen, Ereignisse, FIU-Berichtsliste) als PDF und geben Sie eine vorab signierte Download-URL zurück.",
        "operationId": "print_case",
        "x-didit-sdk": {
          "resource": "cases",
          "method": "print",
          "auth": "api_key",
          "server": true,
          "scope": "application"
        },
        "tags": [
          "Cases"
        ],
        "parameters": [
          {
            "name": "organization_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "UUID der Organisation."
          },
          {
            "name": "application_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Anwendungs-UUID."
          },
          {
            "name": "case_uuid",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "c1a5e000-0000-4000-8000-000000000001"
            },
            "description": "Fall-UUID."
          }
        ],
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X GET 'https://verification.didit.me/v3/organization/11111111-2222-3333-4444-555555555555/application/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/cases/c1a5e000-0000-4000-8000-000000000001/print/' \\\n  -H 'x-api-key: YOUR_API_KEY'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.cases.print(\n    \"c1a5e000-0000-4000-8000-000000000001\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.cases.print(\"c1a5e000-0000-4000-8000-000000000001\");\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.Cases.Print(ctx, \"c1a5e000-0000-4000-8000-000000000001\")\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.cases().print(\"c1a5e000-0000-4000-8000-000000000001\");\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\n$didit = new DiditClient();\n\n$result = $didit->cases->print('c1a5e000-0000-4000-8000-000000000001');\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.cases.print(\"c1a5e000-0000-4000-8000-000000000001\")\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.Cases.PrintAsync(\"c1a5e000-0000-4000-8000-000000000001\");\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "responses": {
          "200": {
            "description": "Vorsignierte PDF-URL.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "url": {
                      "type": "string",
                      "format": "uri"
                    }
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/v3/organization/{organization_id}/application/{application_id}/cases/{case_uuid}/notes/": {
      "get": {
        "operationId": "list_case_notes",
        "x-didit-sdk": {
          "resource": "cases.notes",
          "method": "list",
          "auth": "api_key",
          "server": true,
          "scope": "application"
        },
        "parameters": [
          {
            "in": "path",
            "name": "organization_id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "required": true
          },
          {
            "in": "path",
            "name": "application_id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "required": true
          },
          {
            "in": "path",
            "name": "case_uuid",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "required": true
          },
          {
            "name": "ordering",
            "required": false,
            "in": "query",
            "description": "Welches Feld für die Sortierung der Ergebnisse verwendet werden soll.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "limit",
            "required": false,
            "in": "query",
            "description": "Anzahl der pro Seite zurückzugebenden Ergebnisse.",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "offset",
            "required": false,
            "in": "query",
            "description": "Der Startindex, ab dem die Ergebnisse zurückgegeben werden sollen.",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CaseCollaborationPaginatedCaseNoteList"
                }
              }
            },
            "description": ""
          },
          "403": {
            "description": "Dem Aufrufer fehlt die erforderliche Berechtigung für Fälle."
          },
          "404": {
            "description": "Der Fall oder die Notiz ist für diesen Aufrufer nicht verfügbar."
          }
        },
        "tags": [
          "Case Management"
        ],
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "x-codeSamples": [
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nfor item in client.cases.notes.list(\n    \"11111111-2222-3333-4444-555555555555\",\n):\n    print(item)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nfor await (const item of didit.cases.notes.list(\"11111111-2222-3333-4444-555555555555\")) {\n  console.log(item);\n}"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\niter := client.Cases.Notes.ListAutoPaging(ctx, \"11111111-2222-3333-4444-555555555555\", didit.CasesNotesListParams{})\nfor iter.Next() {\n\tfmt.Printf(\"%+v\\n\", iter.Current())\n}\nif err := iter.Err(); err != nil {\n\tlog.Fatal(err)\n}"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nfor (var item : client.cases().notes().list(\"11111111-2222-3333-4444-555555555555\")) {\n    System.out.println(item);\n}"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\n$didit = new DiditClient();\n\nforeach ($didit->cases->notes->list('11111111-2222-3333-4444-555555555555') as $item) {\n    print_r($item->toArray());\n}"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\ndidit.cases.notes.list(\"11111111-2222-3333-4444-555555555555\").auto_paging_each do |item|\n  puts item.to_h\nend"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nawait foreach (var item in await client.Cases.Notes.ListAsync(\"11111111-2222-3333-4444-555555555555\"))\n{\n    Console.WriteLine(JsonSerializer.Serialize(item));\n}"
          }
        ]
      },
      "post": {
        "operationId": "create_case_note",
        "x-didit-sdk": {
          "resource": "cases.notes",
          "method": "create",
          "auth": "api_key",
          "server": true,
          "scope": "application"
        },
        "parameters": [
          {
            "in": "path",
            "name": "organization_id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "required": true
          },
          {
            "in": "path",
            "name": "application_id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "required": true
          },
          {
            "in": "path",
            "name": "case_uuid",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "required": true
          }
        ],
        "requestBody": {
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/CaseCollaborationCaseNoteCreateRequest"
              }
            },
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CaseCollaborationCaseNoteCreateRequest"
              },
              "example": {
                "comment": "Proof of address matches the ID document."
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/CaseCollaborationCaseNoteCreateRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CaseCollaborationCaseNote"
                }
              }
            },
            "description": ""
          },
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CaseCollaborationCaseNote"
                }
              }
            },
            "description": ""
          },
          "403": {
            "description": "Dem Aufrufer fehlt die erforderliche Berechtigung für Fälle."
          },
          "404": {
            "description": "Der Fall oder die Notiz ist für diesen Aufrufer nicht verfügbar."
          },
          "409": {
            "description": "Diese Client-Referenz wurde bereits für eine andere Notiz oder für eine gelöschte Notiz verwendet."
          }
        },
        "tags": [
          "Case Management"
        ],
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "description": "Eine fallbezogene Notiz hinzufügen. Eine optionale client_reference bewirkt, dass ein unveränderter Wiederholungsversuch dieselbe Notiz ohne doppelte Aktivitäten oder Benachrichtigungen zurückgibt. reply_to muss eine aktive Notiz in diesem Fall identifizieren. Die Antwort enthält einen begrenzten Auszug der übergeordneten Notiz, ohne diesen Auszug in die gespeicherte Antwort zu kopieren.",
        "x-codeSamples": [
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.cases.notes.create(\n    \"11111111-2222-3333-4444-555555555555\",\n    comment=\"Proof of address matches the ID document.\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.cases.notes.create(\"11111111-2222-3333-4444-555555555555\", {\n  comment: \"Proof of address matches the ID document.\",\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.Cases.Notes.Create(ctx, \"11111111-2222-3333-4444-555555555555\", didit.CaseCollaborationCaseNoteCreateRequest{\n\tComment: \"Proof of address matches the ID document.\",\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\nimport me.didit.types.CaseCollaborationCaseNoteCreateRequest;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.cases().notes().create(\"11111111-2222-3333-4444-555555555555\", CaseCollaborationCaseNoteCreateRequest.builder()\n        .comment(\"Proof of address matches the ID document.\")\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\n$didit = new DiditClient();\n\n$result = $didit->cases->notes->create('11111111-2222-3333-4444-555555555555', [\n    'comment' => 'Proof of address matches the ID document.',\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.cases.notes.create(\n  \"11111111-2222-3333-4444-555555555555\",\n  comment: \"Proof of address matches the ID document.\"\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.Cases.Notes.CreateAsync(\"11111111-2222-3333-4444-555555555555\", new CaseCollaborationCaseNoteCreateRequest\n{\n    Comment = \"Proof of address matches the ID document.\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ]
      }
    },
    "/v3/organization/{organization_id}/application/{application_id}/cases/{case_uuid}/notes/{note_uuid}/": {
      "patch": {
        "operationId": "root_partial_update",
        "x-didit-sdk": {
          "resource": "cases.notes",
          "method": "update",
          "auth": "api_key",
          "server": true,
          "scope": "application"
        },
        "parameters": [
          {
            "in": "path",
            "name": "organization_id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "required": true
          },
          {
            "in": "path",
            "name": "application_id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "required": true
          },
          {
            "in": "path",
            "name": "case_uuid",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "required": true
          },
          {
            "in": "path",
            "name": "note_uuid",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "required": true
          }
        ],
        "requestBody": {
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/CaseCollaborationPatchedCaseNoteUpdateRequest"
              }
            },
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CaseCollaborationPatchedCaseNoteUpdateRequest"
              },
              "example": {
                "is_pinned": true
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/CaseCollaborationPatchedCaseNoteUpdateRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CaseCollaborationCaseNote"
                }
              }
            },
            "description": ""
          },
          "403": {
            "description": "Dem Aufrufer fehlt die erforderliche Berechtigung für Fälle."
          },
          "404": {
            "description": "Der Fall oder die Notiz ist für diesen Aufrufer nicht verfügbar."
          }
        },
        "tags": [
          "Case Management"
        ],
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "description": "Eine vorhandene Notiz anpinnen oder lösen. Angepinnte Notizen werden zuerst angezeigt. Änderungen der Fixierung werden in der Fallaktivität erfasst und ändern weder Nachweise noch Quellentscheidungen.",
        "x-codeSamples": [
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.cases.notes.update(\n    \"11111111-2222-3333-4444-555555555555\",\n    \"11111111-2222-3333-4444-555555555555\",\n    is_pinned=True,\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.cases.notes.update(\n  \"11111111-2222-3333-4444-555555555555\",\n  \"11111111-2222-3333-4444-555555555555\",\n  {\n    is_pinned: true,\n  },\n);\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.Cases.Notes.Update(ctx, \"11111111-2222-3333-4444-555555555555\", \"11111111-2222-3333-4444-555555555555\", didit.CaseCollaborationPatchedCaseNoteUpdateRequest{\n\tIsPinned: didit.Bool(true),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\nimport me.didit.types.CaseCollaborationPatchedCaseNoteUpdateRequest;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.cases().notes().update(\"11111111-2222-3333-4444-555555555555\", \"11111111-2222-3333-4444-555555555555\", CaseCollaborationPatchedCaseNoteUpdateRequest.builder()\n        .isPinned(true)\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\n$didit = new DiditClient();\n\n$result = $didit->cases->notes->update('11111111-2222-3333-4444-555555555555', '11111111-2222-3333-4444-555555555555', [\n    'is_pinned' => true,\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.cases.notes.update(\n  \"11111111-2222-3333-4444-555555555555\",\n  \"11111111-2222-3333-4444-555555555555\",\n  is_pinned: true\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.Cases.Notes.UpdateAsync(\"11111111-2222-3333-4444-555555555555\", \"11111111-2222-3333-4444-555555555555\", new CaseCollaborationPatchedCaseNoteUpdateRequest\n{\n    IsPinned = true,\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ]
      },
      "delete": {
        "operationId": "delete_case_note",
        "x-didit-sdk": {
          "resource": "cases.notes",
          "method": "delete",
          "auth": "api_key",
          "server": true,
          "scope": "application"
        },
        "parameters": [
          {
            "in": "path",
            "name": "organization_id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "required": true
          },
          {
            "in": "path",
            "name": "application_id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "required": true
          },
          {
            "in": "path",
            "name": "case_uuid",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "required": true
          },
          {
            "in": "path",
            "name": "note_uuid",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "required": true
          }
        ],
        "responses": {
          "204": {
            "description": "Die Notiz wird dauerhaft gelöscht. Antworten bleiben erhalten, ohne den Auszug der gelöschten übergeordneten Notiz. Anhänge werden gelöscht, es sei denn, eine andere Notiz verwendet sie noch."
          },
          "403": {
            "description": "Dem Aufrufer fehlt die erforderliche Berechtigung für Fälle."
          },
          "404": {
            "description": "Der Fall oder die Notiz ist für diesen Aufrufer nicht verfügbar."
          }
        },
        "tags": [
          "Case Management"
        ],
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "x-codeSamples": [
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nclient.cases.notes.delete(\n    \"11111111-2222-3333-4444-555555555555\",\n    \"11111111-2222-3333-4444-555555555555\",\n)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nawait didit.cases.notes.delete(\n  \"11111111-2222-3333-4444-555555555555\",\n  \"11111111-2222-3333-4444-555555555555\",\n);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nif err := client.Cases.Notes.Delete(ctx, \"11111111-2222-3333-4444-555555555555\", \"11111111-2222-3333-4444-555555555555\"); err != nil {\n\tlog.Fatal(err)\n}"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nclient.cases().notes().delete(\"11111111-2222-3333-4444-555555555555\", \"11111111-2222-3333-4444-555555555555\");"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\n$didit = new DiditClient();\n\n$didit->cases->notes->delete('11111111-2222-3333-4444-555555555555', '11111111-2222-3333-4444-555555555555');"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\ndidit.cases.notes.delete(\n  \"11111111-2222-3333-4444-555555555555\",\n  \"11111111-2222-3333-4444-555555555555\"\n)"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nawait client.Cases.Notes.DeleteAsync(\"11111111-2222-3333-4444-555555555555\", \"11111111-2222-3333-4444-555555555555\");"
          }
        ]
      }
    },
    "/v3/organization/{organization_id}/application/{application_id}/cases/{case_uuid}/notes/presign/": {
      "post": {
        "summary": "Anhang einer Notiz hochladen",
        "description": "Datei hochladen (JPEG, PNG, WebP, PDF, Klartext oder CSV; max. 5 MB), um sie an eine Notiz anzuhängen. Gibt den s3_key zurück, der im attachments-Array der Notiz übergeben werden muss.",
        "operationId": "upload_case_note_attachment",
        "x-didit-sdk": {
          "resource": "cases.notes",
          "method": "create_attachment_upload",
          "auth": "api_key",
          "server": true,
          "scope": "application"
        },
        "tags": [
          "Cases"
        ],
        "parameters": [
          {
            "name": "organization_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "UUID der Organisation."
          },
          {
            "name": "application_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Anwendungs-UUID."
          },
          {
            "name": "case_uuid",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "c1a5e000-0000-4000-8000-000000000001"
            },
            "description": "Fall-UUID."
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "required": [
                  "file"
                ],
                "properties": {
                  "file": {
                    "type": "string",
                    "format": "binary"
                  }
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X POST 'https://verification.didit.me/v3/organization/11111111-2222-3333-4444-555555555555/application/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/cases/c1a5e000-0000-4000-8000-000000000001/notes/presign/' \\\n  -H 'x-api-key: YOUR_API_KEY' \\\n  -F 'file=@evidence.pdf'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.cases.notes.create_attachment_upload(\n    \"c1a5e000-0000-4000-8000-000000000001\",\n    file=open(\"document.pdf\", \"rb\"),\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit, { fileFromPath } from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.cases.notes.createAttachmentUpload(\"c1a5e000-0000-4000-8000-000000000001\", {\n  file: await fileFromPath(\"document.pdf\"),\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.Cases.Notes.CreateAttachmentUpload(ctx, \"c1a5e000-0000-4000-8000-000000000001\", didit.CasesNotesCreateAttachmentUploadParams{\n\tFile: didit.FileFromPath(\"document.pdf\"),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import java.nio.file.Path;\nimport me.didit.Didit;\nimport me.didit.types.CasesNotesCreateAttachmentUploadParams;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.cases().notes().createAttachmentUpload(\"c1a5e000-0000-4000-8000-000000000001\", CasesNotesCreateAttachmentUploadParams.builder()\n        .file(Path.of(\"document.pdf\"))\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\nuse Didit\\File;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\n$didit = new DiditClient();\n\n$result = $didit->cases->notes->createAttachmentUpload('c1a5e000-0000-4000-8000-000000000001', [\n    'file' => File::fromPath('document.pdf'),\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.cases.notes.create_attachment_upload(\n  \"c1a5e000-0000-4000-8000-000000000001\",\n  file: Pathname(\"document.pdf\")\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.Cases.Notes.CreateAttachmentUploadAsync(\"c1a5e000-0000-4000-8000-000000000001\", new CasesNotesCreateAttachmentUploadParams\n{\n    File = FileUpload.FromPath(\"document.pdf\"),\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "responses": {
          "201": {
            "description": "Datei hochgeladen.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "s3_key": {
                      "type": "string"
                    },
                    "url": {
                      "type": "string",
                      "format": "uri"
                    },
                    "filename": {
                      "type": "string"
                    },
                    "file_size": {
                      "type": "integer"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Keine Datei, nicht unterstützter Inhaltstyp oder Datei überschreitet 5 MB.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      },
      "get": {
        "summary": "URL für Notizanhang abrufen",
        "description": "Erstellen Sie eine neue vorsignierte Download-URL für einen Anhang, der bereits in einer der Notizen des Falls gespeichert ist.",
        "operationId": "get_case_note_attachment_url",
        "x-didit-sdk": {
          "resource": "cases.notes",
          "method": "retrieve_attachment_url",
          "auth": "api_key",
          "server": true,
          "scope": "application"
        },
        "tags": [
          "Cases"
        ],
        "parameters": [
          {
            "name": "organization_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "UUID der Organisation."
          },
          {
            "name": "application_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Anwendungs-UUID."
          },
          {
            "name": "case_uuid",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "c1a5e000-0000-4000-8000-000000000001"
            },
            "description": "Fall-UUID."
          },
          {
            "name": "s3_key",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "Der s3_key des Anhangs, wie durch den Upload zurückgegeben oder in der Notiz aufgeführt.",
            "required": true
          }
        ],
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X GET 'https://verification.didit.me/v3/organization/11111111-2222-3333-4444-555555555555/application/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/cases/c1a5e000-0000-4000-8000-000000000001/notes/presign/?s3_key=case-notes/c1a5e000-0000-4000-8000-000000000001/evidence.pdf' \\\n  -H 'x-api-key: YOUR_API_KEY'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.cases.notes.retrieve_attachment_url(\n    \"c1a5e000-0000-4000-8000-000000000001\",\n    s3_key=\"your-s3-key\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.cases.notes.retrieveAttachmentUrl(\"c1a5e000-0000-4000-8000-000000000001\", {\n  s3_key: \"your-s3-key\",\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.Cases.Notes.RetrieveAttachmentURL(ctx, \"c1a5e000-0000-4000-8000-000000000001\", didit.CasesNotesRetrieveAttachmentURLParams{\n\tS3Key: \"your-s3-key\",\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\nimport me.didit.types.CasesNotesRetrieveAttachmentUrlParams;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.cases().notes().retrieveAttachmentUrl(\"c1a5e000-0000-4000-8000-000000000001\", CasesNotesRetrieveAttachmentUrlParams.builder()\n        .s3Key(\"your-s3-key\")\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\n$didit = new DiditClient();\n\n$result = $didit->cases->notes->retrieveAttachmentUrl('c1a5e000-0000-4000-8000-000000000001', [\n    's3_key' => 'your-s3-key',\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.cases.notes.retrieve_attachment_url(\n  \"c1a5e000-0000-4000-8000-000000000001\",\n  s3_key: \"your-s3-key\"\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.Cases.Notes.RetrieveAttachmentUrlAsync(\"c1a5e000-0000-4000-8000-000000000001\", new CasesNotesRetrieveAttachmentUrlParams\n{\n    S3Key = \"your-s3-key\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "responses": {
          "200": {
            "description": "Vorsignierte URL.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "s3_key": {
                      "type": "string"
                    },
                    "url": {
                      "type": "string",
                      "format": "uri"
                    },
                    "filename": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "s3_key fehlt oder gehört nicht zu diesem Fall.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/v3/organization/{organization_id}/application/{application_id}/cases/{case_uuid}/links/": {
      "get": {
        "summary": "Fall-Verknüpfungen auflisten",
        "description": "Dem Fall zugeordnete Sitzungen, Unternehmenssitzungen und Transaktionen auflisten.",
        "operationId": "list_case_links",
        "x-didit-sdk": {
          "resource": "cases.links",
          "method": "list",
          "auth": "api_key",
          "server": true,
          "scope": "application"
        },
        "tags": [
          "Cases"
        ],
        "parameters": [
          {
            "name": "organization_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "UUID der Organisation."
          },
          {
            "name": "application_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Anwendungs-UUID."
          },
          {
            "name": "case_uuid",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "c1a5e000-0000-4000-8000-000000000001"
            },
            "description": "Fall-UUID."
          }
        ],
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X GET 'https://verification.didit.me/v3/organization/11111111-2222-3333-4444-555555555555/application/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/cases/c1a5e000-0000-4000-8000-000000000001/links/' \\\n  -H 'x-api-key: YOUR_API_KEY'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.cases.links.list(\n    \"c1a5e000-0000-4000-8000-000000000001\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.cases.links.list(\"c1a5e000-0000-4000-8000-000000000001\");\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.Cases.Links.List(ctx, \"c1a5e000-0000-4000-8000-000000000001\")\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.cases().links().list(\"c1a5e000-0000-4000-8000-000000000001\");\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\n$didit = new DiditClient();\n\n$result = $didit->cases->links->list('c1a5e000-0000-4000-8000-000000000001');\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\ndidit.cases.links.list(\"c1a5e000-0000-4000-8000-000000000001\").each do |item|\n  puts item.to_h\nend"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.Cases.Links.ListAsync(\"c1a5e000-0000-4000-8000-000000000001\");\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "responses": {
          "200": {
            "description": "Fall-Verknüpfungen.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/CaseLink"
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      },
      "post": {
        "summary": "Fall-Link hinzufügen",
        "description": "Eine Sitzung, Business-Sitzung oder Transaktion an den Fall anhängen. Wird mit 400 abgelehnt, wenn die Entität zu einem anderen Subjekt als der Fall gehört.",
        "operationId": "create_case_link",
        "x-didit-sdk": {
          "resource": "cases.links",
          "method": "create",
          "auth": "api_key",
          "server": true,
          "scope": "application"
        },
        "tags": [
          "Cases"
        ],
        "parameters": [
          {
            "name": "organization_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "UUID der Organisation."
          },
          {
            "name": "application_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Anwendungs-UUID."
          },
          {
            "name": "case_uuid",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "c1a5e000-0000-4000-8000-000000000001"
            },
            "description": "Fall-UUID."
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "entity_type",
                  "entity_uuid"
                ],
                "properties": {
                  "entity_type": {
                    "type": "string",
                    "enum": [
                      "session",
                      "business_session",
                      "transaction"
                    ]
                  },
                  "entity_uuid": {
                    "type": "string",
                    "format": "uuid"
                  }
                }
              },
              "example": {
                "entity_type": "transaction",
                "entity_uuid": "77000000-0000-4000-8000-000000000077"
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X POST 'https://verification.didit.me/v3/organization/11111111-2222-3333-4444-555555555555/application/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/cases/c1a5e000-0000-4000-8000-000000000001/links/' \\\n  -H 'x-api-key: YOUR_API_KEY' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\"entity_type\": \"transaction\", \"entity_uuid\": \"77000000-0000-4000-8000-000000000077\"}'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.cases.links.create(\n    \"c1a5e000-0000-4000-8000-000000000001\",\n    entity_type=\"transaction\",\n    entity_uuid=\"77000000-0000-4000-8000-000000000077\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.cases.links.create(\"c1a5e000-0000-4000-8000-000000000001\", {\n  entity_type: \"transaction\",\n  entity_uuid: \"77000000-0000-4000-8000-000000000077\",\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.Cases.Links.Create(ctx, \"c1a5e000-0000-4000-8000-000000000001\", didit.CasesLinksCreateParams{\n\tEntityType: \"transaction\",\n\tEntityUUID: \"77000000-0000-4000-8000-000000000077\",\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\nimport me.didit.types.CasesLinksCreateParams;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.cases().links().create(\"c1a5e000-0000-4000-8000-000000000001\", CasesLinksCreateParams.builder()\n        .entityType(CasesLinksCreateParams.EntityType.of(\"transaction\"))\n        .entityUuid(\"77000000-0000-4000-8000-000000000077\")\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\n$didit = new DiditClient();\n\n$result = $didit->cases->links->create('c1a5e000-0000-4000-8000-000000000001', [\n    'entity_type' => 'transaction',\n    'entity_uuid' => '77000000-0000-4000-8000-000000000077',\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.cases.links.create(\n  \"c1a5e000-0000-4000-8000-000000000001\",\n  entity_type: \"transaction\",\n  entity_uuid: \"77000000-0000-4000-8000-000000000077\"\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.Cases.Links.CreateAsync(\"c1a5e000-0000-4000-8000-000000000001\", new CasesLinksCreateParams\n{\n    EntityType = \"transaction\",\n    EntityUuid = \"77000000-0000-4000-8000-000000000077\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "responses": {
          "201": {
            "description": "Link erstellt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CaseLink"
                }
              }
            }
          },
          "400": {
            "description": "Die Entität gehört zu einem anderen Profil als das Subjekt des Falls.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/v3/organization/{organization_id}/application/{application_id}/cases/{case_uuid}/links/{link_uuid}/": {
      "delete": {
        "summary": "Fall-Verknüpfung entfernen",
        "description": "Eine verknüpfte Sitzung, Unternehmenssitzung oder Transaktion vom Fall trennen.",
        "operationId": "delete_case_link",
        "x-didit-sdk": {
          "resource": "cases.links",
          "method": "delete",
          "auth": "api_key",
          "server": true,
          "scope": "application"
        },
        "tags": [
          "Cases"
        ],
        "parameters": [
          {
            "name": "organization_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "UUID der Organisation."
          },
          {
            "name": "application_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Anwendungs-UUID."
          },
          {
            "name": "case_uuid",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "c1a5e000-0000-4000-8000-000000000001"
            },
            "description": "Fall-UUID."
          },
          {
            "name": "link_uuid",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "11000000-0000-4000-8000-000000000004"
            },
            "description": "Link-UUID."
          }
        ],
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X DELETE 'https://verification.didit.me/v3/organization/11111111-2222-3333-4444-555555555555/application/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/cases/c1a5e000-0000-4000-8000-000000000001/links/11000000-0000-4000-8000-000000000004/' \\\n  -H 'x-api-key: YOUR_API_KEY'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nclient.cases.links.delete(\n    \"c1a5e000-0000-4000-8000-000000000001\",\n    \"11000000-0000-4000-8000-000000000004\",\n)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nawait didit.cases.links.delete(\n  \"c1a5e000-0000-4000-8000-000000000001\",\n  \"11000000-0000-4000-8000-000000000004\",\n);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nif err := client.Cases.Links.Delete(ctx, \"c1a5e000-0000-4000-8000-000000000001\", \"11000000-0000-4000-8000-000000000004\"); err != nil {\n\tlog.Fatal(err)\n}"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nclient.cases().links().delete(\"c1a5e000-0000-4000-8000-000000000001\", \"11000000-0000-4000-8000-000000000004\");"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\n$didit = new DiditClient();\n\n$didit->cases->links->delete('c1a5e000-0000-4000-8000-000000000001', '11000000-0000-4000-8000-000000000004');"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\ndidit.cases.links.delete(\n  \"c1a5e000-0000-4000-8000-000000000001\",\n  \"11000000-0000-4000-8000-000000000004\"\n)"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nawait client.Cases.Links.DeleteAsync(\"c1a5e000-0000-4000-8000-000000000001\", \"11000000-0000-4000-8000-000000000004\");"
          }
        ],
        "responses": {
          "204": {
            "description": "Link entfernt."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/v3/organization/{organization_id}/application/{application_id}/cases/{case_uuid}/events/": {
      "get": {
        "summary": "Fall-Ereignisse auflisten",
        "description": "Schreibgeschützte Audit-Zeitleiste des Falls (Erstellung, Statusänderungen, Zuweisung, Lösung, Eskalation, Weiterleitungen, Änderungen an Tags/Priorität/Fälligkeitsdatum, Entitätsaktionen und mehr).",
        "operationId": "list_case_events",
        "x-didit-sdk": {
          "resource": "cases",
          "method": "list_events",
          "auth": "api_key",
          "server": true,
          "scope": "application"
        },
        "tags": [
          "Cases"
        ],
        "parameters": [
          {
            "name": "organization_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "UUID der Organisation."
          },
          {
            "name": "application_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Anwendungs-UUID."
          },
          {
            "name": "case_uuid",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "c1a5e000-0000-4000-8000-000000000001"
            },
            "description": "Fall-UUID."
          },
          {
            "name": "limit",
            "in": "query",
            "schema": {
              "type": "integer",
              "default": 50,
              "minimum": 1
            },
            "description": "Seitengröße."
          },
          {
            "name": "offset",
            "in": "query",
            "schema": {
              "type": "integer",
              "default": 0,
              "minimum": 0
            },
            "description": "Nullbasierter Offset."
          }
        ],
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X GET 'https://verification.didit.me/v3/organization/11111111-2222-3333-4444-555555555555/application/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/cases/c1a5e000-0000-4000-8000-000000000001/events/' \\\n  -H 'x-api-key: YOUR_API_KEY'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nfor item in client.cases.list_events(\n    \"c1a5e000-0000-4000-8000-000000000001\",\n):\n    print(item)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nfor await (const item of didit.cases.listEvents(\"c1a5e000-0000-4000-8000-000000000001\")) {\n  console.log(item);\n}"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\niter := client.Cases.ListEventsAutoPaging(ctx, \"c1a5e000-0000-4000-8000-000000000001\", didit.CasesListEventsParams{})\nfor iter.Next() {\n\tfmt.Printf(\"%+v\\n\", iter.Current())\n}\nif err := iter.Err(); err != nil {\n\tlog.Fatal(err)\n}"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nfor (var item : client.cases().listEvents(\"c1a5e000-0000-4000-8000-000000000001\")) {\n    System.out.println(item);\n}"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\n$didit = new DiditClient();\n\nforeach ($didit->cases->listEvents('c1a5e000-0000-4000-8000-000000000001') as $item) {\n    print_r($item->toArray());\n}"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\ndidit.cases.list_events(\"c1a5e000-0000-4000-8000-000000000001\").auto_paging_each do |item|\n  puts item.to_h\nend"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nawait foreach (var item in await client.Cases.ListEventsAsync(\"c1a5e000-0000-4000-8000-000000000001\"))\n{\n    Console.WriteLine(JsonSerializer.Serialize(item));\n}"
          }
        ],
        "responses": {
          "200": {
            "description": "Paginierte Ereignisse, die neuesten zuerst.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "count": {
                      "type": "integer",
                      "description": "Anzahl der übereinstimmenden Zeilen. Exakt bis 100, darüber aus Performancegründen auf 100 begrenzt. Verlassen Sie sich darauf, dass `next` null ist, um die letzte Seite zu erkennen."
                    },
                    "next": {
                      "type": "string",
                      "nullable": true,
                      "description": "Absolute URL der nächsten Seite oder null."
                    },
                    "previous": {
                      "type": "string",
                      "nullable": true,
                      "description": "Absolute URL der vorherigen Seite oder null."
                    },
                    "results": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/CaseEvent"
                      }
                    }
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/v3/organization/{organization_id}/application/{application_id}/cases/{case_uuid}/checklist/": {
      "get": {
        "summary": "Fall-Checkliste auflisten",
        "description": "Checklisten-Einträge des Falls auflisten, die bei der Erstellung aus content_config.checklist.items des Blueprints kopiert wurden, sortiert.",
        "operationId": "list_case_checklist",
        "x-didit-sdk": {
          "resource": "cases.checklist",
          "method": "list",
          "auth": "api_key",
          "server": true,
          "scope": "application"
        },
        "tags": [
          "Cases"
        ],
        "parameters": [
          {
            "name": "organization_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "UUID der Organisation."
          },
          {
            "name": "application_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Anwendungs-UUID."
          },
          {
            "name": "case_uuid",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "c1a5e000-0000-4000-8000-000000000001"
            },
            "description": "Fall-UUID."
          }
        ],
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X GET 'https://verification.didit.me/v3/organization/11111111-2222-3333-4444-555555555555/application/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/cases/c1a5e000-0000-4000-8000-000000000001/checklist/' \\\n  -H 'x-api-key: YOUR_API_KEY'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.cases.checklist.list(\n    \"c1a5e000-0000-4000-8000-000000000001\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.cases.checklist.list(\"c1a5e000-0000-4000-8000-000000000001\");\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.Cases.Checklist.List(ctx, \"c1a5e000-0000-4000-8000-000000000001\")\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.cases().checklist().list(\"c1a5e000-0000-4000-8000-000000000001\");\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\n$didit = new DiditClient();\n\n$result = $didit->cases->checklist->list('c1a5e000-0000-4000-8000-000000000001');\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\ndidit.cases.checklist.list(\"c1a5e000-0000-4000-8000-000000000001\").each do |item|\n  puts item.to_h\nend"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.Cases.Checklist.ListAsync(\"c1a5e000-0000-4000-8000-000000000001\");\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "responses": {
          "200": {
            "description": "Checklisten-Einträge.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/CaseChecklistItem"
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/v3/organization/{organization_id}/application/{application_id}/cases/{case_uuid}/checklist/{item_uuid}/": {
      "patch": {
        "summary": "Checklisteneintrag umschalten",
        "description": "Einen Prüflisteneintrag als erledigt oder unerledigt markieren. Der Abschluss ist blockiert, solange ein Eintrag unerledigt ist, es sei denn, der Blueprint markiert die Prüfliste als optional.",
        "operationId": "toggle_case_checklist_item",
        "x-didit-sdk": {
          "resource": "cases.checklist",
          "method": "toggle_item",
          "auth": "api_key",
          "server": true,
          "scope": "application"
        },
        "tags": [
          "Cases"
        ],
        "parameters": [
          {
            "name": "organization_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "UUID der Organisation."
          },
          {
            "name": "application_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Anwendungs-UUID."
          },
          {
            "name": "case_uuid",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "c1a5e000-0000-4000-8000-000000000001"
            },
            "description": "Fall-UUID."
          },
          {
            "name": "item_uuid",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "c4ec0000-0000-4000-8000-000000000005"
            },
            "description": "UUID des Checklisten-Eintrags."
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "is_completed"
                ],
                "properties": {
                  "is_completed": {
                    "type": "boolean"
                  }
                }
              },
              "example": {
                "is_completed": true
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X PATCH 'https://verification.didit.me/v3/organization/11111111-2222-3333-4444-555555555555/application/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/cases/c1a5e000-0000-4000-8000-000000000001/checklist/c4ec0000-0000-4000-8000-000000000005/' \\\n  -H 'x-api-key: YOUR_API_KEY' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\"is_completed\": true}'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.cases.checklist.toggle_item(\n    \"c1a5e000-0000-4000-8000-000000000001\",\n    \"c4ec0000-0000-4000-8000-000000000005\",\n    is_completed=True,\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.cases.checklist.toggleItem(\n  \"c1a5e000-0000-4000-8000-000000000001\",\n  \"c4ec0000-0000-4000-8000-000000000005\",\n  {\n    is_completed: true,\n  },\n);\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.Cases.Checklist.ToggleItem(ctx, \"c1a5e000-0000-4000-8000-000000000001\", \"c4ec0000-0000-4000-8000-000000000005\", didit.CasesChecklistToggleItemParams{\n\tIsCompleted: true,\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\nimport me.didit.types.CasesChecklistToggleItemParams;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.cases().checklist().toggleItem(\"c1a5e000-0000-4000-8000-000000000001\", \"c4ec0000-0000-4000-8000-000000000005\", CasesChecklistToggleItemParams.builder()\n        .isCompleted(true)\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\n$didit = new DiditClient();\n\n$result = $didit->cases->checklist->toggleItem('c1a5e000-0000-4000-8000-000000000001', 'c4ec0000-0000-4000-8000-000000000005', [\n    'is_completed' => true,\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.cases.checklist.toggle_item(\n  \"c1a5e000-0000-4000-8000-000000000001\",\n  \"c4ec0000-0000-4000-8000-000000000005\",\n  is_completed: true\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.Cases.Checklist.ToggleItemAsync(\"c1a5e000-0000-4000-8000-000000000001\", \"c4ec0000-0000-4000-8000-000000000005\", new CasesChecklistToggleItemParams\n{\n    IsCompleted = true,\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "responses": {
          "200": {
            "description": "Aktualisierter Checklisteneintrag.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CaseChecklistItem"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/v3/organization/{organization_id}/application/{application_id}/cases/{case_uuid}/aml/": {
      "get": {
        "summary": "AML-Treffer eines Falls auflisten",
        "description": "AML-Screening-Treffer für die betroffene Person des Falls auflisten. Gleiche Struktur wie die von POST /v3/aml/ zurückgegebenen Treffer.",
        "operationId": "list_case_aml_hits",
        "x-didit-sdk": {
          "resource": "cases",
          "method": "list_aml_hits",
          "auth": "api_key",
          "server": true,
          "scope": "application"
        },
        "tags": [
          "Cases"
        ],
        "parameters": [
          {
            "name": "organization_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "UUID der Organisation."
          },
          {
            "name": "application_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Anwendungs-UUID."
          },
          {
            "name": "case_uuid",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "c1a5e000-0000-4000-8000-000000000001"
            },
            "description": "Fall-UUID."
          }
        ],
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X GET 'https://verification.didit.me/v3/organization/11111111-2222-3333-4444-555555555555/application/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/cases/c1a5e000-0000-4000-8000-000000000001/aml/' \\\n  -H 'x-api-key: YOUR_API_KEY'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.cases.list_aml_hits(\n    \"c1a5e000-0000-4000-8000-000000000001\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.cases.listAmlHits(\"c1a5e000-0000-4000-8000-000000000001\");\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.Cases.ListAMLHits(ctx, \"c1a5e000-0000-4000-8000-000000000001\")\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.cases().listAmlHits(\"c1a5e000-0000-4000-8000-000000000001\");\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\n$didit = new DiditClient();\n\n$result = $didit->cases->listAmlHits('c1a5e000-0000-4000-8000-000000000001');\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\ndidit.cases.list_aml_hits(\"c1a5e000-0000-4000-8000-000000000001\").each do |item|\n  puts item.to_h\nend"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.Cases.ListAmlHitsAsync(\"c1a5e000-0000-4000-8000-000000000001\");\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "responses": {
          "200": {
            "description": "AML-Treffer.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/AMLScreening"
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/v3/organization/{organization_id}/application/{application_id}/cases/statistics/": {
      "get": {
        "summary": "Fall-Analysen",
        "description": "Aggregierte Fallanalysen für den Datumsbereich (standardmäßig die letzten 30 Tage; maximal 731 Tage). Diagramme, Tabellen, Gesamtsummen, Zuweisungsereignisse und aktuelle Warteschlangenzahlen verwenden dieselben anwendungsbezogenen Filter. Filter verwenden aktuelle Fallwerte. Datumsangaben gelten für jedes Metrik-Ereignis, sodass ältere Fälle, die während des Zeitraums zugewiesen oder gelöst wurden, enthalten bleiben. Die Warteschlangentiefe ist unabhängig vom Datumsbereich. Ungültige Filter geben 400 zurück; ein unbekannter Blueprint oder eine unbekannte zugewiesene Person gibt ein leeres Ergebnis zurück.",
        "operationId": "get_case_analytics",
        "x-didit-sdk": {
          "resource": "cases",
          "method": "retrieve_statistics",
          "auth": "api_key",
          "server": true,
          "scope": "application"
        },
        "tags": [
          "Cases"
        ],
        "parameters": [
          {
            "name": "organization_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "UUID der Organisation."
          },
          {
            "name": "application_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Anwendungs-UUID."
          },
          {
            "name": "date_from",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date"
            },
            "description": "Bereichsbeginn (inklusiv). Standardmäßig vor 30 Tagen."
          },
          {
            "name": "date_to",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date"
            },
            "description": "Bereichsende (inklusiv). Standardmäßig der heutige Tag."
          },
          {
            "name": "blueprint",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Nach der aktuellen Blueprint-UUID filtern."
          },
          {
            "name": "assigned_to",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Nach der Benutzer-UUID des aktuell zugewiesenen Prüfers filtern."
          },
          {
            "name": "priority",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "LOW",
                "MEDIUM",
                "HIGH"
              ]
            },
            "description": "Nach aktueller Fallpriorität filtern."
          },
          {
            "name": "source",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "MANUAL",
                "AML_SCREENING",
                "TRANSACTION_RULE",
                "WORKFLOW_BUILDER"
              ]
            },
            "description": "Nach Erstellungsquelle des Falls filtern."
          },
          {
            "name": "status",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "OPEN",
                "AWAITING_USER",
                "RESOLVED"
              ]
            },
            "description": "Nach aktuellem Fallstatus filtern."
          }
        ],
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X GET 'https://verification.didit.me/v3/organization/11111111-2222-3333-4444-555555555555/application/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/cases/statistics/?date_from=2026-06-01&date_to=2026-06-30' \\\n  -H 'x-api-key: YOUR_API_KEY'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.cases.retrieve_statistics()\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.cases.retrieveStatistics();\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.Cases.RetrieveStatistics(ctx, didit.CasesRetrieveStatisticsParams{})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.cases().retrieveStatistics();\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\n$didit = new DiditClient();\n\n$result = $didit->cases->retrieveStatistics();\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.cases.retrieve_statistics\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.Cases.RetrieveStatisticsAsync();\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "responses": {
          "200": {
            "description": "Analytics-Payload.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "series": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "date": {
                            "type": "string",
                            "format": "date"
                          },
                          "created": {
                            "type": "integer"
                          },
                          "reviewed": {
                            "type": "integer"
                          }
                        }
                      }
                    },
                    "tables": {
                      "type": "object",
                      "properties": {
                        "officer": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "key": {
                                "type": "string",
                                "description": "Dimensionswert: E-Mail des Beauftragten, \"blueprint_name:uuid\", Quelle oder Status. \"unassigned\"/\"none\" für fehlende Dimensionen."
                              },
                              "created": {
                                "type": "integer"
                              },
                              "assigned": {
                                "type": "integer"
                              },
                              "resolved": {
                                "type": "integer"
                              },
                              "threat_rate": {
                                "type": "number",
                                "format": "float"
                              },
                              "false_positive_rate": {
                                "type": "number",
                                "format": "float"
                              },
                              "unresolved": {
                                "type": "integer"
                              },
                              "reassignment_rate": {
                                "type": "number",
                                "format": "float"
                              },
                              "escalation_rate": {
                                "type": "number",
                                "format": "float"
                              },
                              "avg_assign_hours": {
                                "type": "number",
                                "format": "float"
                              },
                              "avg_resolve_hours": {
                                "type": "number",
                                "format": "float"
                              },
                              "avg_handling_hours": {
                                "type": "number",
                                "format": "float"
                              }
                            }
                          }
                        },
                        "blueprint": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "key": {
                                "type": "string",
                                "description": "Dimensionswert: E-Mail des Beauftragten, \"blueprint_name:uuid\", Quelle oder Status. \"unassigned\"/\"none\" für fehlende Dimensionen."
                              },
                              "created": {
                                "type": "integer"
                              },
                              "assigned": {
                                "type": "integer"
                              },
                              "resolved": {
                                "type": "integer"
                              },
                              "threat_rate": {
                                "type": "number",
                                "format": "float"
                              },
                              "false_positive_rate": {
                                "type": "number",
                                "format": "float"
                              },
                              "unresolved": {
                                "type": "integer"
                              },
                              "reassignment_rate": {
                                "type": "number",
                                "format": "float"
                              },
                              "escalation_rate": {
                                "type": "number",
                                "format": "float"
                              },
                              "avg_assign_hours": {
                                "type": "number",
                                "format": "float"
                              },
                              "avg_resolve_hours": {
                                "type": "number",
                                "format": "float"
                              },
                              "avg_handling_hours": {
                                "type": "number",
                                "format": "float"
                              }
                            }
                          }
                        },
                        "source": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "key": {
                                "type": "string",
                                "description": "Dimensionswert: E-Mail des Beauftragten, \"blueprint_name:uuid\", Quelle oder Status. \"unassigned\"/\"none\" für fehlende Dimensionen."
                              },
                              "created": {
                                "type": "integer"
                              },
                              "assigned": {
                                "type": "integer"
                              },
                              "resolved": {
                                "type": "integer"
                              },
                              "threat_rate": {
                                "type": "number",
                                "format": "float"
                              },
                              "false_positive_rate": {
                                "type": "number",
                                "format": "float"
                              },
                              "unresolved": {
                                "type": "integer"
                              },
                              "reassignment_rate": {
                                "type": "number",
                                "format": "float"
                              },
                              "escalation_rate": {
                                "type": "number",
                                "format": "float"
                              },
                              "avg_assign_hours": {
                                "type": "number",
                                "format": "float"
                              },
                              "avg_resolve_hours": {
                                "type": "number",
                                "format": "float"
                              },
                              "avg_handling_hours": {
                                "type": "number",
                                "format": "float"
                              }
                            }
                          }
                        },
                        "status": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "key": {
                                "type": "string",
                                "description": "Dimensionswert: E-Mail des Beauftragten, \"blueprint_name:uuid\", Quelle oder Status. \"unassigned\"/\"none\" für fehlende Dimensionen."
                              },
                              "created": {
                                "type": "integer"
                              },
                              "assigned": {
                                "type": "integer"
                              },
                              "resolved": {
                                "type": "integer"
                              },
                              "threat_rate": {
                                "type": "number",
                                "format": "float"
                              },
                              "false_positive_rate": {
                                "type": "number",
                                "format": "float"
                              },
                              "unresolved": {
                                "type": "integer"
                              },
                              "reassignment_rate": {
                                "type": "number",
                                "format": "float"
                              },
                              "escalation_rate": {
                                "type": "number",
                                "format": "float"
                              },
                              "avg_assign_hours": {
                                "type": "number",
                                "format": "float"
                              },
                              "avg_resolve_hours": {
                                "type": "number",
                                "format": "float"
                              },
                              "avg_handling_hours": {
                                "type": "number",
                                "format": "float"
                              }
                            }
                          }
                        }
                      }
                    },
                    "totals": {
                      "type": "object",
                      "properties": {
                        "created": {
                          "type": "integer"
                        },
                        "assigned": {
                          "type": "integer"
                        },
                        "resolved": {
                          "type": "integer"
                        },
                        "threat_rate": {
                          "type": "number",
                          "format": "float"
                        },
                        "false_positive_rate": {
                          "type": "number",
                          "format": "float"
                        },
                        "unresolved": {
                          "type": "integer"
                        },
                        "reassignment_rate": {
                          "type": "number",
                          "format": "float"
                        },
                        "escalation_rate": {
                          "type": "number",
                          "format": "float"
                        },
                        "avg_assign_hours": {
                          "type": "number",
                          "format": "float"
                        },
                        "avg_resolve_hours": {
                          "type": "number",
                          "format": "float"
                        },
                        "avg_handling_hours": {
                          "type": "number",
                          "format": "float"
                        }
                      }
                    },
                    "queue": {
                      "type": "object",
                      "description": "Live-Momentaufnahme, nicht auf den Datumsbereich beschränkt.",
                      "properties": {
                        "open": {
                          "type": "integer"
                        },
                        "overdue": {
                          "type": "integer"
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/v3/organization/{organization_id}/application/{application_id}/cases/bulk/status/": {
      "post": {
        "summary": "Fallstatus per Massenaktion aktualisieren",
        "description": "Wenden Sie denselben Statusübergang in einem einzigen Aufruf auf mehrere Fälle an: OPEN öffnet erneut, AWAITING_USER fordert Informationen an, RESOLVED schließt ab (Lösung erforderlich). Jeder Fall wird unabhängig ausgewertet; Gate-Fehlschläge (unvollständige Checkliste, fehlende erforderliche Notiz) werden pro Fall gemeldet, ohne den Batch abzubrechen.",
        "operationId": "bulk_update_case_status",
        "x-didit-sdk": {
          "resource": "cases",
          "method": "bulk_update_status",
          "auth": "api_key",
          "server": true,
          "scope": "application"
        },
        "tags": [
          "Cases"
        ],
        "parameters": [
          {
            "name": "organization_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "UUID der Organisation."
          },
          {
            "name": "application_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Anwendungs-UUID."
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "case_uuids",
                  "status"
                ],
                "properties": {
                  "case_uuids": {
                    "type": "array",
                    "items": {
                      "type": "string",
                      "format": "uuid"
                    },
                    "minItems": 1
                  },
                  "status": {
                    "type": "string",
                    "enum": [
                      "OPEN",
                      "AWAITING_USER",
                      "RESOLVED"
                    ]
                  },
                  "resolution": {
                    "type": "string",
                    "enum": [
                      "FALSE_POSITIVE",
                      "VALID_THREAT",
                      "INCONCLUSIVE",
                      "REQUIREMENTS_NOT_MET",
                      "REQUIREMENTS_SATISFIED"
                    ],
                    "description": "Erforderlich, wenn status RESOLVED ist."
                  },
                  "note": {
                    "type": "string",
                    "nullable": true
                  }
                }
              },
              "example": {
                "case_uuids": [
                  "c1a5e000-0000-4000-8000-000000000001"
                ],
                "status": "RESOLVED",
                "resolution": "FALSE_POSITIVE"
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X POST 'https://verification.didit.me/v3/organization/11111111-2222-3333-4444-555555555555/application/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/cases/bulk/status/' \\\n  -H 'x-api-key: YOUR_API_KEY' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\"case_uuids\": [\"c1a5e000-0000-4000-8000-000000000001\"], \"status\": \"RESOLVED\", \"resolution\": \"FALSE_POSITIVE\"}'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.cases.bulk_update_status(\n    case_uuids=[\"c1a5e000-0000-4000-8000-000000000001\"],\n    status=\"RESOLVED\",\n    resolution=\"FALSE_POSITIVE\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.cases.bulkUpdateStatus({\n  case_uuids: [\"c1a5e000-0000-4000-8000-000000000001\"],\n  status: \"RESOLVED\",\n  resolution: \"FALSE_POSITIVE\",\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.Cases.BulkUpdateStatus(ctx, didit.CasesBulkUpdateStatusParams{\n\tCaseUUIDs:  []string{\"c1a5e000-0000-4000-8000-000000000001\"},\n\tStatus:     \"RESOLVED\",\n\tResolution: didit.Some(didit.CasesBulkUpdateStatusParamsResolution(\"FALSE_POSITIVE\")),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import java.util.List;\nimport me.didit.Didit;\nimport me.didit.types.CasesBulkUpdateStatusParams;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.cases().bulkUpdateStatus(CasesBulkUpdateStatusParams.builder()\n        .caseUuids(List.of(\"c1a5e000-0000-4000-8000-000000000001\"))\n        .status(CasesBulkUpdateStatusParams.Status.of(\"RESOLVED\"))\n        .resolution(CasesBulkUpdateStatusParams.Resolution.of(\"FALSE_POSITIVE\"))\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\n$didit = new DiditClient();\n\n$result = $didit->cases->bulkUpdateStatus([\n    'case_uuids' => ['c1a5e000-0000-4000-8000-000000000001'],\n    'status' => 'RESOLVED',\n    'resolution' => 'FALSE_POSITIVE',\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.cases.bulk_update_status(\n  case_uuids: [\"c1a5e000-0000-4000-8000-000000000001\"],\n  status: \"RESOLVED\",\n  resolution: \"FALSE_POSITIVE\"\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.Cases.BulkUpdateStatusAsync(new CasesBulkUpdateStatusParams\n{\n    CaseUuids = new string[] { \"c1a5e000-0000-4000-8000-000000000001\" },\n    Status = \"RESOLVED\",\n    Resolution = new CasesBulkUpdateStatusParamsResolution(\"FALSE_POSITIVE\"),\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "responses": {
          "200": {
            "description": "Ergebnisse pro Fall.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CaseBulkUpdateResult"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/v3/organization/{organization_id}/application/{application_id}/cases/bulk/assign/": {
      "post": {
        "summary": "Fälle gesammelt zuweisen",
        "description": "Mehrere Fälle gleichzeitig zuweisen (oder Zuweisung aufheben mit assignee_user_id: null). Alle Fälle müssen denselben Blueprint teilen; Unstimmigkeiten werden pro Fall gemeldet, ohne den Batch abzubrechen.",
        "operationId": "bulk_assign_cases",
        "x-didit-sdk": {
          "resource": "cases",
          "method": "bulk_assign",
          "auth": "api_key",
          "server": true,
          "scope": "application"
        },
        "tags": [
          "Cases"
        ],
        "parameters": [
          {
            "name": "organization_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "UUID der Organisation."
          },
          {
            "name": "application_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Anwendungs-UUID."
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "case_uuids",
                  "assignee_user_id"
                ],
                "properties": {
                  "case_uuids": {
                    "type": "array",
                    "items": {
                      "type": "string",
                      "format": "uuid"
                    },
                    "minItems": 1
                  },
                  "assignee_user_id": {
                    "type": "string",
                    "format": "uuid",
                    "nullable": true
                  },
                  "assignee_email": {
                    "type": "string",
                    "format": "email",
                    "nullable": true
                  },
                  "assignee_name": {
                    "type": "string",
                    "nullable": true
                  }
                }
              },
              "example": {
                "case_uuids": [
                  "c1a5e000-0000-4000-8000-000000000001"
                ],
                "assignee_user_id": "9a000000-0000-4000-8000-0000000000aa"
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X POST 'https://verification.didit.me/v3/organization/11111111-2222-3333-4444-555555555555/application/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/cases/bulk/assign/' \\\n  -H 'x-api-key: YOUR_API_KEY' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\"case_uuids\": [\"c1a5e000-0000-4000-8000-000000000001\"], \"assignee_user_id\": \"9a000000-0000-4000-8000-0000000000aa\"}'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.cases.bulk_assign(\n    case_uuids=[\"c1a5e000-0000-4000-8000-000000000001\"],\n    assignee_user_id=\"9a000000-0000-4000-8000-0000000000aa\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.cases.bulkAssign({\n  case_uuids: [\"c1a5e000-0000-4000-8000-000000000001\"],\n  assignee_user_id: \"9a000000-0000-4000-8000-0000000000aa\",\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.Cases.BulkAssign(ctx, didit.CasesBulkAssignParams{\n\tCaseUUIDs:      []string{\"c1a5e000-0000-4000-8000-000000000001\"},\n\tAssigneeUserID: didit.String(\"9a000000-0000-4000-8000-0000000000aa\"),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import java.util.List;\nimport me.didit.Didit;\nimport me.didit.types.CasesBulkAssignParams;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.cases().bulkAssign(CasesBulkAssignParams.builder()\n        .caseUuids(List.of(\"c1a5e000-0000-4000-8000-000000000001\"))\n        .assigneeUserId(\"9a000000-0000-4000-8000-0000000000aa\")\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\n$didit = new DiditClient();\n\n$result = $didit->cases->bulkAssign([\n    'case_uuids' => ['c1a5e000-0000-4000-8000-000000000001'],\n    'assignee_user_id' => '9a000000-0000-4000-8000-0000000000aa',\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.cases.bulk_assign(\n  case_uuids: [\"c1a5e000-0000-4000-8000-000000000001\"],\n  assignee_user_id: \"9a000000-0000-4000-8000-0000000000aa\"\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.Cases.BulkAssignAsync(new CasesBulkAssignParams\n{\n    CaseUuids = new string[] { \"c1a5e000-0000-4000-8000-000000000001\" },\n    AssigneeUserId = \"9a000000-0000-4000-8000-0000000000aa\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "responses": {
          "200": {
            "description": "Ergebnisse pro Fall.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CaseBulkUpdateResult"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/v3/organization/{organization_id}/application/{application_id}/cases/blueprints/": {
      "get": {
        "summary": "Blueprints auflisten",
        "description": "Fall-Blueprints für die Anwendung auflisten.",
        "operationId": "list_case_blueprints",
        "x-didit-sdk": {
          "resource": "cases.blueprints",
          "method": "list",
          "auth": "api_key",
          "server": true,
          "scope": "application"
        },
        "tags": [
          "Case Blueprints"
        ],
        "parameters": [
          {
            "name": "organization_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "UUID der Organisation."
          },
          {
            "name": "application_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Anwendungs-UUID."
          },
          {
            "name": "limit",
            "in": "query",
            "schema": {
              "type": "integer",
              "default": 50,
              "minimum": 1
            },
            "description": "Seitengröße."
          },
          {
            "name": "offset",
            "in": "query",
            "schema": {
              "type": "integer",
              "default": 0,
              "minimum": 0
            },
            "description": "Nullbasierter Offset."
          }
        ],
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X GET 'https://verification.didit.me/v3/organization/11111111-2222-3333-4444-555555555555/application/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/cases/blueprints/' \\\n  -H 'x-api-key: YOUR_API_KEY'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nfor item in client.cases.blueprints.list():\n    print(item)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nfor await (const item of didit.cases.blueprints.list()) {\n  console.log(item);\n}"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\niter := client.Cases.Blueprints.ListAutoPaging(ctx, didit.CasesBlueprintsListParams{})\nfor iter.Next() {\n\tfmt.Printf(\"%+v\\n\", iter.Current())\n}\nif err := iter.Err(); err != nil {\n\tlog.Fatal(err)\n}"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nfor (var item : client.cases().blueprints().list()) {\n    System.out.println(item);\n}"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\n$didit = new DiditClient();\n\nforeach ($didit->cases->blueprints->list() as $item) {\n    print_r($item->toArray());\n}"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\ndidit.cases.blueprints.list.auto_paging_each do |item|\n  puts item.to_h\nend"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nawait foreach (var item in await client.Cases.Blueprints.ListAsync())\n{\n    Console.WriteLine(JsonSerializer.Serialize(item));\n}"
          }
        ],
        "responses": {
          "200": {
            "description": "Paginierte Blueprint-Liste.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "count": {
                      "type": "integer",
                      "description": "Anzahl der übereinstimmenden Zeilen, aus Performancegründen auf 100 begrenzt."
                    },
                    "next": {
                      "type": "string",
                      "nullable": true
                    },
                    "previous": {
                      "type": "string",
                      "nullable": true
                    },
                    "results": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/CaseBlueprintListItem"
                      }
                    }
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      },
      "post": {
        "summary": "Blueprint erstellen",
        "description": "Erstellen Sie einen Fall-Blueprint: allgemeine Einstellungen (Zuweisung, Eskalation, Weiterleitung, Vier-Augen-Prinzip) plus content_config, die sechs Abschnitte, die die Fallseite steuern. Setzen Sie publish=false, um einen unveröffentlichten Entwurf zu erstellen; durch die Veröffentlichung wird dessen erste Live-Version erstellt. Das Verwerfen eines nie veröffentlichten Entwurfs löscht diesen.",
        "operationId": "create_case_blueprint",
        "x-didit-sdk": {
          "resource": "cases.blueprints",
          "method": "create",
          "auth": "api_key",
          "server": true,
          "scope": "application"
        },
        "tags": [
          "Case Blueprints"
        ],
        "parameters": [
          {
            "name": "organization_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "UUID der Organisation."
          },
          {
            "name": "application_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Anwendungs-UUID."
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "name",
                  "assignee_pool"
                ],
                "properties": {
                  "name": {
                    "type": "string",
                    "maxLength": 24,
                    "description": "Maximal 24 Zeichen, z. B. „AML investigation“."
                  },
                  "description": {
                    "type": "string",
                    "nullable": true
                  },
                  "assignee_pool": {
                    "type": "array",
                    "items": {
                      "type": "string",
                      "format": "uuid"
                    },
                    "minItems": 1,
                    "description": "Liste von Benutzer-UUIDs. Leere Arrays werden mit \"Mindestens einen Bearbeiter auswählen\" abgelehnt."
                  },
                  "assignment_method": {
                    "type": "string",
                    "enum": [
                      "MANUAL",
                      "AUTOMATIC"
                    ],
                    "default": "MANUAL"
                  },
                  "max_active_cases": {
                    "type": "integer",
                    "nullable": true,
                    "minimum": 1,
                    "description": "Schwellenwert für den Automatikmodus: „weniger als N Fälle dieser Vorlage zugewiesen“."
                  },
                  "escalation_enabled": {
                    "type": "boolean",
                    "default": false
                  },
                  "escalation_blueprint": {
                    "type": "string",
                    "format": "uuid",
                    "nullable": true,
                    "description": "Ziel-Blueprint-UUID. Wird beim Speichern nicht erzwungen, aber die Eskalationsaktion schlägt mit 400 fehl, bis sowohl escalation_enabled als auch escalation_blueprint festgelegt sind."
                  },
                  "transfer_enabled": {
                    "type": "boolean",
                    "default": false
                  },
                  "four_eyes_checker_blueprint": {
                    "type": "string",
                    "format": "uuid",
                    "nullable": true,
                    "description": "Wenn dies festgelegt wird, wird die Vier-Augen-Prüfung aktiviert: Entscheidungen zu diesem Blueprint werden in die Warteschlange des Checker-Blueprints eingereiht."
                  },
                  "require_resolution_note": {
                    "type": "boolean",
                    "default": false
                  },
                  "content_config": {
                    "$ref": "#/components/schemas/CaseContentConfig"
                  },
                  "is_active": {
                    "type": "boolean",
                    "default": true
                  },
                  "default_deadline_hours": {
                    "type": "integer",
                    "nullable": true,
                    "minimum": 1,
                    "maximum": 8760,
                    "description": "Standardfrist für neu geöffnete Fälle. Fristen bestehender Fälle bleiben unverändert."
                  },
                  "publish": {
                    "type": "boolean",
                    "writeOnly": true,
                    "default": true,
                    "description": "Auf false setzen, um einen noch nie veröffentlichten Entwurf zu speichern. Der Datensatz bleibt bei Version 0 inaktiv, bis der Entwurf explizit veröffentlicht wird. Das Weglassen dieses Felds behält die sofortige Erstellung für bestehende Integrationen bei."
                  }
                }
              },
              "example": {
                "name": "AML investigation",
                "assignee_pool": [
                  "9a000000-0000-4000-8000-0000000000aa"
                ],
                "assignment_method": "AUTOMATIC",
                "max_active_cases": 15,
                "require_resolution_note": true,
                "content_config": {
                  "aml_control": {
                    "enabled": true,
                    "financial": true,
                    "identity": false
                  }
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X POST 'https://verification.didit.me/v3/organization/11111111-2222-3333-4444-555555555555/application/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/cases/blueprints/' \\\n  -H 'x-api-key: YOUR_API_KEY' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\"name\": \"AML investigation\", \"assignee_pool\": [\"9a000000-0000-4000-8000-0000000000aa\"], \"assignment_method\": \"AUTOMATIC\", \"max_active_cases\": 15, \"require_resolution_note\": true, \"content_config\": {\"aml_control\": {\"enabled\": true, \"financial\": true, \"identity\": false}}}'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.cases.blueprints.create(\n    name=\"AML investigation\",\n    assignee_pool=[\"9a000000-0000-4000-8000-0000000000aa\"],\n    assignment_method=\"AUTOMATIC\",\n    max_active_cases=15,\n    require_resolution_note=True,\n    content_config={\n        \"aml_control\": {\n            \"enabled\": True,\n            \"financial\": True,\n            \"identity\": False,\n        },\n    },\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.cases.blueprints.create({\n  name: \"AML investigation\",\n  assignee_pool: [\"9a000000-0000-4000-8000-0000000000aa\"],\n  assignment_method: \"AUTOMATIC\",\n  max_active_cases: 15,\n  require_resolution_note: true,\n  content_config: {\n    aml_control: {\n      enabled: true,\n      financial: true,\n      identity: false,\n    },\n  },\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.Cases.Blueprints.Create(ctx, didit.CasesBlueprintsCreateParams{\n\tName:                  \"AML investigation\",\n\tAssigneePool:          []string{\"9a000000-0000-4000-8000-0000000000aa\"},\n\tAssignmentMethod:      didit.Some(didit.CasesBlueprintsCreateParamsAssignmentMethod(\"AUTOMATIC\")),\n\tMaxActiveCases:        didit.Int(15),\n\tRequireResolutionNote: didit.Bool(true),\n\tContentConfig: didit.Some(didit.CaseContentConfigParam{\n\t\tAMLControl: didit.Some(didit.CaseContentConfigParamAMLControl{\n\t\t\tEnabled:   didit.Bool(true),\n\t\t\tFinancial: didit.Bool(true),\n\t\t\tIdentity:  didit.Bool(false),\n\t\t}),\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;\nimport me.didit.Didit;\nimport me.didit.types.CaseContentConfig;\nimport me.didit.types.CasesBlueprintsCreateParams;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.cases().blueprints().create(CasesBlueprintsCreateParams.builder()\n        .name(\"AML investigation\")\n        .assigneePool(List.of(\"9a000000-0000-4000-8000-0000000000aa\"))\n        .assignmentMethod(CasesBlueprintsCreateParams.AssignmentMethod.of(\"AUTOMATIC\"))\n        .maxActiveCases(15L)\n        .requireResolutionNote(true)\n        .contentConfig(CaseContentConfig.builder()\n                .amlControl(CaseContentConfig.AmlControl.builder()\n                        .enabled(true)\n                        .financial(true)\n                        .identity(false)\n                        .build())\n                .build())\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\n$didit = new DiditClient();\n\n$result = $didit->cases->blueprints->create([\n    'name' => 'AML investigation',\n    'assignee_pool' => ['9a000000-0000-4000-8000-0000000000aa'],\n    'assignment_method' => 'AUTOMATIC',\n    'max_active_cases' => 15,\n    'require_resolution_note' => true,\n    'content_config' => [\n        'aml_control' => [\n            'enabled' => true,\n            'financial' => true,\n            'identity' => false,\n        ],\n    ],\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.cases.blueprints.create(\n  name: \"AML investigation\",\n  assignee_pool: [\"9a000000-0000-4000-8000-0000000000aa\"],\n  assignment_method: \"AUTOMATIC\",\n  max_active_cases: 15,\n  require_resolution_note: true,\n  content_config: {\n    aml_control: {\n      enabled: true,\n      financial: true,\n      identity: false,\n    },\n  }\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.Cases.Blueprints.CreateAsync(new CasesBlueprintsCreateParams\n{\n    Name = \"AML investigation\",\n    AssigneePool = new string[] { \"9a000000-0000-4000-8000-0000000000aa\" },\n    AssignmentMethod = new CasesBlueprintsCreateParamsAssignmentMethod(\"AUTOMATIC\"),\n    MaxActiveCases = 15,\n    RequireResolutionNote = true,\n    ContentConfig = new CaseContentConfig\n    {\n        AmlControl = new CaseContentConfigAmlControl\n        {\n            Enabled = true,\n            Financial = true,\n            Identity = false,\n        },\n    },\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "responses": {
          "201": {
            "description": "Blueprint erstellt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CaseBlueprintDetail"
                }
              }
            }
          },
          "400": {
            "description": "Name mit mehr als 24 Zeichen, leerer assignee_pool oder ein querverwiesener Blueprint (Eskalation/Checker) wurde nicht gefunden.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/v3/organization/{organization_id}/application/{application_id}/cases/blueprints/{blueprint_uuid}/": {
      "get": {
        "summary": "Vorlage abrufen",
        "description": "Eine Vorlage abrufen, einschließlich ihrer verknüpften Erstellungsquellen (AML-Konfiguration, Transaktionsregeln, Workflow-Knoten) und welche Vorlagen an sie eskalieren.",
        "operationId": "get_case_blueprint",
        "x-didit-sdk": {
          "resource": "cases.blueprints",
          "method": "retrieve",
          "auth": "api_key",
          "server": true,
          "scope": "application"
        },
        "tags": [
          "Case Blueprints"
        ],
        "parameters": [
          {
            "name": "organization_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "UUID der Organisation."
          },
          {
            "name": "application_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Anwendungs-UUID."
          },
          {
            "name": "blueprint_uuid",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "b1de0000-0000-4000-8000-000000000002"
            },
            "description": "Blueprint-UUID."
          }
        ],
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X GET 'https://verification.didit.me/v3/organization/11111111-2222-3333-4444-555555555555/application/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/cases/blueprints/b1de0000-0000-4000-8000-000000000002/' \\\n  -H 'x-api-key: YOUR_API_KEY'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.cases.blueprints.retrieve(\n    \"b1de0000-0000-4000-8000-000000000002\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.cases.blueprints.retrieve(\"b1de0000-0000-4000-8000-000000000002\");\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.Cases.Blueprints.Retrieve(ctx, \"b1de0000-0000-4000-8000-000000000002\")\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.cases().blueprints().retrieve(\"b1de0000-0000-4000-8000-000000000002\");\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\n$didit = new DiditClient();\n\n$result = $didit->cases->blueprints->retrieve('b1de0000-0000-4000-8000-000000000002');\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.cases.blueprints.retrieve(\"b1de0000-0000-4000-8000-000000000002\")\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.Cases.Blueprints.RetrieveAsync(\"b1de0000-0000-4000-8000-000000000002\");\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "responses": {
          "200": {
            "description": "Blueprint-Details.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CaseBlueprintDetail"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      },
      "patch": {
        "summary": "Blueprint aktualisieren",
        "description": "Allgemeine Einstellungen oder content_config eines Blueprints partiell aktualisieren.",
        "operationId": "update_case_blueprint",
        "x-didit-sdk": {
          "resource": "cases.blueprints",
          "method": "update",
          "auth": "api_key",
          "server": true,
          "scope": "application"
        },
        "tags": [
          "Case Blueprints"
        ],
        "parameters": [
          {
            "name": "organization_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "UUID der Organisation."
          },
          {
            "name": "application_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Anwendungs-UUID."
          },
          {
            "name": "blueprint_uuid",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "b1de0000-0000-4000-8000-000000000002"
            },
            "description": "Blueprint-UUID."
          }
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "name": {
                    "type": "string",
                    "maxLength": 24,
                    "description": "Maximal 24 Zeichen, z. B. „AML investigation“."
                  },
                  "description": {
                    "type": "string",
                    "nullable": true
                  },
                  "assignee_pool": {
                    "type": "array",
                    "items": {
                      "type": "string",
                      "format": "uuid"
                    },
                    "minItems": 1,
                    "description": "Liste von Benutzer-UUIDs. Leere Arrays werden mit \"Mindestens einen Bearbeiter auswählen\" abgelehnt."
                  },
                  "assignment_method": {
                    "type": "string",
                    "enum": [
                      "MANUAL",
                      "AUTOMATIC"
                    ]
                  },
                  "max_active_cases": {
                    "type": "integer",
                    "nullable": true,
                    "minimum": 1,
                    "description": "Schwellenwert für den Automatikmodus: „weniger als N Fälle dieser Vorlage zugewiesen“."
                  },
                  "escalation_enabled": {
                    "type": "boolean"
                  },
                  "escalation_blueprint": {
                    "type": "string",
                    "format": "uuid",
                    "nullable": true,
                    "description": "Ziel-Blueprint-UUID. Wird beim Speichern nicht erzwungen, aber die Eskalationsaktion schlägt mit 400 fehl, bis sowohl escalation_enabled als auch escalation_blueprint festgelegt sind."
                  },
                  "transfer_enabled": {
                    "type": "boolean"
                  },
                  "four_eyes_checker_blueprint": {
                    "type": "string",
                    "format": "uuid",
                    "nullable": true,
                    "description": "Wenn dies festgelegt wird, wird die Vier-Augen-Prüfung aktiviert: Entscheidungen zu diesem Blueprint werden in die Warteschlange des Checker-Blueprints eingereiht."
                  },
                  "require_resolution_note": {
                    "type": "boolean"
                  },
                  "content_config": {
                    "$ref": "#/components/schemas/CaseContentConfig"
                  },
                  "is_active": {
                    "type": "boolean"
                  },
                  "default_deadline_hours": {
                    "type": "integer",
                    "nullable": true,
                    "minimum": 1,
                    "maximum": 8760,
                    "description": "Standardfrist für neu geöffnete Fälle. Fristen bestehender Fälle bleiben unverändert."
                  },
                  "expected_version": {
                    "type": "integer",
                    "minimum": 1,
                    "description": "Die vom Editor geöffnete Version. Eine veraltete Version gibt 409 zurück, ohne die Prüfungsrichtlinie zu ändern."
                  }
                }
              },
              "example": {
                "transfer_enabled": true
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X PATCH 'https://verification.didit.me/v3/organization/11111111-2222-3333-4444-555555555555/application/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/cases/blueprints/b1de0000-0000-4000-8000-000000000002/' \\\n  -H 'x-api-key: YOUR_API_KEY' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\"transfer_enabled\": true}'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.cases.blueprints.update(\n    \"b1de0000-0000-4000-8000-000000000002\",\n    transfer_enabled=True,\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.cases.blueprints.update(\"b1de0000-0000-4000-8000-000000000002\", {\n  transfer_enabled: true,\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.Cases.Blueprints.Update(ctx, \"b1de0000-0000-4000-8000-000000000002\", didit.CasesBlueprintsUpdateParams{\n\tTransferEnabled: didit.Bool(true),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\nimport me.didit.types.CasesBlueprintsUpdateParams;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.cases().blueprints().update(\"b1de0000-0000-4000-8000-000000000002\", CasesBlueprintsUpdateParams.builder()\n        .transferEnabled(true)\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\n$didit = new DiditClient();\n\n$result = $didit->cases->blueprints->update('b1de0000-0000-4000-8000-000000000002', [\n    'transfer_enabled' => true,\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.cases.blueprints.update(\n  \"b1de0000-0000-4000-8000-000000000002\",\n  transfer_enabled: true\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.Cases.Blueprints.UpdateAsync(\"b1de0000-0000-4000-8000-000000000002\", new CasesBlueprintsUpdateParams\n{\n    TransferEnabled = true,\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "responses": {
          "200": {
            "description": "Aktualisierter Blueprint.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CaseBlueprintDetail"
                }
              }
            }
          },
          "409": {
            "description": "Die Prüfungsrichtlinie wurde seit expected_version geändert. Prüfen Sie die neueste Version, bevor Sie es erneut versuchen."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      },
      "delete": {
        "summary": "Blueprint löschen",
        "description": "Einen Blueprint löschen. Die Löschung ist immer erfolgreich und berührt die Fälle des Blueprints nicht: Bestehende Fälle behalten ihre Blueprint-Referenz und dessen Einstellungen gelten weiterhin für sie. Ein gelöschter Blueprint erscheint nicht mehr in Blueprint-Listen und kann nicht mehr als Übertragungsziel ausgewählt werden; wenn ein Maker-Blueprint gelöscht wird, während für eine Entscheidung die Vier-Augen-Genehmigung aussteht, verbleibt der Fall bei einer abgelehnten Entscheidung auf dem Checker-Blueprint.",
        "operationId": "delete_case_blueprint",
        "x-didit-sdk": {
          "resource": "cases.blueprints",
          "method": "delete",
          "auth": "api_key",
          "server": true,
          "scope": "application"
        },
        "tags": [
          "Case Blueprints"
        ],
        "parameters": [
          {
            "name": "organization_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "UUID der Organisation."
          },
          {
            "name": "application_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Anwendungs-UUID."
          },
          {
            "name": "blueprint_uuid",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "b1de0000-0000-4000-8000-000000000002"
            },
            "description": "Blueprint-UUID."
          }
        ],
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X DELETE 'https://verification.didit.me/v3/organization/11111111-2222-3333-4444-555555555555/application/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/cases/blueprints/b1de0000-0000-4000-8000-000000000002/' \\\n  -H 'x-api-key: YOUR_API_KEY'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nclient.cases.blueprints.delete(\n    \"b1de0000-0000-4000-8000-000000000002\",\n)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nawait didit.cases.blueprints.delete(\"b1de0000-0000-4000-8000-000000000002\");"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nif err := client.Cases.Blueprints.Delete(ctx, \"b1de0000-0000-4000-8000-000000000002\"); err != nil {\n\tlog.Fatal(err)\n}"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nclient.cases().blueprints().delete(\"b1de0000-0000-4000-8000-000000000002\");"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\n$didit = new DiditClient();\n\n$didit->cases->blueprints->delete('b1de0000-0000-4000-8000-000000000002');"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\ndidit.cases.blueprints.delete(\"b1de0000-0000-4000-8000-000000000002\")"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nawait client.Cases.Blueprints.DeleteAsync(\"b1de0000-0000-4000-8000-000000000002\");"
          }
        ],
        "responses": {
          "204": {
            "description": "Blueprint gelöscht."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/v3/organization/{organization_id}/application/{application_id}/cases/blueprints/presets/": {
      "get": {
        "summary": "Blueprint-Voreinstellungen auflisten",
        "description": "Die vier integrierten Voreinstellungen (Screening hit, AML investigation, Suspicious activity, KYC review) mit ihrer content_config auflisten und angeben, ob jede davon bereits in dieser Anwendung installiert ist.",
        "operationId": "list_case_blueprint_presets",
        "x-didit-sdk": {
          "resource": "cases.blueprints",
          "method": "list_presets",
          "auth": "api_key",
          "server": true,
          "scope": "application"
        },
        "tags": [
          "Case Blueprints"
        ],
        "parameters": [
          {
            "name": "organization_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "UUID der Organisation."
          },
          {
            "name": "application_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Anwendungs-UUID."
          }
        ],
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X GET 'https://verification.didit.me/v3/organization/11111111-2222-3333-4444-555555555555/application/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/cases/blueprints/presets/' \\\n  -H 'x-api-key: YOUR_API_KEY'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.cases.blueprints.list_presets()\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.cases.blueprints.listPresets();\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.Cases.Blueprints.ListPresets(ctx)\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.cases().blueprints().listPresets();\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\n$didit = new DiditClient();\n\n$result = $didit->cases->blueprints->listPresets();\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.cases.blueprints.list_presets\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.Cases.Blueprints.ListPresetsAsync();\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "responses": {
          "200": {
            "description": "Vorlagenkatalog.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "results": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "preset_key": {
                            "type": "string",
                            "enum": [
                              "screening_hit",
                              "aml_investigation",
                              "suspicious_activity",
                              "kyc"
                            ]
                          },
                          "name": {
                            "type": "string"
                          },
                          "description": {
                            "type": "string"
                          },
                          "content_config": {
                            "$ref": "#/components/schemas/CaseContentConfig"
                          },
                          "installed": {
                            "type": "boolean"
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/v3/organization/{organization_id}/application/{application_id}/cases/blueprints/presets/install/": {
      "post": {
        "summary": "Blueprint-Vorlagen installieren",
        "description": "Kopieren Sie ein oder mehrere Presets als bearbeitbare Vorlagen in die Anwendung. Idempotent pro preset_key; lassen Sie preset_keys weg, um jedes noch nicht installierte Preset zu installieren.",
        "operationId": "install_case_blueprint_presets",
        "x-didit-sdk": {
          "resource": "cases.blueprints",
          "method": "install_presets",
          "auth": "api_key",
          "server": true,
          "scope": "application"
        },
        "tags": [
          "Case Blueprints"
        ],
        "parameters": [
          {
            "name": "organization_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "UUID der Organisation."
          },
          {
            "name": "application_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Anwendungs-UUID."
          }
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "preset_keys": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    },
                    "nullable": true,
                    "description": "Teilmenge von screening_hit, aml_investigation, suspicious_activity, kyc. Weglassen, um alle zu installieren."
                  }
                }
              },
              "example": {
                "preset_keys": [
                  "aml_investigation",
                  "kyc"
                ]
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X POST 'https://verification.didit.me/v3/organization/11111111-2222-3333-4444-555555555555/application/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/cases/blueprints/presets/install/' \\\n  -H 'x-api-key: YOUR_API_KEY' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\"preset_keys\": [\"aml_investigation\", \"kyc\"]}'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.cases.blueprints.install_presets(\n    preset_keys=[\"aml_investigation\", \"kyc\"],\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.cases.blueprints.installPresets({\n  preset_keys: [\"aml_investigation\", \"kyc\"],\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.Cases.Blueprints.InstallPresets(ctx, didit.CasesBlueprintsInstallPresetsParams{\n\tPresetKeys: didit.Some([]string{\"aml_investigation\", \"kyc\"}),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import java.util.List;\nimport me.didit.Didit;\nimport me.didit.types.CasesBlueprintsInstallPresetsParams;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.cases().blueprints().installPresets(CasesBlueprintsInstallPresetsParams.builder()\n        .presetKeys(List.of(\"aml_investigation\", \"kyc\"))\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\n$didit = new DiditClient();\n\n$result = $didit->cases->blueprints->installPresets([\n    'preset_keys' => ['aml_investigation', 'kyc'],\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.cases.blueprints.install_presets(preset_keys: [\"aml_investigation\", \"kyc\"])\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.Cases.Blueprints.InstallPresetsAsync(new CasesBlueprintsInstallPresetsParams\n{\n    PresetKeys = new string[] { \"aml_investigation\", \"kyc\" },\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "responses": {
          "201": {
            "description": "Ein oder mehrere installierte Presets.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CaseBlueprintPresetInstallResult"
                }
              }
            }
          },
          "200": {
            "description": "Keine neuen Voreinstellungen zu installieren (alle angeforderten Voreinstellungen existieren bereits).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CaseBlueprintPresetInstallResult"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/v3/organization/{organization_id}/application/{application_id}/report-templates/": {
      "get": {
        "summary": "Berichtsvorlagen auflisten",
        "description": "FIU-Berichtsvorlagen für die Anwendung auflisten.",
        "operationId": "list_report_templates",
        "x-didit-sdk": {
          "resource": "report_templates",
          "method": "list",
          "auth": "api_key",
          "server": true,
          "scope": "application"
        },
        "tags": [
          "Report Templates"
        ],
        "parameters": [
          {
            "name": "organization_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "UUID der Organisation."
          },
          {
            "name": "application_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Anwendungs-UUID."
          },
          {
            "name": "limit",
            "in": "query",
            "schema": {
              "type": "integer",
              "default": 50,
              "minimum": 1
            },
            "description": "Seitengröße."
          },
          {
            "name": "offset",
            "in": "query",
            "schema": {
              "type": "integer",
              "default": 0,
              "minimum": 0
            },
            "description": "Nullbasierter Offset."
          }
        ],
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X GET 'https://verification.didit.me/v3/organization/11111111-2222-3333-4444-555555555555/application/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/report-templates/' \\\n  -H 'x-api-key: YOUR_API_KEY'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nfor item in client.report_templates.list():\n    print(item)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nfor await (const item of didit.reportTemplates.list()) {\n  console.log(item);\n}"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\niter := client.ReportTemplates.ListAutoPaging(ctx, didit.ReportTemplatesListParams{})\nfor iter.Next() {\n\tfmt.Printf(\"%+v\\n\", iter.Current())\n}\nif err := iter.Err(); err != nil {\n\tlog.Fatal(err)\n}"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nfor (var item : client.reportTemplates().list()) {\n    System.out.println(item);\n}"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\n$didit = new DiditClient();\n\nforeach ($didit->reportTemplates->list() as $item) {\n    print_r($item->toArray());\n}"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\ndidit.report_templates.list.auto_paging_each do |item|\n  puts item.to_h\nend"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nawait foreach (var item in await client.ReportTemplates.ListAsync())\n{\n    Console.WriteLine(JsonSerializer.Serialize(item));\n}"
          }
        ],
        "responses": {
          "200": {
            "description": "Paginierte Vorlagen.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "count": {
                      "type": "integer",
                      "description": "Anzahl der übereinstimmenden Zeilen, aus Performancegründen auf 100 begrenzt."
                    },
                    "next": {
                      "type": "string",
                      "nullable": true
                    },
                    "previous": {
                      "type": "string",
                      "nullable": true
                    },
                    "results": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/ReportTemplateDetail"
                      }
                    }
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      },
      "post": {
        "summary": "Berichtsvorlage erstellen",
        "description": "Erstellen Sie eine wiederverwendbare goAML-Header-Vorlage pro Rechtsordnung und Berichtstyp. Wird mit 400 abgelehnt, wenn eines der auf Vorlagenebene obligatorischen Felder (rentity_id, submission_code, currency_code_local) in field_config fehlt; eine ungültige Vorlage kann weder gespeichert noch zur Erstellung eines Berichts verwendet werden. Header-Felder pro Einreichung (action, submission_date, transactions) werden stattdessen bei der Validierung/Finalisierung des Berichts durchgesetzt.",
        "operationId": "create_report_template",
        "x-didit-sdk": {
          "resource": "report_templates",
          "method": "create",
          "auth": "api_key",
          "server": true,
          "scope": "application"
        },
        "tags": [
          "Report Templates"
        ],
        "parameters": [
          {
            "name": "organization_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "UUID der Organisation."
          },
          {
            "name": "application_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Anwendungs-UUID."
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "name",
                  "jurisdiction",
                  "report_type"
                ],
                "properties": {
                  "name": {
                    "type": "string"
                  },
                  "jurisdiction": {
                    "type": "string",
                    "minLength": 2,
                    "maxLength": 2,
                    "description": "ISO 3166-1 Alpha-2-Ländercode, der beim Speichern in Großbuchstaben umgewandelt wird."
                  },
                  "report_type": {
                    "type": "string",
                    "enum": [
                      "SAR",
                      "STR",
                      "CTR",
                      "TTR",
                      "UTR",
                      "IFT",
                      "CBR",
                      "TFR"
                    ]
                  },
                  "field_config": {
                    "type": "object",
                    "description": "Wiederverwendbare goAML-Header-Standardwerte. Pflichtfelder auf Vorlagenebene: rentity_id, submission_code und currency_code_local (3-stellig). Optional: enabled_fields (welche optionalen Berichtsblöcke enthalten sein sollen) sowie Standardwerte für reporting_person, location, reason und action. Header-Felder pro Meldung (action, submission_date, transactions, jurisdiction) werden bei der Validierung oder Fertigstellung des Berichts erzwungen, nicht in der Vorlage."
                  }
                }
              },
              "example": {
                "name": "US SAR default",
                "jurisdiction": "US",
                "report_type": "SAR",
                "field_config": {
                  "rentity_id": "FIU-US-00123",
                  "submission_code": "E",
                  "currency_code_local": "USD"
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X POST 'https://verification.didit.me/v3/organization/11111111-2222-3333-4444-555555555555/application/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/report-templates/' \\\n  -H 'x-api-key: YOUR_API_KEY' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\"name\": \"US SAR default\", \"jurisdiction\": \"US\", \"report_type\": \"SAR\", \"field_config\": {\"rentity_id\": \"FIU-US-00123\", \"submission_code\": \"E\", \"currency_code_local\": \"USD\"}}'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.report_templates.create(\n    name=\"US SAR default\",\n    jurisdiction=\"US\",\n    report_type=\"SAR\",\n    field_config={\"rentity_id\": \"FIU-US-00123\", \"submission_code\": \"E\", \"currency_code_local\": \"USD\"},\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.reportTemplates.create({\n  name: \"US SAR default\",\n  jurisdiction: \"US\",\n  report_type: \"SAR\",\n  field_config: { rentity_id: \"FIU-US-00123\", submission_code: \"E\", currency_code_local: \"USD\" },\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.ReportTemplates.Create(ctx, didit.ReportTemplatesCreateParams{\n\tName:         \"US SAR default\",\n\tJurisdiction: \"US\",\n\tReportType:   \"SAR\",\n\tFieldConfig:  didit.Some(map[string]any{\"rentity_id\": \"FIU-US-00123\", \"submission_code\": \"E\", \"currency_code_local\": \"USD\"}),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import java.util.Map;\nimport me.didit.Didit;\nimport me.didit.types.ReportTemplatesCreateParams;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.reportTemplates().create(ReportTemplatesCreateParams.builder()\n        .name(\"US SAR default\")\n        .jurisdiction(\"US\")\n        .reportType(ReportTemplatesCreateParams.ReportType.of(\"SAR\"))\n        .fieldConfig(Map.of(\"rentity_id\", \"FIU-US-00123\", \"submission_code\", \"E\", \"currency_code_local\", \"USD\"))\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\n$didit = new DiditClient();\n\n$result = $didit->reportTemplates->create([\n    'name' => 'US SAR default',\n    'jurisdiction' => 'US',\n    'report_type' => 'SAR',\n    'field_config' => ['rentity_id' => 'FIU-US-00123', 'submission_code' => 'E', 'currency_code_local' => 'USD'],\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.report_templates.create(\n  name: \"US SAR default\",\n  jurisdiction: \"US\",\n  report_type: \"SAR\",\n  field_config: { rentity_id: \"FIU-US-00123\", submission_code: \"E\", currency_code_local: \"USD\" }\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Collections.Generic;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.ReportTemplates.CreateAsync(new ReportTemplatesCreateParams\n{\n    Name = \"US SAR default\",\n    Jurisdiction = \"US\",\n    ReportType = \"SAR\",\n    FieldConfig = new Dictionary<string, object> { [\"rentity_id\"] = \"FIU-US-00123\", [\"submission_code\"] = \"E\", [\"currency_code_local\"] = \"USD\" },\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "responses": {
          "201": {
            "description": "Vorlage erstellt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ReportTemplateDetail"
                }
              }
            }
          },
          "400": {
            "description": "Nicht erkannte Jurisdiktion oder field_config schlägt bei der Validierung der Pflichtfelder fehl.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "errors": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      }
                    }
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/v3/organization/{organization_id}/application/{application_id}/report-templates/{template_uuid}/": {
      "get": {
        "summary": "Berichtsvorlage abrufen",
        "description": "Eine Berichtsvorlage abrufen.",
        "operationId": "get_report_template",
        "x-didit-sdk": {
          "resource": "report_templates",
          "method": "retrieve",
          "auth": "api_key",
          "server": true,
          "scope": "application"
        },
        "tags": [
          "Report Templates"
        ],
        "parameters": [
          {
            "name": "organization_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "UUID der Organisation."
          },
          {
            "name": "application_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Anwendungs-UUID."
          },
          {
            "name": "template_uuid",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "7ec00000-0000-4000-8000-000000000006"
            },
            "description": "Berichtsvorlagen-UUID."
          }
        ],
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X GET 'https://verification.didit.me/v3/organization/11111111-2222-3333-4444-555555555555/application/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/report-templates/7ec00000-0000-4000-8000-000000000006/' \\\n  -H 'x-api-key: YOUR_API_KEY'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.report_templates.retrieve(\n    \"7ec00000-0000-4000-8000-000000000006\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.reportTemplates.retrieve(\"7ec00000-0000-4000-8000-000000000006\");\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.ReportTemplates.Retrieve(ctx, \"7ec00000-0000-4000-8000-000000000006\")\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.reportTemplates().retrieve(\"7ec00000-0000-4000-8000-000000000006\");\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\n$didit = new DiditClient();\n\n$result = $didit->reportTemplates->retrieve('7ec00000-0000-4000-8000-000000000006');\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.report_templates.retrieve(\"7ec00000-0000-4000-8000-000000000006\")\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.ReportTemplates.RetrieveAsync(\"7ec00000-0000-4000-8000-000000000006\");\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "responses": {
          "200": {
            "description": "Vorlagendetails.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ReportTemplateDetail"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      },
      "patch": {
        "summary": "Berichtsvorlage aktualisieren",
        "description": "Berichtsvorlage partiell aktualisieren. Validiert obligatorische goAML-Felder beim Speichern erneut.",
        "operationId": "update_report_template",
        "x-didit-sdk": {
          "resource": "report_templates",
          "method": "update",
          "auth": "api_key",
          "server": true,
          "scope": "application"
        },
        "tags": [
          "Report Templates"
        ],
        "parameters": [
          {
            "name": "organization_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "UUID der Organisation."
          },
          {
            "name": "application_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Anwendungs-UUID."
          },
          {
            "name": "template_uuid",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "7ec00000-0000-4000-8000-000000000006"
            },
            "description": "Berichtsvorlagen-UUID."
          }
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "name": {
                    "type": "string"
                  },
                  "jurisdiction": {
                    "type": "string",
                    "minLength": 2,
                    "maxLength": 2,
                    "description": "ISO 3166-1 Alpha-2-Ländercode, der beim Speichern in Großbuchstaben umgewandelt wird."
                  },
                  "report_type": {
                    "type": "string",
                    "enum": [
                      "SAR",
                      "STR",
                      "CTR",
                      "TTR",
                      "UTR",
                      "IFT",
                      "CBR",
                      "TFR"
                    ]
                  },
                  "field_config": {
                    "type": "object",
                    "description": "Wiederverwendbare goAML-Header-Standardwerte. Pflichtfelder auf Vorlagenebene: rentity_id, submission_code und currency_code_local (3-stellig). Optional: enabled_fields (welche optionalen Berichtsblöcke enthalten sein sollen) sowie Standardwerte für reporting_person, location, reason und action. Header-Felder pro Meldung (action, submission_date, transactions, jurisdiction) werden bei der Validierung oder Fertigstellung des Berichts erzwungen, nicht in der Vorlage."
                  }
                }
              },
              "example": {
                "field_config": {
                  "rentity_id": "FIU-US-00124"
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X PATCH 'https://verification.didit.me/v3/organization/11111111-2222-3333-4444-555555555555/application/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/report-templates/7ec00000-0000-4000-8000-000000000006/' \\\n  -H 'x-api-key: YOUR_API_KEY' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\"field_config\": {\"rentity_id\": \"FIU-US-00124\"}}'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.report_templates.update(\n    \"7ec00000-0000-4000-8000-000000000006\",\n    field_config={\"rentity_id\": \"FIU-US-00124\"},\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.reportTemplates.update(\"7ec00000-0000-4000-8000-000000000006\", {\n  field_config: { rentity_id: \"FIU-US-00124\" },\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.ReportTemplates.Update(ctx, \"7ec00000-0000-4000-8000-000000000006\", didit.ReportTemplatesUpdateParams{\n\tFieldConfig: didit.Some(map[string]any{\"rentity_id\": \"FIU-US-00124\"}),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import java.util.Map;\nimport me.didit.Didit;\nimport me.didit.types.ReportTemplatesUpdateParams;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.reportTemplates().update(\"7ec00000-0000-4000-8000-000000000006\", ReportTemplatesUpdateParams.builder()\n        .fieldConfig(Map.of(\"rentity_id\", \"FIU-US-00124\"))\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\n$didit = new DiditClient();\n\n$result = $didit->reportTemplates->update('7ec00000-0000-4000-8000-000000000006', [\n    'field_config' => ['rentity_id' => 'FIU-US-00124'],\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.report_templates.update(\n  \"7ec00000-0000-4000-8000-000000000006\",\n  field_config: { rentity_id: \"FIU-US-00124\" }\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Collections.Generic;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.ReportTemplates.UpdateAsync(\"7ec00000-0000-4000-8000-000000000006\", new ReportTemplatesUpdateParams\n{\n    FieldConfig = new Dictionary<string, object> { [\"rentity_id\"] = \"FIU-US-00124\" },\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "responses": {
          "200": {
            "description": "Aktualisierte Vorlage.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ReportTemplateDetail"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      },
      "delete": {
        "summary": "Berichtsvorlage löschen",
        "description": "Eine Berichtsvorlage löschen. Bereits daraus erstellte Berichte sind davon nicht betroffen.",
        "operationId": "delete_report_template",
        "x-didit-sdk": {
          "resource": "report_templates",
          "method": "delete",
          "auth": "api_key",
          "server": true,
          "scope": "application"
        },
        "tags": [
          "Report Templates"
        ],
        "parameters": [
          {
            "name": "organization_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "UUID der Organisation."
          },
          {
            "name": "application_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Anwendungs-UUID."
          },
          {
            "name": "template_uuid",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "7ec00000-0000-4000-8000-000000000006"
            },
            "description": "Berichtsvorlagen-UUID."
          }
        ],
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X DELETE 'https://verification.didit.me/v3/organization/11111111-2222-3333-4444-555555555555/application/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/report-templates/7ec00000-0000-4000-8000-000000000006/' \\\n  -H 'x-api-key: YOUR_API_KEY'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nclient.report_templates.delete(\n    \"7ec00000-0000-4000-8000-000000000006\",\n)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nawait didit.reportTemplates.delete(\"7ec00000-0000-4000-8000-000000000006\");"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nif err := client.ReportTemplates.Delete(ctx, \"7ec00000-0000-4000-8000-000000000006\"); err != nil {\n\tlog.Fatal(err)\n}"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nclient.reportTemplates().delete(\"7ec00000-0000-4000-8000-000000000006\");"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\n$didit = new DiditClient();\n\n$didit->reportTemplates->delete('7ec00000-0000-4000-8000-000000000006');"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\ndidit.report_templates.delete(\"7ec00000-0000-4000-8000-000000000006\")"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nawait client.ReportTemplates.DeleteAsync(\"7ec00000-0000-4000-8000-000000000006\");"
          }
        ],
        "responses": {
          "204": {
            "description": "Vorlage gelöscht."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/v3/organization/{organization_id}/application/{application_id}/cases/{case_uuid}/regulatory-reports/": {
      "get": {
        "summary": "Berichte für einen Fall auflisten",
        "description": "Für den Fall generierte FIU-Berichte auflisten.",
        "operationId": "list_case_regulatory_reports",
        "x-didit-sdk": {
          "resource": "cases.regulatory_reports",
          "method": "list",
          "auth": "api_key",
          "server": true,
          "scope": "application"
        },
        "tags": [
          "Regulatory Reports"
        ],
        "parameters": [
          {
            "name": "organization_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "UUID der Organisation."
          },
          {
            "name": "application_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Anwendungs-UUID."
          },
          {
            "name": "case_uuid",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "c1a5e000-0000-4000-8000-000000000001"
            },
            "description": "Fall-UUID."
          },
          {
            "name": "limit",
            "in": "query",
            "schema": {
              "type": "integer",
              "default": 50,
              "minimum": 1
            },
            "description": "Seitengröße."
          },
          {
            "name": "offset",
            "in": "query",
            "schema": {
              "type": "integer",
              "default": 0,
              "minimum": 0
            },
            "description": "Nullbasierter Offset."
          }
        ],
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X GET 'https://verification.didit.me/v3/organization/11111111-2222-3333-4444-555555555555/application/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/cases/c1a5e000-0000-4000-8000-000000000001/regulatory-reports/' \\\n  -H 'x-api-key: YOUR_API_KEY'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nfor item in client.cases.regulatory_reports.list(\n    \"c1a5e000-0000-4000-8000-000000000001\",\n):\n    print(item)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nfor await (const item of didit.cases.regulatoryReports.list(\"c1a5e000-0000-4000-8000-000000000001\")) {\n  console.log(item);\n}"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\niter := client.Cases.RegulatoryReports.ListAutoPaging(ctx, \"c1a5e000-0000-4000-8000-000000000001\", didit.CasesRegulatoryReportsListParams{})\nfor iter.Next() {\n\tfmt.Printf(\"%+v\\n\", iter.Current())\n}\nif err := iter.Err(); err != nil {\n\tlog.Fatal(err)\n}"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nfor (var item : client.cases().regulatoryReports().list(\"c1a5e000-0000-4000-8000-000000000001\")) {\n    System.out.println(item);\n}"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\n$didit = new DiditClient();\n\nforeach ($didit->cases->regulatoryReports->list('c1a5e000-0000-4000-8000-000000000001') as $item) {\n    print_r($item->toArray());\n}"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\ndidit.cases.regulatory_reports.list(\"c1a5e000-0000-4000-8000-000000000001\").auto_paging_each do |item|\n  puts item.to_h\nend"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nawait foreach (var item in await client.Cases.RegulatoryReports.ListAsync(\"c1a5e000-0000-4000-8000-000000000001\"))\n{\n    Console.WriteLine(JsonSerializer.Serialize(item));\n}"
          }
        ],
        "responses": {
          "200": {
            "description": "Paginierte Berichte für den Fall.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RegulatoryReportList"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      },
      "post": {
        "summary": "Bericht aus einem Fall erstellen",
        "description": "Erstellen Sie einen FIU-Berichtsentwurf für den Fall: Status DRAFT, automatisch ausgefüllt anhand der optionalen Vorlage sowie des Subjekts des Falls, verknüpfter Transaktionen und der Sachverhaltsschilderung. Erst validieren, dann finalisieren, um die goAML-XML und -PDF zu erstellen.",
        "operationId": "create_case_regulatory_report",
        "x-didit-sdk": {
          "resource": "cases.regulatory_reports",
          "method": "create",
          "auth": "api_key",
          "server": true,
          "scope": "application"
        },
        "tags": [
          "Regulatory Reports"
        ],
        "parameters": [
          {
            "name": "organization_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "UUID der Organisation."
          },
          {
            "name": "application_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Anwendungs-UUID."
          },
          {
            "name": "case_uuid",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "c1a5e000-0000-4000-8000-000000000001"
            },
            "description": "Fall-UUID."
          }
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "report_type": {
                    "type": "string",
                    "enum": [
                      "SAR",
                      "STR",
                      "CTR",
                      "TTR",
                      "UTR",
                      "IFT",
                      "CBR",
                      "TFR"
                    ],
                    "description": "Erforderlich, sofern keine Vorlage angegeben ist; andernfalls wird report_type der Vorlage verwendet."
                  },
                  "jurisdiction": {
                    "type": "string",
                    "minLength": 2,
                    "maxLength": 2,
                    "description": "Erforderlich, sofern keine Vorlage angegeben ist."
                  },
                  "template": {
                    "type": "string",
                    "format": "uuid",
                    "nullable": true,
                    "description": "Berichtsvorlagen-UUID; ihre field_config initialisiert den Entwurf, bevor aus dem Fall abgeleitete Daten zusammengeführt werden."
                  },
                  "transactions": {
                    "type": "array",
                    "items": {
                      "type": "string",
                      "format": "uuid"
                    },
                    "nullable": true,
                    "description": "Anzuhängende Transaktionen; standardmäßig die verknüpften Transaktionen des Falls."
                  },
                  "rentity_id": {
                    "type": "string",
                    "nullable": true
                  },
                  "rentity_branch": {
                    "type": "string",
                    "nullable": true
                  },
                  "submission_code": {
                    "type": "string",
                    "enum": [
                      "E",
                      "M"
                    ],
                    "default": "E"
                  },
                  "entity_reference": {
                    "type": "string",
                    "nullable": true
                  },
                  "fiu_ref_number": {
                    "type": "string",
                    "nullable": true
                  },
                  "currency_code_local": {
                    "type": "string",
                    "minLength": 3,
                    "maxLength": 3,
                    "nullable": true
                  },
                  "submission_date": {
                    "type": "string",
                    "format": "date-time",
                    "nullable": true
                  },
                  "reporting_person": {
                    "type": "object"
                  },
                  "location": {
                    "type": "object"
                  },
                  "reason": {
                    "type": "string",
                    "nullable": true
                  },
                  "action": {
                    "type": "string",
                    "nullable": true
                  },
                  "activity": {
                    "type": "string",
                    "nullable": true
                  },
                  "narrative": {
                    "type": "object",
                    "properties": {
                      "who": {
                        "type": "string"
                      },
                      "what": {
                        "type": "string"
                      },
                      "when": {
                        "type": "string"
                      },
                      "where": {
                        "type": "string"
                      },
                      "why": {
                        "type": "string"
                      },
                      "how": {
                        "type": "string"
                      }
                    }
                  },
                  "report_indicators": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    }
                  },
                  "included_fields": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    }
                  }
                }
              },
              "example": {
                "template": "7ec00000-0000-4000-8000-000000000006"
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X POST 'https://verification.didit.me/v3/organization/11111111-2222-3333-4444-555555555555/application/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/cases/c1a5e000-0000-4000-8000-000000000001/regulatory-reports/' \\\n  -H 'x-api-key: YOUR_API_KEY' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\"template\": \"7ec00000-0000-4000-8000-000000000006\"}'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.cases.regulatory_reports.create(\n    \"c1a5e000-0000-4000-8000-000000000001\",\n    template=\"7ec00000-0000-4000-8000-000000000006\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.cases.regulatoryReports.create(\"c1a5e000-0000-4000-8000-000000000001\", {\n  template: \"7ec00000-0000-4000-8000-000000000006\",\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.Cases.RegulatoryReports.Create(ctx, \"c1a5e000-0000-4000-8000-000000000001\", didit.CasesRegulatoryReportsCreateParams{\n\tTemplate: didit.String(\"7ec00000-0000-4000-8000-000000000006\"),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\nimport me.didit.types.CasesRegulatoryReportsCreateParams;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.cases().regulatoryReports().create(\"c1a5e000-0000-4000-8000-000000000001\", CasesRegulatoryReportsCreateParams.builder()\n        .template(\"7ec00000-0000-4000-8000-000000000006\")\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\n$didit = new DiditClient();\n\n$result = $didit->cases->regulatoryReports->create('c1a5e000-0000-4000-8000-000000000001', [\n    'template' => '7ec00000-0000-4000-8000-000000000006',\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.cases.regulatory_reports.create(\n  \"c1a5e000-0000-4000-8000-000000000001\",\n  template: \"7ec00000-0000-4000-8000-000000000006\"\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.Cases.RegulatoryReports.CreateAsync(\"c1a5e000-0000-4000-8000-000000000001\", new CasesRegulatoryReportsCreateParams\n{\n    Template = \"7ec00000-0000-4000-8000-000000000006\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "responses": {
          "201": {
            "description": "Entwurfsbericht erstellt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RegulatoryReportDetail"
                }
              }
            }
          },
          "400": {
            "description": "Die referenzierte Vorlage wurde nicht gefunden.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/v3/organization/{organization_id}/application/{application_id}/regulatory-reports/": {
      "get": {
        "summary": "Berichte auflisten",
        "description": "Anwendungsweite FIU-Berichtsliste, optional gefiltert nach status, report_type oder case.",
        "operationId": "list_regulatory_reports",
        "x-didit-sdk": {
          "resource": "regulatory_reports",
          "method": "list",
          "auth": "api_key",
          "server": true,
          "scope": "application"
        },
        "tags": [
          "Regulatory Reports"
        ],
        "parameters": [
          {
            "name": "organization_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "UUID der Organisation."
          },
          {
            "name": "application_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Anwendungs-UUID."
          },
          {
            "name": "limit",
            "in": "query",
            "schema": {
              "type": "integer",
              "default": 50,
              "minimum": 1
            },
            "description": "Seitengröße."
          },
          {
            "name": "offset",
            "in": "query",
            "schema": {
              "type": "integer",
              "default": 0,
              "minimum": 0
            },
            "description": "Nullbasierter Offset."
          },
          {
            "name": "status",
            "in": "query",
            "schema": {
              "type": "string",
              "enum": [
                "DRAFT",
                "VALIDATED",
                "FINALIZED"
              ]
            },
            "description": "Nach Status filtern."
          },
          {
            "name": "report_type",
            "in": "query",
            "schema": {
              "type": "string",
              "enum": [
                "SAR",
                "STR",
                "CTR",
                "TTR",
                "UTR",
                "IFT",
                "CBR",
                "TFR"
              ]
            },
            "description": "Nach Berichtstyp filtern."
          },
          {
            "name": "case",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Auf Berichte zu diesem Fall filtern."
          }
        ],
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X GET 'https://verification.didit.me/v3/organization/11111111-2222-3333-4444-555555555555/application/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/regulatory-reports/' \\\n  -H 'x-api-key: YOUR_API_KEY'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nfor item in client.regulatory_reports.list():\n    print(item)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nfor await (const item of didit.regulatoryReports.list()) {\n  console.log(item);\n}"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\niter := client.RegulatoryReports.ListAutoPaging(ctx, didit.RegulatoryReportsListParams{})\nfor iter.Next() {\n\tfmt.Printf(\"%+v\\n\", iter.Current())\n}\nif err := iter.Err(); err != nil {\n\tlog.Fatal(err)\n}"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nfor (var item : client.regulatoryReports().list()) {\n    System.out.println(item);\n}"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\n$didit = new DiditClient();\n\nforeach ($didit->regulatoryReports->list() as $item) {\n    print_r($item->toArray());\n}"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\ndidit.regulatory_reports.list.auto_paging_each do |item|\n  puts item.to_h\nend"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nawait foreach (var item in await client.RegulatoryReports.ListAsync())\n{\n    Console.WriteLine(JsonSerializer.Serialize(item));\n}"
          }
        ],
        "responses": {
          "200": {
            "description": "Paginierte Berichte über die gesamte Anwendung hinweg.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RegulatoryReportList"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      },
      "post": {
        "summary": "Eigenständigen Bericht erstellen",
        "description": "Erstellen Sie einen FIU-Berichtsentwurf über die eigenständige Berichtsseite: Sowohl Fall als auch Vorlage sind erforderlich (anders als bei der fallbezogenen Erstellung, bei der die Vorlage weggelassen werden kann).",
        "operationId": "create_standalone_regulatory_report",
        "x-didit-sdk": {
          "resource": "regulatory_reports",
          "method": "create",
          "auth": "api_key",
          "server": true,
          "scope": "application"
        },
        "tags": [
          "Regulatory Reports"
        ],
        "parameters": [
          {
            "name": "organization_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "UUID der Organisation."
          },
          {
            "name": "application_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Anwendungs-UUID."
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "case",
                  "template"
                ],
                "properties": {
                  "case": {
                    "type": "string",
                    "format": "uuid"
                  },
                  "template": {
                    "type": "string",
                    "format": "uuid"
                  },
                  "report_type": {
                    "type": "string",
                    "enum": [
                      "SAR",
                      "STR",
                      "CTR",
                      "TTR",
                      "UTR",
                      "IFT",
                      "CBR",
                      "TFR"
                    ],
                    "description": "Erforderlich, sofern keine Vorlage angegeben ist; andernfalls wird report_type der Vorlage verwendet."
                  },
                  "jurisdiction": {
                    "type": "string",
                    "minLength": 2,
                    "maxLength": 2,
                    "description": "Erforderlich, sofern keine Vorlage angegeben ist."
                  },
                  "transactions": {
                    "type": "array",
                    "items": {
                      "type": "string",
                      "format": "uuid"
                    },
                    "nullable": true,
                    "description": "Anzuhängende Transaktionen; standardmäßig die verknüpften Transaktionen des Falls."
                  },
                  "rentity_id": {
                    "type": "string",
                    "nullable": true
                  },
                  "rentity_branch": {
                    "type": "string",
                    "nullable": true
                  },
                  "submission_code": {
                    "type": "string",
                    "enum": [
                      "E",
                      "M"
                    ],
                    "default": "E"
                  },
                  "entity_reference": {
                    "type": "string",
                    "nullable": true
                  },
                  "fiu_ref_number": {
                    "type": "string",
                    "nullable": true
                  },
                  "currency_code_local": {
                    "type": "string",
                    "minLength": 3,
                    "maxLength": 3,
                    "nullable": true
                  },
                  "submission_date": {
                    "type": "string",
                    "format": "date-time",
                    "nullable": true
                  },
                  "reporting_person": {
                    "type": "object"
                  },
                  "location": {
                    "type": "object"
                  },
                  "reason": {
                    "type": "string",
                    "nullable": true
                  },
                  "action": {
                    "type": "string",
                    "nullable": true
                  },
                  "activity": {
                    "type": "string",
                    "nullable": true
                  },
                  "narrative": {
                    "type": "object",
                    "properties": {
                      "who": {
                        "type": "string"
                      },
                      "what": {
                        "type": "string"
                      },
                      "when": {
                        "type": "string"
                      },
                      "where": {
                        "type": "string"
                      },
                      "why": {
                        "type": "string"
                      },
                      "how": {
                        "type": "string"
                      }
                    }
                  },
                  "report_indicators": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    }
                  },
                  "included_fields": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    }
                  }
                }
              },
              "example": {
                "case": "c1a5e000-0000-4000-8000-000000000001",
                "template": "7ec00000-0000-4000-8000-000000000006"
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X POST 'https://verification.didit.me/v3/organization/11111111-2222-3333-4444-555555555555/application/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/regulatory-reports/' \\\n  -H 'x-api-key: YOUR_API_KEY' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\"case\": \"c1a5e000-0000-4000-8000-000000000001\", \"template\": \"7ec00000-0000-4000-8000-000000000006\"}'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.regulatory_reports.create(\n    case=\"c1a5e000-0000-4000-8000-000000000001\",\n    template=\"7ec00000-0000-4000-8000-000000000006\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.regulatoryReports.create({\n  case: \"c1a5e000-0000-4000-8000-000000000001\",\n  template: \"7ec00000-0000-4000-8000-000000000006\",\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.RegulatoryReports.Create(ctx, didit.RegulatoryReportsCreateParams{\n\tCase:     \"c1a5e000-0000-4000-8000-000000000001\",\n\tTemplate: \"7ec00000-0000-4000-8000-000000000006\",\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\nimport me.didit.types.RegulatoryReportsCreateParams;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.regulatoryReports().create(RegulatoryReportsCreateParams.builder()\n        .case_(\"c1a5e000-0000-4000-8000-000000000001\")\n        .template(\"7ec00000-0000-4000-8000-000000000006\")\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\n$didit = new DiditClient();\n\n$result = $didit->regulatoryReports->create([\n    'case' => 'c1a5e000-0000-4000-8000-000000000001',\n    'template' => '7ec00000-0000-4000-8000-000000000006',\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.regulatory_reports.create(\n  case: \"c1a5e000-0000-4000-8000-000000000001\",\n  template: \"7ec00000-0000-4000-8000-000000000006\"\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.RegulatoryReports.CreateAsync(new RegulatoryReportsCreateParams\n{\n    Case = \"c1a5e000-0000-4000-8000-000000000001\",\n    Template = \"7ec00000-0000-4000-8000-000000000006\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "responses": {
          "201": {
            "description": "Entwurfsbericht erstellt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RegulatoryReportDetail"
                }
              }
            }
          },
          "400": {
            "description": "Die referenzierte Vorlage wurde nicht gefunden.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/v3/organization/{organization_id}/application/{application_id}/regulatory-reports/{report_uuid}/": {
      "get": {
        "summary": "Bericht abrufen",
        "description": "Einen regulatorischen Bericht abrufen.",
        "operationId": "get_regulatory_report",
        "x-didit-sdk": {
          "resource": "regulatory_reports",
          "method": "retrieve",
          "auth": "api_key",
          "server": true,
          "scope": "application"
        },
        "tags": [
          "Regulatory Reports"
        ],
        "parameters": [
          {
            "name": "organization_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "UUID der Organisation."
          },
          {
            "name": "application_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Anwendungs-UUID."
          },
          {
            "name": "report_uuid",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "5ec00000-0000-4000-8000-000000000007"
            },
            "description": "Berichts-UUID."
          }
        ],
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X GET 'https://verification.didit.me/v3/organization/11111111-2222-3333-4444-555555555555/application/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/regulatory-reports/5ec00000-0000-4000-8000-000000000007/' \\\n  -H 'x-api-key: YOUR_API_KEY'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.regulatory_reports.retrieve(\n    \"5ec00000-0000-4000-8000-000000000007\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.regulatoryReports.retrieve(\"5ec00000-0000-4000-8000-000000000007\");\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.RegulatoryReports.Retrieve(ctx, \"5ec00000-0000-4000-8000-000000000007\")\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.regulatoryReports().retrieve(\"5ec00000-0000-4000-8000-000000000007\");\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\n$didit = new DiditClient();\n\n$result = $didit->regulatoryReports->retrieve('5ec00000-0000-4000-8000-000000000007');\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.regulatory_reports.retrieve(\"5ec00000-0000-4000-8000-000000000007\")\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.RegulatoryReports.RetrieveAsync(\"5ec00000-0000-4000-8000-000000000007\");\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "responses": {
          "200": {
            "description": "Berichtsdetails.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RegulatoryReportDetail"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      },
      "patch": {
        "summary": "Bericht aktualisieren",
        "description": "Felder eines Entwurfs oder eines validierten Berichts bearbeiten. Abgeschlossene Berichte können nicht bearbeitet werden (409).",
        "operationId": "update_regulatory_report",
        "x-didit-sdk": {
          "resource": "regulatory_reports",
          "method": "update",
          "auth": "api_key",
          "server": true,
          "scope": "application"
        },
        "tags": [
          "Regulatory Reports"
        ],
        "parameters": [
          {
            "name": "organization_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "UUID der Organisation."
          },
          {
            "name": "application_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Anwendungs-UUID."
          },
          {
            "name": "report_uuid",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "5ec00000-0000-4000-8000-000000000007"
            },
            "description": "Berichts-UUID."
          }
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "jurisdiction": {
                    "type": "string",
                    "minLength": 2,
                    "maxLength": 2
                  },
                  "rentity_id": {
                    "type": "string",
                    "nullable": true
                  },
                  "rentity_branch": {
                    "type": "string",
                    "nullable": true
                  },
                  "submission_code": {
                    "type": "string",
                    "enum": [
                      "E",
                      "M"
                    ],
                    "default": "E"
                  },
                  "entity_reference": {
                    "type": "string",
                    "nullable": true
                  },
                  "fiu_ref_number": {
                    "type": "string",
                    "nullable": true
                  },
                  "currency_code_local": {
                    "type": "string",
                    "minLength": 3,
                    "maxLength": 3,
                    "nullable": true
                  },
                  "submission_date": {
                    "type": "string",
                    "format": "date-time",
                    "nullable": true
                  },
                  "reporting_person": {
                    "type": "object"
                  },
                  "location": {
                    "type": "object"
                  },
                  "reason": {
                    "type": "string",
                    "nullable": true
                  },
                  "action": {
                    "type": "string",
                    "nullable": true
                  },
                  "activity": {
                    "type": "string",
                    "nullable": true
                  },
                  "narrative": {
                    "type": "object",
                    "properties": {
                      "who": {
                        "type": "string"
                      },
                      "what": {
                        "type": "string"
                      },
                      "when": {
                        "type": "string"
                      },
                      "where": {
                        "type": "string"
                      },
                      "why": {
                        "type": "string"
                      },
                      "how": {
                        "type": "string"
                      }
                    }
                  },
                  "report_indicators": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    }
                  },
                  "included_fields": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    }
                  }
                }
              },
              "example": {
                "rentity_id": "FIU-US-00123",
                "currency_code_local": "USD"
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X PATCH 'https://verification.didit.me/v3/organization/11111111-2222-3333-4444-555555555555/application/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/regulatory-reports/5ec00000-0000-4000-8000-000000000007/' \\\n  -H 'x-api-key: YOUR_API_KEY' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\"rentity_id\": \"FIU-US-00123\", \"currency_code_local\": \"USD\"}'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.regulatory_reports.update(\n    \"5ec00000-0000-4000-8000-000000000007\",\n    rentity_id=\"FIU-US-00123\",\n    currency_code_local=\"USD\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.regulatoryReports.update(\"5ec00000-0000-4000-8000-000000000007\", {\n  rentity_id: \"FIU-US-00123\",\n  currency_code_local: \"USD\",\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.RegulatoryReports.Update(ctx, \"5ec00000-0000-4000-8000-000000000007\", didit.RegulatoryReportsUpdateParams{\n\tRentityID:         didit.String(\"FIU-US-00123\"),\n\tCurrencyCodeLocal: didit.String(\"USD\"),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\nimport me.didit.types.RegulatoryReportsUpdateParams;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.regulatoryReports().update(\"5ec00000-0000-4000-8000-000000000007\", RegulatoryReportsUpdateParams.builder()\n        .rentityId(\"FIU-US-00123\")\n        .currencyCodeLocal(\"USD\")\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\n$didit = new DiditClient();\n\n$result = $didit->regulatoryReports->update('5ec00000-0000-4000-8000-000000000007', [\n    'rentity_id' => 'FIU-US-00123',\n    'currency_code_local' => 'USD',\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.regulatory_reports.update(\n  \"5ec00000-0000-4000-8000-000000000007\",\n  rentity_id: \"FIU-US-00123\",\n  currency_code_local: \"USD\"\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.RegulatoryReports.UpdateAsync(\"5ec00000-0000-4000-8000-000000000007\", new RegulatoryReportsUpdateParams\n{\n    RentityId = \"FIU-US-00123\",\n    CurrencyCodeLocal = \"USD\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "responses": {
          "200": {
            "description": "Aktualisierter Bericht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RegulatoryReportDetail"
                }
              }
            }
          },
          "409": {
            "description": "Bericht ist bereits finalisiert.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      },
      "delete": {
        "summary": "Bericht löschen",
        "description": "Einen regulatorischen Bericht dauerhaft löschen. Der Bericht, seine kopierte Sachverhaltsschilderung und Gründe, seine Transaktionsverknüpfungen sowie seine generierten goAML-XML- und PDF-Dateien werden gelöscht, einschließlich jeder gespeicherten Version dieser Dateien. Der Bericht verschwindet aus Listen und Download-URLs funktionieren nicht mehr. Andere Datensätze, einschließlich des Falls, Transaktionen, Personen und Unternehmen, werden nicht gelöscht. Ein Rückgängigmachen ist nicht möglich.\n\nEin Berichtsentwurf oder ein validierter Bericht kann ohne Anfrage-Body gelöscht werden. Das Löschen eines finalisierten Berichts erfordert `confirm_delete: true` im Anfrage-Body. Wird der Bericht nicht gefunden, gibt die Anfrage `404` zurück; wird ein finalisierter Bericht ohne Bestätigung gesendet, gibt sie `400` zurück und es wird nichts gelöscht.",
        "operationId": "delete_regulatory_report",
        "x-didit-sdk": {
          "resource": "regulatory_reports",
          "method": "delete",
          "auth": "api_key",
          "server": true,
          "scope": "application"
        },
        "tags": [
          "Regulatory Reports"
        ],
        "parameters": [
          {
            "name": "organization_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "UUID der Organisation."
          },
          {
            "name": "application_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Anwendungs-UUID."
          },
          {
            "name": "report_uuid",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "5ec00000-0000-4000-8000-000000000007"
            },
            "description": "Berichts-UUID."
          }
        ],
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl (draft report)",
            "source": "curl -X DELETE 'https://verification.didit.me/v3/organization/11111111-2222-3333-4444-555555555555/application/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/regulatory-reports/5ec00000-0000-4000-8000-000000000007/' \\\n  -H 'x-api-key: YOUR_API_KEY'"
          },
          {
            "lang": "curl",
            "label": "curl (finalized report)",
            "source": "curl -X DELETE 'https://verification.didit.me/v3/organization/11111111-2222-3333-4444-555555555555/application/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/regulatory-reports/5ec00000-0000-4000-8000-000000000007/' \\\n  -H 'x-api-key: YOUR_API_KEY' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\"confirm_delete\": true}'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nclient.regulatory_reports.delete(\n    \"5ec00000-0000-4000-8000-000000000007\",\n    confirm_delete=True,\n)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nawait didit.regulatoryReports.delete(\"5ec00000-0000-4000-8000-000000000007\", {\n  confirm_delete: true,\n});"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\nimport me.didit.types.RegulatoryReportsDeleteParams;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nclient.regulatoryReports().delete(\"5ec00000-0000-4000-8000-000000000007\", RegulatoryReportsDeleteParams.builder()\n        .confirmDelete(true)\n        .build());"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\n$didit = new DiditClient();\n\n$didit->regulatoryReports->delete('5ec00000-0000-4000-8000-000000000007', [\n    'confirm_delete' => true,\n]);"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\ndidit.regulatory_reports.delete(\n  \"5ec00000-0000-4000-8000-000000000007\",\n  confirm_delete: true\n)"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nawait client.RegulatoryReports.DeleteAsync(\"5ec00000-0000-4000-8000-000000000007\", new RegulatoryReportsDeleteParams\n{\n    ConfirmDelete = true,\n});"
          }
        ],
        "responses": {
          "204": {
            "description": "Bericht gelöscht, einschließlich seiner generierten Dateien."
          },
          "400": {
            "description": "Ein finalisierter Bericht wurde ohne `confirm_delete: true` gesendet. Es wird nichts gelöscht.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "confirm_delete": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      }
                    }
                  }
                },
                "example": {
                  "confirm_delete": [
                    "This field is required to delete a finalized report."
                  ]
                }
              }
            }
          },
          "403": {
            "description": "Der API-Schlüssel kann keine Berichte löschen. Der Endpoint erfordert `write:cases`.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Bericht in dieser Anwendung nicht gefunden.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          },
          "409": {
            "description": "Der Bericht wird bereits gelöscht. Wiederholen Sie die Anfrage, um das Löschen seiner Dateien abzuschließen.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string"
                    },
                    "code": {
                      "type": "string"
                    }
                  }
                },
                "example": {
                  "detail": "This report is being deleted. Retry deleting it to finish erasing its files.",
                  "code": "report_deletion_pending"
                }
              }
            }
          },
          "503": {
            "description": "Die Berichtdateien konnten derzeit nicht gelöscht werden. Der Bericht ist weiterhin vorhanden. Wiederholen Sie die Anfrage.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string"
                    },
                    "code": {
                      "type": "string"
                    }
                  }
                },
                "example": {
                  "detail": "The report files could not be erased. Please retry deleting the report.",
                  "code": "report_storage_unavailable"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "requestBody": {
          "required": false,
          "description": "Nur für einen finalisierten Bericht erforderlich.",
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "confirm_delete": {
                    "type": "boolean",
                    "description": "Auf true setzen, um zu bestätigen, dass ein finalisierter Bericht und seine generierten Dateien dauerhaft gelöscht werden."
                  }
                },
                "example": {
                  "confirm_delete": true
                }
              },
              "example": {
                "confirm_delete": true
              }
            }
          }
        }
      }
    },
    "/v3/organization/{organization_id}/application/{application_id}/regulatory-reports/{report_uuid}/validate/": {
      "post": {
        "summary": "Bericht validieren",
        "description": "Prüft den Bericht anhand der obligatorischen goAML-Header-Felder (ID der meldenden Einheit, Übermittlungscode, lokale Währung, ergriffene Maßnahme, Übermittlungsdatum) sowie mindestens einer angehängten Transaktion und einer 2-stelligen Jurisdiktion, ohne Dateien zu erzeugen. Speichert das Ergebnis außerdem im Bericht: validation_errors und validated_at werden aktualisiert, und der Status eines noch nicht finalisierten Berichts wechselt zu VALIDATED (keine Fehler) oder zurück zu DRAFT (Fehler).",
        "operationId": "validate_regulatory_report",
        "x-didit-sdk": {
          "resource": "regulatory_reports",
          "method": "validate",
          "auth": "api_key",
          "server": true,
          "scope": "application"
        },
        "tags": [
          "Regulatory Reports"
        ],
        "parameters": [
          {
            "name": "organization_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "UUID der Organisation."
          },
          {
            "name": "application_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Anwendungs-UUID."
          },
          {
            "name": "report_uuid",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "5ec00000-0000-4000-8000-000000000007"
            },
            "description": "Berichts-UUID."
          }
        ],
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X POST 'https://verification.didit.me/v3/organization/11111111-2222-3333-4444-555555555555/application/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/regulatory-reports/5ec00000-0000-4000-8000-000000000007/validate/' \\\n  -H 'x-api-key: YOUR_API_KEY'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.regulatory_reports.validate(\n    \"5ec00000-0000-4000-8000-000000000007\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.regulatoryReports.validate(\"5ec00000-0000-4000-8000-000000000007\");\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.RegulatoryReports.Validate(ctx, \"5ec00000-0000-4000-8000-000000000007\")\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.regulatoryReports().validate(\"5ec00000-0000-4000-8000-000000000007\");\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\n$didit = new DiditClient();\n\n$result = $didit->regulatoryReports->validate('5ec00000-0000-4000-8000-000000000007');\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.regulatory_reports.validate(\"5ec00000-0000-4000-8000-000000000007\")\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.RegulatoryReports.ValidateAsync(\"5ec00000-0000-4000-8000-000000000007\");\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "responses": {
          "200": {
            "description": "Validierungsergebnis.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "status": {
                      "type": "string",
                      "enum": [
                        "DRAFT",
                        "VALIDATED",
                        "FINALIZED"
                      ]
                    },
                    "is_valid": {
                      "type": "boolean"
                    },
                    "errors": {
                      "type": "array",
                      "description": "Leer, wenn gültig.",
                      "items": {
                        "type": "object",
                        "properties": {
                          "field": {
                            "type": "string"
                          },
                          "message": {
                            "type": "string"
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/v3/organization/{organization_id}/application/{application_id}/regulatory-reports/{report_uuid}/finalize/": {
      "post": {
        "summary": "Bericht abschließen",
        "description": "Erneut validieren, anschließend die goAML-XML und das PDF rendern und beides zu S3 hochladen. Bei SAR/STR/TFR-Berichten verschiebt dies auch die Transaktions-Alerts des Falls von Pending SAR zu SAR filed.",
        "operationId": "finalize_regulatory_report",
        "x-didit-sdk": {
          "resource": "regulatory_reports",
          "method": "finalize",
          "auth": "api_key",
          "server": true,
          "scope": "application"
        },
        "tags": [
          "Regulatory Reports"
        ],
        "parameters": [
          {
            "name": "organization_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "UUID der Organisation."
          },
          {
            "name": "application_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Anwendungs-UUID."
          },
          {
            "name": "report_uuid",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "5ec00000-0000-4000-8000-000000000007"
            },
            "description": "Berichts-UUID."
          }
        ],
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X POST 'https://verification.didit.me/v3/organization/11111111-2222-3333-4444-555555555555/application/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/regulatory-reports/5ec00000-0000-4000-8000-000000000007/finalize/' \\\n  -H 'x-api-key: YOUR_API_KEY'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.regulatory_reports.finalize(\n    \"5ec00000-0000-4000-8000-000000000007\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.regulatoryReports.finalize(\"5ec00000-0000-4000-8000-000000000007\");\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.RegulatoryReports.Finalize(ctx, \"5ec00000-0000-4000-8000-000000000007\")\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.regulatoryReports().finalize_(\"5ec00000-0000-4000-8000-000000000007\");\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\n$didit = new DiditClient();\n\n$result = $didit->regulatoryReports->finalize('5ec00000-0000-4000-8000-000000000007');\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.regulatory_reports.finalize(\"5ec00000-0000-4000-8000-000000000007\")\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.RegulatoryReports.FinalizeAsync(\"5ec00000-0000-4000-8000-000000000007\");\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "responses": {
          "200": {
            "description": "Bericht finalisiert; xml_s3_key und pdf_s3_key sind gesetzt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RegulatoryReportDetail"
                }
              }
            }
          },
          "400": {
            "description": "Bericht hat die Validierung nicht bestanden.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string"
                    },
                    "errors": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "field": {
                            "type": "string"
                          },
                          "message": {
                            "type": "string"
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          },
          "409": {
            "description": "Bericht befindet sich nicht in einem abschließbaren Status.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/v3/organization/{organization_id}/application/{application_id}/regulatory-reports/{report_uuid}/download-url/": {
      "get": {
        "summary": "Download-URL für Bericht abrufen",
        "description": "Erstellen Sie eine vorsignierte URL für das goAML-XML oder -PDF eines finalisierten Berichts.",
        "operationId": "get_regulatory_report_download_url",
        "x-didit-sdk": {
          "resource": "regulatory_reports",
          "method": "retrieve_download_url",
          "auth": "api_key",
          "server": true,
          "scope": "application"
        },
        "tags": [
          "Regulatory Reports"
        ],
        "parameters": [
          {
            "name": "organization_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "UUID der Organisation."
          },
          {
            "name": "application_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Anwendungs-UUID."
          },
          {
            "name": "report_uuid",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "5ec00000-0000-4000-8000-000000000007"
            },
            "description": "Berichts-UUID."
          },
          {
            "name": "file",
            "in": "query",
            "schema": {
              "type": "string",
              "enum": [
                "pdf",
                "xml"
              ],
              "default": "pdf"
            },
            "description": "Welche Datei heruntergeladen werden soll."
          }
        ],
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X GET 'https://verification.didit.me/v3/organization/11111111-2222-3333-4444-555555555555/application/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/regulatory-reports/5ec00000-0000-4000-8000-000000000007/download-url/?file=xml' \\\n  -H 'x-api-key: YOUR_API_KEY'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.regulatory_reports.retrieve_download_url(\n    \"5ec00000-0000-4000-8000-000000000007\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.regulatoryReports.retrieveDownloadUrl(\"5ec00000-0000-4000-8000-000000000007\");\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.RegulatoryReports.RetrieveDownloadURL(ctx, \"5ec00000-0000-4000-8000-000000000007\", didit.RegulatoryReportsRetrieveDownloadURLParams{})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.regulatoryReports().retrieveDownloadUrl(\"5ec00000-0000-4000-8000-000000000007\");\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\n$didit = new DiditClient();\n\n$result = $didit->regulatoryReports->retrieveDownloadUrl('5ec00000-0000-4000-8000-000000000007');\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.regulatory_reports.retrieve_download_url(\"5ec00000-0000-4000-8000-000000000007\")\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.RegulatoryReports.RetrieveDownloadUrlAsync(\"5ec00000-0000-4000-8000-000000000007\");\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "responses": {
          "200": {
            "description": "Vorsignierte Download-URL.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "download_url": {
                      "type": "string",
                      "format": "uri"
                    },
                    "file": {
                      "type": "string",
                      "enum": [
                        "pdf",
                        "xml"
                      ]
                    }
                  }
                }
              }
            }
          },
          "409": {
            "description": "Bericht ist noch nicht finalisiert.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string"
                    },
                    "status": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/v3/transactions/rules/": {
      "get": {
        "summary": "Regeln auflisten",
        "description": "Transaktionsüberwachungsregeln der Anwendung auflisten: Ihre benutzerdefinierten Regeln plus alle installierten Bibliotheksvoreinstellungen. Filtern Sie nach Quelle, Kategorie, Modus, Bundle oder Volltextsuche; sortieren Sie mit `ordering` (run_count, approved_pct, reviewed_pct, declined_pct, latest_triggered_at, title, created_at, source, jeweils mit optionalem `-`-Präfix).",
        "operationId": "listTransactionRules",
        "x-didit-sdk": {
          "resource": "transactions.rules",
          "method": "list",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Transactions"
        ],
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "parameters": [
          {
            "name": "source",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "PRESET",
                "CUSTOM"
              ]
            },
            "description": "PRESET oder CUSTOM"
          },
          {
            "name": "category",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "Nach Regelkategorie filtern"
          },
          {
            "name": "mode",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "ACTIVE",
                "DISABLED",
                "TEST"
              ]
            },
            "description": "ACTIVE, DISABLED oder TEST"
          },
          {
            "name": "bundle",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "Voreinstellungen nach Bundle filtern"
          },
          {
            "name": "search",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "Übereinstimmung ohne Berücksichtigung von Groß-/Kleinschreibung mit Titel und Beschreibung"
          },
          {
            "name": "ordering",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "Kommagetrennte Sortierfelder, Standardwert source,-run_count"
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer"
            },
            "description": "Seitengröße"
          },
          {
            "name": "offset",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer"
            },
            "description": "Seiten-Offset"
          }
        ],
        "responses": {
          "200": {
            "description": "Paginierte Regeln.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "count": {
                      "type": "integer"
                    },
                    "next": {
                      "type": "string",
                      "nullable": true
                    },
                    "previous": {
                      "type": "string",
                      "nullable": true
                    },
                    "results": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/TransactionRuleDetail"
                      }
                    }
                  }
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X GET 'https://verification.didit.me/v3/transactions/rules/?source=CUSTOM&ordering=-run_count' \\\n  -H 'x-api-key: YOUR_API_KEY'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nfor item in client.transactions.rules.list():\n    print(item)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nfor await (const item of didit.transactions.rules.list()) {\n  console.log(item);\n}"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\niter := client.Transactions.Rules.ListAutoPaging(ctx, didit.TransactionsRulesListParams{})\nfor iter.Next() {\n\tfmt.Printf(\"%+v\\n\", iter.Current())\n}\nif err := iter.Err(); err != nil {\n\tlog.Fatal(err)\n}"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nfor (var item : client.transactions().rules().list()) {\n    System.out.println(item);\n}"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\nforeach ($didit->transactions->rules->list() as $item) {\n    print_r($item->toArray());\n}"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\ndidit.transactions.rules.list.auto_paging_each do |item|\n  puts item.to_h\nend"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nawait foreach (var item in await client.Transactions.Rules.ListAsync())\n{\n    Console.WriteLine(JsonSerializer.Serialize(item));\n}"
          }
        ]
      },
      "post": {
        "summary": "Regel erstellen",
        "description": "Erstellen Sie eine benutzerdefinierte (CUSTOM) Transaktionsüberwachungsregel. Titel sind pro Anwendung eindeutig (Duplikat -> 400). Eine `change_status`-Aktion, die auf `AWAITING_USER` abzielt, muss `workflow_id` enthalten. Regeln, die im Modus ACTIVE erstellt wurden, gelten sofort für neue Transaktionen – der empfohlene Workflow besteht darin, sie im Modus TEST zu erstellen, ein Backtesting durchzuführen und den Modus anschließend auf ACTIVE umzustellen. Um eine Bibliotheksregel zu ändern, erstellen Sie sie als Kopie: Senden Sie die Definition der Bibliotheksregel mit `metadata.based_on` (ihr Bibliotheksschlüssel) und `metadata.based_on_rule_uuid`.",
        "operationId": "createTransactionRule",
        "x-didit-sdk": {
          "resource": "transactions.rules",
          "method": "create",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Transactions"
        ],
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TransactionRuleCreateRequest"
              },
              "example": {
                "title": "Structuring - inbound (custom)",
                "description": "20+ inbound EUR transfers, all under 10,000 EUR, 30 days",
                "category": "finance",
                "mode": "TEST",
                "evaluation_mode": "ALL",
                "scope": {
                  "transaction_types": [
                    "finance"
                  ],
                  "directions": [
                    "INBOUND"
                  ]
                },
                "conditions": [
                  {
                    "field": "currency",
                    "operator": "eq",
                    "value": "EUR"
                  },
                  {
                    "field": "amount",
                    "operator": "lt",
                    "value": 10000
                  }
                ],
                "aggregation": [
                  {
                    "metric": "count",
                    "operator": "gte",
                    "value": 20,
                    "window": "30d",
                    "filters": {
                      "direction": "INBOUND",
                      "transaction_type": "finance",
                      "subject_vendor_data": "__current__",
                      "currency": "EUR"
                    }
                  },
                  {
                    "metric": "max",
                    "field": "amount",
                    "operator": "lt",
                    "value": 10000,
                    "window": "30d",
                    "filters": {
                      "direction": "INBOUND",
                      "transaction_type": "finance",
                      "subject_vendor_data": "__current__",
                      "currency": "EUR"
                    }
                  }
                ],
                "actions": [
                  {
                    "type": "add_score",
                    "value": 35
                  }
                ]
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Die erstellte Regel.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TransactionRuleDetail"
                }
              }
            }
          },
          "400": {
            "description": "Validierungsfehler – doppelter Titel, unbekannter Operator/Metrik, fehlerhaftes Fenster, ungültige Scope-Richtung oder AWAITING_USER ohne workflow_id.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                },
                "example": {
                  "title": [
                    "A rule with this name already exists."
                  ]
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X POST 'https://verification.didit.me/v3/transactions/rules/' \\\n  -H 'x-api-key: YOUR_API_KEY' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\"title\": \"Structuring - inbound (custom)\", \"description\": \"20+ inbound EUR transfers, all under 10,000 EUR, 30 days\", \"category\": \"finance\", \"mode\": \"TEST\", \"evaluation_mode\": \"ALL\", \"scope\": {\"transaction_types\": [\"finance\"], \"directions\": [\"INBOUND\"]}, \"conditions\": [{\"field\": \"currency\", \"operator\": \"eq\", \"value\": \"EUR\"}, {\"field\": \"amount\", \"operator\": \"lt\", \"value\": 10000}], \"aggregation\": [{\"metric\": \"count\", \"operator\": \"gte\", \"value\": 20, \"window\": \"30d\", \"filters\": {\"direction\": \"INBOUND\", \"transaction_type\": \"finance\", \"subject_vendor_data\": \"__current__\", \"currency\": \"EUR\"}}, {\"metric\": \"max\", \"field\": \"amount\", \"operator\": \"lt\", \"value\": 10000, \"window\": \"30d\", \"filters\": {\"direction\": \"INBOUND\", \"transaction_type\": \"finance\", \"subject_vendor_data\": \"__current__\", \"currency\": \"EUR\"}}], \"actions\": [{\"type\": \"add_score\", \"value\": 35}]}'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.transactions.rules.create(\n    title=\"Structuring - inbound (custom)\",\n    description=\"20+ inbound EUR transfers, all under 10,000 EUR, 30 days\",\n    category=\"finance\",\n    mode=\"TEST\",\n    evaluation_mode=\"ALL\",\n    scope={\n        \"transaction_types\": [\"finance\"],\n        \"directions\": [\"INBOUND\"],\n    },\n    conditions=[{\n        \"field\": \"currency\",\n        \"operator\": \"eq\",\n        \"value\": \"EUR\",\n    }, {\n        \"field\": \"amount\",\n        \"operator\": \"lt\",\n        \"value\": 10000,\n    }],\n    aggregation=[{\n        \"metric\": \"count\",\n        \"operator\": \"gte\",\n        \"value\": 20.0,\n        \"window\": \"30d\",\n        \"filters\": {\"direction\": \"INBOUND\", \"transaction_type\": \"finance\", \"subject_vendor_data\": \"__current__\", \"currency\": \"EUR\"},\n    }, {\n        \"metric\": \"max\",\n        \"field\": \"amount\",\n        \"operator\": \"lt\",\n        \"value\": 10000.0,\n        \"window\": \"30d\",\n        \"filters\": {\"direction\": \"INBOUND\", \"transaction_type\": \"finance\", \"subject_vendor_data\": \"__current__\", \"currency\": \"EUR\"},\n    }],\n    actions=[{\n        \"type\": \"add_score\",\n        \"value\": 35,\n    }],\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.transactions.rules.create({\n  title: \"Structuring - inbound (custom)\",\n  description: \"20+ inbound EUR transfers, all under 10,000 EUR, 30 days\",\n  category: \"finance\",\n  mode: \"TEST\",\n  evaluation_mode: \"ALL\",\n  scope: {\n    transaction_types: [\"finance\"],\n    directions: [\"INBOUND\"],\n  },\n  conditions: [{\n    field: \"currency\",\n    operator: \"eq\",\n    value: \"EUR\",\n  }, {\n    field: \"amount\",\n    operator: \"lt\",\n    value: 10000,\n  }],\n  aggregation: [{\n    metric: \"count\",\n    operator: \"gte\",\n    value: 20.0,\n    window: \"30d\",\n    filters: { direction: \"INBOUND\", transaction_type: \"finance\", subject_vendor_data: \"__current__\", currency: \"EUR\" },\n  }, {\n    metric: \"max\",\n    field: \"amount\",\n    operator: \"lt\",\n    value: 10000.0,\n    window: \"30d\",\n    filters: { direction: \"INBOUND\", transaction_type: \"finance\", subject_vendor_data: \"__current__\", currency: \"EUR\" },\n  }],\n  actions: [{\n    type: \"add_score\",\n    value: 35,\n  }],\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Transactions.Rules.Create(ctx, didit.TransactionRuleCreateRequest{\n\tTitle:          \"Structuring - inbound (custom)\",\n\tDescription:    didit.String(\"20+ inbound EUR transfers, all under 10,000 EUR, 30 days\"),\n\tCategory:       \"finance\",\n\tMode:           \"TEST\",\n\tEvaluationMode: didit.Some(didit.TransactionRuleCreateRequestEvaluationMode(\"ALL\")),\n\tScope: didit.Some(didit.TransactionRuleScopeParam{\n\t\tTransactionTypes: didit.Some([]string{\"finance\"}),\n\t\tDirections:       didit.Some([]didit.TransactionRuleScopeDirections{\"INBOUND\"}),\n\t}),\n\tConditions: didit.Some([]didit.TransactionRuleConditionParam{{\n\t\tField:    \"currency\",\n\t\tOperator: \"eq\",\n\t\tValue:    didit.Some[any](\"EUR\"),\n\t}, {\n\t\tField:    \"amount\",\n\t\tOperator: \"lt\",\n\t\tValue:    didit.Some[any](10000),\n\t}}),\n\tAggregation: didit.Some([]didit.TransactionRuleAggregationParam{{\n\t\tMetric:   didit.Some(didit.TransactionRuleAggregationMetric(\"count\")),\n\t\tOperator: didit.Some(didit.TransactionRuleAggregationOperator(\"gte\")),\n\t\tValue:    20.0,\n\t\tWindow:   didit.String(\"30d\"),\n\t\tFilters:  didit.Some(map[string]any{\"direction\": \"INBOUND\", \"transaction_type\": \"finance\", \"subject_vendor_data\": \"__current__\", \"currency\": \"EUR\"}),\n\t}, {\n\t\tMetric:   didit.Some(didit.TransactionRuleAggregationMetric(\"max\")),\n\t\tField:    didit.String(\"amount\"),\n\t\tOperator: didit.Some(didit.TransactionRuleAggregationOperator(\"lt\")),\n\t\tValue:    10000.0,\n\t\tWindow:   didit.String(\"30d\"),\n\t\tFilters:  didit.Some(map[string]any{\"direction\": \"INBOUND\", \"transaction_type\": \"finance\", \"subject_vendor_data\": \"__current__\", \"currency\": \"EUR\"}),\n\t}}),\n\tActions: didit.Some([]didit.TransactionRuleActionParam{{\n\t\tType:  \"add_score\",\n\t\tValue: didit.Some[any](35),\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;\nimport java.util.Map;\nimport me.didit.Didit;\nimport me.didit.types.TransactionRuleAction;\nimport me.didit.types.TransactionRuleActionAddScore;\nimport me.didit.types.TransactionRuleAggregation;\nimport me.didit.types.TransactionRuleCondition;\nimport me.didit.types.TransactionRuleCreateRequest;\nimport me.didit.types.TransactionRuleScope;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.transactions().rules().create(TransactionRuleCreateRequest.builder()\n        .title(\"Structuring - inbound (custom)\")\n        .description(\"20+ inbound EUR transfers, all under 10,000 EUR, 30 days\")\n        .category(\"finance\")\n        .mode(TransactionRuleCreateRequest.Mode.of(\"TEST\"))\n        .evaluationMode(TransactionRuleCreateRequest.EvaluationMode.of(\"ALL\"))\n        .scope(TransactionRuleScope.builder()\n                .transactionTypes(List.of(\"finance\"))\n                .directions(List.of(TransactionRuleScope.Directions.of(\"INBOUND\")))\n                .build())\n        .conditions(List.of(\n                TransactionRuleCondition.builder()\n                        .field(\"currency\")\n                        .operator(TransactionRuleCondition.Operator.of(\"eq\"))\n                        .value(\"EUR\")\n                        .build(),\n                TransactionRuleCondition.builder()\n                        .field(\"amount\")\n                        .operator(TransactionRuleCondition.Operator.of(\"lt\"))\n                        .value(10000)\n                        .build()))\n        .aggregation(List.of(\n                TransactionRuleAggregation.builder()\n                        .metric(TransactionRuleAggregation.Metric.of(\"count\"))\n                        .operator(TransactionRuleAggregation.Operator.of(\"gte\"))\n                        .value(20.0)\n                        .window(\"30d\")\n                        .filters(Map.of(\"direction\", \"INBOUND\", \"transaction_type\", \"finance\", \"subject_vendor_data\", \"__current__\", \"currency\", \"EUR\"))\n                        .build(),\n                TransactionRuleAggregation.builder()\n                        .metric(TransactionRuleAggregation.Metric.of(\"max\"))\n                        .field(\"amount\")\n                        .operator(TransactionRuleAggregation.Operator.of(\"lt\"))\n                        .value(10000.0)\n                        .window(\"30d\")\n                        .filters(Map.of(\"direction\", \"INBOUND\", \"transaction_type\", \"finance\", \"subject_vendor_data\", \"__current__\", \"currency\", \"EUR\"))\n                        .build()))\n        .actions(List.of(TransactionRuleAction.ofAddScore(TransactionRuleActionAddScore.builder()\n                .type(TransactionRuleActionAddScore.Type.of(\"add_score\"))\n                .value(35L)\n                .build())))\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->transactions->rules->create([\n    'title' => 'Structuring - inbound (custom)',\n    'description' => '20+ inbound EUR transfers, all under 10,000 EUR, 30 days',\n    'category' => 'finance',\n    'mode' => 'TEST',\n    'evaluation_mode' => 'ALL',\n    'scope' => [\n        'transaction_types' => ['finance'],\n        'directions' => ['INBOUND'],\n    ],\n    'conditions' => [[\n        'field' => 'currency',\n        'operator' => 'eq',\n        'value' => 'EUR',\n    ], [\n        'field' => 'amount',\n        'operator' => 'lt',\n        'value' => 10000,\n    ]],\n    'aggregation' => [[\n        'metric' => 'count',\n        'operator' => 'gte',\n        'value' => 20.0,\n        'window' => '30d',\n        'filters' => ['direction' => 'INBOUND', 'transaction_type' => 'finance', 'subject_vendor_data' => '__current__', 'currency' => 'EUR'],\n    ], [\n        'metric' => 'max',\n        'field' => 'amount',\n        'operator' => 'lt',\n        'value' => 10000.0,\n        'window' => '30d',\n        'filters' => ['direction' => 'INBOUND', 'transaction_type' => 'finance', 'subject_vendor_data' => '__current__', 'currency' => 'EUR'],\n    ]],\n    'actions' => [[\n        'type' => 'add_score',\n        'value' => 35,\n    ]],\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.transactions.rules.create(\n  title: \"Structuring - inbound (custom)\",\n  description: \"20+ inbound EUR transfers, all under 10,000 EUR, 30 days\",\n  category: \"finance\",\n  mode: \"TEST\",\n  evaluation_mode: \"ALL\",\n  scope: {\n    transaction_types: [\"finance\"],\n    directions: [\"INBOUND\"],\n  },\n  conditions: [{\n    field: \"currency\",\n    operator: \"eq\",\n    value: \"EUR\",\n  }, {\n    field: \"amount\",\n    operator: \"lt\",\n    value: 10000,\n  }],\n  aggregation: [{\n    metric: \"count\",\n    operator: \"gte\",\n    value: 20.0,\n    window: \"30d\",\n    filters: { direction: \"INBOUND\", transaction_type: \"finance\", subject_vendor_data: \"__current__\", currency: \"EUR\" },\n  }, {\n    metric: \"max\",\n    field: \"amount\",\n    operator: \"lt\",\n    value: 10000.0,\n    window: \"30d\",\n    filters: { direction: \"INBOUND\", transaction_type: \"finance\", subject_vendor_data: \"__current__\", currency: \"EUR\" },\n  }],\n  actions: [{\n    type: \"add_score\",\n    value: 35,\n  }]\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Collections.Generic;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Transactions.Rules.CreateAsync(new TransactionRuleCreateRequest\n{\n    Title = \"Structuring - inbound (custom)\",\n    Description = \"20+ inbound EUR transfers, all under 10,000 EUR, 30 days\",\n    Category = \"finance\",\n    Mode = \"TEST\",\n    EvaluationMode = new TransactionRuleCreateRequestEvaluationMode(\"ALL\"),\n    Scope = new TransactionRuleScope\n    {\n        TransactionTypes = new string[] { \"finance\" },\n        Directions = new TransactionRuleScopeDirections[] { \"INBOUND\" },\n    },\n    Conditions = new TransactionRuleCondition[]\n    {\n        new()\n        {\n            Field = \"currency\",\n            Operator = \"eq\",\n            Value = \"EUR\",\n        },\n        new()\n        {\n            Field = \"amount\",\n            Operator = \"lt\",\n            Value = 10000,\n        },\n    },\n    Aggregation = new TransactionRuleAggregation[]\n    {\n        new()\n        {\n            Metric = new TransactionRuleAggregationMetric(\"count\"),\n            Operator = new TransactionRuleAggregationOperator(\"gte\"),\n            Value = 20.0,\n            Window = \"30d\",\n            Filters = new Dictionary<string, object> { [\"direction\"] = \"INBOUND\", [\"transaction_type\"] = \"finance\", [\"subject_vendor_data\"] = \"__current__\", [\"currency\"] = \"EUR\" },\n        },\n        new()\n        {\n            Metric = new TransactionRuleAggregationMetric(\"max\"),\n            Field = \"amount\",\n            Operator = new TransactionRuleAggregationOperator(\"lt\"),\n            Value = 10000.0,\n            Window = \"30d\",\n            Filters = new Dictionary<string, object> { [\"direction\"] = \"INBOUND\", [\"transaction_type\"] = \"finance\", [\"subject_vendor_data\"] = \"__current__\", [\"currency\"] = \"EUR\" },\n        },\n    },\n    Actions = new TransactionRuleAction[]\n    {\n        new()\n        {\n            Type = new TransactionRuleActionType(\"add_score\"),\n            Value = 35,\n        },\n    },\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ]
      }
    },
    "/v3/transactions/rules/{rule_uuid}/": {
      "parameters": [
        {
          "name": "rule_uuid",
          "in": "path",
          "required": true,
          "schema": {
            "type": "string",
            "format": "uuid"
          },
          "description": "Die UUID der Regel aus der Auflistung oder Erstellung."
        }
      ],
      "get": {
        "summary": "Regel abrufen",
        "description": "Rufen Sie eine Regel mit ihrer vollständigen Konfiguration und ihren Ausführungszählern ab.",
        "operationId": "getTransactionRule",
        "x-didit-sdk": {
          "resource": "transactions.rules",
          "method": "retrieve",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Transactions"
        ],
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "Die Regel.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TransactionRuleDetail"
                }
              }
            }
          },
          "404": {
            "description": "Keine solche Regel für diese Anwendung.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X GET 'https://verification.didit.me/v3/transactions/rules/RULE_UUID/' \\\n  -H 'x-api-key: YOUR_API_KEY'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.transactions.rules.retrieve(\n    \"11111111-2222-3333-4444-555555555555\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.transactions.rules.retrieve(\"11111111-2222-3333-4444-555555555555\");\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Transactions.Rules.Retrieve(ctx, \"11111111-2222-3333-4444-555555555555\")\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.transactions().rules().retrieve(\"11111111-2222-3333-4444-555555555555\");\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->transactions->rules->retrieve('11111111-2222-3333-4444-555555555555');\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.transactions.rules.retrieve(\"11111111-2222-3333-4444-555555555555\")\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Transactions.Rules.RetrieveAsync(\"11111111-2222-3333-4444-555555555555\");\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ]
      },
      "patch": {
        "summary": "Regel aktualisieren",
        "description": "Eine Regel teilweise aktualisieren. Benutzerdefinierte Regeln akzeptieren jedes Konfigurationsfeld. Bibliotheksregeln (PRESET) akzeptieren nur `mode` – verwenden Sie dies, um ein Preset zu aktivieren, zu deaktivieren oder auf TEST umzuschalten; jedes andere Feld gibt 400 zurück, da Didit Bibliotheksregeln pflegt und deren Aktualisierungen automatisch anwendet. Um die Bedingungen einer Bibliotheksregel zu ändern, erstellen Sie eine benutzerdefinierte Kopie mit `POST /v3/transactions/rules/` unter Verwendung der Definition der Bibliotheksregel sowie `metadata.based_on` (dem Bibliotheksschlüssel) und `metadata.based_on_rule_uuid`, und schalten Sie die Bibliotheksregel anschließend mit `mode: DISABLED` aus, damit eine Transaktion nicht doppelt alarmiert. Eine installierte Kopie einer zurückgehaltenen Bibliotheksregel ist ausgeschaltet: Das Setzen ihres `mode` auf einen anderen Wert als `DISABLED` gibt 400 zurück („This library rule cannot run yet: its conditions read data the rules engine cannot evaluate.“).",
        "operationId": "updateTransactionRule",
        "x-didit-sdk": {
          "resource": "transactions.rules",
          "method": "update",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Transactions"
        ],
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TransactionRuleUpdateRequest"
              },
              "example": {
                "mode": "ACTIVE"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Die aktualisierte Regel.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TransactionRuleDetail"
                }
              }
            }
          },
          "400": {
            "description": "Validierungsfehler, ein Nicht-Modus-Feld bei einer Bibliotheksregel oder ein anderer Modus als DISABLED bei einer zurückgehaltenen Bibliotheksregel.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X PATCH 'https://verification.didit.me/v3/transactions/rules/RULE_UUID/' \\\n  -H 'x-api-key: YOUR_API_KEY' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\"mode\": \"ACTIVE\"}'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.transactions.rules.update(\n    \"11111111-2222-3333-4444-555555555555\",\n    mode=\"ACTIVE\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.transactions.rules.update(\"11111111-2222-3333-4444-555555555555\", {\n  mode: \"ACTIVE\",\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Transactions.Rules.Update(ctx, \"11111111-2222-3333-4444-555555555555\", didit.TransactionRuleUpdateRequest{\n\tMode: didit.Some(didit.TransactionRuleUpdateRequestMode(\"ACTIVE\")),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\nimport me.didit.types.TransactionRuleUpdateRequest;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.transactions().rules().update(\"11111111-2222-3333-4444-555555555555\", TransactionRuleUpdateRequest.builder()\n        .mode(TransactionRuleUpdateRequest.Mode.of(\"ACTIVE\"))\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->transactions->rules->update('11111111-2222-3333-4444-555555555555', [\n    'mode' => 'ACTIVE',\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.transactions.rules.update(\n  \"11111111-2222-3333-4444-555555555555\",\n  mode: \"ACTIVE\"\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Transactions.Rules.UpdateAsync(\"11111111-2222-3333-4444-555555555555\", new TransactionRuleUpdateRequest\n{\n    Mode = new TransactionRuleUpdateRequestMode(\"ACTIVE\"),\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ]
      },
      "delete": {
        "summary": "Regel löschen",
        "description": "Eine CUSTOM-Regel löschen. Die Löschung erfolgt sofort und dauerhaft: Die Regel wird für neue Transaktionen nicht mehr ausgewertet und verschwindet aus den Listen, während vergangene Regeldurchläufe bei bereits ausgewerteten Transaktionen ihre aufgezeichneten Ergebnisse behalten. Bibliotheksregeln können nicht gelöscht werden – deinstallieren Sie diese stattdessen über den Install-Endpoint (sie können jederzeit erneut aus der Bibliothek installiert werden).",
        "operationId": "deleteTransactionRule",
        "x-didit-sdk": {
          "resource": "transactions.rules",
          "method": "delete",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Transactions"
        ],
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "responses": {
          "204": {
            "description": "Gelöscht."
          },
          "400": {
            "description": "Die Regel ist eine Bibliotheksvoreinstellung – deinstallieren Sie sie stattdessen.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                },
                "example": {
                  "detail": "Library rules cannot be deleted. Uninstall them via the rules install endpoint instead."
                }
              }
            }
          },
          "404": {
            "description": "Keine solche Regel für diese Anwendung.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X DELETE 'https://verification.didit.me/v3/transactions/rules/RULE_UUID/' \\\n  -H 'x-api-key: YOUR_API_KEY'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nclient.transactions.rules.delete(\n    \"11111111-2222-3333-4444-555555555555\",\n)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nawait didit.transactions.rules.delete(\"11111111-2222-3333-4444-555555555555\");"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nif err := client.Transactions.Rules.Delete(ctx, \"11111111-2222-3333-4444-555555555555\"); err != nil {\n\tlog.Fatal(err)\n}"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nclient.transactions().rules().delete(\"11111111-2222-3333-4444-555555555555\");"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$didit->transactions->rules->delete('11111111-2222-3333-4444-555555555555');"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\ndidit.transactions.rules.delete(\"11111111-2222-3333-4444-555555555555\")"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nawait client.Transactions.Rules.DeleteAsync(\"11111111-2222-3333-4444-555555555555\");"
          }
        ]
      }
    },
    "/v3/transactions/rules/backtest/": {
      "post": {
        "summary": "Regelkonfiguration für den Backtest",
        "description": "Evaluieren Sie eine hypothetische Regelkonfiguration anhand Ihrer letzten Transaktionen (neueste zuerst, bis zum Backtest-Limit), ohne eine Regel zu erstellen oder Transaktionen zu verändern. Nutzen Sie dies vor der Aktivierung einer Regel, um zu sehen, wie oft sie zugetroffen hätte und wie viele Personen davon betroffen gewesen wären.",
        "operationId": "backtestTransactionRules",
        "x-didit-sdk": {
          "resource": "transactions.rules",
          "method": "backtest",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Transactions"
        ],
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TransactionRuleBacktestRequest"
              },
              "example": {
                "conditions": [
                  {
                    "field": "currency",
                    "operator": "eq",
                    "value": "EUR"
                  },
                  {
                    "field": "amount",
                    "operator": "lt",
                    "value": 10000
                  }
                ],
                "aggregation": [
                  {
                    "metric": "count",
                    "operator": "gte",
                    "value": 20,
                    "window": "30d",
                    "filters": {
                      "direction": "INBOUND",
                      "transaction_type": "finance",
                      "subject_vendor_data": "__current__",
                      "currency": "EUR"
                    }
                  },
                  {
                    "metric": "max",
                    "field": "amount",
                    "operator": "lt",
                    "value": 10000,
                    "window": "30d",
                    "filters": {
                      "direction": "INBOUND",
                      "transaction_type": "finance",
                      "subject_vendor_data": "__current__",
                      "currency": "EUR"
                    }
                  }
                ],
                "evaluation_mode": "ALL",
                "scope": {
                  "transaction_types": [
                    "finance"
                  ],
                  "directions": [
                    "INBOUND"
                  ]
                },
                "period_days": 90
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Backtest-Statistiken.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TransactionRuleBacktestResult"
                },
                "example": {
                  "evaluated": 4820,
                  "matched": 12,
                  "affected_entities": 4,
                  "period_days": 90
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X POST 'https://verification.didit.me/v3/transactions/rules/backtest/' \\\n  -H 'x-api-key: YOUR_API_KEY' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\"conditions\": [{\"field\": \"currency\", \"operator\": \"eq\", \"value\": \"EUR\"}, {\"field\": \"amount\", \"operator\": \"lt\", \"value\": 10000}], \"aggregation\": [{\"metric\": \"count\", \"operator\": \"gte\", \"value\": 20, \"window\": \"30d\", \"filters\": {\"direction\": \"INBOUND\", \"transaction_type\": \"finance\", \"subject_vendor_data\": \"__current__\", \"currency\": \"EUR\"}}, {\"metric\": \"max\", \"field\": \"amount\", \"operator\": \"lt\", \"value\": 10000, \"window\": \"30d\", \"filters\": {\"direction\": \"INBOUND\", \"transaction_type\": \"finance\", \"subject_vendor_data\": \"__current__\", \"currency\": \"EUR\"}}], \"evaluation_mode\": \"ALL\", \"scope\": {\"transaction_types\": [\"finance\"], \"directions\": [\"INBOUND\"]}, \"period_days\": 90}'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.transactions.rules.backtest(\n    conditions=[{\n        \"field\": \"currency\",\n        \"operator\": \"eq\",\n        \"value\": \"EUR\",\n    }, {\n        \"field\": \"amount\",\n        \"operator\": \"lt\",\n        \"value\": 10000,\n    }],\n    aggregation=[{\n        \"metric\": \"count\",\n        \"operator\": \"gte\",\n        \"value\": 20.0,\n        \"window\": \"30d\",\n        \"filters\": {\"direction\": \"INBOUND\", \"transaction_type\": \"finance\", \"subject_vendor_data\": \"__current__\", \"currency\": \"EUR\"},\n    }, {\n        \"metric\": \"max\",\n        \"field\": \"amount\",\n        \"operator\": \"lt\",\n        \"value\": 10000.0,\n        \"window\": \"30d\",\n        \"filters\": {\"direction\": \"INBOUND\", \"transaction_type\": \"finance\", \"subject_vendor_data\": \"__current__\", \"currency\": \"EUR\"},\n    }],\n    evaluation_mode=\"ALL\",\n    scope={\n        \"transaction_types\": [\"finance\"],\n        \"directions\": [\"INBOUND\"],\n    },\n    period_days=90,\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.transactions.rules.backtest({\n  conditions: [{\n    field: \"currency\",\n    operator: \"eq\",\n    value: \"EUR\",\n  }, {\n    field: \"amount\",\n    operator: \"lt\",\n    value: 10000,\n  }],\n  aggregation: [{\n    metric: \"count\",\n    operator: \"gte\",\n    value: 20.0,\n    window: \"30d\",\n    filters: { direction: \"INBOUND\", transaction_type: \"finance\", subject_vendor_data: \"__current__\", currency: \"EUR\" },\n  }, {\n    metric: \"max\",\n    field: \"amount\",\n    operator: \"lt\",\n    value: 10000.0,\n    window: \"30d\",\n    filters: { direction: \"INBOUND\", transaction_type: \"finance\", subject_vendor_data: \"__current__\", currency: \"EUR\" },\n  }],\n  evaluation_mode: \"ALL\",\n  scope: {\n    transaction_types: [\"finance\"],\n    directions: [\"INBOUND\"],\n  },\n  period_days: 90,\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Transactions.Rules.Backtest(ctx, didit.TransactionRuleBacktestRequest{\n\tConditions: didit.Some([]didit.TransactionRuleConditionParam{{\n\t\tField:    \"currency\",\n\t\tOperator: \"eq\",\n\t\tValue:    didit.Some[any](\"EUR\"),\n\t}, {\n\t\tField:    \"amount\",\n\t\tOperator: \"lt\",\n\t\tValue:    didit.Some[any](10000),\n\t}}),\n\tAggregation: didit.Some([]didit.TransactionRuleAggregationParam{{\n\t\tMetric:   didit.Some(didit.TransactionRuleAggregationMetric(\"count\")),\n\t\tOperator: didit.Some(didit.TransactionRuleAggregationOperator(\"gte\")),\n\t\tValue:    20.0,\n\t\tWindow:   didit.String(\"30d\"),\n\t\tFilters:  didit.Some(map[string]any{\"direction\": \"INBOUND\", \"transaction_type\": \"finance\", \"subject_vendor_data\": \"__current__\", \"currency\": \"EUR\"}),\n\t}, {\n\t\tMetric:   didit.Some(didit.TransactionRuleAggregationMetric(\"max\")),\n\t\tField:    didit.String(\"amount\"),\n\t\tOperator: didit.Some(didit.TransactionRuleAggregationOperator(\"lt\")),\n\t\tValue:    10000.0,\n\t\tWindow:   didit.String(\"30d\"),\n\t\tFilters:  didit.Some(map[string]any{\"direction\": \"INBOUND\", \"transaction_type\": \"finance\", \"subject_vendor_data\": \"__current__\", \"currency\": \"EUR\"}),\n\t}}),\n\tEvaluationMode: didit.Some(didit.TransactionRuleBacktestRequestEvaluationMode(\"ALL\")),\n\tScope: didit.Some(didit.TransactionRuleScopeParam{\n\t\tTransactionTypes: didit.Some([]string{\"finance\"}),\n\t\tDirections:       didit.Some([]didit.TransactionRuleScopeDirections{\"INBOUND\"}),\n\t}),\n\tPeriodDays: didit.Int(90),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import java.util.List;\nimport java.util.Map;\nimport me.didit.Didit;\nimport me.didit.types.TransactionRuleAggregation;\nimport me.didit.types.TransactionRuleBacktestRequest;\nimport me.didit.types.TransactionRuleCondition;\nimport me.didit.types.TransactionRuleScope;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.transactions().rules().backtest(TransactionRuleBacktestRequest.builder()\n        .conditions(List.of(\n                TransactionRuleCondition.builder()\n                        .field(\"currency\")\n                        .operator(TransactionRuleCondition.Operator.of(\"eq\"))\n                        .value(\"EUR\")\n                        .build(),\n                TransactionRuleCondition.builder()\n                        .field(\"amount\")\n                        .operator(TransactionRuleCondition.Operator.of(\"lt\"))\n                        .value(10000)\n                        .build()))\n        .aggregation(List.of(\n                TransactionRuleAggregation.builder()\n                        .metric(TransactionRuleAggregation.Metric.of(\"count\"))\n                        .operator(TransactionRuleAggregation.Operator.of(\"gte\"))\n                        .value(20.0)\n                        .window(\"30d\")\n                        .filters(Map.of(\"direction\", \"INBOUND\", \"transaction_type\", \"finance\", \"subject_vendor_data\", \"__current__\", \"currency\", \"EUR\"))\n                        .build(),\n                TransactionRuleAggregation.builder()\n                        .metric(TransactionRuleAggregation.Metric.of(\"max\"))\n                        .field(\"amount\")\n                        .operator(TransactionRuleAggregation.Operator.of(\"lt\"))\n                        .value(10000.0)\n                        .window(\"30d\")\n                        .filters(Map.of(\"direction\", \"INBOUND\", \"transaction_type\", \"finance\", \"subject_vendor_data\", \"__current__\", \"currency\", \"EUR\"))\n                        .build()))\n        .evaluationMode(TransactionRuleBacktestRequest.EvaluationMode.of(\"ALL\"))\n        .scope(TransactionRuleScope.builder()\n                .transactionTypes(List.of(\"finance\"))\n                .directions(List.of(TransactionRuleScope.Directions.of(\"INBOUND\")))\n                .build())\n        .periodDays(90L)\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->transactions->rules->backtest([\n    'conditions' => [[\n        'field' => 'currency',\n        'operator' => 'eq',\n        'value' => 'EUR',\n    ], [\n        'field' => 'amount',\n        'operator' => 'lt',\n        'value' => 10000,\n    ]],\n    'aggregation' => [[\n        'metric' => 'count',\n        'operator' => 'gte',\n        'value' => 20.0,\n        'window' => '30d',\n        'filters' => ['direction' => 'INBOUND', 'transaction_type' => 'finance', 'subject_vendor_data' => '__current__', 'currency' => 'EUR'],\n    ], [\n        'metric' => 'max',\n        'field' => 'amount',\n        'operator' => 'lt',\n        'value' => 10000.0,\n        'window' => '30d',\n        'filters' => ['direction' => 'INBOUND', 'transaction_type' => 'finance', 'subject_vendor_data' => '__current__', 'currency' => 'EUR'],\n    ]],\n    'evaluation_mode' => 'ALL',\n    'scope' => [\n        'transaction_types' => ['finance'],\n        'directions' => ['INBOUND'],\n    ],\n    'period_days' => 90,\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.transactions.rules.backtest(\n  conditions: [{\n    field: \"currency\",\n    operator: \"eq\",\n    value: \"EUR\",\n  }, {\n    field: \"amount\",\n    operator: \"lt\",\n    value: 10000,\n  }],\n  aggregation: [{\n    metric: \"count\",\n    operator: \"gte\",\n    value: 20.0,\n    window: \"30d\",\n    filters: { direction: \"INBOUND\", transaction_type: \"finance\", subject_vendor_data: \"__current__\", currency: \"EUR\" },\n  }, {\n    metric: \"max\",\n    field: \"amount\",\n    operator: \"lt\",\n    value: 10000.0,\n    window: \"30d\",\n    filters: { direction: \"INBOUND\", transaction_type: \"finance\", subject_vendor_data: \"__current__\", currency: \"EUR\" },\n  }],\n  evaluation_mode: \"ALL\",\n  scope: {\n    transaction_types: [\"finance\"],\n    directions: [\"INBOUND\"],\n  },\n  period_days: 90\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Collections.Generic;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Transactions.Rules.BacktestAsync(new TransactionRuleBacktestRequest\n{\n    Conditions = new TransactionRuleCondition[]\n    {\n        new()\n        {\n            Field = \"currency\",\n            Operator = \"eq\",\n            Value = \"EUR\",\n        },\n        new()\n        {\n            Field = \"amount\",\n            Operator = \"lt\",\n            Value = 10000,\n        },\n    },\n    Aggregation = new TransactionRuleAggregation[]\n    {\n        new()\n        {\n            Metric = new TransactionRuleAggregationMetric(\"count\"),\n            Operator = new TransactionRuleAggregationOperator(\"gte\"),\n            Value = 20.0,\n            Window = \"30d\",\n            Filters = new Dictionary<string, object> { [\"direction\"] = \"INBOUND\", [\"transaction_type\"] = \"finance\", [\"subject_vendor_data\"] = \"__current__\", [\"currency\"] = \"EUR\" },\n        },\n        new()\n        {\n            Metric = new TransactionRuleAggregationMetric(\"max\"),\n            Field = \"amount\",\n            Operator = new TransactionRuleAggregationOperator(\"lt\"),\n            Value = 10000.0,\n            Window = \"30d\",\n            Filters = new Dictionary<string, object> { [\"direction\"] = \"INBOUND\", [\"transaction_type\"] = \"finance\", [\"subject_vendor_data\"] = \"__current__\", [\"currency\"] = \"EUR\" },\n        },\n    },\n    EvaluationMode = new TransactionRuleBacktestRequestEvaluationMode(\"ALL\"),\n    Scope = new TransactionRuleScope\n    {\n        TransactionTypes = new string[] { \"finance\" },\n        Directions = new TransactionRuleScopeDirections[] { \"INBOUND\" },\n    },\n    PeriodDays = 90,\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ]
      }
    },
    "/v3/transactions/rules/library/": {
      "get": {
        "summary": "Regelbibliothek auflisten",
        "description": "Durchsuchen Sie die vollständige Bibliothek vordefinierter Regeln (150+ Regeln) mit der vollständigen Konfiguration jedes Eintrags und einem `is_installed`-Flag für diese Anwendung. Filtern Sie nach Paket, Kategorie oder Freitextsuche. Eine Bibliotheksregel, deren Bedingungen Daten lesen, die die Regel-Engine noch nicht auswerten kann, wird zurückgehalten, bis sie ausgeführt werden kann. Zurückgehaltene Regeln werden nicht aufgeführt.",
        "operationId": "listTransactionRuleLibrary",
        "x-didit-sdk": {
          "resource": "transactions.rules",
          "method": "list_library",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Transactions"
        ],
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "parameters": [
          {
            "name": "bundle",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "Nach Paket filtern, z. B. finance, aml_ctf, crypto_monitoring, travel_rule"
          },
          {
            "name": "category",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "Nach Kategorie filtern"
          },
          {
            "name": "search",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "Übereinstimmung ohne Berücksichtigung von Groß-/Kleinschreibung mit Titel und Beschreibung"
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer"
            },
            "description": "Seitengröße"
          },
          {
            "name": "offset",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer"
            },
            "description": "Seiten-Offset"
          }
        ],
        "responses": {
          "200": {
            "description": "Paginierte Bibliothekseinträge.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "count": {
                      "type": "integer"
                    },
                    "next": {
                      "type": "string",
                      "nullable": true
                    },
                    "previous": {
                      "type": "string",
                      "nullable": true
                    },
                    "results": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/TransactionRuleLibraryEntry"
                      }
                    }
                  }
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X GET 'https://verification.didit.me/v3/transactions/rules/library/?bundle=finance' \\\n  -H 'x-api-key: YOUR_API_KEY'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nfor item in client.transactions.rules.list_library():\n    print(item)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nfor await (const item of didit.transactions.rules.listLibrary()) {\n  console.log(item);\n}"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\niter := client.Transactions.Rules.ListLibraryAutoPaging(ctx, didit.TransactionsRulesListLibraryParams{})\nfor iter.Next() {\n\tfmt.Printf(\"%+v\\n\", iter.Current())\n}\nif err := iter.Err(); err != nil {\n\tlog.Fatal(err)\n}"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nfor (var item : client.transactions().rules().listLibrary()) {\n    System.out.println(item);\n}"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\nforeach ($didit->transactions->rules->listLibrary() as $item) {\n    print_r($item->toArray());\n}"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\ndidit.transactions.rules.list_library.auto_paging_each do |item|\n  puts item.to_h\nend"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nawait foreach (var item in await client.Transactions.Rules.ListLibraryAsync())\n{\n    Console.WriteLine(JsonSerializer.Serialize(item));\n}"
          }
        ]
      }
    },
    "/v3/transactions/rules/install/": {
      "post": {
        "summary": "Bibliotheksregeln installieren",
        "description": "Installieren Sie eine oder mehrere Vorlagen in der Anwendung, über `library_keys` oder ein ganzes `bundle`. Eine installierte Vorlage ist sofort aktiv, solange die Transaktionsüberwachung eingeschaltet ist, andernfalls deaktiviert; bereits installierte Schlüssel werden übersprungen. Eine Bibliotheksregel, deren Bedingungen Daten lesen, die die Regel-Engine noch nicht auswerten kann, wird zurückgehalten, bis sie ausgeführt werden kann. Eine Anfrage, die eine solche Regel in `library_keys` benennt, wird mit 400 beantwortet und installiert nichts („Diese Bibliotheksregeln können noch nicht ausgeführt werden: deren Bedingungen lesen Daten, die die Regel-Engine nicht auswerten kann.“ gefolgt von den Schlüsseln), und eine `bundle`-Installation überspringt sie. Eine zurückgehaltene Regel wird automatisch wieder aktiv, sobald ihre Bedingungen ausgewertet werden können. Ein Eintrag in `library_keys`, der nicht in der Bibliothek vorhanden ist, wird übersprungen, nicht abgelehnt.",
        "operationId": "installTransactionRuleLibrary",
        "x-didit-sdk": {
          "resource": "transactions.rules",
          "method": "install_library",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Transactions"
        ],
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TransactionRuleInstallRequest"
              },
              "example": {
                "library_keys": [
                  "structuring-inbound",
                  "structuring-outbound"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Was installiert wurde.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TransactionRuleInstallResult"
                },
                "example": {
                  "installed_library_keys": [
                    "structuring-inbound",
                    "structuring-outbound"
                  ],
                  "installed_count": 2
                }
              }
            }
          },
          "400": {
            "description": "Weder library_keys noch bundle angegeben, `library_keys` ist keine Liste oder ein Eintrag in `library_keys` wird zurückgehalten. Ein unbekannter Eintrag wird übersprungen und gibt 200 ohne ihn zurück.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X POST 'https://verification.didit.me/v3/transactions/rules/install/' \\\n  -H 'x-api-key: YOUR_API_KEY' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\"library_keys\": [\"structuring-inbound\", \"structuring-outbound\"]}'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.transactions.rules.install_library(\n    library_keys=[\"structuring-inbound\", \"structuring-outbound\"],\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.transactions.rules.installLibrary({\n  library_keys: [\"structuring-inbound\", \"structuring-outbound\"],\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Transactions.Rules.InstallLibrary(ctx, didit.TransactionRuleInstallRequest{\n\tLibraryKeys: didit.Some([]string{\"structuring-inbound\", \"structuring-outbound\"}),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import java.util.List;\nimport me.didit.Didit;\nimport me.didit.types.TransactionRuleInstallRequest;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.transactions().rules().installLibrary(TransactionRuleInstallRequest.builder()\n        .libraryKeys(List.of(\"structuring-inbound\", \"structuring-outbound\"))\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->transactions->rules->installLibrary([\n    'library_keys' => ['structuring-inbound', 'structuring-outbound'],\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.transactions.rules.install_library(library_keys: [\"structuring-inbound\", \"structuring-outbound\"])\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Transactions.Rules.InstallLibraryAsync(new TransactionRuleInstallRequest\n{\n    LibraryKeys = new string[] { \"structuring-inbound\", \"structuring-outbound\" },\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ]
      },
      "delete": {
        "summary": "Bibliotheksregeln deinstallieren",
        "description": "Installierte Presets anhand von `library_keys` oder als ganzes `bundle` aus der Anwendung entfernen. Deinstallierte Presets werden ab sofort nicht mehr ausgewertet und können jederzeit wieder aus der Bibliothek installiert werden.",
        "operationId": "uninstallTransactionRuleLibrary",
        "x-didit-sdk": {
          "resource": "transactions.rules",
          "method": "uninstall_library",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Transactions"
        ],
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TransactionRuleInstallRequest"
              },
              "example": {
                "bundle": "responsible_gaming"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Wie viele Voreinstellungen entfernt wurden.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TransactionRuleInstallResult"
                },
                "example": {
                  "uninstalled_count": 5
                }
              }
            }
          },
          "400": {
            "description": "Weder library_keys noch bundle angegeben.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X DELETE 'https://verification.didit.me/v3/transactions/rules/install/' \\\n  -H 'x-api-key: YOUR_API_KEY' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\"bundle\": \"responsible_gaming\"}'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.transactions.rules.uninstall_library(\n    bundle=\"responsible_gaming\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.transactions.rules.uninstallLibrary({\n  bundle: \"responsible_gaming\",\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Transactions.Rules.UninstallLibrary(ctx, didit.TransactionRuleInstallRequest{\n\tBundle: didit.String(\"responsible_gaming\"),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\nimport me.didit.types.TransactionRuleInstallRequest;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.transactions().rules().uninstallLibrary(TransactionRuleInstallRequest.builder()\n        .bundle(\"responsible_gaming\")\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->transactions->rules->uninstallLibrary([\n    'bundle' => 'responsible_gaming',\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.transactions.rules.uninstall_library(bundle: \"responsible_gaming\")\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Transactions.Rules.UninstallLibraryAsync(new TransactionRuleInstallRequest\n{\n    Bundle = \"responsible_gaming\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ]
      }
    },
    "/v3/organization/{organization_id}/application/{application_id}/networks/": {
      "get": {
        "summary": "Netzwerke auflisten",
        "description": "Listet Betrugsnetzwerke auf, die innerhalb der Organisation dieser Anwendung erkannt wurden, standardmäßig mit dem höchsten Risiko zuerst. Standardmäßig sind verworfene Netzwerke ausgeschlossen; übergeben Sie status, um sie einzuschließen. Sandbox-Anwendungen haben niemals Netzwerke: Clustering schließt Sandbox-Daten vollständig aus. Jede Antwort enthält den `sharing_mode` der Organisation und die Angabe, ob organisationsübergreifende Signale darauf zutreffen (`cross_org_available`, `cross_org_unavailable_reason`). `kpis` aggregieren die Netzwerke, die Ihren Filtern entsprechen, und `counts` aggregieren jedes Netzwerk, das die Anwendung sehen kann; übergeben Sie `summary=false`, um beides zu überspringen, wenn Sie nur die Seite benötigen. Erfordert einen API-Schlüssel mit Vollzugriff oder `list:networks` für ein Mitglied der Konsole.",
        "operationId": "list_networks",
        "x-didit-sdk": {
          "resource": "networks",
          "method": "list",
          "auth": "api_key",
          "server": true,
          "scope": "application"
        },
        "tags": [
          "Networks"
        ],
        "parameters": [
          {
            "name": "organization_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "UUID der Organisation."
          },
          {
            "name": "application_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Anwendungs-UUID."
          },
          {
            "name": "status",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "Kommagetrennte Liste der einzuschließenden Status: active,in_review,resolved,dismissed. Weglassen, um verworfene auszuschließen."
          },
          {
            "name": "scope",
            "in": "query",
            "schema": {
              "type": "string",
              "enum": [
                "identity",
                "transactions"
              ]
            },
            "description": "`transactions` behält Netzwerke bei, deren Mitglieder ausnahmslos Transaktionsparteien sind; `identity` behält jedes andere Netzwerk bei. Weglassen für beide. Dies schränkt auch `counts.views` und `counts.facets` ein. Jeder andere Wert gibt 400 zurück."
          },
          {
            "name": "signal_type",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "Kommagetrennte Signaltypen: ip_address,device,face,document_number,phone,email,address."
          },
          {
            "name": "pattern_type",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "Kommagetrennte Mustertypen, z. B. exact_same_device,same_email."
          },
          {
            "name": "risk_band",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "Kommagetrennte Bänder: low,medium,high."
          },
          {
            "name": "min_size",
            "in": "query",
            "schema": {
              "type": "integer"
            },
            "description": "Mindestanzahl an Mitgliedern."
          },
          {
            "name": "max_size",
            "in": "query",
            "schema": {
              "type": "integer"
            },
            "description": "Maximale Mitgliederanzahl."
          },
          {
            "name": "assignee",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "Kommagetrennte Zuständige: `unassigned`, E-Mail-Adressen von Mitgliedern (ohne Berücksichtigung der Groß-/Kleinschreibung) oder `me` für das aufrufende Konsolenmitglied. Ein Netzwerk stimmt mit jedem Wert überein. `me` erfordert ein Token für Konsolenmitglieder: Ein API-Schlüssel erhält 400 `{\"assignee\": [\"\\\"me\\\" needs a user token; an API key has no assignee identity.\"]}`."
          },
          {
            "name": "priority",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "Kommagetrennte Prioritäten: `low`, `medium`, `high` oder `none` für Netzwerke ohne Priorität. Jeder andere Wert gibt 400 `{\"priority\": \"Unknown priority: <values>.\"}` zurück."
          },
          {
            "name": "risk_min",
            "in": "query",
            "schema": {
              "type": "integer",
              "minimum": 0,
              "maximum": 100
            },
            "description": "Minimaler Risiko-Score, eine ganze Zahl von 0 bis 100. Ein Wert, der keine ganze Zahl ist, gibt 400 `{\"risk_min\": \"Use a whole number from 0 to 100.\"}` zurück."
          },
          {
            "name": "has_case",
            "in": "query",
            "schema": {
              "type": "boolean"
            },
            "description": "`true` behält die Netzwerke bei, für die Ihre Anwendung einen Fall eröffnet hat, `false` die übrigen. Jeder andere Wert wird ignoriert."
          },
          {
            "name": "date_from",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date"
            },
            "description": "Untergrenze für last_activity_at (ISO-8601-Datum oder -Datum/Uhrzeit)."
          },
          {
            "name": "date_to",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date"
            },
            "description": "Obere Grenze für first_activity_at (ISO 8601-Datum oder -Datetime)."
          },
          {
            "name": "q",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "Freitextsuche nach Netzwerknamen, Mitgliedernamen, der network_id (N-0001) und exakten pattern_type-Tokens."
          },
          {
            "name": "ordering",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "Einer der Werte risk_score, -risk_score, last_activity_at, -last_activity_at, first_activity_at, -first_activity_at, network_number, -network_number. Standardwert ist -risk_score,-last_activity_at."
          },
          {
            "name": "limit",
            "in": "query",
            "schema": {
              "type": "integer",
              "default": 100,
              "minimum": 1,
              "maximum": 500
            },
            "description": "Seitengröße, 1-500. Standardmäßig 100."
          },
          {
            "name": "offset",
            "in": "query",
            "schema": {
              "type": "integer",
              "default": 0,
              "minimum": 0
            },
            "description": "Nullbasierter Offset des ersten Datensatzes."
          },
          {
            "name": "summary",
            "in": "query",
            "schema": {
              "type": "boolean",
              "default": true
            },
            "description": "`false` gibt nur die Seite und deren `count` zurück, ohne `kpis` und `counts`. Standardmäßig `true`. Jeder andere Wert als `true` oder `false` gibt 400 zurück."
          }
        ],
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X GET 'https://verification.didit.me/v3/organization/11111111-2222-3333-4444-555555555555/application/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/networks/?status=active,in_review&ordering=-risk_score' \\\n  -H 'x-api-key: YOUR_API_KEY'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nfor item in client.networks.list():\n    print(item)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nfor await (const item of didit.networks.list()) {\n  console.log(item);\n}"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\niter := client.Networks.ListAutoPaging(ctx, didit.NetworksListParams{})\nfor iter.Next() {\n\tfmt.Printf(\"%+v\\n\", iter.Current())\n}\nif err := iter.Err(); err != nil {\n\tlog.Fatal(err)\n}"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nfor (var item : client.networks().list()) {\n    System.out.println(item);\n}"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\n$didit = new DiditClient();\n\nforeach ($didit->networks->list() as $item) {\n    print_r($item->toArray());\n}"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\ndidit.networks.list.auto_paging_each do |item|\n  puts item.to_h\nend"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nawait foreach (var item in await client.Networks.ListAsync())\n{\n    Console.WriteLine(JsonSerializer.Serialize(item));\n}"
          }
        ],
        "responses": {
          "200": {
            "description": "Paginierte Netzwerkliste mit dem Freigabemodus der Organisation und der organisationsübergreifenden Verfügbarkeit, plus `kpis` und `counts`, sofern nicht `summary=false`.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "count": {
                      "type": "integer"
                    },
                    "next": {
                      "type": "integer",
                      "nullable": true,
                      "description": "Offset der nächsten Seite oder null auf der letzten Seite."
                    },
                    "previous": {
                      "type": "integer",
                      "nullable": true
                    },
                    "results": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/NetworkListItem"
                      }
                    },
                    "kpis": {
                      "type": "object",
                      "description": "Jeder Schlüssel enthält {value, delta} für die Ergebnisse, die den aktuellen Filtern entsprechen. Wird weggelassen, wenn `summary=false`.",
                      "properties": {
                        "active": {
                          "type": "object"
                        },
                        "in_review": {
                          "type": "object"
                        },
                        "applicants_involved": {
                          "type": "object"
                        },
                        "detected_this_period": {
                          "type": "object"
                        },
                        "false_positive_rate": {
                          "type": "object"
                        }
                      }
                    },
                    "counts": {
                      "$ref": "#/components/schemas/NetworkListCounts"
                    },
                    "sharing_mode": {
                      "type": "string",
                      "enum": [
                        "off",
                        "private",
                        "global"
                      ],
                      "description": "Der organisationsübergreifende Freigabemodus der Organisation. Nur `global` vergleicht Netzwerke über Organisationen hinweg; `private` und `off` beschränken sie auf den eigenen Verlauf der Organisation.",
                      "example": "global"
                    },
                    "cross_org_available": {
                      "type": "boolean",
                      "description": "Gibt an, ob organisationsübergreifende Signale für diese Organisation gelten. Sie erfordern sowohl den Enterprise-Tarif als auch den Freigabemodus `global`.",
                      "example": true
                    },
                    "cross_org_unavailable_reason": {
                      "type": "string",
                      "enum": [
                        "plan",
                        "sharing_mode"
                      ],
                      "nullable": true,
                      "description": "Warum organisationsübergreifende Signale nicht greifen, geprüft in dieser Reihenfolge. `plan`: Der Tarif der Organisation enthält das organisationsübergreifende Betrugsnetzwerk nicht (erfordert den Enterprise-Tarif), unabhängig vom Freigabemodus. `sharing_mode`: Der Tarif enthält es, aber der Freigabemodus ist `private` oder `off`. Null, wenn `cross_org_available` `true` ist.",
                      "example": null
                    }
                  },
                  "required": [
                    "count",
                    "next",
                    "previous",
                    "results",
                    "sharing_mode",
                    "cross_org_available",
                    "cross_org_unavailable_reason"
                  ]
                }
              }
            }
          },
          "400": {
            "description": "Ein ungültiger Filter-, Sortier-, Paginierungs- oder `summary`-Wert.",
            "content": {
              "application/json": {
                "examples": {
                  "Invalid summary": {
                    "summary": "Ungültige Zusammenfassung",
                    "value": {
                      "summary": [
                        "Must be \"true\" or \"false\"."
                      ]
                    }
                  },
                  "Invalid scope": {
                    "summary": "Ungültiger Scope",
                    "value": {
                      "scope": [
                        "Use identity or transactions."
                      ]
                    }
                  },
                  "Unsupported ordering": {
                    "summary": "Nicht unterstützte Sortierung",
                    "value": [
                      "Unsupported ordering."
                    ]
                  }
                }
              }
            }
          },
          "401": {
            "description": "Fehlende oder ungültige Anmeldedaten.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string"
                    },
                    "code": {
                      "type": "string",
                      "description": "Vorhanden bei codierten Fehlern, zum Beispiel `networks_not_entitled`."
                    }
                  }
                },
                "examples": {
                  "Missing or invalid credentials": {
                    "summary": "Fehlende oder ungültige Anmeldedaten",
                    "value": {
                      "detail": "Authentication credentials were not provided or are invalid."
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Der API-Schlüssel gehört zu einer anderen Anwendung oder ist ein Schlüssel mit eingeschränktem Zugriff: Networks-Endpoints erfordern einen Schlüssel mit Vollzugriff. Ein Konsolen-Mitgliedstoken benötigt `list:networks`. Wird auch mit `code: networks_not_entitled` zurückgegeben, wenn Networks für die Organisation nicht aktiviert ist.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string"
                    },
                    "code": {
                      "type": "string",
                      "description": "Vorhanden bei codierten Fehlern, zum Beispiel `networks_not_entitled`."
                    }
                  }
                },
                "examples": {
                  "Networks not enabled": {
                    "summary": "Netzwerke nicht aktiviert",
                    "value": {
                      "detail": "Networks is disabled for this organization. Contact Didit support if you believe this is an error.",
                      "code": "networks_not_entitled"
                    }
                  },
                  "Restricted API key": {
                    "summary": "Eingeschränkter API-Schlüssel",
                    "value": {
                      "detail": "This API key has no access to this endpoint."
                    }
                  },
                  "No permission": {
                    "summary": "Keine Berechtigung",
                    "value": {
                      "detail": "You do not have permission to perform this action."
                    }
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/v3/organization/{organization_id}/application/{application_id}/networks/{network_uuid}/": {
      "get": {
        "summary": "Netzwerk abrufen",
        "description": "Rufen Sie die vollständigen Details eines einzelnen Netzwerks ab: Statistiken, Betrugs-Tags und Risikosignale sowie den `sharing_mode` der Organisation und die organisationsübergreifende Verfügbarkeit, die `tags` Ihrer Anwendung für das Netzwerk, `outcomes` für Mitglieder und Muster-Scores (`patterns`). Erfordert einen API-Schlüssel mit Vollzugriff oder `read:networks` für ein Console-Mitglied.",
        "operationId": "get_network",
        "x-didit-sdk": {
          "resource": "networks",
          "method": "retrieve",
          "auth": "api_key",
          "server": true,
          "scope": "application"
        },
        "tags": [
          "Networks"
        ],
        "parameters": [
          {
            "name": "organization_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "UUID der Organisation."
          },
          {
            "name": "application_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Anwendungs-UUID."
          },
          {
            "name": "network_uuid",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "n3a5e000-0000-4000-8000-000000000001"
            },
            "description": "Netzwerk-UUID."
          }
        ],
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X GET 'https://verification.didit.me/v3/organization/11111111-2222-3333-4444-555555555555/application/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/networks/n3a5e000-0000-4000-8000-000000000001/' \\\n  -H 'x-api-key: YOUR_API_KEY'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.networks.retrieve(\n    \"n3a5e000-0000-4000-8000-000000000001\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.networks.retrieve(\"n3a5e000-0000-4000-8000-000000000001\");\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.Networks.Retrieve(ctx, \"n3a5e000-0000-4000-8000-000000000001\")\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.networks().retrieve(\"n3a5e000-0000-4000-8000-000000000001\");\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\n$didit = new DiditClient();\n\n$result = $didit->networks->retrieve('n3a5e000-0000-4000-8000-000000000001');\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.networks.retrieve(\"n3a5e000-0000-4000-8000-000000000001\")\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.Networks.RetrieveAsync(\"n3a5e000-0000-4000-8000-000000000001\");\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "responses": {
          "200": {
            "description": "Netzwerkdetails.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NetworkDetailResponse"
                },
                "example": {
                  "uuid": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
                  "network_id": "N-0042",
                  "name": null,
                  "status": "in_review",
                  "risk": {
                    "score": 82,
                    "band": "high",
                    "bar": 0.82
                  },
                  "pattern_types": [
                    "exact_same_device",
                    "same_email"
                  ],
                  "signal_types": [
                    "device",
                    "email"
                  ],
                  "member_counts": {
                    "total": 3,
                    "users": 3,
                    "businesses": 0,
                    "transaction_parties": 0
                  },
                  "member_status": {
                    "approved": 1,
                    "declined": 1,
                    "in_review": 0,
                    "not_completed": 1
                  },
                  "signal_coverage": {
                    "device": {
                      "signals": 1,
                      "subjects": 3,
                      "coverage": 1.0
                    },
                    "email": {
                      "signals": 1,
                      "subjects": 2,
                      "coverage": 0.6667
                    }
                  },
                  "first_activity_at": "2026-10-01T09:12:44Z",
                  "last_activity_at": "2026-10-12T16:03:10Z",
                  "stats": {
                    "members": {
                      "total": 3,
                      "users": 3,
                      "businesses": 0,
                      "transaction_parties": 0
                    },
                    "member_status": {
                      "approved": 1,
                      "declined": 1,
                      "in_review": 0,
                      "not_completed": 1
                    },
                    "signals": {
                      "total": 2,
                      "by_type": {
                        "device": {
                          "signals": 1,
                          "subjects": 3,
                          "coverage": 1.0
                        },
                        "email": {
                          "signals": 1,
                          "subjects": 2,
                          "coverage": 0.6667
                        }
                      }
                    }
                  },
                  "fraud_tags": [],
                  "risk_signals": {
                    "residential_proxy_reuse": {
                      "detected": false,
                      "signal_count": 0,
                      "max_subject_count": 0
                    },
                    "email_intelligence": {
                      "enriched_signal_count": 1,
                      "high_risk_count": 0,
                      "social_profile_count": 0
                    },
                    "phone_intelligence": {
                      "enriched_signal_count": 0,
                      "high_risk_count": 0
                    }
                  },
                  "reviewed_at": "2026-10-12T16:30:00Z",
                  "reviewed_by": "reviewer@example.com",
                  "review_reason": "Shared device across three new accounts.",
                  "notes_count": 0,
                  "sharing_mode": "global",
                  "cross_org_available": true,
                  "cross_org_unavailable_reason": null,
                  "tags": [
                    {
                      "uuid": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
                      "name": "SUSPICIOUS",
                      "color": "#6366F1",
                      "source": "custom",
                      "added_by": null,
                      "added_at": "2026-10-13T08:15:00Z"
                    }
                  ],
                  "outcomes": {
                    "approved": 1,
                    "declined": 1,
                    "in_review": 0,
                    "total": 3
                  },
                  "patterns": [
                    {
                      "type": "background",
                      "score": 0.8125,
                      "members": 3,
                      "reason": null,
                      "computed_at": "2026-10-13T08:00:00Z"
                    }
                  ]
                }
              }
            }
          },
          "404": {
            "description": "Netzwerk nicht gefunden (oder für diese Anwendung nicht sichtbar).",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Fehlende oder ungültige Anmeldedaten.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string"
                    },
                    "code": {
                      "type": "string",
                      "description": "Vorhanden bei codierten Fehlern, zum Beispiel `networks_not_entitled`."
                    }
                  }
                },
                "examples": {
                  "Missing or invalid credentials": {
                    "summary": "Fehlende oder ungültige Anmeldedaten",
                    "value": {
                      "detail": "Authentication credentials were not provided or are invalid."
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Der API-Schlüssel gehört zu einer anderen Anwendung oder ist ein Schlüssel mit eingeschränktem Zugriff: Networks-Endpoints erfordern einen Schlüssel mit Vollzugriff. Ein Konsolen-Mitgliedstoken benötigt `read:networks`. Wird auch mit `code: networks_not_entitled` zurückgegeben, wenn Networks für die Organisation nicht aktiviert ist.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string"
                    },
                    "code": {
                      "type": "string",
                      "description": "Vorhanden bei codierten Fehlern, zum Beispiel `networks_not_entitled`."
                    }
                  }
                },
                "examples": {
                  "Networks not enabled": {
                    "summary": "Netzwerke nicht aktiviert",
                    "value": {
                      "detail": "Networks is disabled for this organization. Contact Didit support if you believe this is an error.",
                      "code": "networks_not_entitled"
                    }
                  },
                  "Restricted API key": {
                    "summary": "Eingeschränkter API-Schlüssel",
                    "value": {
                      "detail": "This API key has no access to this endpoint."
                    }
                  },
                  "No permission": {
                    "summary": "Keine Berechtigung",
                    "value": {
                      "detail": "You do not have permission to perform this action."
                    }
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/v3/organization/{organization_id}/application/{application_id}/networks/{network_uuid}/graph/": {
      "get": {
        "summary": "Netzwerkgraphen abrufen",
        "description": "Das Netzwerk als Graph aus Subjektknoten (Anbieterbenutzer, Anbieterunternehmen, Transaktionsparteien) und Signalknoten (die geteilten Geräte-/IP-/Gesichts-/Dokument-/Telefon-/E-Mail-/Adresswerte, die sie verbinden) abrufen, mit Kanten, die Zugehörigkeiten darstellen.",
        "operationId": "get_network_graph",
        "x-didit-sdk": {
          "resource": "networks",
          "method": "retrieve_graph",
          "auth": "api_key",
          "server": true,
          "scope": "application"
        },
        "tags": [
          "Networks"
        ],
        "parameters": [
          {
            "name": "organization_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "UUID der Organisation."
          },
          {
            "name": "application_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Anwendungs-UUID."
          },
          {
            "name": "network_uuid",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "n3a5e000-0000-4000-8000-000000000001"
            },
            "description": "Netzwerk-UUID."
          },
          {
            "name": "depth",
            "in": "query",
            "schema": {
              "type": "string",
              "enum": [
                "1",
                "2",
                "3",
                "all"
              ]
            },
            "description": "Einzubeziehende Hops ausgehend vom Fokusobjekt. Standardmäßig alle (unbegrenzt)."
          },
          {
            "name": "focus_kind",
            "in": "query",
            "schema": {
              "type": "string",
              "enum": [
                "vendor_user",
                "vendor_business",
                "transaction_party"
              ]
            },
            "description": "Subjekttyp, auf den der Graph zentriert werden soll. Muss zusammen mit focus_id angegeben werden; standardmäßig ein beliebiges Mitglied, wenn die Tiefe begrenzt ist und keines von beiden angegeben wird."
          },
          {
            "name": "focus_id",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Subjekt-UUID, auf die der Graph zentriert werden soll."
          }
        ],
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X GET 'https://verification.didit.me/v3/organization/11111111-2222-3333-4444-555555555555/application/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/networks/n3a5e000-0000-4000-8000-000000000001/graph/?depth=2' \\\n  -H 'x-api-key: YOUR_API_KEY'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.networks.retrieve_graph(\n    \"n3a5e000-0000-4000-8000-000000000001\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.networks.retrieveGraph(\"n3a5e000-0000-4000-8000-000000000001\");\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.Networks.RetrieveGraph(ctx, \"n3a5e000-0000-4000-8000-000000000001\", didit.NetworksRetrieveGraphParams{})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.networks().retrieveGraph(\"n3a5e000-0000-4000-8000-000000000001\");\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\n$didit = new DiditClient();\n\n$result = $didit->networks->retrieveGraph('n3a5e000-0000-4000-8000-000000000001');\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.networks.retrieve_graph(\"n3a5e000-0000-4000-8000-000000000001\")\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.Networks.RetrieveGraphAsync(\"n3a5e000-0000-4000-8000-000000000001\");\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "responses": {
          "200": {
            "description": "Netzwerk-Graph.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NetworkGraph"
                }
              }
            }
          },
          "404": {
            "description": "Netzwerk nicht gefunden (oder für diese Anwendung nicht sichtbar).",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/v3/organization/{organization_id}/application/{application_id}/networks/{network_uuid}/members/": {
      "get": {
        "summary": "Netzwerkmitglieder auflisten",
        "description": "Subjekte auflisten (Vendor-Benutzer, Vendor-Unternehmen oder Transaktionsparteien), die zu diesem Netzwerk gehören.",
        "operationId": "list_network_members",
        "x-didit-sdk": {
          "resource": "networks",
          "method": "list_members",
          "auth": "api_key",
          "server": true,
          "scope": "application"
        },
        "tags": [
          "Networks"
        ],
        "parameters": [
          {
            "name": "organization_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "UUID der Organisation."
          },
          {
            "name": "application_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Anwendungs-UUID."
          },
          {
            "name": "network_uuid",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "n3a5e000-0000-4000-8000-000000000001"
            },
            "description": "Netzwerk-UUID."
          }
        ],
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X GET 'https://verification.didit.me/v3/organization/11111111-2222-3333-4444-555555555555/application/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/networks/n3a5e000-0000-4000-8000-000000000001/members/' \\\n  -H 'x-api-key: YOUR_API_KEY'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.networks.list_members(\n    \"n3a5e000-0000-4000-8000-000000000001\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.networks.listMembers(\"n3a5e000-0000-4000-8000-000000000001\");\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.Networks.ListMembers(ctx, \"n3a5e000-0000-4000-8000-000000000001\")\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.networks().listMembers(\"n3a5e000-0000-4000-8000-000000000001\");\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\n$didit = new DiditClient();\n\n$result = $didit->networks->listMembers('n3a5e000-0000-4000-8000-000000000001');\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.networks.list_members(\"n3a5e000-0000-4000-8000-000000000001\")\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.Networks.ListMembersAsync(\"n3a5e000-0000-4000-8000-000000000001\");\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "responses": {
          "200": {
            "description": "Netzwerkmitglieder. Nicht paginiert.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "results": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/NetworkMember"
                      }
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Netzwerk nicht gefunden (oder für diese Anwendung nicht sichtbar).",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/v3/organization/{organization_id}/application/{application_id}/networks/{network_uuid}/signals/": {
      "get": {
        "summary": "Netzwerksignale auflisten",
        "description": "Signale auflisten (gemeinsame Werte für Gerät, IP-Adresse, Gesicht, Dokumentennummer, Telefon, E-Mail oder Adresse), die die Mitglieder dieses Netzwerks verknüpfen.",
        "operationId": "list_network_signals",
        "x-didit-sdk": {
          "resource": "networks",
          "method": "list_signals",
          "auth": "api_key",
          "server": true,
          "scope": "application"
        },
        "tags": [
          "Networks"
        ],
        "parameters": [
          {
            "name": "organization_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "UUID der Organisation."
          },
          {
            "name": "application_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Anwendungs-UUID."
          },
          {
            "name": "network_uuid",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "n3a5e000-0000-4000-8000-000000000001"
            },
            "description": "Netzwerk-UUID."
          }
        ],
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X GET 'https://verification.didit.me/v3/organization/11111111-2222-3333-4444-555555555555/application/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/networks/n3a5e000-0000-4000-8000-000000000001/signals/' \\\n  -H 'x-api-key: YOUR_API_KEY'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.networks.list_signals(\n    \"n3a5e000-0000-4000-8000-000000000001\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.networks.listSignals(\"n3a5e000-0000-4000-8000-000000000001\");\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.Networks.ListSignals(ctx, \"n3a5e000-0000-4000-8000-000000000001\")\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.networks().listSignals(\"n3a5e000-0000-4000-8000-000000000001\");\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\n$didit = new DiditClient();\n\n$result = $didit->networks->listSignals('n3a5e000-0000-4000-8000-000000000001');\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.networks.list_signals(\"n3a5e000-0000-4000-8000-000000000001\")\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.Networks.ListSignalsAsync(\"n3a5e000-0000-4000-8000-000000000001\");\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "responses": {
          "200": {
            "description": "Netzwerksignale. Nicht paginiert.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "results": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/NetworkSignal"
                      }
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Netzwerk nicht gefunden (oder für diese Anwendung nicht sichtbar).",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/v3/organization/{organization_id}/application/{application_id}/networks/{network_uuid}/timeline/": {
      "get": {
        "summary": "Netzwerk-Zeitleiste abrufen",
        "description": "Ohne `contract`: Die netzwerkeigenen Ereignisse (Erkennung, neueste Beobachtung jedes Signals und dessen Überprüfung), älteste zuerst und nicht paginiert. `limit`, `cursor` und `event_type` werden ignoriert. Mit `contract=2`: Die typisierte Zeitleiste, neueste zuerst und per Cursor paginiert. Sie ergänzt die Aktivitäten der Mitgliedskonten (Verifizierungsversuche, Transaktionen, Anmeldungen, die Sie über die Events-API übermitteln, und die Live-Regeln, auf die sie gestoßen sind) sowie die für das Netzwerk eröffneten Fälle. `note_added`-Ereignisse werden nur an Console-Mitglieder zurückgegeben, niemals an einen API-Schlüssel. Erfordert einen API-Schlüssel mit Vollzugriff oder `read:networks` für ein Console-Mitglied.",
        "operationId": "get_network_timeline",
        "x-didit-sdk": {
          "resource": "networks",
          "method": "retrieve_timeline",
          "auth": "api_key",
          "server": true,
          "scope": "application"
        },
        "tags": [
          "Networks"
        ],
        "parameters": [
          {
            "name": "organization_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "UUID der Organisation."
          },
          {
            "name": "application_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Anwendungs-UUID."
          },
          {
            "name": "network_uuid",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "n3a5e000-0000-4000-8000-000000000001"
            },
            "description": "Netzwerk-UUID."
          },
          {
            "name": "contract",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "2"
              ]
            },
            "description": "`2` gibt die typisierte Timeline zurück. Lassen Sie den Parameter für die Standard-Timeline weg. Jeder andere Wert gibt 400 zurück."
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 500,
              "default": 100
            },
            "description": "Nur für typisierte Timelines. Ereignisse pro Seite, 1 bis 500. Standardwert ist 100."
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "Nur typisierte Timeline. Der `next_cursor` der vorherigen Seite. Ein ungültiger oder leerer Cursor gibt 400 zurück."
          },
          {
            "name": "event_type",
            "in": "query",
            "required": false,
            "style": "form",
            "explode": true,
            "schema": {
              "type": "array",
              "maxItems": 20,
              "items": {
                "type": "string",
                "enum": [
                  "network_detected",
                  "signal_observed",
                  "network_active",
                  "network_in_review",
                  "network_resolved",
                  "network_dismissed",
                  "verification_attempt",
                  "transaction",
                  "login",
                  "rule_hit",
                  "case_linked",
                  "note_added"
                ]
              }
            },
            "description": "Nur für typisierte Timelines. Beizubehaltende Ereignistypen, wiederholt oder kommagetrennt, maximal 20 Werte. Standardmäßig alle Typen."
          }
        ],
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X GET 'https://verification.didit.me/v3/organization/11111111-2222-3333-4444-555555555555/application/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/networks/n3a5e000-0000-4000-8000-000000000001/timeline/' \\\n  -H 'x-api-key: YOUR_API_KEY'"
          },
          {
            "lang": "curl",
            "label": "curl (typed timeline)",
            "source": "curl -X GET 'https://verification.didit.me/v3/organization/11111111-2222-3333-4444-555555555555/application/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/networks/3fa85f64-5717-4562-b3fc-2c963f66afa6/timeline/?contract=2&limit=50&event_type=verification_attempt,login' \\\n  -H 'x-api-key: YOUR_API_KEY'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.networks.retrieve_timeline(\n    \"n3a5e000-0000-4000-8000-000000000001\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.networks.retrieveTimeline(\"n3a5e000-0000-4000-8000-000000000001\");\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.Networks.RetrieveTimeline(ctx, \"n3a5e000-0000-4000-8000-000000000001\", didit.NetworksRetrieveTimelineParams{})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.networks().retrieveTimeline(\"n3a5e000-0000-4000-8000-000000000001\");\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\n$didit = new DiditClient();\n\n$result = $didit->networks->retrieveTimeline('n3a5e000-0000-4000-8000-000000000001');\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.networks.retrieve_timeline(\"n3a5e000-0000-4000-8000-000000000001\")\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.Networks.RetrieveTimelineAsync(\"n3a5e000-0000-4000-8000-000000000001\");\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "responses": {
          "200": {
            "description": "Ohne `contract`: `{results}`, älteste zuerst, nicht paginiert. Mit `contract=2`: `{results, next_cursor}`, neueste zuerst.",
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "$ref": "#/components/schemas/NetworkTimeline"
                    },
                    {
                      "$ref": "#/components/schemas/NetworkTimelinePage"
                    }
                  ]
                },
                "examples": {
                  "Default timeline": {
                    "summary": "Ohne Contract",
                    "value": {
                      "results": [
                        {
                          "event_type": "network_detected",
                          "occurred_at": "2026-10-01T09:12:44Z",
                          "label": "Network detected",
                          "metadata": {
                            "network_id": "N-0042"
                          }
                        },
                        {
                          "event_type": "signal_observed",
                          "occurred_at": "2026-10-12T16:03:10Z",
                          "label": "device observed",
                          "metadata": {
                            "signal_type": "device",
                            "subject_count": 3,
                            "is_hub": false
                          }
                        },
                        {
                          "event_type": "network_in_review",
                          "occurred_at": "2026-10-12T16:30:00Z",
                          "label": "Network in_review",
                          "metadata": {
                            "reason": "Shared device across three new accounts."
                          }
                        }
                      ]
                    }
                  },
                  "Typed timeline": {
                    "summary": "Mit contract=2",
                    "value": {
                      "results": [
                        {
                          "id": "monitoring_event:9b2f1c3e-4d5a-4b6c-8d7e-0f1a2b3c4d5e",
                          "event_type": "login",
                          "occurred_at": "2026-10-12T18:41:02Z",
                          "ingested_at": "2026-10-12T18:41:03Z",
                          "label": "Login",
                          "metadata": {},
                          "account": {
                            "node_id": "vendor_user:5f6e7d8c-9b0a-4c1d-8e2f-3a4b5c6d7e8f",
                            "node_type": "account",
                            "uuid": "5f6e7d8c-9b0a-4c1d-8e2f-3a4b5c6d7e8f",
                            "vendor_data": "user-1042",
                            "display_name": "Alex Example",
                            "ownership": "owned",
                            "route": {
                              "kind": "user",
                              "id": "5f6e7d8c-9b0a-4c1d-8e2f-3a4b5c6d7e8f",
                              "application_id": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee"
                            }
                          },
                          "source_ref": {
                            "kind": "monitoring_event",
                            "id": "9b2f1c3e-4d5a-4b6c-8d7e-0f1a2b3c4d5e",
                            "ownership": "owned"
                          },
                          "verification_attempt": null,
                          "transaction": null,
                          "login": {
                            "action": "auth.login",
                            "succeeded": true,
                            "status": "APPROVED",
                            "ip": {
                              "address": "203.0.113.24",
                              "country_code": "ES",
                              "city": "Madrid",
                              "connection_type": null,
                              "is_vpn_or_tor": false,
                              "is_data_center": false
                            },
                            "device": {
                              "fingerprint": "fp_0a1b2c3d",
                              "label": "Chrome · Android"
                            },
                            "is_first_login": false,
                            "is_new_device": true
                          },
                          "rule_hit": null,
                          "case_linked": null,
                          "note_added": null
                        },
                        {
                          "id": "session:1c2d3e4f-5a6b-4c7d-8e9f-0a1b2c3d4e5f",
                          "event_type": "verification_attempt",
                          "occurred_at": "2026-10-12T16:03:10Z",
                          "ingested_at": "2026-10-12T16:03:10Z",
                          "label": "Verification attempt 2 of 2",
                          "metadata": {},
                          "account": {
                            "node_id": "vendor_user:5f6e7d8c-9b0a-4c1d-8e2f-3a4b5c6d7e8f",
                            "node_type": "account",
                            "uuid": "5f6e7d8c-9b0a-4c1d-8e2f-3a4b5c6d7e8f",
                            "vendor_data": "user-1042",
                            "display_name": "Alex Example",
                            "ownership": "owned",
                            "route": {
                              "kind": "user",
                              "id": "5f6e7d8c-9b0a-4c1d-8e2f-3a4b5c6d7e8f",
                              "application_id": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee"
                            }
                          },
                          "source_ref": {
                            "kind": "session",
                            "id": "1c2d3e4f-5a6b-4c7d-8e9f-0a1b2c3d4e5f",
                            "ownership": "owned",
                            "route": {
                              "kind": "session",
                              "id": "1c2d3e4f-5a6b-4c7d-8e9f-0a1b2c3d4e5f",
                              "application_id": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee"
                            }
                          },
                          "verification_attempt": {
                            "session_id": "1c2d3e4f-5a6b-4c7d-8e9f-0a1b2c3d4e5f",
                            "session_number": 1287,
                            "attempt": 2,
                            "attempt_count": 2,
                            "status": "Approved",
                            "status_changed_at": "2026-10-12T16:05:41Z",
                            "decline_reasons": []
                          },
                          "transaction": null,
                          "login": null,
                          "rule_hit": null,
                          "case_linked": null,
                          "note_added": null
                        },
                        {
                          "id": "signal_observed:8d7c6b5a-4e3f-4a2b-9c1d-0e9f8a7b6c5d",
                          "event_type": "signal_observed",
                          "occurred_at": "2026-10-12T16:03:10Z",
                          "ingested_at": "2026-10-01T09:12:44Z",
                          "label": "device observed",
                          "metadata": {
                            "signal_type": "device",
                            "subject_count": 3,
                            "is_hub": false
                          },
                          "account": null,
                          "source_ref": null,
                          "verification_attempt": null,
                          "transaction": null,
                          "login": null,
                          "rule_hit": null,
                          "case_linked": null,
                          "note_added": null
                        }
                      ],
                      "next_cursor": "eyJ0IjoiMjAyNi0xMC0xMlQxNjowMzoxMCswMDowMCIsImMiOiIyMDI2LTEwLTAxVDA5OjEyOjQ0KzAwOjAwIiwiciI6MSwidSI6IjhkN2M2YjVhLTRlM2YtNGEyYi05YzFkLTBlOWY4YTdiNmM1ZCJ9"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Wenn `contract` vorhanden ist: ein ungültiger `contract`-, `limit`-, `cursor`- oder `event_type`-Wert.",
            "content": {
              "application/json": {
                "examples": {
                  "Unsupported contract": {
                    "summary": "Nicht unterstützter Vertrag",
                    "value": {
                      "contract": [
                        "\"3\" is not a valid choice."
                      ]
                    }
                  },
                  "Invalid cursor": {
                    "summary": "Ungültiger Cursor",
                    "value": {
                      "cursor": [
                        "This cursor is not valid. Reload the feed."
                      ]
                    }
                  },
                  "Limit too large": {
                    "summary": "Limit zu groß",
                    "value": {
                      "limit": [
                        "Ensure this value is less than or equal to 500."
                      ]
                    }
                  },
                  "Unknown event type": {
                    "summary": "Unbekannter Ereignistyp",
                    "value": {
                      "event_type": {
                        "0": [
                          "\"logout\" is not a valid choice."
                        ]
                      }
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Fehlende oder ungültige Anmeldedaten.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string"
                    },
                    "code": {
                      "type": "string",
                      "description": "Vorhanden bei codierten Fehlern, zum Beispiel `networks_not_entitled`."
                    }
                  }
                },
                "examples": {
                  "Missing or invalid credentials": {
                    "summary": "Fehlende oder ungültige Anmeldedaten",
                    "value": {
                      "detail": "Authentication credentials were not provided or are invalid."
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Der API-Schlüssel gehört zu einer anderen Anwendung oder ist ein Schlüssel mit eingeschränktem Zugriff: Networks-Endpoints erfordern einen Schlüssel mit Vollzugriff. Ein Konsolen-Mitgliedstoken benötigt `read:networks`. Wird auch mit `code: networks_not_entitled` zurückgegeben, wenn Networks für die Organisation nicht aktiviert ist.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string"
                    },
                    "code": {
                      "type": "string",
                      "description": "Vorhanden bei codierten Fehlern, zum Beispiel `networks_not_entitled`."
                    }
                  }
                },
                "examples": {
                  "Networks not enabled": {
                    "summary": "Netzwerke nicht aktiviert",
                    "value": {
                      "detail": "Networks is disabled for this organization. Contact Didit support if you believe this is an error.",
                      "code": "networks_not_entitled"
                    }
                  },
                  "Restricted API key": {
                    "summary": "Eingeschränkter API-Schlüssel",
                    "value": {
                      "detail": "This API key has no access to this endpoint."
                    }
                  },
                  "No permission": {
                    "summary": "Keine Berechtigung",
                    "value": {
                      "detail": "You do not have permission to perform this action."
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Netzwerk nicht gefunden (oder für diese Anwendung nicht sichtbar).",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/v3/organization/{organization_id}/application/{application_id}/networks/{network_uuid}/map/": {
      "get": {
        "summary": "Netzwerkkarte abrufen",
        "description": "Geografische Punkte, an denen die Adressen/Standorte der Mitglieder dieses Netzwerks konvergieren, bezogen aus den Sitzungen, Unternehmenssitzungen und Transaktionen, die seinen Mitgliedschaften zugrunde liegen.",
        "operationId": "get_network_map",
        "x-didit-sdk": {
          "resource": "networks",
          "method": "retrieve_map",
          "auth": "api_key",
          "server": true,
          "scope": "application"
        },
        "tags": [
          "Networks"
        ],
        "parameters": [
          {
            "name": "organization_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "UUID der Organisation."
          },
          {
            "name": "application_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Anwendungs-UUID."
          },
          {
            "name": "network_uuid",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "n3a5e000-0000-4000-8000-000000000001"
            },
            "description": "Netzwerk-UUID."
          }
        ],
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X GET 'https://verification.didit.me/v3/organization/11111111-2222-3333-4444-555555555555/application/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/networks/n3a5e000-0000-4000-8000-000000000001/map/' \\\n  -H 'x-api-key: YOUR_API_KEY'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.networks.retrieve_map(\n    \"n3a5e000-0000-4000-8000-000000000001\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.networks.retrieveMap(\"n3a5e000-0000-4000-8000-000000000001\");\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.Networks.RetrieveMap(ctx, \"n3a5e000-0000-4000-8000-000000000001\")\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.networks().retrieveMap(\"n3a5e000-0000-4000-8000-000000000001\");\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\n$didit = new DiditClient();\n\n$result = $didit->networks->retrieveMap('n3a5e000-0000-4000-8000-000000000001');\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.networks.retrieve_map(\"n3a5e000-0000-4000-8000-000000000001\")\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.Networks.RetrieveMapAsync(\"n3a5e000-0000-4000-8000-000000000001\");\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "responses": {
          "200": {
            "description": "Netzwerkkarte.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NetworkMap"
                }
              }
            }
          },
          "404": {
            "description": "Netzwerk nicht gefunden (oder für diese Anwendung nicht sichtbar).",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/v3/organization/{organization_id}/application/{application_id}/sessions/{session_id}/networks/": {
      "get": {
        "summary": "Netzwerke für eine Sitzung auflisten",
        "description": "Netzwerke auflisten, zu denen der Vendor-Benutzer der Sitzung gehört. Wird über den mit vendor_data verknüpften Benutzer der Sitzung aufgelöst.",
        "operationId": "list_session_network_memberships",
        "x-didit-sdk": {
          "resource": "sessions",
          "method": "list_networks",
          "auth": "api_key",
          "server": true,
          "scope": "application"
        },
        "tags": [
          "Networks"
        ],
        "parameters": [
          {
            "name": "organization_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "UUID der Organisation."
          },
          {
            "name": "application_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Anwendungs-UUID."
          },
          {
            "name": "session_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Sitzungs-UUID."
          }
        ],
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X GET 'https://verification.didit.me/v3/organization/11111111-2222-3333-4444-555555555555/application/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/sessions/aaaaaaaa-0000-4000-8000-000000000001/networks/' \\\n  -H 'x-api-key: YOUR_API_KEY'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.sessions.list_networks(\n    \"11111111-2222-3333-4444-555555555555\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.sessions.listNetworks(\"11111111-2222-3333-4444-555555555555\");\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.Sessions.ListNetworks(ctx, \"11111111-2222-3333-4444-555555555555\")\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.sessions().listNetworks(\"11111111-2222-3333-4444-555555555555\");\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\n$didit = new DiditClient();\n\n$result = $didit->sessions->listNetworks('11111111-2222-3333-4444-555555555555');\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.sessions.list_networks(\"11111111-2222-3333-4444-555555555555\")\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.Sessions.ListNetworksAsync(\"11111111-2222-3333-4444-555555555555\");\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "responses": {
          "200": {
            "description": "Netzwerke, zu denen diese Entität gehört. Nicht paginiert.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EntityNetworkMembershipList"
                }
              }
            }
          },
          "404": {
            "description": "Entität in dieser Anwendung nicht gefunden oder hat kein verknüpftes Subjekt zum Nachschlagen.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/v3/organization/{organization_id}/application/{application_id}/business-sessions/{business_session_id}/networks/": {
      "get": {
        "summary": "Netzwerke für eine Unternehmenssitzung auflisten",
        "description": "Netzwerke auflisten, zu denen das Vendor-Unternehmen der Unternehmenssitzung gehört.",
        "operationId": "list_business_session_network_memberships",
        "x-didit-sdk": {
          "resource": "business_sessions",
          "method": "list_networks",
          "auth": "api_key",
          "server": true,
          "scope": "application"
        },
        "tags": [
          "Networks"
        ],
        "parameters": [
          {
            "name": "organization_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "UUID der Organisation."
          },
          {
            "name": "application_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Anwendungs-UUID."
          },
          {
            "name": "business_session_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "UUID der Unternehmenssitzung."
          }
        ],
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X GET 'https://verification.didit.me/v3/organization/11111111-2222-3333-4444-555555555555/application/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/business-sessions/aaaaaaaa-0000-4000-8000-000000000002/networks/' \\\n  -H 'x-api-key: YOUR_API_KEY'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.business_sessions.list_networks(\n    \"11111111-2222-3333-4444-555555555555\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.businessSessions.listNetworks(\"11111111-2222-3333-4444-555555555555\");\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.BusinessSessions.ListNetworks(ctx, \"11111111-2222-3333-4444-555555555555\")\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.businessSessions().listNetworks(\"11111111-2222-3333-4444-555555555555\");\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\n$didit = new DiditClient();\n\n$result = $didit->businessSessions->listNetworks('11111111-2222-3333-4444-555555555555');\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.business_sessions.list_networks(\"11111111-2222-3333-4444-555555555555\")\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.BusinessSessions.ListNetworksAsync(\"11111111-2222-3333-4444-555555555555\");\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "responses": {
          "200": {
            "description": "Netzwerke, zu denen diese Entität gehört. Nicht paginiert.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EntityNetworkMembershipList"
                }
              }
            }
          },
          "404": {
            "description": "Entität in dieser Anwendung nicht gefunden oder hat kein verknüpftes Subjekt zum Nachschlagen.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/v3/organization/{organization_id}/application/{application_id}/users/{vendor_user_uuid}/networks/": {
      "get": {
        "summary": "Netzwerke für einen Benutzer auflisten",
        "description": "Netzwerke auflisten, zu denen ein Vendor-Benutzer gehört.",
        "operationId": "list_user_network_memberships",
        "x-didit-sdk": {
          "resource": "users",
          "method": "list_networks",
          "auth": "api_key",
          "server": true,
          "scope": "application"
        },
        "tags": [
          "Networks"
        ],
        "parameters": [
          {
            "name": "organization_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "UUID der Organisation."
          },
          {
            "name": "application_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Anwendungs-UUID."
          },
          {
            "name": "vendor_user_uuid",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Vendor-Benutzer-UUID."
          }
        ],
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X GET 'https://verification.didit.me/v3/organization/11111111-2222-3333-4444-555555555555/application/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/users/aaaaaaaa-0000-4000-8000-000000000003/networks/' \\\n  -H 'x-api-key: YOUR_API_KEY'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.users.list_networks(\n    \"11111111-2222-3333-4444-555555555555\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.users.listNetworks(\"11111111-2222-3333-4444-555555555555\");\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.Users.ListNetworks(ctx, \"11111111-2222-3333-4444-555555555555\")\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.users().listNetworks(\"11111111-2222-3333-4444-555555555555\");\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\n$didit = new DiditClient();\n\n$result = $didit->users->listNetworks('11111111-2222-3333-4444-555555555555');\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.users.list_networks(\"11111111-2222-3333-4444-555555555555\")\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.Users.ListNetworksAsync(\"11111111-2222-3333-4444-555555555555\");\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "responses": {
          "200": {
            "description": "Netzwerke, zu denen diese Entität gehört. Nicht paginiert.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EntityNetworkMembershipList"
                }
              }
            }
          },
          "404": {
            "description": "Entität in dieser Anwendung nicht gefunden oder hat kein verknüpftes Subjekt zum Nachschlagen.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/v3/organization/{organization_id}/application/{application_id}/businesses/{vendor_business_uuid}/networks/": {
      "get": {
        "summary": "Netzwerke für ein Unternehmen auflisten",
        "description": "Netzwerke auflisten, zu denen ein Vendor-Unternehmen gehört.",
        "operationId": "list_business_network_memberships",
        "x-didit-sdk": {
          "resource": "businesses",
          "method": "list_networks",
          "auth": "api_key",
          "server": true,
          "scope": "application"
        },
        "tags": [
          "Networks"
        ],
        "parameters": [
          {
            "name": "organization_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "UUID der Organisation."
          },
          {
            "name": "application_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Anwendungs-UUID."
          },
          {
            "name": "vendor_business_uuid",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Vendor-Unternehmens-UUID."
          }
        ],
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X GET 'https://verification.didit.me/v3/organization/11111111-2222-3333-4444-555555555555/application/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/businesses/aaaaaaaa-0000-4000-8000-000000000004/networks/' \\\n  -H 'x-api-key: YOUR_API_KEY'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.businesses.list_networks(\n    \"11111111-2222-3333-4444-555555555555\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.businesses.listNetworks(\"11111111-2222-3333-4444-555555555555\");\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.Businesses.ListNetworks(ctx, \"11111111-2222-3333-4444-555555555555\")\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.businesses().listNetworks(\"11111111-2222-3333-4444-555555555555\");\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\n$didit = new DiditClient();\n\n$result = $didit->businesses->listNetworks('11111111-2222-3333-4444-555555555555');\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.businesses.list_networks(\"11111111-2222-3333-4444-555555555555\")\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.Businesses.ListNetworksAsync(\"11111111-2222-3333-4444-555555555555\");\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "responses": {
          "200": {
            "description": "Netzwerke, zu denen diese Entität gehört. Nicht paginiert.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EntityNetworkMembershipList"
                }
              }
            }
          },
          "404": {
            "description": "Entität in dieser Anwendung nicht gefunden oder hat kein verknüpftes Subjekt zum Nachschlagen.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/v3/organization/{organization_id}/application/{application_id}/transactions/{transaction_uuid}/networks/": {
      "get": {
        "summary": "Netzwerke für eine Transaktion auflisten",
        "description": "Netzwerke auflisten, zu denen das der Transaktion zugrunde liegende KYC/KYB-Subjekt gehört (aufgelöst über die Sitzung oder Unternehmenssitzung der Transaktion).",
        "operationId": "list_transaction_network_memberships",
        "x-didit-sdk": {
          "resource": "transactions",
          "method": "list_networks",
          "auth": "api_key",
          "server": true,
          "scope": "application"
        },
        "tags": [
          "Networks"
        ],
        "parameters": [
          {
            "name": "organization_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "UUID der Organisation."
          },
          {
            "name": "application_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Anwendungs-UUID."
          },
          {
            "name": "transaction_uuid",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Transaktions-UUID."
          }
        ],
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X GET 'https://verification.didit.me/v3/organization/11111111-2222-3333-4444-555555555555/application/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/transactions/aaaaaaaa-0000-4000-8000-000000000005/networks/' \\\n  -H 'x-api-key: YOUR_API_KEY'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.transactions.list_networks(\n    \"11111111-2222-3333-4444-555555555555\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.transactions.listNetworks(\"11111111-2222-3333-4444-555555555555\");\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.Transactions.ListNetworks(ctx, \"11111111-2222-3333-4444-555555555555\")\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.transactions().listNetworks(\"11111111-2222-3333-4444-555555555555\");\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\n$didit = new DiditClient();\n\n$result = $didit->transactions->listNetworks('11111111-2222-3333-4444-555555555555');\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.transactions.list_networks(\"11111111-2222-3333-4444-555555555555\")\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.Transactions.ListNetworksAsync(\"11111111-2222-3333-4444-555555555555\");\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "responses": {
          "200": {
            "description": "Netzwerke, zu denen diese Entität gehört. Nicht paginiert.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EntityNetworkMembershipList"
                }
              }
            }
          },
          "404": {
            "description": "Entität in dieser Anwendung nicht gefunden oder hat kein verknüpftes Subjekt zum Nachschlagen.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/v3/organization/{organization_id}/application/{application_id}/transactions/{transaction_uuid}/parties/{transaction_party_uuid}/networks/": {
      "get": {
        "summary": "Netzwerke für eine Transaktionspartei auflisten",
        "description": "Netzwerke auflisten, zu denen eine Transaktionspartei (Auftraggeber, Begünstigter oder Gegenpartei) gehört, aufgelöst über die Partei selbst und nicht über die zugrunde liegende Sitzung der Transaktion.",
        "operationId": "list_transaction_party_network_memberships",
        "x-didit-sdk": {
          "resource": "transactions",
          "method": "list_party_networks",
          "auth": "api_key",
          "server": true,
          "scope": "application"
        },
        "tags": [
          "Networks"
        ],
        "parameters": [
          {
            "name": "organization_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "UUID der Organisation."
          },
          {
            "name": "application_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Anwendungs-UUID."
          },
          {
            "name": "transaction_uuid",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Transaktions-UUID."
          },
          {
            "name": "transaction_party_uuid",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "UUID der Transaktionspartei."
          }
        ],
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X GET 'https://verification.didit.me/v3/organization/11111111-2222-3333-4444-555555555555/application/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/transactions/aaaaaaaa-0000-4000-8000-000000000005/parties/bbbbbbbb-0000-4000-8000-000000000006/networks/' \\\n  -H 'x-api-key: YOUR_API_KEY'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.transactions.list_party_networks(\n    \"11111111-2222-3333-4444-555555555555\",\n    \"11111111-2222-3333-4444-555555555555\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.transactions.listPartyNetworks(\n  \"11111111-2222-3333-4444-555555555555\",\n  \"11111111-2222-3333-4444-555555555555\",\n);\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.Transactions.ListPartyNetworks(ctx, \"11111111-2222-3333-4444-555555555555\", \"11111111-2222-3333-4444-555555555555\")\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.transactions().listPartyNetworks(\"11111111-2222-3333-4444-555555555555\", \"11111111-2222-3333-4444-555555555555\");\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\n$didit = new DiditClient();\n\n$result = $didit->transactions->listPartyNetworks('11111111-2222-3333-4444-555555555555', '11111111-2222-3333-4444-555555555555');\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.transactions.list_party_networks(\n  \"11111111-2222-3333-4444-555555555555\",\n  \"11111111-2222-3333-4444-555555555555\"\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.Transactions.ListPartyNetworksAsync(\"11111111-2222-3333-4444-555555555555\", \"11111111-2222-3333-4444-555555555555\");\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "responses": {
          "200": {
            "description": "Netzwerke, zu denen diese Entität gehört. Nicht paginiert.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EntityNetworkMembershipList"
                }
              }
            }
          },
          "404": {
            "description": "Entität in dieser Anwendung nicht gefunden oder hat kein verknüpftes Subjekt zum Nachschlagen.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/v3/biometric-templates/": {
      "get": {
        "summary": "Aufbewahrte biometrische Templates auflisten",
        "description": "Eine Anwendung, die sich dafür entschieden hat, behält ein separat verwaltetes, bildfreies biometrisches Template für das Gesicht, das dem Benutzer zugeordnet ist, wenn eine Sitzung gelöscht wird (siehe `DELETE /v3/session/{sessionId}/delete/`). Templates sind biometrische Daten mit einem endlichen `expires_at`; sie enthalten niemals Bilder, Sitzungsdaten oder Identitätsfelder und werden bei Benutzerlöschung, Datenschutz-Löschung, Ablauf oder einer expliziten Bereinigung gelöscht. Diese Endpoints akzeptieren ausschließlich Anwendungs-API-Schlüssel (`x-api-key`); Business Console-Benutzertoken werden mit `403` abgelehnt.\n\nGibt eine paginierte Liste der Templates zurück, die die Anwendung derzeit hält. Bereinigte Templates werden nicht aufgeführt.",
        "operationId": "list_biometric_templates",
        "x-didit-sdk": {
          "resource": "biometric_templates",
          "method": "list",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Biometric Templates"
        ],
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "parameters": [
          {
            "in": "query",
            "name": "vendor_data",
            "required": false,
            "description": "Teilstring-Übereinstimmung ohne Berücksichtigung von Groß-/Kleinschreibung im aktuellen `vendor_data` des zugehörigen Benutzers.",
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "vendor_user_uuid",
            "required": false,
            "description": "Exakte Übereinstimmung mit dem zugehörigen Benutzer.",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "in": "query",
            "name": "status",
            "required": false,
            "description": "Lebenszyklusstatus. Bereinigte Vorlagen werden niemals aufgeführt.",
            "schema": {
              "type": "string",
              "enum": [
                "pending",
                "active",
                "expired",
                "held_out_of_use",
                "purge_pending",
                "purge_failed"
              ]
            }
          },
          {
            "in": "query",
            "name": "source_type",
            "required": false,
            "description": "Wie die Vorlage erstellt wurde.",
            "schema": {
              "type": "string",
              "enum": [
                "session_delete",
                "automatic_retention",
                "backfill"
              ]
            }
          },
          {
            "in": "query",
            "name": "retained_from",
            "required": false,
            "description": "Vorlagen, die zu oder nach diesem Zeitpunkt aufbewahrt wurden.",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "in": "query",
            "name": "retained_to",
            "required": false,
            "description": "Vorlagen, die zu oder vor diesem Zeitpunkt aufbewahrt wurden. Darf nicht vor `retained_from` liegen (`400`).",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "in": "query",
            "name": "ordering",
            "required": false,
            "description": "Sortierreihenfolge.",
            "schema": {
              "type": "string",
              "enum": [
                "retained_at",
                "-retained_at",
                "expires_at",
                "-expires_at"
              ],
              "default": "-retained_at"
            }
          },
          {
            "in": "query",
            "name": "limit",
            "required": false,
            "description": "Seitengröße.",
            "schema": {
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "offset",
            "required": false,
            "description": "Paginierungs-Offset.",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Paginierte Vorlagen.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "count": {
                      "type": "integer"
                    },
                    "next": {
                      "type": "string",
                      "nullable": true
                    },
                    "previous": {
                      "type": "string",
                      "nullable": true
                    },
                    "results": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "uuid": {
                            "type": "string",
                            "format": "uuid",
                            "description": "Vorlagen-ID. Zufällig generiert; nicht aus der gelöschten Sitzung oder deren Gesicht abgeleitet."
                          },
                          "vendor_user_uuid": {
                            "type": "string",
                            "format": "uuid",
                            "description": "Der besitzende Benutzer."
                          },
                          "vendor_data": {
                            "type": "string",
                            "nullable": true,
                            "description": "Die aktuellen `vendor_data` des Benutzers, aufgelöst, wenn Sie die Vorlage lesen (werden nie kopiert)."
                          },
                          "source_type": {
                            "type": "string",
                            "enum": [
                              "session_delete",
                              "automatic_retention",
                              "backfill"
                            ],
                            "description": "Wie die Vorlage erstellt wurde: eine Sitzungslöschung (API oder Console), das automatische Datenaufbewahrungsfenster der Anwendung oder eine von Didit durchgeführte nachträgliche Datenauffüllung, die Sie beauftragt haben."
                          },
                          "provenance_reference": {
                            "type": "string",
                            "format": "uuid",
                            "description": "Opake Referenz, die die Vorlage mit ihrem Audit-Log verknüpft. Sie ist nicht die ID der gelöschten Sitzung und kann nicht zu dieser aufgelöst werden."
                          },
                          "retention_policy": {
                            "type": "string",
                            "enum": [
                              "delete_with_session",
                              "retain_until_user_deleted"
                            ],
                            "description": "Die Anwendungsrichtlinie zum Zeitpunkt der Datenaufbewahrung."
                          },
                          "retention_override": {
                            "type": "boolean",
                            "nullable": true,
                            "description": "Der bei der Löschung gesendete Wert `retain_face_embeddings` oder `null`, wenn die Richtlinie angewendet wurde."
                          },
                          "retained_at": {
                            "type": "string",
                            "format": "date-time"
                          },
                          "expires_at": {
                            "type": "string",
                            "format": "date-time",
                            "description": "Wann die Vorlage abläuft und automatisch bereinigt wird. Immer gesetzt."
                          },
                          "retained_by": {
                            "type": "string",
                            "nullable": true,
                            "description": "Prinzipal, der die Anweisung erteilt hat: die Anwendungs-ID für API-Schlüssel, die Mitglieds-ID der Console für Console-Aktionen oder eine `service:`-Kennung für die automatische Aufbewahrung. Niemals eine E-Mail-Adresse."
                          },
                          "retained_by_type": {
                            "type": "string",
                            "enum": [
                              "API_KEY",
                              "CONSOLE_USER",
                              "SYSTEM"
                            ]
                          },
                          "instruction_class": {
                            "type": "string",
                            "enum": [
                              "operational_session_delete",
                              "privacy_erasure"
                            ]
                          },
                          "instruction_source": {
                            "type": "string",
                            "enum": [
                              "api",
                              "console",
                              "automatic_retention",
                              "backfill",
                              "privacy_erasure",
                              "explicit_template_purge",
                              "vendor_user_delete",
                              "expiry",
                              "reconciliation",
                              "migration",
                              "system"
                            ]
                          },
                          "instruction_id": {
                            "type": "string",
                            "description": "Die bei der Löschung gesendete `instruction_id` oder eine von Didit generierte ID."
                          },
                          "held_out_of_use": {
                            "type": "boolean",
                            "description": "`true` nur, solange ein Legal Hold gilt. Ein gesperrtes Template wird von jeglichem Abgleich ausgeschlossen."
                          },
                          "status": {
                            "type": "string",
                            "enum": [
                              "pending",
                              "active",
                              "expired",
                              "held_out_of_use",
                              "purge_pending",
                              "purge_failed",
                              "purged"
                            ],
                            "description": "Nur `active` Vorlagen, die nicht zurückgehalten werden, deren `expires_at` nicht überschritten ist und deren Benutzer noch existiert, nehmen am Abgleich teil."
                          },
                          "purged_at": {
                            "type": "string",
                            "format": "date-time",
                            "nullable": true
                          }
                        }
                      }
                    }
                  }
                },
                "examples": {
                  "One active template": {
                    "value": {
                      "count": 1,
                      "next": null,
                      "previous": null,
                      "results": [
                        {
                          "uuid": "9d2f4b6e-1c3a-4e8f-b7d5-0a1c2e3f4a5b",
                          "vendor_user_uuid": "2f7c1a9e-8b4d-4c6a-9e1f-3d5b7a9c1e2f",
                          "vendor_data": "user-42",
                          "source_type": "session_delete",
                          "provenance_reference": "6b1e8d2f-4a3c-4f9e-8c7d-1a2b3c4d5e6f",
                          "retention_policy": "retain_until_user_deleted",
                          "retention_override": null,
                          "retained_at": "2026-08-28T10:15:42.318402Z",
                          "expires_at": "2027-08-28T10:15:42.318402Z",
                          "retained_by": "3c9e2b1f-7d4a-4e8b-9c1d-5f6a7b8c9d0e",
                          "retained_by_type": "API_KEY",
                          "instruction_class": "operational_session_delete",
                          "instruction_source": "api",
                          "instruction_id": "post-approval-cleanup-2026-08",
                          "held_out_of_use": false,
                          "status": "active",
                          "purged_at": null
                        }
                      ]
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Ungültiger Filterwert oder `retained_to` liegt vor `retained_from`. Nach Feldern aufgeschlüsselte Validierungsfehler.",
            "content": {
              "application/json": {
                "examples": {
                  "Bad range": {
                    "value": {
                      "retained_to": [
                        "Must be on or after retained_from."
                      ]
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Console-Benutzertoken, oder der API-Schlüssel ist nicht zulässig. Diese Endpoints akzeptieren ausschließlich Anwendungs-API-Schlüssel.",
            "content": {
              "application/json": {
                "examples": {
                  "Forbidden": {
                    "value": {
                      "detail": "You do not have permission to perform this action."
                    }
                  }
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X GET 'https://verification.didit.me/v3/biometric-templates/?vendor_data=user-42&status=active' \\\n  -H 'x-api-key: YOUR_API_KEY'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nfor item in client.biometric_templates.list():\n    print(item)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nfor await (const item of didit.biometricTemplates.list()) {\n  console.log(item);\n}"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\niter := client.BiometricTemplates.ListAutoPaging(ctx, didit.BiometricTemplatesListParams{})\nfor iter.Next() {\n\tfmt.Printf(\"%+v\\n\", iter.Current())\n}\nif err := iter.Err(); err != nil {\n\tlog.Fatal(err)\n}"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nfor (var item : client.biometricTemplates().list()) {\n    System.out.println(item);\n}"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\nforeach ($didit->biometricTemplates->list() as $item) {\n    print_r($item->toArray());\n}"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\ndidit.biometric_templates.list.auto_paging_each do |item|\n  puts item.to_h\nend"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nawait foreach (var item in await client.BiometricTemplates.ListAsync())\n{\n    Console.WriteLine(JsonSerializer.Serialize(item));\n}"
          }
        ]
      }
    },
    "/v3/biometric-templates/count/": {
      "get": {
        "summary": "Anzahl der aufbewahrten biometrischen Templates",
        "description": "Eine Anwendung, die sich dafür entschieden hat, behält ein separat verwaltetes, bildfreies biometrisches Template für das Gesicht, das dem Benutzer zugeordnet ist, wenn eine Sitzung gelöscht wird (siehe `DELETE /v3/session/{sessionId}/delete/`). Templates sind biometrische Daten mit einem endlichen `expires_at`; sie enthalten niemals Bilder, Sitzungsdaten oder Identitätsfelder und werden bei Benutzerlöschung, Datenschutz-Löschung, Ablauf oder einer expliziten Bereinigung gelöscht. Diese Endpoints akzeptieren ausschließlich Anwendungs-API-Schlüssel (`x-api-key`); Business Console-Benutzertoken werden mit `403` abgelehnt.\n\nGibt die Anzahl der Templates zurück, die mit denselben Filtern wie der Listen-Endpoint übereinstimmen. Verwenden Sie dies, um zu prüfen, was eine gefilterte Massenbereinigung mit `delete_all: true` betreffen würde.",
        "operationId": "count_biometric_templates",
        "x-didit-sdk": {
          "resource": "biometric_templates",
          "method": "count",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Biometric Templates"
        ],
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "parameters": [
          {
            "in": "query",
            "name": "vendor_data",
            "required": false,
            "description": "Teilstring-Übereinstimmung ohne Berücksichtigung von Groß-/Kleinschreibung im aktuellen `vendor_data` des zugehörigen Benutzers.",
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "vendor_user_uuid",
            "required": false,
            "description": "Exakte Übereinstimmung mit dem zugehörigen Benutzer.",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "in": "query",
            "name": "status",
            "required": false,
            "description": "Lebenszyklusstatus. Bereinigte Vorlagen werden niemals aufgeführt.",
            "schema": {
              "type": "string",
              "enum": [
                "pending",
                "active",
                "expired",
                "held_out_of_use",
                "purge_pending",
                "purge_failed"
              ]
            }
          },
          {
            "in": "query",
            "name": "source_type",
            "required": false,
            "description": "Wie die Vorlage erstellt wurde.",
            "schema": {
              "type": "string",
              "enum": [
                "session_delete",
                "automatic_retention",
                "backfill"
              ]
            }
          },
          {
            "in": "query",
            "name": "retained_from",
            "required": false,
            "description": "Vorlagen, die zu oder nach diesem Zeitpunkt aufbewahrt wurden.",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "in": "query",
            "name": "retained_to",
            "required": false,
            "description": "Vorlagen, die zu oder vor diesem Zeitpunkt aufbewahrt wurden. Darf nicht vor `retained_from` liegen (`400`).",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Anzahl.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "count": {
                      "type": "integer",
                      "minimum": 0
                    }
                  }
                },
                "examples": {
                  "Count": {
                    "value": {
                      "count": 128
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Ungültiger Filterwert oder `retained_to` liegt vor `retained_from`. Nach Feldern aufgeschlüsselte Validierungsfehler.",
            "content": {
              "application/json": {
                "examples": {
                  "Bad range": {
                    "value": {
                      "retained_to": [
                        "Must be on or after retained_from."
                      ]
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Console-Benutzertoken, oder der API-Schlüssel ist nicht zulässig. Diese Endpoints akzeptieren ausschließlich Anwendungs-API-Schlüssel.",
            "content": {
              "application/json": {
                "examples": {
                  "Forbidden": {
                    "value": {
                      "detail": "You do not have permission to perform this action."
                    }
                  }
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X GET 'https://verification.didit.me/v3/biometric-templates/count/?status=active' \\\n  -H 'x-api-key: YOUR_API_KEY'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.biometric_templates.count()\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.biometricTemplates.count();\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.BiometricTemplates.Count(ctx, didit.BiometricTemplatesCountParams{})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.biometricTemplates().count();\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->biometricTemplates->count();\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.biometric_templates.count\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.BiometricTemplates.CountAsync();\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ]
      }
    },
    "/v3/biometric-templates/{template_uuid}/": {
      "get": {
        "summary": "Gespeichertes biometrisches Template abrufen",
        "description": "Eine Anwendung, die sich dafür entschieden hat, behält ein separat verwaltetes, bildfreies biometrisches Template für das Gesicht, das dem Benutzer zugeordnet ist, wenn eine Sitzung gelöscht wird (siehe `DELETE /v3/session/{sessionId}/delete/`). Templates sind biometrische Daten mit einem endlichen `expires_at`; sie enthalten niemals Bilder, Sitzungsdaten oder Identitätsfelder und werden bei Benutzerlöschung, Datenschutz-Löschung, Ablauf oder einer expliziten Bereinigung gelöscht. Diese Endpoints akzeptieren ausschließlich Anwendungs-API-Schlüssel (`x-api-key`); Business Console-Benutzertoken werden mit `403` abgelehnt.\n\nGibt ein Template zurück. Die Antwort enthält niemals ein Bild, einen Vektor, die ID der gelöschten Sitzung oder Identitätsdaten.",
        "operationId": "get_biometric_template",
        "x-didit-sdk": {
          "resource": "biometric_templates",
          "method": "retrieve",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Biometric Templates"
        ],
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "parameters": [
          {
            "in": "path",
            "name": "template_uuid",
            "required": true,
            "description": "Template-ID, wie in `biometric_template_uuid` von den Endpoints zum Löschen von Sitzungen, `biometric_template_id` bei einem Treffer der Gesichtssuche oder dem Listen-Endpoint zurückgegeben.",
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "9d2f4b6e-1c3a-4e8f-b7d5-0a1c2e3f4a5b"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Die Vorlage.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "uuid": {
                      "type": "string",
                      "format": "uuid",
                      "description": "Vorlagen-ID. Zufällig generiert; nicht aus der gelöschten Sitzung oder deren Gesicht abgeleitet."
                    },
                    "vendor_user_uuid": {
                      "type": "string",
                      "format": "uuid",
                      "description": "Der besitzende Benutzer."
                    },
                    "vendor_data": {
                      "type": "string",
                      "nullable": true,
                      "description": "Die aktuellen `vendor_data` des Benutzers, aufgelöst, wenn Sie die Vorlage lesen (werden nie kopiert)."
                    },
                    "source_type": {
                      "type": "string",
                      "enum": [
                        "session_delete",
                        "automatic_retention",
                        "backfill"
                      ],
                      "description": "Wie die Vorlage erstellt wurde: eine Sitzungslöschung (API oder Console), das automatische Datenaufbewahrungsfenster der Anwendung oder eine von Didit durchgeführte nachträgliche Datenauffüllung, die Sie beauftragt haben."
                    },
                    "provenance_reference": {
                      "type": "string",
                      "format": "uuid",
                      "description": "Opake Referenz, die die Vorlage mit ihrem Audit-Log verknüpft. Sie ist nicht die ID der gelöschten Sitzung und kann nicht zu dieser aufgelöst werden."
                    },
                    "retention_policy": {
                      "type": "string",
                      "enum": [
                        "delete_with_session",
                        "retain_until_user_deleted"
                      ],
                      "description": "Die Anwendungsrichtlinie zum Zeitpunkt der Datenaufbewahrung."
                    },
                    "retention_override": {
                      "type": "boolean",
                      "nullable": true,
                      "description": "Der bei der Löschung gesendete Wert `retain_face_embeddings` oder `null`, wenn die Richtlinie angewendet wurde."
                    },
                    "retained_at": {
                      "type": "string",
                      "format": "date-time"
                    },
                    "expires_at": {
                      "type": "string",
                      "format": "date-time",
                      "description": "Wann die Vorlage abläuft und automatisch bereinigt wird. Immer gesetzt."
                    },
                    "retained_by": {
                      "type": "string",
                      "nullable": true,
                      "description": "Prinzipal, der die Anweisung erteilt hat: die Anwendungs-ID für API-Schlüssel, die Mitglieds-ID der Console für Console-Aktionen oder eine `service:`-Kennung für die automatische Aufbewahrung. Niemals eine E-Mail-Adresse."
                    },
                    "retained_by_type": {
                      "type": "string",
                      "enum": [
                        "API_KEY",
                        "CONSOLE_USER",
                        "SYSTEM"
                      ]
                    },
                    "instruction_class": {
                      "type": "string",
                      "enum": [
                        "operational_session_delete",
                        "privacy_erasure"
                      ]
                    },
                    "instruction_source": {
                      "type": "string",
                      "enum": [
                        "api",
                        "console",
                        "automatic_retention",
                        "backfill",
                        "privacy_erasure",
                        "explicit_template_purge",
                        "vendor_user_delete",
                        "expiry",
                        "reconciliation",
                        "migration",
                        "system"
                      ]
                    },
                    "instruction_id": {
                      "type": "string",
                      "description": "Die bei der Löschung gesendete `instruction_id` oder eine von Didit generierte ID."
                    },
                    "held_out_of_use": {
                      "type": "boolean",
                      "description": "`true` nur, solange ein Legal Hold gilt. Ein gesperrtes Template wird von jeglichem Abgleich ausgeschlossen."
                    },
                    "status": {
                      "type": "string",
                      "enum": [
                        "pending",
                        "active",
                        "expired",
                        "held_out_of_use",
                        "purge_pending",
                        "purge_failed",
                        "purged"
                      ],
                      "description": "Nur `active` Vorlagen, die nicht zurückgehalten werden, deren `expires_at` nicht überschritten ist und deren Benutzer noch existiert, nehmen am Abgleich teil."
                    },
                    "purged_at": {
                      "type": "string",
                      "format": "date-time",
                      "nullable": true
                    }
                  }
                },
                "examples": {
                  "Active template": {
                    "value": {
                      "uuid": "9d2f4b6e-1c3a-4e8f-b7d5-0a1c2e3f4a5b",
                      "vendor_user_uuid": "2f7c1a9e-8b4d-4c6a-9e1f-3d5b7a9c1e2f",
                      "vendor_data": "user-42",
                      "source_type": "session_delete",
                      "provenance_reference": "6b1e8d2f-4a3c-4f9e-8c7d-1a2b3c4d5e6f",
                      "retention_policy": "retain_until_user_deleted",
                      "retention_override": null,
                      "retained_at": "2026-08-28T10:15:42.318402Z",
                      "expires_at": "2027-08-28T10:15:42.318402Z",
                      "retained_by": "3c9e2b1f-7d4a-4e8b-9c1d-5f6a7b8c9d0e",
                      "retained_by_type": "API_KEY",
                      "instruction_class": "operational_session_delete",
                      "instruction_source": "api",
                      "instruction_id": "post-approval-cleanup-2026-08",
                      "held_out_of_use": false,
                      "status": "active",
                      "purged_at": null
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Console-Benutzertoken, oder der API-Schlüssel ist nicht zulässig. Diese Endpoints akzeptieren ausschließlich Anwendungs-API-Schlüssel.",
            "content": {
              "application/json": {
                "examples": {
                  "Forbidden": {
                    "value": {
                      "detail": "You do not have permission to perform this action."
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Unbekannte Vorlage, Vorlage einer anderen Anwendung oder (bei `GET`) eine gelöschte Vorlage.",
            "content": {
              "application/json": {
                "examples": {
                  "Not found": {
                    "value": {
                      "detail": "Biometric template not found."
                    }
                  }
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X GET https://verification.didit.me/v3/biometric-templates/9d2f4b6e-1c3a-4e8f-b7d5-0a1c2e3f4a5b/ \\\n  -H 'x-api-key: YOUR_API_KEY'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.biometric_templates.retrieve(\n    \"9d2f4b6e-1c3a-4e8f-b7d5-0a1c2e3f4a5b\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.biometricTemplates.retrieve(\"9d2f4b6e-1c3a-4e8f-b7d5-0a1c2e3f4a5b\");\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.BiometricTemplates.Retrieve(ctx, \"9d2f4b6e-1c3a-4e8f-b7d5-0a1c2e3f4a5b\")\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.biometricTemplates().retrieve(\"9d2f4b6e-1c3a-4e8f-b7d5-0a1c2e3f4a5b\");\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->biometricTemplates->retrieve('9d2f4b6e-1c3a-4e8f-b7d5-0a1c2e3f4a5b');\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.biometric_templates.retrieve(\"9d2f4b6e-1c3a-4e8f-b7d5-0a1c2e3f4a5b\")\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.BiometricTemplates.RetrieveAsync(\"9d2f4b6e-1c3a-4e8f-b7d5-0a1c2e3f4a5b\");\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ]
      },
      "delete": {
        "summary": "Ein aufbewahrtes biometrisches Template löschen",
        "description": "Eine Anwendung, die sich dafür entschieden hat, behält ein separat verwaltetes, bildfreies biometrisches Gesichtstemplate, das dem Benutzer zugeordnet ist, wenn eine Sitzung gelöscht wird (siehe `DELETE /v3/session/{sessionId}/delete/`). Templates sind biometrische Daten mit einem endlichen `expires_at`; sie enthalten niemals Bilder, Sitzungsdaten oder Identitätsfelder und werden bei Benutzerlöschung, Datenschutz-Löschung, Ablauf oder einer expliziten Bereinigung gelöscht. Diese Endpoints akzeptieren ausschließlich Anwendungs-API-Schlüssel (`x-api-key`); Business Console-Benutzertoken werden mit `403` abgelehnt.\n\nBereinigt ein Template: Es wird aus jeder Art von Abgleich entfernt und das gespeicherte Template wird gelöscht. Unumkehrbar und im Audit-Log mit dem handelnden Akteur erfasst.\n\n**Wiederholungssemantik:** Didit löscht zuerst das gespeicherte Template und markiert das Template erst danach als bereinigt. Wenn ein biometrischer Speicher nicht verfügbar ist, gibt der Aufruf `503` zurück, das Template wechselt zu `status: purge_failed` und ist bereits vom Abgleich ausgeschlossen; wiederholen Sie denselben Aufruf, um den Vorgang abzuschließen. Das Wiederholen einer Bereinigung eines bereits bereinigten Templates gibt `already_purged` zurück.\n\nTemplates werden auch durch `POST /v3/users/delete/` für den zugehörigen Benutzer, durch jede Löschung von Sitzungen dieses Benutzers mit `deletion_instruction: privacy_erasure` sowie automatisch bei `expires_at` bereinigt.",
        "operationId": "purge_biometric_template",
        "x-didit-sdk": {
          "resource": "biometric_templates",
          "method": "delete",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Biometric Templates"
        ],
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "parameters": [
          {
            "in": "path",
            "name": "template_uuid",
            "required": true,
            "description": "Template-ID, wie in `biometric_template_uuid` von den Endpoints zum Löschen von Sitzungen, `biometric_template_id` bei einem Treffer der Gesichtssuche oder dem Listen-Endpoint zurückgegeben.",
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "9d2f4b6e-1c3a-4e8f-b7d5-0a1c2e3f4a5b"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Ergebnis des Löschvorgangs.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "uuid": {
                      "type": "string",
                      "format": "uuid"
                    },
                    "outcome": {
                      "type": "string",
                      "enum": [
                        "purged",
                        "already_purged"
                      ]
                    }
                  }
                },
                "examples": {
                  "Purged": {
                    "value": {
                      "uuid": "9d2f4b6e-1c3a-4e8f-b7d5-0a1c2e3f4a5b",
                      "outcome": "purged"
                    }
                  },
                  "Already purged": {
                    "value": {
                      "uuid": "9d2f4b6e-1c3a-4e8f-b7d5-0a1c2e3f4a5b",
                      "outcome": "already_purged"
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Console-Benutzertoken, oder der API-Schlüssel ist nicht zulässig. Diese Endpoints akzeptieren ausschließlich Anwendungs-API-Schlüssel.",
            "content": {
              "application/json": {
                "examples": {
                  "Forbidden": {
                    "value": {
                      "detail": "You do not have permission to perform this action."
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Unbekannte Vorlage, Vorlage einer anderen Anwendung oder (bei `GET`) eine gelöschte Vorlage.",
            "content": {
              "application/json": {
                "examples": {
                  "Not found": {
                    "value": {
                      "detail": "Biometric template not found."
                    }
                  }
                }
              }
            }
          },
          "503": {
            "description": "Ein Biometriespeicher war während des Aufbewahrens oder Löschens eines biometrischen Templates nicht verfügbar. Es wurde nichts gelöscht; wiederholen Sie dieselbe Anfrage. Wiederholungsversuche sind idempotent und führen zu einem einzigen Template.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string"
                    }
                  }
                },
                "examples": {
                  "Retryable": {
                    "value": {
                      "detail": "The biometric-template operation could not finish because an external store is unavailable. The operation is retryable."
                    }
                  }
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X DELETE https://verification.didit.me/v3/biometric-templates/9d2f4b6e-1c3a-4e8f-b7d5-0a1c2e3f4a5b/ \\\n  -H 'x-api-key: YOUR_API_KEY'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.biometric_templates.delete(\n    \"9d2f4b6e-1c3a-4e8f-b7d5-0a1c2e3f4a5b\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.biometricTemplates.delete(\"9d2f4b6e-1c3a-4e8f-b7d5-0a1c2e3f4a5b\");\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.BiometricTemplates.Delete(ctx, \"9d2f4b6e-1c3a-4e8f-b7d5-0a1c2e3f4a5b\")\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.biometricTemplates().delete(\"9d2f4b6e-1c3a-4e8f-b7d5-0a1c2e3f4a5b\");\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->biometricTemplates->delete('9d2f4b6e-1c3a-4e8f-b7d5-0a1c2e3f4a5b');\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.biometric_templates.delete(\"9d2f4b6e-1c3a-4e8f-b7d5-0a1c2e3f4a5b\")\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.BiometricTemplates.DeleteAsync(\"9d2f4b6e-1c3a-4e8f-b7d5-0a1c2e3f4a5b\");\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ]
      }
    },
    "/v3/biometric-templates/delete/": {
      "post": {
        "summary": "Gespeicherte biometrische Templates per Massenaktion löschen",
        "description": "Eine Anwendung, für die eine Einwilligung vorliegt, behält ein separat verwaltetes, bildfreies biometrisches Gesichtstemplate, das am Benutzer verankert ist, wenn eine Sitzung gelöscht wird (siehe `DELETE /v3/session/{sessionId}/delete/`). Templates sind biometrische Daten mit einem endlichen `expires_at`; sie enthalten niemals Bilder, Sitzungsdaten oder Identitätsfelder und werden bei Benutzerlöschung, datenschutzrechtlicher Löschung, Ablauf oder einer expliziten Bereinigung bereinigt. Diese Endpoints akzeptieren ausschließlich Anwendungs-API-Schlüssel (`x-api-key`); Benutzer-Tokens der Business Console werden mit `403` abgelehnt.\n\nBereinigt viele Templates in einem Aufruf, entweder anhand einer expliziten ID-Liste oder mit `delete_all: true`, optional eingegrenzt durch dieselben Filter wie beim List-Endpoint. Templates werden nacheinander bereinigt, und jedes Ergebnis meldet `purged` oder `already_purged`. Wenn ein biometrischer Speicher nicht verfügbar ist, gibt der Aufruf beim ersten Template, bei dem ein Fehler auftritt, `503` zurück: Früher in der Anfrage bereinigte Templates bleiben bereinigt, das fehlschlagende wechselt zu `purge_failed` (bereits vom Abgleich ausgeschlossen), und eine Wiederholung der Anfrage schließt den Vorgang ab.\n\n**`delete_all: true` ohne Filter bereinigt jedes biometrische Template in der Anwendung und kann nicht rückgängig gemacht werden.** Führen Sie zuerst den Count-Endpoint mit denselben Filtern aus.",
        "operationId": "bulk_purge_biometric_templates",
        "x-didit-sdk": {
          "resource": "biometric_templates",
          "method": "batch_delete",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Biometric Templates"
        ],
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "template_uuids": {
                    "type": "array",
                    "items": {
                      "type": "string",
                      "format": "uuid"
                    },
                    "minItems": 1,
                    "description": "Zu bereinigende Vorlagen. Erforderlich, es sei denn, `delete_all` ist `true`. Bereits bereinigte IDs werden als `already_purged` gemeldet."
                  },
                  "delete_all": {
                    "type": "boolean",
                    "default": false,
                    "description": "Wenn `true`, werden alle Vorlagen gelöscht, die den folgenden Filtern entsprechen (alle Vorlagen der Anwendung, wenn kein Filter angegeben ist). `template_uuids` wird ignoriert. Unumkehrbar."
                  },
                  "vendor_data": {
                    "type": "string",
                    "description": "Nur mit `delete_all`: Teilstring-Abgleich ohne Berücksichtigung der Groß-/Kleinschreibung mit dem `vendor_data` des besitzenden Benutzers."
                  },
                  "vendor_user_uuid": {
                    "type": "string",
                    "format": "uuid",
                    "description": "Nur mit `delete_all`: exakte Übereinstimmung mit dem besitzenden Benutzer."
                  },
                  "status": {
                    "type": "string",
                    "enum": [
                      "pending",
                      "active",
                      "expired",
                      "held_out_of_use",
                      "purge_pending",
                      "purge_failed"
                    ],
                    "description": "Nur mit `delete_all`."
                  },
                  "source_type": {
                    "type": "string",
                    "enum": [
                      "session_delete",
                      "automatic_retention",
                      "backfill"
                    ],
                    "description": "Nur mit `delete_all`."
                  },
                  "retained_from": {
                    "type": "string",
                    "format": "date-time",
                    "description": "Nur mit `delete_all`."
                  },
                  "retained_to": {
                    "type": "string",
                    "format": "date-time",
                    "description": "Nur mit `delete_all`. Darf nicht vor `retained_from` liegen."
                  }
                }
              },
              "examples": {
                "By id": {
                  "value": {
                    "template_uuids": [
                      "9d2f4b6e-1c3a-4e8f-b7d5-0a1c2e3f4a5b",
                      "1a2b3c4d-5e6f-4a7b-8c9d-0e1f2a3b4c5d"
                    ]
                  }
                },
                "Every template of one User": {
                  "value": {
                    "delete_all": true,
                    "vendor_user_uuid": "2f7c1a9e-8b4d-4c6a-9e1f-3d5b7a9c1e2f"
                  }
                },
                "Every template in the application": {
                  "value": {
                    "delete_all": true
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Bereinigungsergebnisse pro Vorlage.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "results": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "uuid": {
                            "type": "string",
                            "format": "uuid"
                          },
                          "outcome": {
                            "type": "string",
                            "enum": [
                              "purged",
                              "already_purged"
                            ]
                          }
                        }
                      }
                    }
                  }
                },
                "examples": {
                  "Mixed": {
                    "value": {
                      "results": [
                        {
                          "uuid": "9d2f4b6e-1c3a-4e8f-b7d5-0a1c2e3f4a5b",
                          "outcome": "purged"
                        },
                        {
                          "uuid": "1a2b3c4d-5e6f-4a7b-8c9d-0e1f2a3b4c5d",
                          "outcome": "already_purged"
                        }
                      ]
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Validierungsfehler – es wird nichts bereinigt.",
            "content": {
              "application/json": {
                "examples": {
                  "Missing selector": {
                    "value": {
                      "template_uuids": [
                        "This field is required unless delete_all is true."
                      ]
                    }
                  },
                  "Bad range": {
                    "value": {
                      "retained_to": [
                        "Must be on or after retained_from."
                      ]
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Console-Benutzertoken, oder der API-Schlüssel ist nicht zulässig. Diese Endpoints akzeptieren ausschließlich Anwendungs-API-Schlüssel.",
            "content": {
              "application/json": {
                "examples": {
                  "Forbidden": {
                    "value": {
                      "detail": "You do not have permission to perform this action."
                    }
                  }
                }
              }
            }
          },
          "503": {
            "description": "Ein Biometriespeicher war während des Aufbewahrens oder Löschens eines biometrischen Templates nicht verfügbar. Es wurde nichts gelöscht; wiederholen Sie dieselbe Anfrage. Wiederholungsversuche sind idempotent und führen zu einem einzigen Template.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string"
                    }
                  }
                },
                "examples": {
                  "Retryable": {
                    "value": {
                      "detail": "The biometric-template operation could not finish because an external store is unavailable. The operation is retryable."
                    }
                  }
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X POST https://verification.didit.me/v3/biometric-templates/delete/ \\\n  -H 'x-api-key: YOUR_API_KEY' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\"delete_all\": true, \"vendor_user_uuid\": \"2f7c1a9e-8b4d-4c6a-9e1f-3d5b7a9c1e2f\"}'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.biometric_templates.batch_delete(\n    template_uuids=[\"9d2f4b6e-1c3a-4e8f-b7d5-0a1c2e3f4a5b\", \"1a2b3c4d-5e6f-4a7b-8c9d-0e1f2a3b4c5d\"],\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.biometricTemplates.batchDelete({\n  template_uuids: [\"9d2f4b6e-1c3a-4e8f-b7d5-0a1c2e3f4a5b\", \"1a2b3c4d-5e6f-4a7b-8c9d-0e1f2a3b4c5d\"],\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.BiometricTemplates.BatchDelete(ctx, didit.BiometricTemplatesBatchDeleteParams{\n\tTemplateUUIDs: didit.Some([]string{\"9d2f4b6e-1c3a-4e8f-b7d5-0a1c2e3f4a5b\", \"1a2b3c4d-5e6f-4a7b-8c9d-0e1f2a3b4c5d\"}),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import java.util.List;\nimport me.didit.Didit;\nimport me.didit.types.BiometricTemplatesBatchDeleteParams;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.biometricTemplates().batchDelete(BiometricTemplatesBatchDeleteParams.builder()\n        .templateUuids(List.of(\"9d2f4b6e-1c3a-4e8f-b7d5-0a1c2e3f4a5b\", \"1a2b3c4d-5e6f-4a7b-8c9d-0e1f2a3b4c5d\"))\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->biometricTemplates->batchDelete([\n    'template_uuids' => ['9d2f4b6e-1c3a-4e8f-b7d5-0a1c2e3f4a5b', '1a2b3c4d-5e6f-4a7b-8c9d-0e1f2a3b4c5d'],\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.biometric_templates.batch_delete(template_uuids: [\"9d2f4b6e-1c3a-4e8f-b7d5-0a1c2e3f4a5b\", \"1a2b3c4d-5e6f-4a7b-8c9d-0e1f2a3b4c5d\"])\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.BiometricTemplates.BatchDeleteAsync(new BiometricTemplatesBatchDeleteParams\n{\n    TemplateUuids = new string[] { \"9d2f4b6e-1c3a-4e8f-b7d5-0a1c2e3f4a5b\", \"1a2b3c4d-5e6f-4a7b-8c9d-0e1f2a3b4c5d\" },\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ]
      }
    },
    "/v3/kyb/shareholders/": {
      "post": {
        "summary": "KYB-Unternehmensabfrage im Register mit Gesellschaftern (eigenständig)",
        "operationId": "post_v3_kyb_shareholders",
        "x-didit-sdk": {
          "resource": "kyb",
          "method": "list_shareholders",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Standalone APIs"
        ],
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "parameters": [],
        "description": "Rufen Sie das Lite-Profil **zuzüglich der direkten Gesellschafter** (natürliche Personen und juristische Einheiten mit ihren Beteiligungsspannen) eines durch `POST /v3/kyb/search/` zurückgegebenen Kandidaten ab.\n\n**Kombination mit der Suche.** Übergeben Sie die `kyb_response_id` des Kandidaten genau so, wie sie von einer Suche derselben Anwendung zurückgegeben wurde. Suchen Sie auf der Stufe, die Sie kaufen möchten (`tier` bei `POST /v3/kyb/search/`), da die Suche auf der Registerkette ausgeführt wird, die diese Stufe bedient, und eine leere Lite-Suche kein Beweis dafür ist, dass das Unternehmensregister das Unternehmen nicht führt. Wenn sich die Eigentümerstruktur-Daten des Landes bei einem anderen Unternehmensregister befinden, sucht Didit das Unternehmen dort anhand der Registernummer ohne zusätzliche Kosten erneut.\n\n**Abrechnung.** Abgerechnet zum Gesellschafter-Preis des Landes – siehe [Preise für KYB-Unternehmensregister](/de/getting-started/kyb-registry-pricing). Wenn das Unternehmensregister keinen Gesellschafter-Eintrag für das Unternehmen führt (oder das Land überhaupt keine Eigentümerstruktur-Daten anbietet), wird stattdessen das Lite-Profil geliefert und abgerechnet: Lesen Sie `registry_tier_delivered` und `registry_ownership_status` aus. Das Guthaben wird vor jedem Registeraufruf mit dem Gesellschafter-Preis abgeglichen (`403`, wenn es nicht ausreicht).\n\n**Verfügbarkeit.** Nur v3. Jeder Aufruf erstellt eine Unternehmenssitzung (deren ID die `request_id` ist).\n\n**Ausstehende Berichte.** Wenn ein Bericht noch vorbereitet wird oder der Eigentümerstruktur-Abschnitt noch nicht aus dem Register abgerufen wurde, gibt der Endpoint 202 Accepted, kyb_registry.fetch_status=pending, kyb_registry.registry_ownership_status=pending und registry_tier_delivered=null zurück. Behalten Sie request_id und rufen Sie GET /v3/session/{request_id}/decision/ ab, bis registry_checks[0].company.fetch_status aufgelöst ist. Didit vervollständigt den Bericht automatisch und berechnet die gelieferte Stufe, sobald er bereit ist. Wiederholen Sie den Kauf nicht, während er aussteht; jedes neue POST erstellt eine separate Anfrage.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/KYBRegistryCandidateRequest"
              },
              "example": {
                "kyb_response_id": "69aeeb95febb0f1704042259",
                "vendor_data": "company-1234"
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X POST https://verification.didit.me/v3/kyb/shareholders/ \\\n  -H 'x-api-key: YOUR_API_KEY' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\n    \"kyb_response_id\": \"69aeeb95febb0f1704042259\",\n    \"vendor_data\": \"company-1234\"\n  }'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.kyb.list_shareholders(\n    kyb_response_id=\"69aeeb95febb0f1704042259\",\n    vendor_data=\"company-1234\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.kyb.listShareholders({\n  kyb_response_id: \"69aeeb95febb0f1704042259\",\n  vendor_data: \"company-1234\",\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.KYB.ListShareholders(ctx, didit.KYBRegistryCandidateRequest{\n\tKYBResponseID: \"69aeeb95febb0f1704042259\",\n\tVendorData:    didit.String(\"company-1234\"),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\nimport me.didit.types.KYBRegistryCandidateRequest;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.kyb().listShareholders(KYBRegistryCandidateRequest.builder()\n        .kybResponseId(\"69aeeb95febb0f1704042259\")\n        .vendorData(\"company-1234\")\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->kyb->listShareholders([\n    'kyb_response_id' => '69aeeb95febb0f1704042259',\n    'vendor_data' => 'company-1234',\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.kyb.list_shareholders(\n  kyb_response_id: \"69aeeb95febb0f1704042259\",\n  vendor_data: \"company-1234\"\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Kyb.ListShareholdersAsync(new KYBRegistryCandidateRequest\n{\n    KybResponseId = \"69aeeb95febb0f1704042259\",\n    VendorData = \"company-1234\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "responses": {
          "200": {
            "description": "Unternehmensbericht zurückgegeben und zur gelieferten Stufe abgerechnet. Eigentümerstruktur-Berichte, die noch vorbereitet werden, können 202 zurückgeben; behalten Sie request_id, um deren gespeicherte Entscheidung abzurufen.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "request_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "ID der Unternehmenssitzung, die für diesen Abruf erstellt wurde. Der gespeicherte Datensatz (in der Konsole sichtbar) wird weiter aktualisiert, falls das Register die Abfrage erst nach der Antwort auflöst."
                    },
                    "registry_tier_requested": {
                      "type": "string",
                      "enum": [
                        "basic",
                        "shareholders",
                        "ubo"
                      ],
                      "description": "Die Stufe, die dieser Endpoint bereitstellt: `basic` (Lite) für ausgewählte, `shareholders`, `ubo`."
                    },
                    "registry_tier_delivered": {
                      "type": "string",
                      "enum": [
                        "basic",
                        "shareholders",
                        "ubo",
                        null
                      ],
                      "description": "Die tatsächlich gelieferte und abgerechnete Stufe. Niedriger als angefordert, wenn die Register des Landes keine Eigentümerdaten enthalten oder das Register keinen Eigentümereintrag für dieses Unternehmen führt.",
                      "nullable": true
                    },
                    "kyb_registry": {
                      "type": "object",
                      "description": "Vollständiges Unternehmensprofil aus dem Register.",
                      "properties": {
                        "uuid": {
                          "type": "string",
                          "format": "uuid",
                          "description": "Didits ID für diesen Unternehmensdatensatz."
                        },
                        "node_id": {
                          "type": "string",
                          "example": "feature_kyb_registry"
                        },
                        "status": {
                          "type": "string",
                          "enum": [
                            "Not Finished",
                            "Approved",
                            "Declined",
                            "In Review"
                          ],
                          "description": "Didits Bewertung der Registerprüfung (z. B. `In Review`, wenn das Unternehmen im Register nicht aktiv ist oder die Daten zur Eigentümerstruktur nicht abgeleitet werden konnten)."
                        },
                        "registry_status": {
                          "type": "string",
                          "nullable": true,
                          "enum": [
                            "active",
                            "dissolved",
                            "deregistered",
                            "see full details",
                            "authorised",
                            "appointed representative",
                            "unauthorised",
                            "inactive",
                            "no longer authorised",
                            "closed",
                            "struck off",
                            null
                          ],
                          "description": "Normalisierter Unternehmensstatus gemäß den Angaben des Registers."
                        },
                        "data_resolved": {
                          "type": "boolean",
                          "description": "`true`, sobald das Register das vollständige Profil zurückgegeben hat. `false`, wenn das Register nach dem Polling noch in Bearbeitung war – der gespeicherte Datensatz wird automatisch vervollständigt, sobald das Register den Vorgang abgeschlossen hat."
                        },
                        "company_name": {
                          "type": "string",
                          "example": "Tesco PLC"
                        },
                        "registration_number": {
                          "type": "string",
                          "nullable": true,
                          "example": "00445790"
                        },
                        "country_code": {
                          "type": "string",
                          "description": "ISO 3166-1-Alpha-2.",
                          "example": "GB"
                        },
                        "region": {
                          "type": "string",
                          "nullable": true,
                          "description": "Unterteilungscode, wenn das Register regional ist (z. B. `CA` für `US-CA`); andernfalls leer."
                        },
                        "company_type": {
                          "type": "string",
                          "nullable": true,
                          "example": "Public Limited Company"
                        },
                        "incorporation_date": {
                          "type": "string",
                          "format": "date",
                          "nullable": true,
                          "example": "1947-11-27"
                        },
                        "registered_address": {
                          "type": "string",
                          "nullable": true,
                          "example": "Tesco House, Shire Park, Kestrel Way, Welwyn Garden City, United Kingdom, AL7 1GA"
                        },
                        "tax_number": {
                          "type": "string",
                          "nullable": true,
                          "example": "GB412 8925 93"
                        },
                        "risk_level": {
                          "type": "string",
                          "nullable": true,
                          "description": "Vom Register gemeldete Risikostufe, sofern verfügbar."
                        },
                        "verification_status": {
                          "type": "string",
                          "enum": [
                            "verified",
                            "failed",
                            "unknown"
                          ],
                          "nullable": true,
                          "description": "Status der jurisdiktionsübergreifenden Verifizierung: `verified`, wenn der Registerstatus den Fortbestand bestätigt (`active`), `failed`, wenn das Unternehmen laut Register nicht mehr besteht (z. B. `dissolved`), andernfalls `unknown`. `null` bei einem Unternehmen, das nicht aus einem Register stammt, sowie solange eine Auswahl noch `pending` ist."
                        },
                        "is_from_registry": {
                          "type": "boolean",
                          "description": "Für diesen Endpoint immer `true` – das Profil wurde aus einem offiziellen Register abgerufen."
                        },
                        "fetch_status": {
                          "type": "string",
                          "enum": [
                            "pending",
                            "resolved"
                          ],
                          "description": "Lebenszyklus des Registerabrufs. Gespiegelt durch `data_resolved`."
                        },
                        "alternative_names": {
                          "type": "string",
                          "nullable": true,
                          "description": "Alternative Namen, Handelsnamen, frühere Namen oder Unternehmensnamen in der Originalsprache als Text, sofern gemeldet."
                        },
                        "nature_of_business": {
                          "type": "string",
                          "nullable": true,
                          "description": "Tätigkeitsbeschreibung oder Klassifizierungscode, sofern gemeldet."
                        },
                        "registered_capital": {
                          "type": "string",
                          "nullable": true
                        },
                        "registered_capital_amount": {
                          "type": "string",
                          "nullable": true,
                          "description": "Dezimalbetrag als Zeichenkette, sofern gemeldet."
                        },
                        "registered_capital_currency": {
                          "type": "string",
                          "nullable": true,
                          "description": "ISO 4217-Code, sofern gemeldet."
                        },
                        "website": {
                          "type": "string",
                          "nullable": true,
                          "example": "https://www.tesco.com/"
                        },
                        "email": {
                          "type": "string",
                          "nullable": true,
                          "example": "customer.service@tesco.co.uk"
                        },
                        "phone": {
                          "type": "string",
                          "nullable": true,
                          "example": "03301231688"
                        },
                        "legal_entity_identifier": {
                          "type": "string",
                          "nullable": true,
                          "description": "LEI, sofern gemeldet."
                        },
                        "location_of_registration": {
                          "type": "string",
                          "nullable": true,
                          "description": "Register/Jurisdiktion, bei dem/der das Unternehmen eingetragen ist, sofern gemeldet."
                        },
                        "vat_number": {
                          "type": "string",
                          "nullable": true,
                          "description": "EU-USt-IdNr., wenn während des gehosteten Registerschritts erfasst oder nachträglich bearbeitet. Zum Zeitpunkt der Auswahl ist dies normalerweise noch nicht festgelegt – die Validierung von USt-IdNr. und Steuernummer wird ausgeführt, wenn der Endbenutzer den Registerschritt im gehosteten Ablauf übermittelt."
                        },
                        "vat_validation_status": {
                          "type": "string",
                          "enum": [
                            "valid",
                            "invalid",
                            "format_valid",
                            "invalid_format",
                            "could_not_validate",
                            "not_applicable"
                          ],
                          "description": "Ergebnis der Validierung der USt-IdNr. oder, falls keine vorhanden ist, der `tax_number` bei der Registerübermittlung. `valid` / `invalid`: entschieden durch das offizielle Register des Landes (EU-VIES, Norwegen, Schweiz, Brasilien, Kolumbien, Costa Rica, Ecuador, Paraguay; Polen auch über sein nationales USt-Register). `format_valid` / `invalid_format`: entschieden durch die Format- und Prüfzifferregeln des Landes, wenn kein Register abgefragt werden kann. `could_not_validate`: das Register war nicht verfügbar. `not_applicable`: keine Nummer, ein Land ohne Register oder Regeln oder eine Sandbox-Sitzung."
                        },
                        "vat_validated_number": {
                          "type": "string",
                          "nullable": true,
                          "description": "Die geprüfte Nummer, wie sie der Quelle bekannt ist (beispielsweise die aus einer französischen SIREN oder einer niederländischen RSIN abgeleitete Umsatzsteuer-Identifikationsnummer). `null`, wenn keine Prüfung durchgeführt wurde."
                        },
                        "vat_validation_source": {
                          "type": "string",
                          "nullable": true,
                          "enum": [
                            "eu_vies",
                            "pl_vat_white_list",
                            "no_brreg",
                            "ch_uid_register",
                            "br_receita_federal",
                            "co_rues",
                            "cr_hacienda",
                            "ec_sri",
                            "py_dnit",
                            "format_rules",
                            null
                          ],
                          "description": "Die Quelle, die `vat_validation_status` festgelegt hat: ein offizielles Register oder `format_rules`. `null`, wenn keine Prüfung durchgeführt wurde."
                        },
                        "vat_validated_name": {
                          "type": "string",
                          "nullable": true,
                          "description": "Name, der bei der Quelle registriert ist, die die Nummer validiert hat, sofern sie einen offenlegt. Wird nur gesetzt, wenn der Status `valid` ist."
                        },
                        "vat_validated_address": {
                          "type": "string",
                          "nullable": true,
                          "description": "Bei der Quelle registrierte Adresse, die die Nummer validiert hat, sofern diese eine offenlegt. Wird nur festgelegt, wenn der Status `valid` ist."
                        },
                        "vat_checked_at": {
                          "type": "string",
                          "format": "date-time",
                          "nullable": true,
                          "description": "Zeitstempel der Prüfung. `null`, wenn keine Prüfung durchgeführt wurde."
                        },
                        "financial_summary": {
                          "type": "object",
                          "nullable": true,
                          "description": "Vom Register gemeldete Anteils-/Kapitaldetails (Währung, Gesamtaktien, Anteilsklassen), sofern verfügbar."
                        },
                        "officers": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "uuid": {
                                "type": "string",
                                "format": "uuid"
                              },
                              "name": {
                                "type": "string",
                                "example": "MELISSA BETHELL"
                              },
                              "designation": {
                                "type": "string",
                                "nullable": true,
                                "description": "Unverarbeitete Registerbezeichnung (z. B. `Director`, `Secretary`)."
                              },
                              "role": {
                                "type": "string",
                                "description": "Normalisierte Rolle, abgeleitet aus der Bezeichnung. Vollständiges Modellset mit 17 Werten; das Register-Parsing an diesem Endpoint gibt typischerweise director, non_executive_director, secretary, chairman oder company_officer aus.",
                                "enum": [
                                  "director",
                                  "non_executive_director",
                                  "secretary",
                                  "chairman",
                                  "ubo",
                                  "shareholder",
                                  "representative",
                                  "founder",
                                  "legal_advisor",
                                  "authorized_signatory",
                                  "trustee",
                                  "beneficiary",
                                  "company_officer",
                                  "settlor",
                                  "protector",
                                  "investor",
                                  "other"
                                ]
                              },
                              "nationality": {
                                "type": "string",
                                "nullable": true
                              },
                              "is_active": {
                                "type": "boolean",
                                "description": "`false`, wenn das Register vermerkt, dass die Bestellung niedergelegt wurde."
                              },
                              "kyc_status": {
                                "type": "string",
                                "nullable": true,
                                "enum": [
                                  "Approved",
                                  "Declined",
                                  "Pending",
                                  null
                                ],
                                "description": "Status einer zugehörigen KYC-Sitzung, sofern für diesen Officer eine gestartet wurde. Andernfalls `null`."
                              },
                              "kyc_session_url": {
                                "type": "string",
                                "nullable": true,
                                "description": "Verifizierungs-URL der zugehörigen KYC-Sitzung, sofern vorhanden."
                              },
                              "first_name": {
                                "type": "string",
                                "nullable": true,
                                "description": "Vorname, wenn vom Register ausdrücklich gemeldet; nicht aus dem vollständigen Namen abgeleitet."
                              },
                              "last_name": {
                                "type": "string",
                                "nullable": true,
                                "description": "Nachname, sofern vom Register explizit gemeldet."
                              },
                              "address": {
                                "type": "string",
                                "nullable": true,
                                "description": "Vom Register gemeldete Adresse des Amtsträgers."
                              },
                              "appointment_date": {
                                "type": "string",
                                "nullable": true,
                                "description": "Datum, an dem die Führungskraft bestellt wurde.",
                                "format": "date"
                              },
                              "termination_date": {
                                "type": "string",
                                "nullable": true,
                                "description": "Datum, an dem die Bestellung endete, sofern gemeldet.",
                                "format": "date"
                              },
                              "date_of_birth": {
                                "type": "string",
                                "nullable": true,
                                "description": "Vollständiges, vom Unternehmensregister gemeldetes Geburtsdatum. Null, wenn nur ein Geburtsjahr oder -monat bekannt ist.",
                                "format": "date"
                              },
                              "date_of_birth_year": {
                                "type": "integer",
                                "nullable": true,
                                "minimum": 1,
                                "maximum": 9999,
                                "description": "Vom Register gemeldetes Geburtsjahr, auch wenn das vollständige Datum nicht verfügbar ist."
                              },
                              "date_of_birth_month": {
                                "type": "integer",
                                "nullable": true,
                                "minimum": 1,
                                "maximum": 12,
                                "description": "Vom Register gemeldeter Geburtsmonat. Null, wenn nur das Jahr bekannt ist."
                              }
                            }
                          },
                          "description": "Geschäftsführer, Sekretäre und andere Funktionsträger, die aus dem Register extrahiert wurden."
                        },
                        "beneficial_owners": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "uuid": {
                                "type": "string",
                                "format": "uuid"
                              },
                              "name": {
                                "type": "string"
                              },
                              "first_name": {
                                "type": "string",
                                "nullable": true
                              },
                              "last_name": {
                                "type": "string",
                                "nullable": true
                              },
                              "entity_type": {
                                "type": "string",
                                "enum": [
                                  "person",
                                  "company"
                                ],
                                "description": "Gibt an, ob der Eigentümer eine natürliche Person oder eine juristische Person ist."
                              },
                              "roles": {
                                "type": "array",
                                "items": {
                                  "type": "string"
                                },
                                "description": "Normalisierte Rollen (z. B. `ubo`, `shareholder`)."
                              },
                              "ownership_min_shares": {
                                "type": "string",
                                "nullable": true,
                                "description": "Untergrenze der vom Register gemeldeten Eigentumsspanne (z. B. `25%`)."
                              },
                              "ownership_max_shares": {
                                "type": "string",
                                "nullable": true,
                                "description": "Obergrenze des vom Register gemeldeten Eigentumsbereichs."
                              },
                              "is_active": {
                                "type": "boolean"
                              },
                              "kyc_status": {
                                "type": "string",
                                "nullable": true,
                                "enum": [
                                  "Approved",
                                  "Declined",
                                  "Pending",
                                  null
                                ]
                              },
                              "kyc_session_url": {
                                "type": "string",
                                "nullable": true
                              },
                              "effective_ownership_percent": {
                                "type": "number",
                                "nullable": true,
                                "description": "Geparster Eigentumsanteil (Obergrenze, mit Fallback auf Untergrenze)."
                              },
                              "company_name": {
                                "type": "string",
                                "nullable": true
                              },
                              "registration_number": {
                                "type": "string",
                                "nullable": true
                              },
                              "country_of_birth": {
                                "type": "string",
                                "nullable": true
                              },
                              "email": {
                                "type": "string",
                                "nullable": true
                              },
                              "nationality": {
                                "type": "string",
                                "nullable": true
                              },
                              "designation": {
                                "type": "string",
                                "nullable": true
                              },
                              "voting_min_shares": {
                                "type": "string",
                                "nullable": true
                              },
                              "voting_max_shares": {
                                "type": "string",
                                "nullable": true
                              },
                              "date_of_birth": {
                                "type": "string",
                                "nullable": true,
                                "description": "Vollständiges Geburtsdatum, sofern gemeldet.",
                                "format": "date"
                              },
                              "appointment_date": {
                                "type": "string",
                                "nullable": true,
                                "description": "Datum der Bestellung, sofern gemeldet.",
                                "format": "date"
                              },
                              "shareholding": {
                                "$ref": "#/components/schemas/KYBRegistryShareholding"
                              }
                            }
                          },
                          "description": "Aus dem Register extrahierte wirtschaftlich Berechtigte / Personen mit maßgeblichem Einfluss. Kann leer sein, wenn das Register die Eigentümerstruktur nicht offenlegt."
                        },
                        "addresses": {
                          "type": "array",
                          "nullable": true,
                          "description": "Jede vom Register angegebene Adresse in einheitlicher Form. Null, wenn keine angegeben ist.",
                          "items": {
                            "$ref": "#/components/schemas/KYBRegistryAddress"
                          }
                        },
                        "industries": {
                          "type": "array",
                          "nullable": true,
                          "description": "Die Tätigkeiten, unter denen das Register das Unternehmen einstuft, in einem kanonischen Format. Null, wenn keine angegeben sind.",
                          "items": {
                            "$ref": "#/components/schemas/KYBRegistryIndustry"
                          }
                        },
                        "accounts": {
                          "type": "object",
                          "nullable": true,
                          "additionalProperties": true,
                          "description": "Register-Einreichungsdaten, sofern verfügbar. Jahresmeldungen und Hauptversammlungen verwenden last_annual_return_date und last_agm_date; sie unterscheiden sich von Finanzabschlüssen."
                        },
                        "registry_data": {
                          "$ref": "#/components/schemas/KYBRegistryData"
                        },
                        "user_provided_data": {
                          "type": "object",
                          "nullable": true,
                          "description": "Auf diesem Endpoint immer `null` (wird vom gehosteten KYB-Workflow verwendet, wenn Endbenutzer Registerdaten bearbeiten)."
                        },
                        "confirmed_by_user_at": {
                          "type": "string",
                          "format": "date-time",
                          "nullable": true,
                          "description": "Auf diesem Endpoint immer `null`."
                        },
                        "last_console_edit_at": {
                          "type": "string",
                          "format": "date-time",
                          "nullable": true,
                          "description": "Wird gesetzt, wenn ein Prüfer in der Konsole den Datensatz später bearbeitet."
                        },
                        "is_editable": {
                          "type": "boolean",
                          "description": "Gibt an, ob die aus Registern stammenden Daten im gehosteten Ablauf bzw. der Konsole noch bearbeitet werden können."
                        },
                        "registry_tier_delivered": {
                          "type": "string",
                          "enum": [
                            "basic",
                            "shareholders",
                            "ubo",
                            null
                          ],
                          "description": "Identisch mit dem `registry_tier_delivered` auf oberster Ebene.",
                          "nullable": true
                        },
                        "registry_ownership_status": {
                          "type": "string",
                          "nullable": true,
                          "enum": [
                            "not_requested",
                            "delivered",
                            "not_held",
                            "unavailable",
                            "pending",
                            null
                          ],
                          "description": "`delivered`, wenn die Daten zur Eigentümerstruktur zurückgegeben wurden; `not_held`, wenn das Unternehmensregister geantwortet hat und dieses Unternehmen nicht führt (siehe `registry_data.ownership_error`); `unavailable`, wenn eine Eigentümerstruktur-Stufe angefordert wurde, das Register jedoch keine Daten für dieses Unternehmen hatte oder nicht abgefragt werden konnte (siehe `registry_data.ownership_error`); `pending`, wenn der Abschnitt zur Eigentümerstruktur noch nicht aus dem Register abgerufen wurde und Didit ihn noch vervollständigt; `not_requested` in der Stufe Lite."
                        },
                        "ownership": {
                          "$ref": "#/components/schemas/KYBRegistryOwnership"
                        },
                        "registry_tier": {
                          "type": "string",
                          "nullable": true,
                          "description": "Die vom Workflow angeforderte Register-Stufe: `basic`, `shareholders` oder `ubo`. Auch in `ownership.tier_requested`."
                        },
                        "registry_monitoring": {
                          "type": "object",
                          "nullable": true,
                          "description": "Der neueste Register-Monitor für das Unternehmen oder `null`, wenn keiner vorhanden ist.",
                          "properties": {
                            "uuid": {
                              "type": "string",
                              "format": "uuid"
                            },
                            "status": {
                              "type": "string"
                            },
                            "unavailable_reason": {
                              "type": "string",
                              "nullable": true
                            },
                            "enrolled_at": {
                              "type": "string",
                              "format": "date-time",
                              "nullable": true
                            },
                            "cancelled_at": {
                              "type": "string",
                              "format": "date-time",
                              "nullable": true
                            },
                            "last_bill_date": {
                              "type": "string",
                              "format": "date",
                              "nullable": true
                            },
                            "next_bill_date": {
                              "type": "string",
                              "format": "date",
                              "nullable": true
                            },
                            "last_event_at": {
                              "type": "string",
                              "format": "date-time",
                              "nullable": true
                            },
                            "events_count": {
                              "type": "integer"
                            },
                            "watched_fields": {
                              "description": "Die Unternehmensfelder, die der Monitor überwacht."
                            }
                          }
                        }
                      }
                    },
                    "vendor_data": {
                      "type": "string",
                      "nullable": true,
                      "description": "Wiedergabe der von Ihnen gesendeten `vendor_data`."
                    },
                    "metadata": {
                      "type": "object",
                      "nullable": true,
                      "description": "Rückgabe der von Ihnen gesendeten `metadata`."
                    },
                    "created_at": {
                      "type": "string",
                      "format": "date-time"
                    }
                  }
                },
                "examples": {
                  "Resolved company": {
                    "summary": "Vollständiges Registerprofil (Liste der Funktionsträger aus Platzgründen gekürzt)",
                    "value": {
                      "request_id": "9d4f2c7a-1b3e-4a5c-8d6f-0e9a8b7c6d5e",
                      "kyb_registry": {
                        "uuid": "f1e2d3c4-b5a6-4789-9c0d-1e2f3a4b5c6d",
                        "node_id": "feature_kyb_registry",
                        "status": "In Review",
                        "registry_status": "active",
                        "data_resolved": true,
                        "company_name": "Tesco PLC",
                        "registration_number": "00445790",
                        "country_code": "GB",
                        "region": "",
                        "company_type": "Public Limited Company",
                        "incorporation_date": "1947-11-27",
                        "registered_address": "Tesco House, Shire Park, Kestrel Way, Welwyn Garden City, United Kingdom, AL7 1GA",
                        "tax_number": "GB412 8925 93",
                        "risk_level": "low risk",
                        "verification_status": "verified",
                        "is_from_registry": true,
                        "fetch_status": "resolved",
                        "alternative_names": "TESCO STORES (HOLDINGS) PUBLIC LIMITED COMPANY",
                        "nature_of_business": null,
                        "registered_capital": null,
                        "registered_capital_amount": null,
                        "registered_capital_currency": null,
                        "website": "https://www.tesco.com/",
                        "email": "customer.service@tesco.co.uk",
                        "phone": "03301231688",
                        "legal_entity_identifier": null,
                        "location_of_registration": null,
                        "financial_summary": {
                          "currency": "Pound (£)",
                          "total_number_of_shares": "8174378721",
                          "meta_detail": {
                            "Class_Of_Share": "Ordinary"
                          }
                        },
                        "officers": [
                          {
                            "uuid": "a1b2c3d4-e5f6-4789-9a0b-1c2d3e4f5a6b",
                            "name": "CHRISTOPHER JON TAYLOR",
                            "designation": "Secretary",
                            "role": "secretary",
                            "nationality": null,
                            "is_active": true,
                            "kyc_status": null,
                            "kyc_session_url": null
                          },
                          {
                            "uuid": "b2c3d4e5-f6a7-4890-8b1c-2d3e4f5a6b7c",
                            "name": "MELISSA BETHELL",
                            "designation": "Director",
                            "role": "director",
                            "nationality": "British",
                            "is_active": true,
                            "kyc_status": null,
                            "kyc_session_url": null
                          }
                        ],
                        "beneficial_owners": [],
                        "addresses": [
                          {
                            "address": "Tesco House, Shire Park, Kestrel Way, Welwyn Garden City, United Kingdom, AL7 1GA",
                            "type": "legal_entity_registry_address",
                            "description": "registered office address"
                          }
                        ],
                        "industries": null,
                        "accounts": {
                          "last_account": "26 February 2025",
                          "next_account": "26 February 2026",
                          "due_by_date": "26 August 2026"
                        },
                        "registry_data": {},
                        "user_provided_data": null,
                        "confirmed_by_user_at": null,
                        "last_console_edit_at": null,
                        "is_editable": true
                      },
                      "vendor_data": "company-1234",
                      "metadata": null,
                      "created_at": "2026-06-11T10:45:00.000000+00:00"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Validierungsfehler. Probleme auf Feldebene verwenden die Standard-Envelope von DRF.",
            "content": {
              "application/json": {
                "examples": {
                  "Missing kyb_response_id": {
                    "summary": "`kyb_response_id` ist erforderlich",
                    "value": {
                      "kyb_response_id": [
                        "This field is required."
                      ]
                    }
                  },
                  "save_api_request=false rejected": {
                    "summary": "Auswahlen werden immer persistent gespeichert",
                    "value": {
                      "save_api_request": [
                        "KYB registry select must be saved so billing and retrieval can be tracked."
                      ]
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Zugriff verweigert. Wird zurückgegeben, wenn der Header `x-api-key` fehlt sowie wenn das Guthaben der aufrufenden Organisation den Aufruf nicht decken kann; ein falscher, widerrufener oder abgelaufener Schlüssel gibt `401` zurück. Ein fehlender Schlüssel gibt `403` mit `{\"detail\": ...}` zurück; ein falscher, widerrufener oder abgelaufener Schlüssel gibt `401` zurück. Unzureichende Credits geben `403` mit `{\"error\": ...}` zurück, bevor ein Screening- oder Anbieteraufruf stattfindet.",
            "content": {
              "application/json": {
                "examples": {
                  "Missing or invalid API key": {
                    "summary": "Kein `x-api-key`-Header, oder der Schlüssel ist ungültig/widerrufen",
                    "value": {
                      "detail": "You do not have permission to perform this action."
                    }
                  },
                  "Not enough credits": {
                    "summary": "Das Guthaben der Organisation reicht für den Aufruf nicht aus",
                    "value": {
                      "error": "You don't have enough credits to perform this request. Please top up at https://business.didit.me"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate-Limit überschritten. POST/PATCH/DELETE-Endpoints teilen sich ein Budget von 300 Schreibanfragen pro Minute pro API-Schlüssel (Transaktionserstellungen und Ereignis-Ingestion haben ein separates Budget von 600). Die Antwort enthält die Header `X-RateLimit-Limit`, `X-RateLimit-Remaining`, `X-RateLimit-Reset` und `Retry-After`.",
            "content": {
              "application/json": {
                "examples": {
                  "Write rate limit exceeded": {
                    "summary": "Mehr als 300 Schreibanfragen in der aktuellen Minute",
                    "value": {
                      "detail": "Write request rate limit exceeded. You can make up to 300 requests per minute."
                    }
                  }
                },
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          },
          "202": {
            "description": "Bericht akzeptiert und wird noch verarbeitet. Wenn ein Bericht noch vorbereitet wird, gibt der Endpoint 202 Accepted, kyb_registry.fetch_status=pending und registry_tier_delivered=null zurück. Behalten Sie request_id und rufen Sie GET /v3/session/{request_id}/decision/ ab, bis registry_checks[0].company.fetch_status aufgelöst ist. Didit schließt den Bericht automatisch ab und stellt die gelieferte Stufe in Rechnung, sobald er bereit ist. Wiederholen Sie den Kauf nicht, während er aussteht; jedes neue POST erstellt eine separate Anfrage.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/paths/~1v3~1kyb~1shareholders~1/post/responses/200/content/application~1json/schema"
                },
                "examples": {
                  "Pending (registry still resolving)": {
                    "summary": "Bericht zur Eigentümerstruktur wird noch verarbeitet; die gespeicherte Entscheidung abrufen",
                    "value": {
                      "request_id": "9d4f2c7a-1b3e-4a5c-8d6f-0e9a8b7c6d5e",
                      "kyb_registry": {
                        "uuid": "7c0a4f7e-2b1d-4f6a-9c3e-8d5b2a1f0e9d",
                        "node_id": "feature_kyb_registry",
                        "status": "Not Finished",
                        "registry_status": null,
                        "data_resolved": false,
                        "company_name": "Example Holdings Limited",
                        "registration_number": "12345678",
                        "country_code": "HK",
                        "region": null,
                        "company_type": null,
                        "incorporation_date": null,
                        "registered_address": null,
                        "tax_number": null,
                        "risk_level": null,
                        "verification_status": null,
                        "is_from_registry": true,
                        "fetch_status": "pending",
                        "alternative_names": null,
                        "nature_of_business": null,
                        "registered_capital": null,
                        "registered_capital_amount": null,
                        "registered_capital_currency": null,
                        "website": null,
                        "email": null,
                        "phone": null,
                        "legal_entity_identifier": null,
                        "location_of_registration": null,
                        "financial_summary": {},
                        "officers": [],
                        "beneficial_owners": [],
                        "addresses": null,
                        "industries": null,
                        "accounts": null,
                        "registry_data": {},
                        "user_provided_data": null,
                        "confirmed_by_user_at": null,
                        "last_console_edit_at": null,
                        "is_editable": true,
                        "registry_tier_delivered": null,
                        "registry_ownership_status": "pending"
                      },
                      "vendor_data": "company-1234",
                      "metadata": null,
                      "created_at": "2026-06-11T10:45:00.000000+00:00",
                      "registry_tier_delivered": null,
                      "registry_tier_requested": "shareholders"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/v3/kyb/ubo/": {
      "post": {
        "summary": "KYB-Unternehmensabfrage im Register mit wirtschaftlich Berechtigten (eigenständig)",
        "operationId": "post_v3_kyb_ubo",
        "x-didit-sdk": {
          "resource": "kyb",
          "method": "list_ubos",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Standalone APIs"
        ],
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "parameters": [],
        "description": "Rufen Sie das Lite-Profil, die direkten Gesellschafter **und die wirtschaftlich Berechtigten** ab, die über die Eigentümerstruktur-Kette aufgelöst wurden (`registry_data.ubo_resolution` enthält die Kette der Muttergesellschaften), für einen durch `POST /v3/kyb/search/` zurückgegebenen Kandidaten.\n\n**Kombination mit der Suche.** Übergeben Sie die `kyb_response_id` des Kandidaten genau so, wie sie von einer Suche derselben Anwendung zurückgegeben wurde. Suchen Sie auf der Stufe, die Sie kaufen möchten (`tier` bei `POST /v3/kyb/search/`), da die Suche auf der Registerkette ausgeführt wird, die diese Stufe bedient, und eine leere Lite-Suche kein Beweis dafür ist, dass das Unternehmensregister das Unternehmen nicht führt. Wenn sich die Eigentümerstruktur-Daten des Landes bei einem anderen Unternehmensregister befinden, sucht Didit das Unternehmen dort anhand der Registernummer ohne zusätzliche Kosten erneut.\n\n**Abrechnung.** Abgerechnet zum UBO-Preis des Landes – siehe [Preise für KYB-Unternehmensregister](/de/getting-started/kyb-registry-pricing). Die gelieferte Stufe ist die höchste, die das Land und das Unternehmensregister bereitstellen können: Shareholders, wenn der aufgelöste Bericht keine natürliche Person als wirtschaftlich Berechtigte nennt, Lite, wenn überhaupt kein Eigentümerstruktur-Eintrag existiert; `registry_tier_delivered` nennt die abgerechnete Stufe. Das Guthaben wird vor jedem Registeraufruf mit dem UBO-Preis abgeglichen (`403`, wenn es nicht ausreicht).\n\n**Verfügbarkeit.** Nur v3. Jeder Aufruf erstellt eine Unternehmenssitzung (deren ID die `request_id` ist).\n\n**Ausstehende Berichte.** Wenn ein Bericht noch vorbereitet wird oder der Eigentümerstruktur-Abschnitt noch nicht aus dem Register abgerufen wurde, gibt der Endpoint 202 Accepted, kyb_registry.fetch_status=pending, kyb_registry.registry_ownership_status=pending und registry_tier_delivered=null zurück. Behalten Sie request_id und rufen Sie GET /v3/session/{request_id}/decision/ ab, bis registry_checks[0].company.fetch_status aufgelöst ist. Didit vervollständigt den Bericht automatisch und berechnet die gelieferte Stufe, sobald er bereit ist. Wiederholen Sie den Kauf nicht, während er aussteht; jedes neue POST erstellt eine separate Anfrage.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/KYBRegistryCandidateRequest"
              },
              "example": {
                "kyb_response_id": "69aeeb95febb0f1704042259",
                "vendor_data": "company-1234"
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X POST https://verification.didit.me/v3/kyb/ubo/ \\\n  -H 'x-api-key: YOUR_API_KEY' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\n    \"kyb_response_id\": \"69aeeb95febb0f1704042259\",\n    \"vendor_data\": \"company-1234\"\n  }'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.kyb.list_ubos(\n    kyb_response_id=\"69aeeb95febb0f1704042259\",\n    vendor_data=\"company-1234\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.kyb.listUbos({\n  kyb_response_id: \"69aeeb95febb0f1704042259\",\n  vendor_data: \"company-1234\",\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.KYB.ListUBOs(ctx, didit.KYBRegistryCandidateRequest{\n\tKYBResponseID: \"69aeeb95febb0f1704042259\",\n\tVendorData:    didit.String(\"company-1234\"),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\nimport me.didit.types.KYBRegistryCandidateRequest;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.kyb().listUbos(KYBRegistryCandidateRequest.builder()\n        .kybResponseId(\"69aeeb95febb0f1704042259\")\n        .vendorData(\"company-1234\")\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->kyb->listUbos([\n    'kyb_response_id' => '69aeeb95febb0f1704042259',\n    'vendor_data' => 'company-1234',\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.kyb.list_ubos(\n  kyb_response_id: \"69aeeb95febb0f1704042259\",\n  vendor_data: \"company-1234\"\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Kyb.ListUbosAsync(new KYBRegistryCandidateRequest\n{\n    KybResponseId = \"69aeeb95febb0f1704042259\",\n    VendorData = \"company-1234\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "responses": {
          "200": {
            "description": "Unternehmensbericht zurückgegeben und zur gelieferten Stufe abgerechnet. Eigentümerstruktur-Berichte, die noch vorbereitet werden, können 202 zurückgeben; behalten Sie request_id, um deren gespeicherte Entscheidung abzurufen.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "request_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "ID der Unternehmenssitzung, die für diesen Abruf erstellt wurde. Der gespeicherte Datensatz (in der Konsole sichtbar) wird weiter aktualisiert, falls das Register die Abfrage erst nach der Antwort auflöst."
                    },
                    "registry_tier_requested": {
                      "type": "string",
                      "enum": [
                        "basic",
                        "shareholders",
                        "ubo"
                      ],
                      "description": "Die Stufe, die dieser Endpoint bereitstellt: `basic` (Lite) für ausgewählte, `shareholders`, `ubo`."
                    },
                    "registry_tier_delivered": {
                      "type": "string",
                      "enum": [
                        "basic",
                        "shareholders",
                        "ubo",
                        null
                      ],
                      "description": "Die tatsächlich gelieferte und abgerechnete Stufe. Niedriger als angefordert, wenn die Register des Landes keine Eigentümerdaten enthalten, wenn das Register keinen Eigentümereintrag für dieses Unternehmen führt oder wenn der aufgelöste Bericht einer `ubo`-Anfrage keine natürliche Person als wirtschaftlich Berechtigten nennt.",
                      "nullable": true
                    },
                    "kyb_registry": {
                      "type": "object",
                      "description": "Vollständiges Unternehmensprofil aus dem Register.",
                      "properties": {
                        "uuid": {
                          "type": "string",
                          "format": "uuid",
                          "description": "Didits ID für diesen Unternehmensdatensatz."
                        },
                        "node_id": {
                          "type": "string",
                          "example": "feature_kyb_registry"
                        },
                        "status": {
                          "type": "string",
                          "enum": [
                            "Not Finished",
                            "Approved",
                            "Declined",
                            "In Review"
                          ],
                          "description": "Didits Bewertung der Registerprüfung (z. B. `In Review`, wenn das Unternehmen im Register nicht aktiv ist oder die Daten zur Eigentümerstruktur nicht abgeleitet werden konnten)."
                        },
                        "registry_status": {
                          "type": "string",
                          "nullable": true,
                          "enum": [
                            "active",
                            "dissolved",
                            "deregistered",
                            "see full details",
                            "authorised",
                            "appointed representative",
                            "unauthorised",
                            "inactive",
                            "no longer authorised",
                            "closed",
                            "struck off",
                            null
                          ],
                          "description": "Normalisierter Unternehmensstatus gemäß den Angaben des Registers."
                        },
                        "data_resolved": {
                          "type": "boolean",
                          "description": "`true`, sobald das Register das vollständige Profil zurückgegeben hat. `false`, wenn das Register nach dem Polling noch in Bearbeitung war – der gespeicherte Datensatz wird automatisch vervollständigt, sobald das Register den Vorgang abgeschlossen hat."
                        },
                        "company_name": {
                          "type": "string",
                          "example": "Tesco PLC"
                        },
                        "registration_number": {
                          "type": "string",
                          "nullable": true,
                          "example": "00445790"
                        },
                        "country_code": {
                          "type": "string",
                          "description": "ISO 3166-1-Alpha-2.",
                          "example": "GB"
                        },
                        "region": {
                          "type": "string",
                          "nullable": true,
                          "description": "Unterteilungscode, wenn das Register regional ist (z. B. `CA` für `US-CA`); andernfalls leer."
                        },
                        "company_type": {
                          "type": "string",
                          "nullable": true,
                          "example": "Public Limited Company"
                        },
                        "incorporation_date": {
                          "type": "string",
                          "format": "date",
                          "nullable": true,
                          "example": "1947-11-27"
                        },
                        "registered_address": {
                          "type": "string",
                          "nullable": true,
                          "example": "Tesco House, Shire Park, Kestrel Way, Welwyn Garden City, United Kingdom, AL7 1GA"
                        },
                        "tax_number": {
                          "type": "string",
                          "nullable": true,
                          "example": "GB412 8925 93"
                        },
                        "risk_level": {
                          "type": "string",
                          "nullable": true,
                          "description": "Vom Register gemeldete Risikostufe, sofern verfügbar."
                        },
                        "verification_status": {
                          "type": "string",
                          "enum": [
                            "verified",
                            "failed",
                            "unknown"
                          ],
                          "nullable": true,
                          "description": "Status der jurisdiktionsübergreifenden Verifizierung: `verified`, wenn der Registerstatus den Fortbestand bestätigt (`active`), `failed`, wenn das Unternehmen laut Register nicht mehr besteht (z. B. `dissolved`), andernfalls `unknown`. `null` bei einem Unternehmen, das nicht aus einem Register stammt, sowie solange eine Auswahl noch `pending` ist."
                        },
                        "is_from_registry": {
                          "type": "boolean",
                          "description": "Für diesen Endpoint immer `true` – das Profil wurde aus einem offiziellen Register abgerufen."
                        },
                        "fetch_status": {
                          "type": "string",
                          "enum": [
                            "pending",
                            "resolved"
                          ],
                          "description": "Lebenszyklus des Registerabrufs. Gespiegelt durch `data_resolved`."
                        },
                        "alternative_names": {
                          "type": "string",
                          "nullable": true,
                          "description": "Alternative Namen, Handelsnamen, frühere Namen oder Unternehmensnamen in der Originalsprache als Text, sofern gemeldet."
                        },
                        "nature_of_business": {
                          "type": "string",
                          "nullable": true,
                          "description": "Tätigkeitsbeschreibung oder Klassifizierungscode, sofern gemeldet."
                        },
                        "registered_capital": {
                          "type": "string",
                          "nullable": true
                        },
                        "registered_capital_amount": {
                          "type": "string",
                          "nullable": true,
                          "description": "Dezimalbetrag als Zeichenkette, sofern gemeldet."
                        },
                        "registered_capital_currency": {
                          "type": "string",
                          "nullable": true,
                          "description": "ISO 4217-Code, sofern gemeldet."
                        },
                        "website": {
                          "type": "string",
                          "nullable": true,
                          "example": "https://www.tesco.com/"
                        },
                        "email": {
                          "type": "string",
                          "nullable": true,
                          "example": "customer.service@tesco.co.uk"
                        },
                        "phone": {
                          "type": "string",
                          "nullable": true,
                          "example": "03301231688"
                        },
                        "legal_entity_identifier": {
                          "type": "string",
                          "nullable": true,
                          "description": "LEI, sofern gemeldet."
                        },
                        "location_of_registration": {
                          "type": "string",
                          "nullable": true,
                          "description": "Register/Jurisdiktion, bei dem/der das Unternehmen eingetragen ist, sofern gemeldet."
                        },
                        "vat_number": {
                          "type": "string",
                          "nullable": true,
                          "description": "EU-USt-IdNr., wenn während des gehosteten Registerschritts erfasst oder nachträglich bearbeitet. Zum Zeitpunkt der Auswahl ist dies normalerweise noch nicht festgelegt – die Validierung von USt-IdNr. und Steuernummer wird ausgeführt, wenn der Endbenutzer den Registerschritt im gehosteten Ablauf übermittelt."
                        },
                        "vat_validation_status": {
                          "type": "string",
                          "enum": [
                            "valid",
                            "invalid",
                            "format_valid",
                            "invalid_format",
                            "could_not_validate",
                            "not_applicable"
                          ],
                          "description": "Ergebnis der Validierung der USt-IdNr. oder, falls keine vorhanden ist, der `tax_number` bei der Registerübermittlung. `valid` / `invalid`: entschieden durch das offizielle Register des Landes (EU-VIES, Norwegen, Schweiz, Brasilien, Kolumbien, Costa Rica, Ecuador, Paraguay; Polen auch über sein nationales USt-Register). `format_valid` / `invalid_format`: entschieden durch die Format- und Prüfzifferregeln des Landes, wenn kein Register abgefragt werden kann. `could_not_validate`: das Register war nicht verfügbar. `not_applicable`: keine Nummer, ein Land ohne Register oder Regeln oder eine Sandbox-Sitzung."
                        },
                        "vat_validated_number": {
                          "type": "string",
                          "nullable": true,
                          "description": "Die geprüfte Nummer, wie sie der Quelle bekannt ist (beispielsweise die aus einer französischen SIREN oder einer niederländischen RSIN abgeleitete Umsatzsteuer-Identifikationsnummer). `null`, wenn keine Prüfung durchgeführt wurde."
                        },
                        "vat_validation_source": {
                          "type": "string",
                          "nullable": true,
                          "enum": [
                            "eu_vies",
                            "pl_vat_white_list",
                            "no_brreg",
                            "ch_uid_register",
                            "br_receita_federal",
                            "co_rues",
                            "cr_hacienda",
                            "ec_sri",
                            "py_dnit",
                            "format_rules",
                            null
                          ],
                          "description": "Die Quelle, die `vat_validation_status` festgelegt hat: ein offizielles Register oder `format_rules`. `null`, wenn keine Prüfung durchgeführt wurde."
                        },
                        "vat_validated_name": {
                          "type": "string",
                          "nullable": true,
                          "description": "Name, der bei der Quelle registriert ist, die die Nummer validiert hat, sofern sie einen offenlegt. Wird nur gesetzt, wenn der Status `valid` ist."
                        },
                        "vat_validated_address": {
                          "type": "string",
                          "nullable": true,
                          "description": "Bei der Quelle registrierte Adresse, die die Nummer validiert hat, sofern diese eine offenlegt. Wird nur festgelegt, wenn der Status `valid` ist."
                        },
                        "vat_checked_at": {
                          "type": "string",
                          "format": "date-time",
                          "nullable": true,
                          "description": "Zeitstempel der Prüfung. `null`, wenn keine Prüfung durchgeführt wurde."
                        },
                        "financial_summary": {
                          "type": "object",
                          "nullable": true,
                          "description": "Vom Register gemeldete Anteils-/Kapitaldetails (Währung, Gesamtaktien, Anteilsklassen), sofern verfügbar."
                        },
                        "officers": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "uuid": {
                                "type": "string",
                                "format": "uuid"
                              },
                              "name": {
                                "type": "string",
                                "example": "MELISSA BETHELL"
                              },
                              "designation": {
                                "type": "string",
                                "nullable": true,
                                "description": "Unverarbeitete Registerbezeichnung (z. B. `Director`, `Secretary`)."
                              },
                              "role": {
                                "type": "string",
                                "description": "Normalisierte Rolle, abgeleitet aus der Bezeichnung. Vollständiges Modellset mit 17 Werten; das Register-Parsing an diesem Endpoint gibt typischerweise director, non_executive_director, secretary, chairman oder company_officer aus.",
                                "enum": [
                                  "director",
                                  "non_executive_director",
                                  "secretary",
                                  "chairman",
                                  "ubo",
                                  "shareholder",
                                  "representative",
                                  "founder",
                                  "legal_advisor",
                                  "authorized_signatory",
                                  "trustee",
                                  "beneficiary",
                                  "company_officer",
                                  "settlor",
                                  "protector",
                                  "investor",
                                  "other"
                                ]
                              },
                              "nationality": {
                                "type": "string",
                                "nullable": true
                              },
                              "is_active": {
                                "type": "boolean",
                                "description": "`false`, wenn das Register vermerkt, dass die Bestellung niedergelegt wurde."
                              },
                              "kyc_status": {
                                "type": "string",
                                "nullable": true,
                                "enum": [
                                  "Approved",
                                  "Declined",
                                  "Pending",
                                  null
                                ],
                                "description": "Status einer zugehörigen KYC-Sitzung, sofern für diesen Officer eine gestartet wurde. Andernfalls `null`."
                              },
                              "kyc_session_url": {
                                "type": "string",
                                "nullable": true,
                                "description": "Verifizierungs-URL der zugehörigen KYC-Sitzung, sofern vorhanden."
                              },
                              "first_name": {
                                "type": "string",
                                "nullable": true,
                                "description": "Vorname, wenn vom Register ausdrücklich gemeldet; nicht aus dem vollständigen Namen abgeleitet."
                              },
                              "last_name": {
                                "type": "string",
                                "nullable": true,
                                "description": "Nachname, sofern vom Register explizit gemeldet."
                              },
                              "address": {
                                "type": "string",
                                "nullable": true,
                                "description": "Vom Register gemeldete Adresse des Amtsträgers."
                              },
                              "appointment_date": {
                                "type": "string",
                                "nullable": true,
                                "description": "Datum, an dem die Führungskraft bestellt wurde.",
                                "format": "date"
                              },
                              "termination_date": {
                                "type": "string",
                                "nullable": true,
                                "description": "Datum, an dem die Bestellung endete, sofern gemeldet.",
                                "format": "date"
                              },
                              "date_of_birth": {
                                "type": "string",
                                "nullable": true,
                                "description": "Vollständiges, vom Unternehmensregister gemeldetes Geburtsdatum. Null, wenn nur ein Geburtsjahr oder -monat bekannt ist.",
                                "format": "date"
                              },
                              "date_of_birth_year": {
                                "type": "integer",
                                "nullable": true,
                                "minimum": 1,
                                "maximum": 9999,
                                "description": "Vom Register gemeldetes Geburtsjahr, auch wenn das vollständige Datum nicht verfügbar ist."
                              },
                              "date_of_birth_month": {
                                "type": "integer",
                                "nullable": true,
                                "minimum": 1,
                                "maximum": 12,
                                "description": "Vom Register gemeldeter Geburtsmonat. Null, wenn nur das Jahr bekannt ist."
                              }
                            }
                          },
                          "description": "Geschäftsführer, Sekretäre und andere Funktionsträger, die aus dem Register extrahiert wurden."
                        },
                        "beneficial_owners": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "uuid": {
                                "type": "string",
                                "format": "uuid"
                              },
                              "name": {
                                "type": "string"
                              },
                              "first_name": {
                                "type": "string",
                                "nullable": true
                              },
                              "last_name": {
                                "type": "string",
                                "nullable": true
                              },
                              "entity_type": {
                                "type": "string",
                                "enum": [
                                  "person",
                                  "company"
                                ],
                                "description": "Gibt an, ob der Eigentümer eine natürliche Person oder eine juristische Person ist."
                              },
                              "roles": {
                                "type": "array",
                                "items": {
                                  "type": "string"
                                },
                                "description": "Normalisierte Rollen (z. B. `ubo`, `shareholder`)."
                              },
                              "ownership_min_shares": {
                                "type": "string",
                                "nullable": true,
                                "description": "Untergrenze der vom Register gemeldeten Eigentumsspanne (z. B. `25%`)."
                              },
                              "ownership_max_shares": {
                                "type": "string",
                                "nullable": true,
                                "description": "Obergrenze des vom Register gemeldeten Eigentumsbereichs."
                              },
                              "is_active": {
                                "type": "boolean"
                              },
                              "kyc_status": {
                                "type": "string",
                                "nullable": true,
                                "enum": [
                                  "Approved",
                                  "Declined",
                                  "Pending",
                                  null
                                ]
                              },
                              "kyc_session_url": {
                                "type": "string",
                                "nullable": true
                              },
                              "effective_ownership_percent": {
                                "type": "number",
                                "nullable": true,
                                "description": "Geparster Eigentumsanteil (Obergrenze, mit Fallback auf Untergrenze)."
                              },
                              "company_name": {
                                "type": "string",
                                "nullable": true
                              },
                              "registration_number": {
                                "type": "string",
                                "nullable": true
                              },
                              "country_of_birth": {
                                "type": "string",
                                "nullable": true
                              },
                              "email": {
                                "type": "string",
                                "nullable": true
                              },
                              "nationality": {
                                "type": "string",
                                "nullable": true
                              },
                              "designation": {
                                "type": "string",
                                "nullable": true
                              },
                              "voting_min_shares": {
                                "type": "string",
                                "nullable": true
                              },
                              "voting_max_shares": {
                                "type": "string",
                                "nullable": true
                              },
                              "date_of_birth": {
                                "type": "string",
                                "nullable": true,
                                "description": "Vollständiges Geburtsdatum, sofern gemeldet.",
                                "format": "date"
                              },
                              "appointment_date": {
                                "type": "string",
                                "nullable": true,
                                "description": "Datum der Bestellung, sofern gemeldet.",
                                "format": "date"
                              },
                              "shareholding": {
                                "$ref": "#/components/schemas/KYBRegistryShareholding"
                              }
                            }
                          },
                          "description": "Aus dem Register extrahierte wirtschaftlich Berechtigte / Personen mit maßgeblichem Einfluss. Kann leer sein, wenn das Register die Eigentümerstruktur nicht offenlegt."
                        },
                        "addresses": {
                          "type": "array",
                          "nullable": true,
                          "description": "Jede vom Register angegebene Adresse in einheitlicher Form. Null, wenn keine angegeben ist.",
                          "items": {
                            "$ref": "#/components/schemas/KYBRegistryAddress"
                          }
                        },
                        "industries": {
                          "type": "array",
                          "nullable": true,
                          "description": "Die Tätigkeiten, unter denen das Register das Unternehmen einstuft, in einem kanonischen Format. Null, wenn keine angegeben sind.",
                          "items": {
                            "$ref": "#/components/schemas/KYBRegistryIndustry"
                          }
                        },
                        "accounts": {
                          "type": "object",
                          "nullable": true,
                          "additionalProperties": true,
                          "description": "Register-Einreichungsdaten, sofern verfügbar. Jahresmeldungen und Hauptversammlungen verwenden last_annual_return_date und last_agm_date; sie unterscheiden sich von Finanzabschlüssen."
                        },
                        "registry_data": {
                          "$ref": "#/components/schemas/KYBRegistryData"
                        },
                        "user_provided_data": {
                          "type": "object",
                          "nullable": true,
                          "description": "Auf diesem Endpoint immer `null` (wird vom gehosteten KYB-Workflow verwendet, wenn Endbenutzer Registerdaten bearbeiten)."
                        },
                        "confirmed_by_user_at": {
                          "type": "string",
                          "format": "date-time",
                          "nullable": true,
                          "description": "Auf diesem Endpoint immer `null`."
                        },
                        "last_console_edit_at": {
                          "type": "string",
                          "format": "date-time",
                          "nullable": true,
                          "description": "Wird gesetzt, wenn ein Prüfer in der Konsole den Datensatz später bearbeitet."
                        },
                        "is_editable": {
                          "type": "boolean",
                          "description": "Gibt an, ob die aus Registern stammenden Daten im gehosteten Ablauf bzw. der Konsole noch bearbeitet werden können."
                        },
                        "registry_tier_delivered": {
                          "type": "string",
                          "enum": [
                            "basic",
                            "shareholders",
                            "ubo",
                            null
                          ],
                          "description": "Identisch mit dem `registry_tier_delivered` auf oberster Ebene.",
                          "nullable": true
                        },
                        "registry_ownership_status": {
                          "type": "string",
                          "nullable": true,
                          "enum": [
                            "not_requested",
                            "delivered",
                            "not_held",
                            "unavailable",
                            "pending",
                            null
                          ],
                          "description": "`delivered`, wenn die Daten zur Eigentümerstruktur zurückgegeben wurden; `not_held`, wenn das Unternehmensregister geantwortet hat und dieses Unternehmen nicht führt (siehe `registry_data.ownership_error`); `unavailable`, wenn eine Eigentümerstruktur-Stufe angefordert wurde, das Register jedoch keine Daten für dieses Unternehmen hatte oder nicht abgefragt werden konnte (siehe `registry_data.ownership_error`); `pending`, wenn der Abschnitt zur Eigentümerstruktur noch nicht aus dem Register abgerufen wurde und Didit ihn noch vervollständigt; `not_requested` in der Stufe Lite."
                        },
                        "ownership": {
                          "$ref": "#/components/schemas/KYBRegistryOwnership"
                        },
                        "registry_tier": {
                          "type": "string",
                          "nullable": true,
                          "description": "Die vom Workflow angeforderte Register-Stufe: `basic`, `shareholders` oder `ubo`. Auch in `ownership.tier_requested`."
                        },
                        "registry_monitoring": {
                          "type": "object",
                          "nullable": true,
                          "description": "Der neueste Register-Monitor für das Unternehmen oder `null`, wenn keiner vorhanden ist.",
                          "properties": {
                            "uuid": {
                              "type": "string",
                              "format": "uuid"
                            },
                            "status": {
                              "type": "string"
                            },
                            "unavailable_reason": {
                              "type": "string",
                              "nullable": true
                            },
                            "enrolled_at": {
                              "type": "string",
                              "format": "date-time",
                              "nullable": true
                            },
                            "cancelled_at": {
                              "type": "string",
                              "format": "date-time",
                              "nullable": true
                            },
                            "last_bill_date": {
                              "type": "string",
                              "format": "date",
                              "nullable": true
                            },
                            "next_bill_date": {
                              "type": "string",
                              "format": "date",
                              "nullable": true
                            },
                            "last_event_at": {
                              "type": "string",
                              "format": "date-time",
                              "nullable": true
                            },
                            "events_count": {
                              "type": "integer"
                            },
                            "watched_fields": {
                              "description": "Die Unternehmensfelder, die der Monitor überwacht."
                            }
                          }
                        }
                      }
                    },
                    "vendor_data": {
                      "type": "string",
                      "nullable": true,
                      "description": "Wiedergabe der von Ihnen gesendeten `vendor_data`."
                    },
                    "metadata": {
                      "type": "object",
                      "nullable": true,
                      "description": "Rückgabe der von Ihnen gesendeten `metadata`."
                    },
                    "created_at": {
                      "type": "string",
                      "format": "date-time"
                    }
                  }
                },
                "examples": {
                  "Resolved company": {
                    "summary": "Vollständiges Registerprofil (Liste der Funktionsträger aus Platzgründen gekürzt)",
                    "value": {
                      "request_id": "9d4f2c7a-1b3e-4a5c-8d6f-0e9a8b7c6d5e",
                      "kyb_registry": {
                        "uuid": "f1e2d3c4-b5a6-4789-9c0d-1e2f3a4b5c6d",
                        "node_id": "feature_kyb_registry",
                        "status": "In Review",
                        "registry_status": "active",
                        "data_resolved": true,
                        "company_name": "Tesco PLC",
                        "registration_number": "00445790",
                        "country_code": "GB",
                        "region": "",
                        "company_type": "Public Limited Company",
                        "incorporation_date": "1947-11-27",
                        "registered_address": "Tesco House, Shire Park, Kestrel Way, Welwyn Garden City, United Kingdom, AL7 1GA",
                        "tax_number": "GB412 8925 93",
                        "risk_level": "low risk",
                        "verification_status": "verified",
                        "is_from_registry": true,
                        "fetch_status": "resolved",
                        "alternative_names": "TESCO STORES (HOLDINGS) PUBLIC LIMITED COMPANY",
                        "nature_of_business": null,
                        "registered_capital": null,
                        "registered_capital_amount": null,
                        "registered_capital_currency": null,
                        "website": "https://www.tesco.com/",
                        "email": "customer.service@tesco.co.uk",
                        "phone": "03301231688",
                        "legal_entity_identifier": null,
                        "location_of_registration": null,
                        "financial_summary": {
                          "currency": "Pound (£)",
                          "total_number_of_shares": "8174378721",
                          "meta_detail": {
                            "Class_Of_Share": "Ordinary"
                          }
                        },
                        "officers": [
                          {
                            "uuid": "a1b2c3d4-e5f6-4789-9a0b-1c2d3e4f5a6b",
                            "name": "CHRISTOPHER JON TAYLOR",
                            "designation": "Secretary",
                            "role": "secretary",
                            "nationality": null,
                            "is_active": true,
                            "kyc_status": null,
                            "kyc_session_url": null
                          },
                          {
                            "uuid": "b2c3d4e5-f6a7-4890-8b1c-2d3e4f5a6b7c",
                            "name": "MELISSA BETHELL",
                            "designation": "Director",
                            "role": "director",
                            "nationality": "British",
                            "is_active": true,
                            "kyc_status": null,
                            "kyc_session_url": null
                          }
                        ],
                        "beneficial_owners": [],
                        "addresses": [
                          {
                            "address": "Tesco House, Shire Park, Kestrel Way, Welwyn Garden City, United Kingdom, AL7 1GA",
                            "type": "legal_entity_registry_address",
                            "description": "registered office address"
                          }
                        ],
                        "industries": null,
                        "accounts": {
                          "last_account": "26 February 2025",
                          "next_account": "26 February 2026",
                          "due_by_date": "26 August 2026"
                        },
                        "registry_data": {
                          "ubo_resolution": {
                            "parent_chain": [],
                            "subsidiaries": [],
                            "unresolved": []
                          }
                        },
                        "user_provided_data": null,
                        "confirmed_by_user_at": null,
                        "last_console_edit_at": null,
                        "is_editable": true
                      },
                      "vendor_data": "company-1234",
                      "metadata": null,
                      "created_at": "2026-06-11T10:45:00.000000+00:00"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Validierungsfehler. Probleme auf Feldebene verwenden die Standard-Envelope von DRF.",
            "content": {
              "application/json": {
                "examples": {
                  "Missing kyb_response_id": {
                    "summary": "`kyb_response_id` ist erforderlich",
                    "value": {
                      "kyb_response_id": [
                        "This field is required."
                      ]
                    }
                  },
                  "save_api_request=false rejected": {
                    "summary": "Auswahlen werden immer persistent gespeichert",
                    "value": {
                      "save_api_request": [
                        "KYB registry select must be saved so billing and retrieval can be tracked."
                      ]
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Zugriff verweigert. Wird zurückgegeben, wenn der Header `x-api-key` fehlt sowie wenn das Guthaben der aufrufenden Organisation den Aufruf nicht decken kann; ein falscher, widerrufener oder abgelaufener Schlüssel gibt `401` zurück. Ein fehlender Schlüssel gibt `403` mit `{\"detail\": ...}` zurück; ein falscher, widerrufener oder abgelaufener Schlüssel gibt `401` zurück. Unzureichende Credits geben `403` mit `{\"error\": ...}` zurück, bevor ein Screening- oder Anbieteraufruf stattfindet.",
            "content": {
              "application/json": {
                "examples": {
                  "Missing or invalid API key": {
                    "summary": "Kein `x-api-key`-Header, oder der Schlüssel ist ungültig/widerrufen",
                    "value": {
                      "detail": "You do not have permission to perform this action."
                    }
                  },
                  "Not enough credits": {
                    "summary": "Das Guthaben der Organisation reicht für den Aufruf nicht aus",
                    "value": {
                      "error": "You don't have enough credits to perform this request. Please top up at https://business.didit.me"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate-Limit überschritten. POST/PATCH/DELETE-Endpoints teilen sich ein Budget von 300 Schreibanfragen pro Minute pro API-Schlüssel (Transaktionserstellungen und Ereignis-Ingestion haben ein separates Budget von 600). Die Antwort enthält die Header `X-RateLimit-Limit`, `X-RateLimit-Remaining`, `X-RateLimit-Reset` und `Retry-After`.",
            "content": {
              "application/json": {
                "examples": {
                  "Write rate limit exceeded": {
                    "summary": "Mehr als 300 Schreibanfragen in der aktuellen Minute",
                    "value": {
                      "detail": "Write request rate limit exceeded. You can make up to 300 requests per minute."
                    }
                  }
                },
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          },
          "202": {
            "description": "Bericht akzeptiert und wird noch verarbeitet. Wenn ein Bericht noch vorbereitet wird, gibt der Endpoint 202 Accepted, kyb_registry.fetch_status=pending und registry_tier_delivered=null zurück. Behalten Sie request_id und rufen Sie GET /v3/session/{request_id}/decision/ ab, bis registry_checks[0].company.fetch_status aufgelöst ist. Didit schließt den Bericht automatisch ab und stellt die gelieferte Stufe in Rechnung, sobald er bereit ist. Wiederholen Sie den Kauf nicht, während er aussteht; jedes neue POST erstellt eine separate Anfrage.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/paths/~1v3~1kyb~1ubo~1/post/responses/200/content/application~1json/schema"
                },
                "examples": {
                  "Pending (registry still resolving)": {
                    "summary": "Bericht zur Eigentümerstruktur wird noch verarbeitet; die gespeicherte Entscheidung abrufen",
                    "value": {
                      "request_id": "9d4f2c7a-1b3e-4a5c-8d6f-0e9a8b7c6d5e",
                      "kyb_registry": {
                        "uuid": "7c0a4f7e-2b1d-4f6a-9c3e-8d5b2a1f0e9d",
                        "node_id": "feature_kyb_registry",
                        "status": "Not Finished",
                        "registry_status": null,
                        "data_resolved": false,
                        "company_name": "Example Holdings Limited",
                        "registration_number": "12345678",
                        "country_code": "HK",
                        "region": null,
                        "company_type": null,
                        "incorporation_date": null,
                        "registered_address": null,
                        "tax_number": null,
                        "risk_level": null,
                        "verification_status": null,
                        "is_from_registry": true,
                        "fetch_status": "pending",
                        "alternative_names": null,
                        "nature_of_business": null,
                        "registered_capital": null,
                        "registered_capital_amount": null,
                        "registered_capital_currency": null,
                        "website": null,
                        "email": null,
                        "phone": null,
                        "legal_entity_identifier": null,
                        "location_of_registration": null,
                        "financial_summary": {},
                        "officers": [],
                        "beneficial_owners": [],
                        "addresses": null,
                        "industries": null,
                        "accounts": null,
                        "registry_data": {},
                        "user_provided_data": null,
                        "confirmed_by_user_at": null,
                        "last_console_edit_at": null,
                        "is_editable": true,
                        "registry_tier_delivered": null,
                        "registry_ownership_status": "pending"
                      },
                      "vendor_data": "company-1234",
                      "metadata": null,
                      "created_at": "2026-06-11T10:45:00.000000+00:00",
                      "registry_tier_delivered": null,
                      "registry_tier_requested": "ubo"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/v3/id-verification/wallets/": {
      "get": {
        "operationId": "list_wallets",
        "x-didit-sdk": {
          "resource": "id_wallets",
          "method": "list",
          "auth": "api_key",
          "server": true
        },
        "description": "Jede Digital-ID-Wallet mit ihrem Start-Endpoint, Ländern, erforderlichen Feldern und der Angabe, ob diese Anwendung sie in dieser Umgebung jetzt starten kann. Die Auflistung bedeutet nicht, dass die Wallet aktiv ist.",
        "summary": "Digitale ID-Wallets auflisten",
        "tags": [
          "Digital ID wallets"
        ],
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletCatalogResponse"
                }
              }
            },
            "description": ""
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiClientCredentialsForbiddenErrorMessage"
                }
              }
            },
            "description": "Fehlende Anmeldedaten (x-api-key oder Authorization: Bearer)."
          }
        },
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "cURL",
            "source": "curl --request GET \\\n  --url https://verification.didit.me/v3/id-verification/wallets/ \\\n  --header 'x-api-key: YOUR_API_KEY'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.id_wallets.list()\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.idWallets.list();\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.IDWallets.List(ctx)\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.idWallets().list();\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->idWallets->list();\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.id_wallets.list\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.IdWallets.ListAsync();\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ]
      }
    },
    "/v3/id-verification/wallets/verifications/{request_id}/": {
      "get": {
        "operationId": "get_wallet_verification",
        "x-didit-sdk": {
          "resource": "id_wallets",
          "method": "retrieve_verification",
          "auth": "api_key",
          "server": true
        },
        "description": "Status und Ergebnis einer Wallet-Verifizierung: die normalisierte Identität und die Wallet-eigenen Attribute nach erfolgreicher Verifizierung, der Fehlercode nach Ablehnung, die nächste Aktion, solange die Verifizierung aussteht. Eine Verifizierung nach expires_at wird als Timeout entschieden.",
        "summary": "Wallet-Verifizierung abrufen",
        "parameters": [
          {
            "in": "path",
            "name": "request_id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Die vom Start-Endpoint zurückgegebene request_id.",
            "required": true
          }
        ],
        "tags": [
          "Digital ID wallets"
        ],
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationResponse"
                },
                "example": {
                  "request_id": "00000000-0000-4000-8000-000000000001",
                  "wallet_verification": {
                    "wallet": {
                      "id": "ftn",
                      "name": "Finnish Trust Network",
                      "issuing_authority": "Finnish banks and mobile operators (FTN)"
                    },
                    "country": "FIN",
                    "status": "Not Finished",
                    "outcome": "pending",
                    "error": null,
                    "interaction": "redirect",
                    "simulated": false,
                    "expires_at": "2026-01-01T10:10:00Z",
                    "next_action": {
                      "type": "redirect",
                      "url": "https://wallet.example.com/authorize"
                    },
                    "identity": null,
                    "attributes": null,
                    "level_of_assurance": null,
                    "verified_at": null,
                    "signature_valid": null,
                    "credential_type": "person_identification"
                  },
                  "vendor_data": "your-customer-reference",
                  "metadata": {
                    "reference": "example"
                  },
                  "created_at": "2026-01-01T10:00:00Z"
                }
              }
            },
            "description": ""
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiClientCredentialsForbiddenErrorMessage"
                }
              }
            },
            "description": "Fehlende Anmeldedaten (x-api-key oder Authorization: Bearer)."
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationError"
                }
              }
            },
            "description": "Fehler not_found: Keine Wallet-Verifizierung dieser Anwendung hat diese request_id."
          }
        },
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "cURL",
            "source": "curl --request GET \\\n  --url https://verification.didit.me/v3/id-verification/wallets/verifications/REQUEST_ID/ \\\n  --header 'x-api-key: YOUR_API_KEY'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.id_wallets.retrieve_verification(\n    \"11111111-2222-3333-4444-555555555555\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.idWallets.retrieveVerification(\"11111111-2222-3333-4444-555555555555\");\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.IDWallets.RetrieveVerification(ctx, \"11111111-2222-3333-4444-555555555555\")\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.idWallets().retrieveVerification(\"11111111-2222-3333-4444-555555555555\");\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->idWallets->retrieveVerification('11111111-2222-3333-4444-555555555555');\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.id_wallets.retrieve_verification(\"11111111-2222-3333-4444-555555555555\")\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.IdWallets.RetrieveVerificationAsync(\"11111111-2222-3333-4444-555555555555\");\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ]
      }
    },
    "/v3/id-verification/wallets/verifications/{request_id}/poll/": {
      "post": {
        "operationId": "poll_wallet_verification",
        "x-didit-sdk": {
          "resource": "id_wallets",
          "method": "poll_verification",
          "auth": "api_key",
          "server": true
        },
        "description": "Smart-ID und Mobile-ID: Den Anbieter fragen, ob der Benutzer die Aufforderung bestätigt, abgelehnt oder verstreichen lassen hat, und die signierte Identität verifizieren, wenn der Benutzer bestätigt hat. Weiterleitungs-Wallets werden über den Browser des Benutzers abgeschlossen, sodass hierfür die Verifizierung lediglich zurückgelesen wird. Gibt die Verifizierung anschließend in ihrem aktuellen Zustand zurück.",
        "summary": "Wallet-Verifizierung abfragen",
        "parameters": [
          {
            "in": "path",
            "name": "request_id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Die vom Start-Endpoint zurückgegebene request_id.",
            "required": true
          }
        ],
        "tags": [
          "Digital ID wallets"
        ],
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationResponse"
                },
                "example": {
                  "request_id": "00000000-0000-4000-8000-000000000001",
                  "wallet_verification": {
                    "wallet": {
                      "id": "smart_id",
                      "name": "Smart-ID",
                      "issuing_authority": "SK ID Solutions"
                    },
                    "country": "EST",
                    "status": "Not Finished",
                    "outcome": "pending",
                    "error": null,
                    "interaction": "in_app",
                    "simulated": true,
                    "expires_at": "2026-01-01T10:10:00Z",
                    "next_action": {
                      "type": "confirm_in_app",
                      "verification_code": "1234",
                      "poll_interval_seconds": 2
                    },
                    "identity": null,
                    "attributes": null,
                    "level_of_assurance": null,
                    "verified_at": null,
                    "signature_valid": null,
                    "credential_type": "person_identification"
                  },
                  "vendor_data": "your-customer-reference",
                  "metadata": {
                    "reference": "example"
                  },
                  "created_at": "2026-01-01T10:00:00Z"
                }
              }
            },
            "description": ""
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiClientCredentialsForbiddenErrorMessage"
                }
              }
            },
            "description": "Fehlende Anmeldedaten (x-api-key oder Authorization: Bearer)."
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationError"
                }
              }
            },
            "description": "Fehler not_found: Keine Wallet-Verifizierung dieser Anwendung hat diese request_id."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationError"
                }
              }
            },
            "description": "Fehler wallet_not_configured: Diese Umgebung kann die Wallet nicht erreichen."
          }
        },
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "cURL",
            "source": "curl --request POST \\\n  --url https://verification.didit.me/v3/id-verification/wallets/verifications/REQUEST_ID/poll/ \\\n  --header 'x-api-key: YOUR_API_KEY'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.id_wallets.poll_verification(\n    \"11111111-2222-3333-4444-555555555555\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.idWallets.pollVerification(\"11111111-2222-3333-4444-555555555555\");\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.IDWallets.PollVerification(ctx, \"11111111-2222-3333-4444-555555555555\")\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.idWallets().pollVerification(\"11111111-2222-3333-4444-555555555555\");\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->idWallets->pollVerification('11111111-2222-3333-4444-555555555555');\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.id_wallets.poll_verification(\"11111111-2222-3333-4444-555555555555\")\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.IdWallets.PollVerificationAsync(\"11111111-2222-3333-4444-555555555555\");\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ]
      }
    },
    "/v3/id-verification/wallets/verifications/{request_id}/cancel/": {
      "post": {
        "operationId": "cancel_wallet_verification",
        "x-didit-sdk": {
          "resource": "id_wallets",
          "method": "cancel_verification",
          "auth": "api_key",
          "server": true
        },
        "description": "Eine ausstehende Verifizierung zurückziehen: Sie wird als abgebrochen abgelehnt und niemals abgerechnet. Eine bereits entschiedene Verifizierung wird unverändert zurückgegeben. Smart-ID und Mobile-ID: Ein Abbruch, der eingeht, während ein Polling die Anmeldung prüft, wartet einige Sekunden auf dieses Polling und lehnt sie dann ab oder gibt sie als verifiziert zurück, falls der Benutzer bereits bestätigt hatte. Eine Verifizierung, die der Benutzer gerade abschließt, kann nicht abgebrochen werden (409 verification_in_progress mit Retry-After): Versuchen Sie es nach dieser Anzahl von Sekunden erneut, um das Ergebnis abzurufen.",
        "summary": "Eine Wallet-Verifizierung abbrechen",
        "parameters": [
          {
            "in": "path",
            "name": "request_id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Die vom Start-Endpoint zurückgegebene request_id.",
            "required": true
          }
        ],
        "tags": [
          "Digital ID wallets"
        ],
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationResponse"
                },
                "example": {
                  "request_id": "00000000-0000-4000-8000-000000000001",
                  "wallet_verification": {
                    "wallet": {
                      "id": "ftn",
                      "name": "Finnish Trust Network",
                      "issuing_authority": "Finnish banks and mobile operators (FTN)"
                    },
                    "country": "FIN",
                    "status": "Declined",
                    "outcome": "cancelled",
                    "error": "cancelled_by_customer",
                    "interaction": "redirect",
                    "simulated": false,
                    "expires_at": "2026-01-01T10:10:00Z",
                    "next_action": null,
                    "identity": null,
                    "attributes": null,
                    "level_of_assurance": null,
                    "verified_at": null,
                    "signature_valid": null,
                    "credential_type": "person_identification"
                  },
                  "vendor_data": "your-customer-reference",
                  "metadata": {
                    "reference": "example"
                  },
                  "created_at": "2026-01-01T10:00:00Z"
                }
              }
            },
            "description": ""
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiClientCredentialsForbiddenErrorMessage"
                }
              }
            },
            "description": "Fehlende Anmeldedaten (x-api-key oder Authorization: Bearer)."
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationError"
                }
              }
            },
            "description": "Fehler not_found: Keine Wallet-Verifizierung dieser Anwendung hat diese request_id."
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationError"
                }
              }
            },
            "description": "Fehler verification_in_progress: Der Benutzer schließt diese Anmeldung gerade ab. Der Retry-After-Header gibt an, wann der Wiederholungsversuch erfolgen soll; der Wiederholungsversuch gibt die getroffene Verifizierungsentscheidung zurück."
          }
        },
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "cURL",
            "source": "curl --request POST \\\n  --url https://verification.didit.me/v3/id-verification/wallets/verifications/REQUEST_ID/cancel/ \\\n  --header 'x-api-key: YOUR_API_KEY'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.id_wallets.cancel_verification(\n    \"11111111-2222-3333-4444-555555555555\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.idWallets.cancelVerification(\"11111111-2222-3333-4444-555555555555\");\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.IDWallets.CancelVerification(ctx, \"11111111-2222-3333-4444-555555555555\")\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.idWallets().cancelVerification(\"11111111-2222-3333-4444-555555555555\");\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->idWallets->cancelVerification('11111111-2222-3333-4444-555555555555');\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.id_wallets.cancel_verification(\"11111111-2222-3333-4444-555555555555\")\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.IdWallets.CancelVerificationAsync(\"11111111-2222-3333-4444-555555555555\");\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ]
      }
    },
    "/v3/id-verification/wallets/mitid/": {
      "post": {
        "operationId": "start_mitid_wallet_verification",
        "x-didit-sdk": {
          "resource": "id_wallets",
          "method": "start_mitid",
          "auth": "api_key",
          "server": true
        },
        "description": "Starten Sie eine MitID-Anmeldung (Danish Agency for Digital Government; DNK) ohne Workflow. Die Abrechnung erfolgt einmalig, nur wenn die Identität verifiziert wurde. Die Antwort enthält next_action.type=redirect mit der URL, an die der Browser des Benutzers weitergeleitet werden soll; der Benutzer kehrt zu return_url zurück, an die request_id und result angehängt werden. Lesen Sie das Ergebnis mit GET /v3/id-verification/wallets/verifications/{request_id}/ oder aus dem Webhook aus, niemals aus der URL. Sandbox-Anwendungen erhalten eine deterministische Simulation (simulated: true), die den Anbieter niemals kontaktiert.",
        "summary": "MitID-Verifizierung starten",
        "parameters": [
          {
            "in": "header",
            "name": "Idempotency-Key",
            "schema": {
              "type": "string"
            },
            "description": "Optionaler Schlüssel zur Wiederholungssicherheit (max. 255 Zeichen). Ein erneuter Versuch mit demselben Schlüssel, derselben Wallet und demselben Body gibt die ursprüngliche Verifizierung zurück, ohne eine zweite Anmeldung zu starten; derselbe Schlüssel mit einer anderen Wallet oder einem anderen Body gibt 409 idempotency_key_reused zurück."
          }
        ],
        "tags": [
          "Digital ID wallets"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DigitalIdWalletApiMitidWalletVerificationStartRequest"
              },
              "example": {
                "country": "DNK",
                "vendor_data": "your-customer-reference",
                "metadata": {
                  "reference": "example"
                },
                "return_url": "https://app.example.com/identity/complete"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/DigitalIdWalletApiMitidWalletVerificationStartRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/DigitalIdWalletApiMitidWalletVerificationStartRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationResponse"
                },
                "example": {
                  "request_id": "00000000-0000-4000-8000-000000000001",
                  "wallet_verification": {
                    "wallet": {
                      "id": "mitid",
                      "name": "MitID",
                      "issuing_authority": "Danish Agency for Digital Government"
                    },
                    "country": "DNK",
                    "status": "Not Finished",
                    "outcome": "pending",
                    "error": null,
                    "interaction": "redirect",
                    "simulated": false,
                    "expires_at": "2026-01-01T10:10:00Z",
                    "next_action": {
                      "type": "redirect",
                      "url": "https://wallet.example.com/authorize"
                    },
                    "identity": null,
                    "attributes": null,
                    "level_of_assurance": null,
                    "verified_at": null,
                    "signature_valid": null,
                    "credential_type": "person_identification"
                  },
                  "vendor_data": "your-customer-reference",
                  "metadata": {
                    "reference": "example"
                  },
                  "created_at": "2026-01-01T10:00:00Z"
                }
              }
            },
            "description": ""
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationStartBadRequest"
                }
              }
            },
            "description": "Feldvalidierungsfehler ({field: [messages]}) oder Fehler return_url_invalid, return_url_not_allowed, invalid_personal_code, invalid_phone_number oder idempotency_key_invalid."
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationStartForbidden"
                }
              }
            },
            "description": "Fehlende Anmeldedaten ({detail}) oder Fehler wallet_unavailable, insufficient_credits oder contract_rate_missing."
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationError"
                }
              }
            },
            "description": "Fehler idempotency_key_reused oder idempotency_key_in_progress (mit Retry-After)."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationError"
                }
              }
            },
            "description": "Fehler wallet_provider_unavailable: Der Anbieter konnte nicht gestartet werden; es wurde nichts erstellt."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationError"
                }
              }
            },
            "description": "Fehler wallet_not_configured: Diese Umgebung kann die Wallet nicht erreichen."
          }
        },
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "cURL",
            "source": "curl --request POST \\\n  --url https://verification.didit.me/v3/id-verification/wallets/mitid/ \\\n  --header 'x-api-key: YOUR_API_KEY' \\\n  --header 'Idempotency-Key: your-unique-attempt-key' \\\n  --header 'Content-Type: application/json' \\\n  --data '{\n  \"country\": \"DNK\",\n  \"vendor_data\": \"your-customer-reference\",\n  \"metadata\": {\n    \"reference\": \"example\"\n  },\n  \"return_url\": \"https://app.example.com/identity/complete\"\n}'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.id_wallets.start_mitid(\n    vendor_data=\"your-customer-reference\",\n    metadata={\"reference\": \"example\"},\n    country=\"DNK\",\n    return_url=\"https://app.example.com/identity/complete\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.idWallets.startMitid({\n  vendor_data: \"your-customer-reference\",\n  metadata: { reference: \"example\" },\n  country: \"DNK\",\n  return_url: \"https://app.example.com/identity/complete\",\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.IDWallets.StartMitid(ctx, didit.IDWalletsStartMitidParams{\n\tBody: didit.DigitalIDWalletAPIMitidWalletVerificationStartRequest{\n\t\tVendorData: didit.String(\"your-customer-reference\"),\n\t\tMetadata:   didit.Some(map[string]any{\"reference\": \"example\"}),\n\t\tCountry:    didit.Some(didit.DigitalIDWalletAPIMitidWalletVerificationStartCountryEnum(\"DNK\")),\n\t\tReturnURL:  \"https://app.example.com/identity/complete\",\n\t},\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import java.util.Map;\nimport me.didit.Didit;\nimport me.didit.types.DigitalIdWalletApiMitidWalletVerificationStartCountryEnum;\nimport me.didit.types.DigitalIdWalletApiMitidWalletVerificationStartRequest;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.idWallets().startMitid(DigitalIdWalletApiMitidWalletVerificationStartRequest.builder()\n        .vendorData(\"your-customer-reference\")\n        .metadata(Map.of(\"reference\", \"example\"))\n        .country(DigitalIdWalletApiMitidWalletVerificationStartCountryEnum.of(\"DNK\"))\n        .returnUrl(\"https://app.example.com/identity/complete\")\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->idWallets->startMitid([\n    'vendor_data' => 'your-customer-reference',\n    'metadata' => ['reference' => 'example'],\n    'country' => 'DNK',\n    'return_url' => 'https://app.example.com/identity/complete',\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.id_wallets.start_mitid(\n  vendor_data: \"your-customer-reference\",\n  metadata: { reference: \"example\" },\n  country: \"DNK\",\n  return_url: \"https://app.example.com/identity/complete\"\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Collections.Generic;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.IdWallets.StartMitidAsync(new DigitalIdWalletApiMitidWalletVerificationStartRequest\n{\n    VendorData = \"your-customer-reference\",\n    Metadata = new Dictionary<string, object> { [\"reference\"] = \"example\" },\n    Country = new DigitalIdWalletApiMitidWalletVerificationStartCountryEnum(\"DNK\"),\n    ReturnUrl = \"https://app.example.com/identity/complete\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "x-didit-wallet-id": "mitid"
      }
    },
    "/v3/id-verification/wallets/bankid-se/": {
      "post": {
        "operationId": "start_bankid_se_wallet_verification",
        "x-didit-sdk": {
          "resource": "id_wallets",
          "method": "start_bankid_se",
          "auth": "api_key",
          "server": true
        },
        "description": "Starten Sie eine BankID (SWE)-Anmeldung (Finansiell ID-Teknik / Bankenkonsortium; SWE) ohne einen Workflow. Wird einmalig abgerechnet, nur wenn die Identität verifiziert ist. Die Antwort enthält next_action.type=redirect mit der URL, an die der Browser des Benutzers weitergeleitet werden soll; der Benutzer kehrt mit angehängtem request_id und result zu return_url zurück. Lesen Sie das Ergebnis mit GET /v3/id-verification/wallets/verifications/{request_id}/ oder aus dem Webhook aus, niemals aus der URL. Sandbox-Anwendungen erhalten eine deterministische Simulation (simulated: true), die den Anbieter niemals kontaktiert.",
        "summary": "BankID (SWE)-Verifizierung starten",
        "parameters": [
          {
            "in": "header",
            "name": "Idempotency-Key",
            "schema": {
              "type": "string"
            },
            "description": "Optionaler Schlüssel zur Wiederholungssicherheit (max. 255 Zeichen). Ein erneuter Versuch mit demselben Schlüssel, derselben Wallet und demselben Body gibt die ursprüngliche Verifizierung zurück, ohne eine zweite Anmeldung zu starten; derselbe Schlüssel mit einer anderen Wallet oder einem anderen Body gibt 409 idempotency_key_reused zurück."
          }
        ],
        "tags": [
          "Digital ID wallets"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DigitalIdWalletApiBankidSeWalletVerificationStartRequest"
              },
              "example": {
                "country": "SWE",
                "vendor_data": "your-customer-reference",
                "metadata": {
                  "reference": "example"
                },
                "return_url": "https://app.example.com/identity/complete"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/DigitalIdWalletApiBankidSeWalletVerificationStartRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/DigitalIdWalletApiBankidSeWalletVerificationStartRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationResponse"
                },
                "example": {
                  "request_id": "00000000-0000-4000-8000-000000000001",
                  "wallet_verification": {
                    "wallet": {
                      "id": "bankid_se",
                      "name": "BankID",
                      "issuing_authority": "Finansiell ID-Teknik / bank consortium"
                    },
                    "country": "SWE",
                    "status": "Not Finished",
                    "outcome": "pending",
                    "error": null,
                    "interaction": "redirect",
                    "simulated": false,
                    "expires_at": "2026-01-01T10:10:00Z",
                    "next_action": {
                      "type": "redirect",
                      "url": "https://wallet.example.com/authorize"
                    },
                    "identity": null,
                    "attributes": null,
                    "level_of_assurance": null,
                    "verified_at": null,
                    "signature_valid": null,
                    "credential_type": "person_identification"
                  },
                  "vendor_data": "your-customer-reference",
                  "metadata": {
                    "reference": "example"
                  },
                  "created_at": "2026-01-01T10:00:00Z"
                }
              }
            },
            "description": ""
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationStartBadRequest"
                }
              }
            },
            "description": "Feldvalidierungsfehler ({field: [messages]}) oder Fehler return_url_invalid, return_url_not_allowed, invalid_personal_code, invalid_phone_number oder idempotency_key_invalid."
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationStartForbidden"
                }
              }
            },
            "description": "Fehlende Anmeldedaten ({detail}) oder Fehler wallet_unavailable, insufficient_credits oder contract_rate_missing."
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationError"
                }
              }
            },
            "description": "Fehler idempotency_key_reused oder idempotency_key_in_progress (mit Retry-After)."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationError"
                }
              }
            },
            "description": "Fehler wallet_provider_unavailable: Der Anbieter konnte nicht gestartet werden; es wurde nichts erstellt."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationError"
                }
              }
            },
            "description": "Fehler wallet_not_configured: Diese Umgebung kann die Wallet nicht erreichen."
          }
        },
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "cURL",
            "source": "curl --request POST \\\n  --url https://verification.didit.me/v3/id-verification/wallets/bankid-se/ \\\n  --header 'x-api-key: YOUR_API_KEY' \\\n  --header 'Idempotency-Key: your-unique-attempt-key' \\\n  --header 'Content-Type: application/json' \\\n  --data '{\n  \"country\": \"SWE\",\n  \"vendor_data\": \"your-customer-reference\",\n  \"metadata\": {\n    \"reference\": \"example\"\n  },\n  \"return_url\": \"https://app.example.com/identity/complete\"\n}'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.id_wallets.start_bankid_se(\n    vendor_data=\"your-customer-reference\",\n    metadata={\"reference\": \"example\"},\n    country=\"SWE\",\n    return_url=\"https://app.example.com/identity/complete\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.idWallets.startBankidSe({\n  vendor_data: \"your-customer-reference\",\n  metadata: { reference: \"example\" },\n  country: \"SWE\",\n  return_url: \"https://app.example.com/identity/complete\",\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.IDWallets.StartBankidSe(ctx, didit.IDWalletsStartBankidSeParams{\n\tBody: didit.DigitalIDWalletAPIBankidSeWalletVerificationStartRequest{\n\t\tVendorData: didit.String(\"your-customer-reference\"),\n\t\tMetadata:   didit.Some(map[string]any{\"reference\": \"example\"}),\n\t\tCountry:    didit.Some(didit.DigitalIDWalletAPICountryEe9enum(\"SWE\")),\n\t\tReturnURL:  \"https://app.example.com/identity/complete\",\n\t},\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import java.util.Map;\nimport me.didit.Didit;\nimport me.didit.types.DigitalIdWalletApiBankidSeWalletVerificationStartRequest;\nimport me.didit.types.DigitalIdWalletApiCountryEe9Enum;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.idWallets().startBankidSe(DigitalIdWalletApiBankidSeWalletVerificationStartRequest.builder()\n        .vendorData(\"your-customer-reference\")\n        .metadata(Map.of(\"reference\", \"example\"))\n        .country(DigitalIdWalletApiCountryEe9Enum.of(\"SWE\"))\n        .returnUrl(\"https://app.example.com/identity/complete\")\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->idWallets->startBankidSe([\n    'vendor_data' => 'your-customer-reference',\n    'metadata' => ['reference' => 'example'],\n    'country' => 'SWE',\n    'return_url' => 'https://app.example.com/identity/complete',\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.id_wallets.start_bankid_se(\n  vendor_data: \"your-customer-reference\",\n  metadata: { reference: \"example\" },\n  country: \"SWE\",\n  return_url: \"https://app.example.com/identity/complete\"\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Collections.Generic;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.IdWallets.StartBankidSeAsync(new DigitalIdWalletApiBankidSeWalletVerificationStartRequest\n{\n    VendorData = \"your-customer-reference\",\n    Metadata = new Dictionary<string, object> { [\"reference\"] = \"example\" },\n    Country = new DigitalIdWalletApiCountryEe9Enum(\"SWE\"),\n    ReturnUrl = \"https://app.example.com/identity/complete\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "x-didit-wallet-id": "bankid_se"
      }
    },
    "/v3/id-verification/wallets/bankid-no/": {
      "post": {
        "operationId": "start_bankid_no_wallet_verification",
        "x-didit-sdk": {
          "resource": "id_wallets",
          "method": "start_bankid_no",
          "auth": "api_key",
          "server": true
        },
        "description": "Starten Sie eine BankID (NOR)-Anmeldung (BankID BankAxept AS; NOR) ohne einen Workflow. Wird einmalig abgerechnet, nur wenn die Identität verifiziert ist. Die Antwort enthält next_action.type=redirect mit der URL, an die der Browser des Benutzers weitergeleitet werden soll; der Benutzer kehrt mit angehängtem request_id und result zu return_url zurück. Lesen Sie das Ergebnis mit GET /v3/id-verification/wallets/verifications/{request_id}/ oder aus dem Webhook aus, niemals aus der URL. Sandbox-Anwendungen erhalten eine deterministische Simulation (simulated: true), die den Anbieter niemals kontaktiert.",
        "summary": "BankID (NOR)-Verifizierung starten",
        "parameters": [
          {
            "in": "header",
            "name": "Idempotency-Key",
            "schema": {
              "type": "string"
            },
            "description": "Optionaler Schlüssel zur Wiederholungssicherheit (max. 255 Zeichen). Ein erneuter Versuch mit demselben Schlüssel, derselben Wallet und demselben Body gibt die ursprüngliche Verifizierung zurück, ohne eine zweite Anmeldung zu starten; derselbe Schlüssel mit einer anderen Wallet oder einem anderen Body gibt 409 idempotency_key_reused zurück."
          }
        ],
        "tags": [
          "Digital ID wallets"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DigitalIdWalletApiBankidNoWalletVerificationStartRequest"
              },
              "example": {
                "country": "NOR",
                "vendor_data": "your-customer-reference",
                "metadata": {
                  "reference": "example"
                },
                "return_url": "https://app.example.com/identity/complete"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/DigitalIdWalletApiBankidNoWalletVerificationStartRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/DigitalIdWalletApiBankidNoWalletVerificationStartRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationResponse"
                },
                "example": {
                  "request_id": "00000000-0000-4000-8000-000000000001",
                  "wallet_verification": {
                    "wallet": {
                      "id": "bankid_no",
                      "name": "BankID",
                      "issuing_authority": "BankID BankAxept AS"
                    },
                    "country": "NOR",
                    "status": "Not Finished",
                    "outcome": "pending",
                    "error": null,
                    "interaction": "redirect",
                    "simulated": false,
                    "expires_at": "2026-01-01T10:10:00Z",
                    "next_action": {
                      "type": "redirect",
                      "url": "https://wallet.example.com/authorize"
                    },
                    "identity": null,
                    "attributes": null,
                    "level_of_assurance": null,
                    "verified_at": null,
                    "signature_valid": null,
                    "credential_type": "person_identification"
                  },
                  "vendor_data": "your-customer-reference",
                  "metadata": {
                    "reference": "example"
                  },
                  "created_at": "2026-01-01T10:00:00Z"
                }
              }
            },
            "description": ""
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationStartBadRequest"
                }
              }
            },
            "description": "Feldvalidierungsfehler ({field: [messages]}) oder Fehler return_url_invalid, return_url_not_allowed, invalid_personal_code, invalid_phone_number oder idempotency_key_invalid."
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationStartForbidden"
                }
              }
            },
            "description": "Fehlende Anmeldedaten ({detail}) oder Fehler wallet_unavailable, insufficient_credits oder contract_rate_missing."
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationError"
                }
              }
            },
            "description": "Fehler idempotency_key_reused oder idempotency_key_in_progress (mit Retry-After)."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationError"
                }
              }
            },
            "description": "Fehler wallet_provider_unavailable: Der Anbieter konnte nicht gestartet werden; es wurde nichts erstellt."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationError"
                }
              }
            },
            "description": "Fehler wallet_not_configured: Diese Umgebung kann die Wallet nicht erreichen."
          }
        },
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "cURL",
            "source": "curl --request POST \\\n  --url https://verification.didit.me/v3/id-verification/wallets/bankid-no/ \\\n  --header 'x-api-key: YOUR_API_KEY' \\\n  --header 'Idempotency-Key: your-unique-attempt-key' \\\n  --header 'Content-Type: application/json' \\\n  --data '{\n  \"country\": \"NOR\",\n  \"vendor_data\": \"your-customer-reference\",\n  \"metadata\": {\n    \"reference\": \"example\"\n  },\n  \"return_url\": \"https://app.example.com/identity/complete\"\n}'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.id_wallets.start_bankid_no(\n    vendor_data=\"your-customer-reference\",\n    metadata={\"reference\": \"example\"},\n    country=\"NOR\",\n    return_url=\"https://app.example.com/identity/complete\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.idWallets.startBankidNo({\n  vendor_data: \"your-customer-reference\",\n  metadata: { reference: \"example\" },\n  country: \"NOR\",\n  return_url: \"https://app.example.com/identity/complete\",\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.IDWallets.StartBankidNo(ctx, didit.IDWalletsStartBankidNoParams{\n\tBody: didit.DigitalIDWalletAPIBankidNoWalletVerificationStartRequest{\n\t\tVendorData: didit.String(\"your-customer-reference\"),\n\t\tMetadata:   didit.Some(map[string]any{\"reference\": \"example\"}),\n\t\tCountry:    didit.Some(didit.DigitalIDWalletAPICountryAfcEnum(\"NOR\")),\n\t\tReturnURL:  \"https://app.example.com/identity/complete\",\n\t},\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import java.util.Map;\nimport me.didit.Didit;\nimport me.didit.types.DigitalIdWalletApiBankidNoWalletVerificationStartRequest;\nimport me.didit.types.DigitalIdWalletApiCountryAfcEnum;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.idWallets().startBankidNo(DigitalIdWalletApiBankidNoWalletVerificationStartRequest.builder()\n        .vendorData(\"your-customer-reference\")\n        .metadata(Map.of(\"reference\", \"example\"))\n        .country(DigitalIdWalletApiCountryAfcEnum.of(\"NOR\"))\n        .returnUrl(\"https://app.example.com/identity/complete\")\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->idWallets->startBankidNo([\n    'vendor_data' => 'your-customer-reference',\n    'metadata' => ['reference' => 'example'],\n    'country' => 'NOR',\n    'return_url' => 'https://app.example.com/identity/complete',\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.id_wallets.start_bankid_no(\n  vendor_data: \"your-customer-reference\",\n  metadata: { reference: \"example\" },\n  country: \"NOR\",\n  return_url: \"https://app.example.com/identity/complete\"\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Collections.Generic;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.IdWallets.StartBankidNoAsync(new DigitalIdWalletApiBankidNoWalletVerificationStartRequest\n{\n    VendorData = \"your-customer-reference\",\n    Metadata = new Dictionary<string, object> { [\"reference\"] = \"example\" },\n    Country = new DigitalIdWalletApiCountryAfcEnum(\"NOR\"),\n    ReturnUrl = \"https://app.example.com/identity/complete\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "x-didit-wallet-id": "bankid_no"
      }
    },
    "/v3/id-verification/wallets/vipps/": {
      "post": {
        "operationId": "start_vipps_wallet_verification",
        "x-didit-sdk": {
          "resource": "id_wallets",
          "method": "start_vipps",
          "auth": "api_key",
          "server": true
        },
        "description": "Starten Sie eine Vipps-Anmeldung (Vipps MobilePay / BankID NO; NOR) ohne Workflow. Wird einmalig abgerechnet, nur wenn die Identität verifiziert ist. Die Antwort enthält next_action.type=redirect mit der URL, an die der Browser des Benutzers geleitet werden soll; der Benutzer kehrt zu return_url zurück, an die request_id und result angehängt sind. Lesen Sie das Ergebnis mit GET /v3/id-verification/wallets/verifications/{request_id}/ oder aus dem Webhook aus, niemals aus der URL. Sandbox-Anwendungen erhalten eine deterministische Simulation (simulated: true), die den Anbieter niemals kontaktiert.",
        "summary": "Vipps-Verifizierung starten",
        "parameters": [
          {
            "in": "header",
            "name": "Idempotency-Key",
            "schema": {
              "type": "string"
            },
            "description": "Optionaler Schlüssel zur Wiederholungssicherheit (max. 255 Zeichen). Ein erneuter Versuch mit demselben Schlüssel, derselben Wallet und demselben Body gibt die ursprüngliche Verifizierung zurück, ohne eine zweite Anmeldung zu starten; derselbe Schlüssel mit einer anderen Wallet oder einem anderen Body gibt 409 idempotency_key_reused zurück."
          }
        ],
        "tags": [
          "Digital ID wallets"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DigitalIdWalletApiVippsWalletVerificationStartRequest"
              },
              "example": {
                "country": "NOR",
                "vendor_data": "your-customer-reference",
                "metadata": {
                  "reference": "example"
                },
                "return_url": "https://app.example.com/identity/complete"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/DigitalIdWalletApiVippsWalletVerificationStartRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/DigitalIdWalletApiVippsWalletVerificationStartRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationResponse"
                },
                "example": {
                  "request_id": "00000000-0000-4000-8000-000000000001",
                  "wallet_verification": {
                    "wallet": {
                      "id": "vipps",
                      "name": "Vipps",
                      "issuing_authority": "Vipps MobilePay / BankID NO"
                    },
                    "country": "NOR",
                    "status": "Not Finished",
                    "outcome": "pending",
                    "error": null,
                    "interaction": "redirect",
                    "simulated": false,
                    "expires_at": "2026-01-01T10:10:00Z",
                    "next_action": {
                      "type": "redirect",
                      "url": "https://wallet.example.com/authorize"
                    },
                    "identity": null,
                    "attributes": null,
                    "level_of_assurance": null,
                    "verified_at": null,
                    "signature_valid": null,
                    "credential_type": "person_identification"
                  },
                  "vendor_data": "your-customer-reference",
                  "metadata": {
                    "reference": "example"
                  },
                  "created_at": "2026-01-01T10:00:00Z"
                }
              }
            },
            "description": ""
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationStartBadRequest"
                }
              }
            },
            "description": "Feldvalidierungsfehler ({field: [messages]}) oder Fehler return_url_invalid, return_url_not_allowed, invalid_personal_code, invalid_phone_number oder idempotency_key_invalid."
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationStartForbidden"
                }
              }
            },
            "description": "Fehlende Anmeldedaten ({detail}) oder Fehler wallet_unavailable, insufficient_credits oder contract_rate_missing."
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationError"
                }
              }
            },
            "description": "Fehler idempotency_key_reused oder idempotency_key_in_progress (mit Retry-After)."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationError"
                }
              }
            },
            "description": "Fehler wallet_provider_unavailable: Der Anbieter konnte nicht gestartet werden; es wurde nichts erstellt."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationError"
                }
              }
            },
            "description": "Fehler wallet_not_configured: Diese Umgebung kann die Wallet nicht erreichen."
          }
        },
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "cURL",
            "source": "curl --request POST \\\n  --url https://verification.didit.me/v3/id-verification/wallets/vipps/ \\\n  --header 'x-api-key: YOUR_API_KEY' \\\n  --header 'Idempotency-Key: your-unique-attempt-key' \\\n  --header 'Content-Type: application/json' \\\n  --data '{\n  \"country\": \"NOR\",\n  \"vendor_data\": \"your-customer-reference\",\n  \"metadata\": {\n    \"reference\": \"example\"\n  },\n  \"return_url\": \"https://app.example.com/identity/complete\"\n}'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.id_wallets.start_vipps(\n    vendor_data=\"your-customer-reference\",\n    metadata={\"reference\": \"example\"},\n    country=\"NOR\",\n    return_url=\"https://app.example.com/identity/complete\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.idWallets.startVipps({\n  vendor_data: \"your-customer-reference\",\n  metadata: { reference: \"example\" },\n  country: \"NOR\",\n  return_url: \"https://app.example.com/identity/complete\",\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.IDWallets.StartVipps(ctx, didit.IDWalletsStartVippsParams{\n\tBody: didit.DigitalIDWalletAPIVippsWalletVerificationStartRequest{\n\t\tVendorData: didit.String(\"your-customer-reference\"),\n\t\tMetadata:   didit.Some(map[string]any{\"reference\": \"example\"}),\n\t\tCountry:    didit.Some(didit.DigitalIDWalletAPICountryAfcEnum(\"NOR\")),\n\t\tReturnURL:  \"https://app.example.com/identity/complete\",\n\t},\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import java.util.Map;\nimport me.didit.Didit;\nimport me.didit.types.DigitalIdWalletApiCountryAfcEnum;\nimport me.didit.types.DigitalIdWalletApiVippsWalletVerificationStartRequest;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.idWallets().startVipps(DigitalIdWalletApiVippsWalletVerificationStartRequest.builder()\n        .vendorData(\"your-customer-reference\")\n        .metadata(Map.of(\"reference\", \"example\"))\n        .country(DigitalIdWalletApiCountryAfcEnum.of(\"NOR\"))\n        .returnUrl(\"https://app.example.com/identity/complete\")\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->idWallets->startVipps([\n    'vendor_data' => 'your-customer-reference',\n    'metadata' => ['reference' => 'example'],\n    'country' => 'NOR',\n    'return_url' => 'https://app.example.com/identity/complete',\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.id_wallets.start_vipps(\n  vendor_data: \"your-customer-reference\",\n  metadata: { reference: \"example\" },\n  country: \"NOR\",\n  return_url: \"https://app.example.com/identity/complete\"\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Collections.Generic;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.IdWallets.StartVippsAsync(new DigitalIdWalletApiVippsWalletVerificationStartRequest\n{\n    VendorData = \"your-customer-reference\",\n    Metadata = new Dictionary<string, object> { [\"reference\"] = \"example\" },\n    Country = new DigitalIdWalletApiCountryAfcEnum(\"NOR\"),\n    ReturnUrl = \"https://app.example.com/identity/complete\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "x-didit-wallet-id": "vipps"
      }
    },
    "/v3/id-verification/wallets/buypass/": {
      "post": {
        "operationId": "start_buypass_wallet_verification",
        "x-didit-sdk": {
          "resource": "id_wallets",
          "method": "start_buypass",
          "auth": "api_key",
          "server": true
        },
        "description": "Starten Sie eine Buypass ID-Anmeldung (Buypass AS; NOR) ohne einen Workflow. Wird einmalig abgerechnet, nur wenn die Identität verifiziert ist. Die Antwort enthält next_action.type=redirect mit der URL, an die der Browser des Benutzers weitergeleitet werden soll; der Benutzer kehrt mit angehängtem request_id und result zu return_url zurück. Lesen Sie das Ergebnis mit GET /v3/id-verification/wallets/verifications/{request_id}/ oder aus dem Webhook aus, niemals aus der URL. Sandbox-Anwendungen erhalten eine deterministische Simulation (simulated: true), die den Anbieter niemals kontaktiert.",
        "summary": "Buypass ID-Verifizierung starten",
        "parameters": [
          {
            "in": "header",
            "name": "Idempotency-Key",
            "schema": {
              "type": "string"
            },
            "description": "Optionaler Schlüssel zur Wiederholungssicherheit (max. 255 Zeichen). Ein erneuter Versuch mit demselben Schlüssel, derselben Wallet und demselben Body gibt die ursprüngliche Verifizierung zurück, ohne eine zweite Anmeldung zu starten; derselbe Schlüssel mit einer anderen Wallet oder einem anderen Body gibt 409 idempotency_key_reused zurück."
          }
        ],
        "tags": [
          "Digital ID wallets"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DigitalIdWalletApiBuypassWalletVerificationStartRequest"
              },
              "example": {
                "country": "NOR",
                "vendor_data": "your-customer-reference",
                "metadata": {
                  "reference": "example"
                },
                "return_url": "https://app.example.com/identity/complete"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/DigitalIdWalletApiBuypassWalletVerificationStartRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/DigitalIdWalletApiBuypassWalletVerificationStartRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationResponse"
                },
                "example": {
                  "request_id": "00000000-0000-4000-8000-000000000001",
                  "wallet_verification": {
                    "wallet": {
                      "id": "buypass",
                      "name": "Buypass ID",
                      "issuing_authority": "Buypass AS"
                    },
                    "country": "NOR",
                    "status": "Not Finished",
                    "outcome": "pending",
                    "error": null,
                    "interaction": "redirect",
                    "simulated": false,
                    "expires_at": "2026-01-01T10:10:00Z",
                    "next_action": {
                      "type": "redirect",
                      "url": "https://wallet.example.com/authorize"
                    },
                    "identity": null,
                    "attributes": null,
                    "level_of_assurance": null,
                    "verified_at": null,
                    "signature_valid": null,
                    "credential_type": "person_identification"
                  },
                  "vendor_data": "your-customer-reference",
                  "metadata": {
                    "reference": "example"
                  },
                  "created_at": "2026-01-01T10:00:00Z"
                }
              }
            },
            "description": ""
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationStartBadRequest"
                }
              }
            },
            "description": "Feldvalidierungsfehler ({field: [messages]}) oder Fehler return_url_invalid, return_url_not_allowed, invalid_personal_code, invalid_phone_number oder idempotency_key_invalid."
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationStartForbidden"
                }
              }
            },
            "description": "Fehlende Anmeldedaten ({detail}) oder Fehler wallet_unavailable, insufficient_credits oder contract_rate_missing."
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationError"
                }
              }
            },
            "description": "Fehler idempotency_key_reused oder idempotency_key_in_progress (mit Retry-After)."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationError"
                }
              }
            },
            "description": "Fehler wallet_provider_unavailable: Der Anbieter konnte nicht gestartet werden; es wurde nichts erstellt."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationError"
                }
              }
            },
            "description": "Fehler wallet_not_configured: Diese Umgebung kann die Wallet nicht erreichen."
          }
        },
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "cURL",
            "source": "curl --request POST \\\n  --url https://verification.didit.me/v3/id-verification/wallets/buypass/ \\\n  --header 'x-api-key: YOUR_API_KEY' \\\n  --header 'Idempotency-Key: your-unique-attempt-key' \\\n  --header 'Content-Type: application/json' \\\n  --data '{\n  \"country\": \"NOR\",\n  \"vendor_data\": \"your-customer-reference\",\n  \"metadata\": {\n    \"reference\": \"example\"\n  },\n  \"return_url\": \"https://app.example.com/identity/complete\"\n}'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.id_wallets.start_buypass(\n    vendor_data=\"your-customer-reference\",\n    metadata={\"reference\": \"example\"},\n    country=\"NOR\",\n    return_url=\"https://app.example.com/identity/complete\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.idWallets.startBuypass({\n  vendor_data: \"your-customer-reference\",\n  metadata: { reference: \"example\" },\n  country: \"NOR\",\n  return_url: \"https://app.example.com/identity/complete\",\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.IDWallets.StartBuypass(ctx, didit.IDWalletsStartBuypassParams{\n\tBody: didit.DigitalIDWalletAPIBuypassWalletVerificationStartRequest{\n\t\tVendorData: didit.String(\"your-customer-reference\"),\n\t\tMetadata:   didit.Some(map[string]any{\"reference\": \"example\"}),\n\t\tCountry:    didit.Some(didit.DigitalIDWalletAPICountryAfcEnum(\"NOR\")),\n\t\tReturnURL:  \"https://app.example.com/identity/complete\",\n\t},\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import java.util.Map;\nimport me.didit.Didit;\nimport me.didit.types.DigitalIdWalletApiBuypassWalletVerificationStartRequest;\nimport me.didit.types.DigitalIdWalletApiCountryAfcEnum;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.idWallets().startBuypass(DigitalIdWalletApiBuypassWalletVerificationStartRequest.builder()\n        .vendorData(\"your-customer-reference\")\n        .metadata(Map.of(\"reference\", \"example\"))\n        .country(DigitalIdWalletApiCountryAfcEnum.of(\"NOR\"))\n        .returnUrl(\"https://app.example.com/identity/complete\")\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->idWallets->startBuypass([\n    'vendor_data' => 'your-customer-reference',\n    'metadata' => ['reference' => 'example'],\n    'country' => 'NOR',\n    'return_url' => 'https://app.example.com/identity/complete',\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.id_wallets.start_buypass(\n  vendor_data: \"your-customer-reference\",\n  metadata: { reference: \"example\" },\n  country: \"NOR\",\n  return_url: \"https://app.example.com/identity/complete\"\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Collections.Generic;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.IdWallets.StartBuypassAsync(new DigitalIdWalletApiBuypassWalletVerificationStartRequest\n{\n    VendorData = \"your-customer-reference\",\n    Metadata = new Dictionary<string, object> { [\"reference\"] = \"example\" },\n    Country = new DigitalIdWalletApiCountryAfcEnum(\"NOR\"),\n    ReturnUrl = \"https://app.example.com/identity/complete\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "x-didit-wallet-id": "buypass"
      }
    },
    "/v3/id-verification/wallets/itsme/": {
      "post": {
        "operationId": "start_itsme_wallet_verification",
        "x-didit-sdk": {
          "resource": "id_wallets",
          "method": "start_itsme",
          "auth": "api_key",
          "server": true
        },
        "description": "Eine itsme-Anmeldung (Belgian Mobile ID; BEL, LUX, NLD) ohne Workflow starten. Wird nur einmal abgerechnet, wenn die Identität verifiziert ist. Die Antwort enthält next_action.type=redirect mit der URL, an die der Browser des Benutzers weitergeleitet werden soll; der Benutzer kehrt mit angehängter request_id und angehängtem result zu return_url zurück. Lesen Sie das Ergebnis mit GET /v3/id-verification/wallets/verifications/{request_id}/ oder aus dem Webhook aus, niemals aus der URL. Sandbox-Anwendungen erhalten eine deterministische Simulation (simulated: true), die den Anbieter niemals kontaktiert.",
        "summary": "itsme-Verifizierung starten",
        "parameters": [
          {
            "in": "header",
            "name": "Idempotency-Key",
            "schema": {
              "type": "string"
            },
            "description": "Optionaler Schlüssel zur Wiederholungssicherheit (max. 255 Zeichen). Ein erneuter Versuch mit demselben Schlüssel, derselben Wallet und demselben Body gibt die ursprüngliche Verifizierung zurück, ohne eine zweite Anmeldung zu starten; derselbe Schlüssel mit einer anderen Wallet oder einem anderen Body gibt 409 idempotency_key_reused zurück."
          }
        ],
        "tags": [
          "Digital ID wallets"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DigitalIdWalletApiItsmeWalletVerificationStartRequest"
              },
              "example": {
                "country": "BEL",
                "vendor_data": "your-customer-reference",
                "metadata": {
                  "reference": "example"
                },
                "return_url": "https://app.example.com/identity/complete"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/DigitalIdWalletApiItsmeWalletVerificationStartRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/DigitalIdWalletApiItsmeWalletVerificationStartRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationResponse"
                },
                "example": {
                  "request_id": "00000000-0000-4000-8000-000000000001",
                  "wallet_verification": {
                    "wallet": {
                      "id": "itsme",
                      "name": "itsme",
                      "issuing_authority": "Belgian Mobile ID"
                    },
                    "country": "BEL",
                    "status": "Not Finished",
                    "outcome": "pending",
                    "error": null,
                    "interaction": "redirect",
                    "simulated": false,
                    "expires_at": "2026-01-01T10:10:00Z",
                    "next_action": {
                      "type": "redirect",
                      "url": "https://wallet.example.com/authorize"
                    },
                    "identity": null,
                    "attributes": null,
                    "level_of_assurance": null,
                    "verified_at": null,
                    "signature_valid": null,
                    "credential_type": "person_identification"
                  },
                  "vendor_data": "your-customer-reference",
                  "metadata": {
                    "reference": "example"
                  },
                  "created_at": "2026-01-01T10:00:00Z"
                }
              }
            },
            "description": ""
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationStartBadRequest"
                }
              }
            },
            "description": "Feldvalidierungsfehler ({field: [messages]}) oder Fehler return_url_invalid, return_url_not_allowed, invalid_personal_code, invalid_phone_number oder idempotency_key_invalid."
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationStartForbidden"
                }
              }
            },
            "description": "Fehlende Anmeldedaten ({detail}) oder Fehler wallet_unavailable, insufficient_credits oder contract_rate_missing."
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationError"
                }
              }
            },
            "description": "Fehler idempotency_key_reused oder idempotency_key_in_progress (mit Retry-After)."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationError"
                }
              }
            },
            "description": "Fehler wallet_provider_unavailable: Der Anbieter konnte nicht gestartet werden; es wurde nichts erstellt."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationError"
                }
              }
            },
            "description": "Fehler wallet_not_configured: Diese Umgebung kann die Wallet nicht erreichen."
          }
        },
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "cURL",
            "source": "curl --request POST \\\n  --url https://verification.didit.me/v3/id-verification/wallets/itsme/ \\\n  --header 'x-api-key: YOUR_API_KEY' \\\n  --header 'Idempotency-Key: your-unique-attempt-key' \\\n  --header 'Content-Type: application/json' \\\n  --data '{\n  \"country\": \"BEL\",\n  \"vendor_data\": \"your-customer-reference\",\n  \"metadata\": {\n    \"reference\": \"example\"\n  },\n  \"return_url\": \"https://app.example.com/identity/complete\"\n}'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.id_wallets.start_itsme(\n    vendor_data=\"your-customer-reference\",\n    metadata={\"reference\": \"example\"},\n    country=\"BEL\",\n    return_url=\"https://app.example.com/identity/complete\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.idWallets.startItsme({\n  vendor_data: \"your-customer-reference\",\n  metadata: { reference: \"example\" },\n  country: \"BEL\",\n  return_url: \"https://app.example.com/identity/complete\",\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.IDWallets.StartItsme(ctx, didit.IDWalletsStartItsmeParams{\n\tBody: didit.DigitalIDWalletAPIItsmeWalletVerificationStartRequest{\n\t\tVendorData: didit.String(\"your-customer-reference\"),\n\t\tMetadata:   didit.Some(map[string]any{\"reference\": \"example\"}),\n\t\tCountry:    didit.DigitalIDWalletAPIItsmeWalletVerificationStartCountryEnum(\"BEL\"),\n\t\tReturnURL:  \"https://app.example.com/identity/complete\",\n\t},\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import java.util.Map;\nimport me.didit.Didit;\nimport me.didit.types.DigitalIdWalletApiItsmeWalletVerificationStartCountryEnum;\nimport me.didit.types.DigitalIdWalletApiItsmeWalletVerificationStartRequest;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.idWallets().startItsme(DigitalIdWalletApiItsmeWalletVerificationStartRequest.builder()\n        .vendorData(\"your-customer-reference\")\n        .metadata(Map.of(\"reference\", \"example\"))\n        .country(DigitalIdWalletApiItsmeWalletVerificationStartCountryEnum.of(\"BEL\"))\n        .returnUrl(\"https://app.example.com/identity/complete\")\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->idWallets->startItsme([\n    'vendor_data' => 'your-customer-reference',\n    'metadata' => ['reference' => 'example'],\n    'country' => 'BEL',\n    'return_url' => 'https://app.example.com/identity/complete',\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.id_wallets.start_itsme(\n  vendor_data: \"your-customer-reference\",\n  metadata: { reference: \"example\" },\n  country: \"BEL\",\n  return_url: \"https://app.example.com/identity/complete\"\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Collections.Generic;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.IdWallets.StartItsmeAsync(new DigitalIdWalletApiItsmeWalletVerificationStartRequest\n{\n    VendorData = \"your-customer-reference\",\n    Metadata = new Dictionary<string, object> { [\"reference\"] = \"example\" },\n    Country = \"BEL\",\n    ReturnUrl = \"https://app.example.com/identity/complete\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "x-didit-wallet-id": "itsme"
      }
    },
    "/v3/id-verification/wallets/idin/": {
      "post": {
        "operationId": "start_idin_wallet_verification",
        "x-didit-sdk": {
          "resource": "id_wallets",
          "method": "start_idin",
          "auth": "api_key",
          "server": true
        },
        "description": "Eine iDIN-Anmeldung (niederländische Banken (Currence iDIN); NLD) ohne Workflow starten. Wird nur einmal abgerechnet, wenn die Identität verifiziert ist. Die Antwort enthält next_action.type=redirect mit der URL, an die der Browser des Benutzers weitergeleitet werden soll; der Benutzer kehrt mit angehängter request_id und angehängtem result zu return_url zurück. Lesen Sie das Ergebnis mit GET /v3/id-verification/wallets/verifications/{request_id}/ oder aus dem Webhook aus, niemals aus der URL. Sandbox-Anwendungen erhalten eine deterministische Simulation (simulated: true), die den Anbieter niemals kontaktiert.",
        "summary": "iDIN-Verifizierung starten",
        "parameters": [
          {
            "in": "header",
            "name": "Idempotency-Key",
            "schema": {
              "type": "string"
            },
            "description": "Optionaler Schlüssel zur Wiederholungssicherheit (max. 255 Zeichen). Ein erneuter Versuch mit demselben Schlüssel, derselben Wallet und demselben Body gibt die ursprüngliche Verifizierung zurück, ohne eine zweite Anmeldung zu starten; derselbe Schlüssel mit einer anderen Wallet oder einem anderen Body gibt 409 idempotency_key_reused zurück."
          }
        ],
        "tags": [
          "Digital ID wallets"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DigitalIdWalletApiIdinWalletVerificationStartRequest"
              },
              "example": {
                "country": "NLD",
                "vendor_data": "your-customer-reference",
                "metadata": {
                  "reference": "example"
                },
                "return_url": "https://app.example.com/identity/complete"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/DigitalIdWalletApiIdinWalletVerificationStartRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/DigitalIdWalletApiIdinWalletVerificationStartRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationResponse"
                },
                "example": {
                  "request_id": "00000000-0000-4000-8000-000000000001",
                  "wallet_verification": {
                    "wallet": {
                      "id": "idin",
                      "name": "iDIN",
                      "issuing_authority": "Dutch banks (Currence iDIN)"
                    },
                    "country": "NLD",
                    "status": "Not Finished",
                    "outcome": "pending",
                    "error": null,
                    "interaction": "redirect",
                    "simulated": false,
                    "expires_at": "2026-01-01T10:10:00Z",
                    "next_action": {
                      "type": "redirect",
                      "url": "https://wallet.example.com/authorize"
                    },
                    "identity": null,
                    "attributes": null,
                    "level_of_assurance": null,
                    "verified_at": null,
                    "signature_valid": null,
                    "credential_type": "person_identification"
                  },
                  "vendor_data": "your-customer-reference",
                  "metadata": {
                    "reference": "example"
                  },
                  "created_at": "2026-01-01T10:00:00Z"
                }
              }
            },
            "description": ""
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationStartBadRequest"
                }
              }
            },
            "description": "Feldvalidierungsfehler ({field: [messages]}) oder Fehler return_url_invalid, return_url_not_allowed, invalid_personal_code, invalid_phone_number oder idempotency_key_invalid."
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationStartForbidden"
                }
              }
            },
            "description": "Fehlende Anmeldedaten ({detail}) oder Fehler wallet_unavailable, insufficient_credits oder contract_rate_missing."
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationError"
                }
              }
            },
            "description": "Fehler idempotency_key_reused oder idempotency_key_in_progress (mit Retry-After)."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationError"
                }
              }
            },
            "description": "Fehler wallet_provider_unavailable: Der Anbieter konnte nicht gestartet werden; es wurde nichts erstellt."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationError"
                }
              }
            },
            "description": "Fehler wallet_not_configured: Diese Umgebung kann die Wallet nicht erreichen."
          }
        },
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "cURL",
            "source": "curl --request POST \\\n  --url https://verification.didit.me/v3/id-verification/wallets/idin/ \\\n  --header 'x-api-key: YOUR_API_KEY' \\\n  --header 'Idempotency-Key: your-unique-attempt-key' \\\n  --header 'Content-Type: application/json' \\\n  --data '{\n  \"country\": \"NLD\",\n  \"vendor_data\": \"your-customer-reference\",\n  \"metadata\": {\n    \"reference\": \"example\"\n  },\n  \"return_url\": \"https://app.example.com/identity/complete\"\n}'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.id_wallets.start_idin(\n    vendor_data=\"your-customer-reference\",\n    metadata={\"reference\": \"example\"},\n    country=\"NLD\",\n    return_url=\"https://app.example.com/identity/complete\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.idWallets.startIdin({\n  vendor_data: \"your-customer-reference\",\n  metadata: { reference: \"example\" },\n  country: \"NLD\",\n  return_url: \"https://app.example.com/identity/complete\",\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.IDWallets.StartIdin(ctx, didit.IDWalletsStartIdinParams{\n\tBody: didit.DigitalIDWalletAPIIdinWalletVerificationStartRequest{\n\t\tVendorData: didit.String(\"your-customer-reference\"),\n\t\tMetadata:   didit.Some(map[string]any{\"reference\": \"example\"}),\n\t\tCountry:    didit.Some(didit.DigitalIDWalletAPIIdinWalletVerificationStartCountryEnum(\"NLD\")),\n\t\tReturnURL:  \"https://app.example.com/identity/complete\",\n\t},\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import java.util.Map;\nimport me.didit.Didit;\nimport me.didit.types.DigitalIdWalletApiIdinWalletVerificationStartCountryEnum;\nimport me.didit.types.DigitalIdWalletApiIdinWalletVerificationStartRequest;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.idWallets().startIdin(DigitalIdWalletApiIdinWalletVerificationStartRequest.builder()\n        .vendorData(\"your-customer-reference\")\n        .metadata(Map.of(\"reference\", \"example\"))\n        .country(DigitalIdWalletApiIdinWalletVerificationStartCountryEnum.of(\"NLD\"))\n        .returnUrl(\"https://app.example.com/identity/complete\")\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->idWallets->startIdin([\n    'vendor_data' => 'your-customer-reference',\n    'metadata' => ['reference' => 'example'],\n    'country' => 'NLD',\n    'return_url' => 'https://app.example.com/identity/complete',\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.id_wallets.start_idin(\n  vendor_data: \"your-customer-reference\",\n  metadata: { reference: \"example\" },\n  country: \"NLD\",\n  return_url: \"https://app.example.com/identity/complete\"\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Collections.Generic;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.IdWallets.StartIdinAsync(new DigitalIdWalletApiIdinWalletVerificationStartRequest\n{\n    VendorData = \"your-customer-reference\",\n    Metadata = new Dictionary<string, object> { [\"reference\"] = \"example\" },\n    Country = new DigitalIdWalletApiIdinWalletVerificationStartCountryEnum(\"NLD\"),\n    ReturnUrl = \"https://app.example.com/identity/complete\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "x-didit-wallet-id": "idin"
      }
    },
    "/v3/id-verification/wallets/ftn/": {
      "post": {
        "operationId": "start_ftn_wallet_verification",
        "x-didit-sdk": {
          "resource": "id_wallets",
          "method": "start_ftn",
          "auth": "api_key",
          "server": true
        },
        "description": "Starten Sie eine Anmeldung über das Finnish Trust Network (finnische Banken und Mobilfunkanbieter (FTN); FIN) ohne Workflow. Die Abrechnung erfolgt einmalig, nur wenn die Identität verifiziert wurde. Die Antwort enthält next_action.type=redirect mit der URL, an die der Browser des Benutzers weitergeleitet werden soll; der Benutzer kehrt zu return_url zurück, an das request_id und result angehängt werden. Lesen Sie das Ergebnis über GET /v3/id-verification/wallets/verifications/{request_id}/ oder über den Webhook aus, niemals aus der URL. Sandbox-Anwendungen erhalten eine deterministische Simulation (simulated: true), die niemals den Anbieter kontaktiert.",
        "summary": "Finnish Trust Network-Verifizierung starten",
        "parameters": [
          {
            "in": "header",
            "name": "Idempotency-Key",
            "schema": {
              "type": "string"
            },
            "description": "Optionaler Schlüssel zur Wiederholungssicherheit (max. 255 Zeichen). Ein erneuter Versuch mit demselben Schlüssel, derselben Wallet und demselben Body gibt die ursprüngliche Verifizierung zurück, ohne eine zweite Anmeldung zu starten; derselbe Schlüssel mit einer anderen Wallet oder einem anderen Body gibt 409 idempotency_key_reused zurück."
          }
        ],
        "tags": [
          "Digital ID wallets"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DigitalIdWalletApiFtnWalletVerificationStartRequest"
              },
              "example": {
                "country": "FIN",
                "vendor_data": "your-customer-reference",
                "metadata": {
                  "reference": "example"
                },
                "return_url": "https://app.example.com/identity/complete"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/DigitalIdWalletApiFtnWalletVerificationStartRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/DigitalIdWalletApiFtnWalletVerificationStartRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationResponse"
                },
                "example": {
                  "request_id": "00000000-0000-4000-8000-000000000001",
                  "wallet_verification": {
                    "wallet": {
                      "id": "ftn",
                      "name": "Finnish Trust Network",
                      "issuing_authority": "Finnish banks and mobile operators (FTN)"
                    },
                    "country": "FIN",
                    "status": "Not Finished",
                    "outcome": "pending",
                    "error": null,
                    "interaction": "redirect",
                    "simulated": false,
                    "expires_at": "2026-01-01T10:10:00Z",
                    "next_action": {
                      "type": "redirect",
                      "url": "https://wallet.example.com/authorize"
                    },
                    "identity": null,
                    "attributes": null,
                    "level_of_assurance": null,
                    "verified_at": null,
                    "signature_valid": null,
                    "credential_type": "person_identification"
                  },
                  "vendor_data": "your-customer-reference",
                  "metadata": {
                    "reference": "example"
                  },
                  "created_at": "2026-01-01T10:00:00Z"
                }
              }
            },
            "description": ""
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationStartBadRequest"
                }
              }
            },
            "description": "Feldvalidierungsfehler ({field: [messages]}) oder Fehler return_url_invalid, return_url_not_allowed, invalid_personal_code, invalid_phone_number oder idempotency_key_invalid."
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationStartForbidden"
                }
              }
            },
            "description": "Fehlende Anmeldedaten ({detail}) oder Fehler wallet_unavailable, insufficient_credits oder contract_rate_missing."
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationError"
                }
              }
            },
            "description": "Fehler idempotency_key_reused oder idempotency_key_in_progress (mit Retry-After)."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationError"
                }
              }
            },
            "description": "Fehler wallet_provider_unavailable: Der Anbieter konnte nicht gestartet werden; es wurde nichts erstellt."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationError"
                }
              }
            },
            "description": "Fehler wallet_not_configured: Diese Umgebung kann die Wallet nicht erreichen."
          }
        },
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "cURL",
            "source": "curl --request POST \\\n  --url https://verification.didit.me/v3/id-verification/wallets/ftn/ \\\n  --header 'x-api-key: YOUR_API_KEY' \\\n  --header 'Idempotency-Key: your-unique-attempt-key' \\\n  --header 'Content-Type: application/json' \\\n  --data '{\n  \"country\": \"FIN\",\n  \"vendor_data\": \"your-customer-reference\",\n  \"metadata\": {\n    \"reference\": \"example\"\n  },\n  \"return_url\": \"https://app.example.com/identity/complete\"\n}'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.id_wallets.start_ftn(\n    vendor_data=\"your-customer-reference\",\n    metadata={\"reference\": \"example\"},\n    country=\"FIN\",\n    return_url=\"https://app.example.com/identity/complete\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.idWallets.startFtn({\n  vendor_data: \"your-customer-reference\",\n  metadata: { reference: \"example\" },\n  country: \"FIN\",\n  return_url: \"https://app.example.com/identity/complete\",\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.IDWallets.StartFtn(ctx, didit.IDWalletsStartFtnParams{\n\tBody: didit.DigitalIDWalletAPIFtnWalletVerificationStartRequest{\n\t\tVendorData: didit.String(\"your-customer-reference\"),\n\t\tMetadata:   didit.Some(map[string]any{\"reference\": \"example\"}),\n\t\tCountry:    didit.Some(didit.DigitalIDWalletAPIFtnWalletVerificationStartCountryEnum(\"FIN\")),\n\t\tReturnURL:  \"https://app.example.com/identity/complete\",\n\t},\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import java.util.Map;\nimport me.didit.Didit;\nimport me.didit.types.DigitalIdWalletApiFtnWalletVerificationStartCountryEnum;\nimport me.didit.types.DigitalIdWalletApiFtnWalletVerificationStartRequest;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.idWallets().startFtn(DigitalIdWalletApiFtnWalletVerificationStartRequest.builder()\n        .vendorData(\"your-customer-reference\")\n        .metadata(Map.of(\"reference\", \"example\"))\n        .country(DigitalIdWalletApiFtnWalletVerificationStartCountryEnum.of(\"FIN\"))\n        .returnUrl(\"https://app.example.com/identity/complete\")\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->idWallets->startFtn([\n    'vendor_data' => 'your-customer-reference',\n    'metadata' => ['reference' => 'example'],\n    'country' => 'FIN',\n    'return_url' => 'https://app.example.com/identity/complete',\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.id_wallets.start_ftn(\n  vendor_data: \"your-customer-reference\",\n  metadata: { reference: \"example\" },\n  country: \"FIN\",\n  return_url: \"https://app.example.com/identity/complete\"\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Collections.Generic;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.IdWallets.StartFtnAsync(new DigitalIdWalletApiFtnWalletVerificationStartRequest\n{\n    VendorData = \"your-customer-reference\",\n    Metadata = new Dictionary<string, object> { [\"reference\"] = \"example\" },\n    Country = new DigitalIdWalletApiFtnWalletVerificationStartCountryEnum(\"FIN\"),\n    ReturnUrl = \"https://app.example.com/identity/complete\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "x-didit-wallet-id": "ftn"
      }
    },
    "/v3/id-verification/wallets/personalausweis/": {
      "post": {
        "operationId": "start_personalausweis_wallet_verification",
        "x-didit-sdk": {
          "resource": "id_wallets",
          "method": "start_personalausweis",
          "auth": "api_key",
          "server": true
        },
        "description": "Starten Sie eine Personalausweis-Anmeldung (Bundesministerium des Innern (eID); DEU) ohne Workflow. Wird einmalig abgerechnet, nur wenn die Identität verifiziert ist. Die Antwort enthält next_action.type=redirect mit der URL, an die der Browser des Benutzers geleitet werden soll; der Benutzer kehrt zu return_url zurück, an die request_id und result angehängt sind. Lesen Sie das Ergebnis mit GET /v3/id-verification/wallets/verifications/{request_id}/ oder aus dem Webhook aus, niemals aus der URL. Sandbox-Anwendungen erhalten eine deterministische Simulation (simulated: true), die den Anbieter niemals kontaktiert.",
        "summary": "Personalausweis-Verifizierung starten",
        "parameters": [
          {
            "in": "header",
            "name": "Idempotency-Key",
            "schema": {
              "type": "string"
            },
            "description": "Optionaler Schlüssel zur Wiederholungssicherheit (max. 255 Zeichen). Ein erneuter Versuch mit demselben Schlüssel, derselben Wallet und demselben Body gibt die ursprüngliche Verifizierung zurück, ohne eine zweite Anmeldung zu starten; derselbe Schlüssel mit einer anderen Wallet oder einem anderen Body gibt 409 idempotency_key_reused zurück."
          }
        ],
        "tags": [
          "Digital ID wallets"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DigitalIdWalletApiPersonalausweisWalletVerificationStartRequest"
              },
              "example": {
                "country": "DEU",
                "vendor_data": "your-customer-reference",
                "metadata": {
                  "reference": "example"
                },
                "return_url": "https://app.example.com/identity/complete"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/DigitalIdWalletApiPersonalausweisWalletVerificationStartRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/DigitalIdWalletApiPersonalausweisWalletVerificationStartRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationResponse"
                },
                "example": {
                  "request_id": "00000000-0000-4000-8000-000000000001",
                  "wallet_verification": {
                    "wallet": {
                      "id": "personalausweis",
                      "name": "Personalausweis",
                      "issuing_authority": "Bundesministerium des Innern (eID)"
                    },
                    "country": "DEU",
                    "status": "Not Finished",
                    "outcome": "pending",
                    "error": null,
                    "interaction": "redirect",
                    "simulated": false,
                    "expires_at": "2026-01-01T10:10:00Z",
                    "next_action": {
                      "type": "redirect",
                      "url": "https://wallet.example.com/authorize"
                    },
                    "identity": null,
                    "attributes": null,
                    "level_of_assurance": null,
                    "verified_at": null,
                    "signature_valid": null,
                    "credential_type": "person_identification"
                  },
                  "vendor_data": "your-customer-reference",
                  "metadata": {
                    "reference": "example"
                  },
                  "created_at": "2026-01-01T10:00:00Z"
                }
              }
            },
            "description": ""
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationStartBadRequest"
                }
              }
            },
            "description": "Feldvalidierungsfehler ({field: [messages]}) oder Fehler return_url_invalid, return_url_not_allowed, invalid_personal_code, invalid_phone_number oder idempotency_key_invalid."
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationStartForbidden"
                }
              }
            },
            "description": "Fehlende Anmeldedaten ({detail}) oder Fehler wallet_unavailable, insufficient_credits oder contract_rate_missing."
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationError"
                }
              }
            },
            "description": "Fehler idempotency_key_reused oder idempotency_key_in_progress (mit Retry-After)."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationError"
                }
              }
            },
            "description": "Fehler wallet_provider_unavailable: Der Anbieter konnte nicht gestartet werden; es wurde nichts erstellt."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationError"
                }
              }
            },
            "description": "Fehler wallet_not_configured: Diese Umgebung kann die Wallet nicht erreichen."
          }
        },
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "cURL",
            "source": "curl --request POST \\\n  --url https://verification.didit.me/v3/id-verification/wallets/personalausweis/ \\\n  --header 'x-api-key: YOUR_API_KEY' \\\n  --header 'Idempotency-Key: your-unique-attempt-key' \\\n  --header 'Content-Type: application/json' \\\n  --data '{\n  \"country\": \"DEU\",\n  \"vendor_data\": \"your-customer-reference\",\n  \"metadata\": {\n    \"reference\": \"example\"\n  },\n  \"return_url\": \"https://app.example.com/identity/complete\"\n}'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.id_wallets.start_personalausweis(\n    vendor_data=\"your-customer-reference\",\n    metadata={\"reference\": \"example\"},\n    country=\"DEU\",\n    return_url=\"https://app.example.com/identity/complete\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.idWallets.startPersonalausweis({\n  vendor_data: \"your-customer-reference\",\n  metadata: { reference: \"example\" },\n  country: \"DEU\",\n  return_url: \"https://app.example.com/identity/complete\",\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.IDWallets.StartPersonalausweis(ctx, didit.IDWalletsStartPersonalausweisParams{\n\tBody: didit.DigitalIDWalletAPIPersonalausweisWalletVerificationStartRequest{\n\t\tVendorData: didit.String(\"your-customer-reference\"),\n\t\tMetadata:   didit.Some(map[string]any{\"reference\": \"example\"}),\n\t\tCountry:    didit.Some(didit.DigitalIDWalletAPIPersonalausweisWalletVerificationStartCountryEnum(\"DEU\")),\n\t\tReturnURL:  \"https://app.example.com/identity/complete\",\n\t},\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import java.util.Map;\nimport me.didit.Didit;\nimport me.didit.types.DigitalIdWalletApiPersonalausweisWalletVerificationStartCountryEnum;\nimport me.didit.types.DigitalIdWalletApiPersonalausweisWalletVerificationStartRequest;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.idWallets().startPersonalausweis(DigitalIdWalletApiPersonalausweisWalletVerificationStartRequest.builder()\n        .vendorData(\"your-customer-reference\")\n        .metadata(Map.of(\"reference\", \"example\"))\n        .country(DigitalIdWalletApiPersonalausweisWalletVerificationStartCountryEnum.of(\"DEU\"))\n        .returnUrl(\"https://app.example.com/identity/complete\")\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->idWallets->startPersonalausweis([\n    'vendor_data' => 'your-customer-reference',\n    'metadata' => ['reference' => 'example'],\n    'country' => 'DEU',\n    'return_url' => 'https://app.example.com/identity/complete',\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.id_wallets.start_personalausweis(\n  vendor_data: \"your-customer-reference\",\n  metadata: { reference: \"example\" },\n  country: \"DEU\",\n  return_url: \"https://app.example.com/identity/complete\"\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Collections.Generic;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.IdWallets.StartPersonalausweisAsync(new DigitalIdWalletApiPersonalausweisWalletVerificationStartRequest\n{\n    VendorData = \"your-customer-reference\",\n    Metadata = new Dictionary<string, object> { [\"reference\"] = \"example\" },\n    Country = new DigitalIdWalletApiPersonalausweisWalletVerificationStartCountryEnum(\"DEU\"),\n    ReturnUrl = \"https://app.example.com/identity/complete\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "x-didit-wallet-id": "personalausweis"
      }
    },
    "/v3/id-verification/wallets/frejaid/": {
      "post": {
        "operationId": "start_frejaid_wallet_verification",
        "x-didit-sdk": {
          "resource": "id_wallets",
          "method": "start_frejaid",
          "auth": "api_key",
          "server": true
        },
        "description": "Starten Sie eine Freja-eID-Anmeldung (Freja eID Group; SWE) ohne Workflow. Die Abrechnung erfolgt einmalig, nur wenn die Identität verifiziert wurde. Die Antwort enthält next_action.type=redirect mit der URL, an die der Browser des Benutzers weitergeleitet werden soll; der Benutzer kehrt zu return_url zurück, an die request_id und result angehängt werden. Lesen Sie das Ergebnis über GET /v3/id-verification/wallets/verifications/{request_id}/ oder über den Webhook aus, niemals aus der URL. Sandbox-Anwendungen erhalten eine deterministische Simulation (simulated: true), die niemals den Anbieter kontaktiert.",
        "summary": "Freja eID-Verifizierung starten",
        "parameters": [
          {
            "in": "header",
            "name": "Idempotency-Key",
            "schema": {
              "type": "string"
            },
            "description": "Optionaler Schlüssel zur Wiederholungssicherheit (max. 255 Zeichen). Ein erneuter Versuch mit demselben Schlüssel, derselben Wallet und demselben Body gibt die ursprüngliche Verifizierung zurück, ohne eine zweite Anmeldung zu starten; derselbe Schlüssel mit einer anderen Wallet oder einem anderen Body gibt 409 idempotency_key_reused zurück."
          }
        ],
        "tags": [
          "Digital ID wallets"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DigitalIdWalletApiFrejaidWalletVerificationStartRequest"
              },
              "example": {
                "country": "SWE",
                "vendor_data": "your-customer-reference",
                "metadata": {
                  "reference": "example"
                },
                "return_url": "https://app.example.com/identity/complete"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/DigitalIdWalletApiFrejaidWalletVerificationStartRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/DigitalIdWalletApiFrejaidWalletVerificationStartRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationResponse"
                },
                "example": {
                  "request_id": "00000000-0000-4000-8000-000000000001",
                  "wallet_verification": {
                    "wallet": {
                      "id": "frejaid",
                      "name": "Freja eID",
                      "issuing_authority": "Freja eID Group"
                    },
                    "country": "SWE",
                    "status": "Not Finished",
                    "outcome": "pending",
                    "error": null,
                    "interaction": "redirect",
                    "simulated": false,
                    "expires_at": "2026-01-01T10:10:00Z",
                    "next_action": {
                      "type": "redirect",
                      "url": "https://wallet.example.com/authorize"
                    },
                    "identity": null,
                    "attributes": null,
                    "level_of_assurance": null,
                    "verified_at": null,
                    "signature_valid": null,
                    "credential_type": "person_identification"
                  },
                  "vendor_data": "your-customer-reference",
                  "metadata": {
                    "reference": "example"
                  },
                  "created_at": "2026-01-01T10:00:00Z"
                }
              }
            },
            "description": ""
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationStartBadRequest"
                }
              }
            },
            "description": "Feldvalidierungsfehler ({field: [messages]}) oder Fehler return_url_invalid, return_url_not_allowed, invalid_personal_code, invalid_phone_number oder idempotency_key_invalid."
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationStartForbidden"
                }
              }
            },
            "description": "Fehlende Anmeldedaten ({detail}) oder Fehler wallet_unavailable, insufficient_credits oder contract_rate_missing."
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationError"
                }
              }
            },
            "description": "Fehler idempotency_key_reused oder idempotency_key_in_progress (mit Retry-After)."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationError"
                }
              }
            },
            "description": "Fehler wallet_provider_unavailable: Der Anbieter konnte nicht gestartet werden; es wurde nichts erstellt."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationError"
                }
              }
            },
            "description": "Fehler wallet_not_configured: Diese Umgebung kann die Wallet nicht erreichen."
          }
        },
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "cURL",
            "source": "curl --request POST \\\n  --url https://verification.didit.me/v3/id-verification/wallets/frejaid/ \\\n  --header 'x-api-key: YOUR_API_KEY' \\\n  --header 'Idempotency-Key: your-unique-attempt-key' \\\n  --header 'Content-Type: application/json' \\\n  --data '{\n  \"country\": \"SWE\",\n  \"vendor_data\": \"your-customer-reference\",\n  \"metadata\": {\n    \"reference\": \"example\"\n  },\n  \"return_url\": \"https://app.example.com/identity/complete\"\n}'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.id_wallets.start_frejaid(\n    vendor_data=\"your-customer-reference\",\n    metadata={\"reference\": \"example\"},\n    country=\"SWE\",\n    return_url=\"https://app.example.com/identity/complete\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.idWallets.startFrejaid({\n  vendor_data: \"your-customer-reference\",\n  metadata: { reference: \"example\" },\n  country: \"SWE\",\n  return_url: \"https://app.example.com/identity/complete\",\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.IDWallets.StartFrejaid(ctx, didit.IDWalletsStartFrejaidParams{\n\tBody: didit.DigitalIDWalletAPIFrejaidWalletVerificationStartRequest{\n\t\tVendorData: didit.String(\"your-customer-reference\"),\n\t\tMetadata:   didit.Some(map[string]any{\"reference\": \"example\"}),\n\t\tCountry:    didit.Some(didit.DigitalIDWalletAPICountryEe9enum(\"SWE\")),\n\t\tReturnURL:  \"https://app.example.com/identity/complete\",\n\t},\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import java.util.Map;\nimport me.didit.Didit;\nimport me.didit.types.DigitalIdWalletApiCountryEe9Enum;\nimport me.didit.types.DigitalIdWalletApiFrejaidWalletVerificationStartRequest;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.idWallets().startFrejaid(DigitalIdWalletApiFrejaidWalletVerificationStartRequest.builder()\n        .vendorData(\"your-customer-reference\")\n        .metadata(Map.of(\"reference\", \"example\"))\n        .country(DigitalIdWalletApiCountryEe9Enum.of(\"SWE\"))\n        .returnUrl(\"https://app.example.com/identity/complete\")\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->idWallets->startFrejaid([\n    'vendor_data' => 'your-customer-reference',\n    'metadata' => ['reference' => 'example'],\n    'country' => 'SWE',\n    'return_url' => 'https://app.example.com/identity/complete',\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.id_wallets.start_frejaid(\n  vendor_data: \"your-customer-reference\",\n  metadata: { reference: \"example\" },\n  country: \"SWE\",\n  return_url: \"https://app.example.com/identity/complete\"\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Collections.Generic;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.IdWallets.StartFrejaidAsync(new DigitalIdWalletApiFrejaidWalletVerificationStartRequest\n{\n    VendorData = \"your-customer-reference\",\n    Metadata = new Dictionary<string, object> { [\"reference\"] = \"example\" },\n    Country = new DigitalIdWalletApiCountryEe9Enum(\"SWE\"),\n    ReturnUrl = \"https://app.example.com/identity/complete\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "x-didit-wallet-id": "frejaid"
      }
    },
    "/v3/id-verification/wallets/uae-pass/": {
      "post": {
        "operationId": "start_uae_pass_wallet_verification",
        "x-didit-sdk": {
          "resource": "id_wallets",
          "method": "start_uae_pass",
          "auth": "api_key",
          "server": true
        },
        "description": "Starten Sie eine UAE PASS-Anmeldung (UAE Digital Government Authority; ARE) ohne Workflow. Wird einmalig abgerechnet, nur wenn die Identität verifiziert ist. Die Antwort enthält next_action.type=redirect mit der URL, an die der Browser des Benutzers geleitet werden soll; der Benutzer kehrt zu return_url zurück, an das request_id und result angehängt sind. Lesen Sie das Ergebnis mit GET /v3/id-verification/wallets/verifications/{request_id}/ oder aus dem Webhook aus, niemals aus der URL. Sandbox-Anwendungen erhalten eine deterministische Simulation (simulated: true), die den Anbieter niemals kontaktiert.",
        "summary": "UAE PASS-Verifizierung starten",
        "parameters": [
          {
            "in": "header",
            "name": "Idempotency-Key",
            "schema": {
              "type": "string"
            },
            "description": "Optionaler Schlüssel zur Wiederholungssicherheit (max. 255 Zeichen). Ein erneuter Versuch mit demselben Schlüssel, derselben Wallet und demselben Body gibt die ursprüngliche Verifizierung zurück, ohne eine zweite Anmeldung zu starten; derselbe Schlüssel mit einer anderen Wallet oder einem anderen Body gibt 409 idempotency_key_reused zurück."
          }
        ],
        "tags": [
          "Digital ID wallets"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DigitalIdWalletApiUaePassWalletVerificationStartRequest"
              },
              "example": {
                "country": "ARE",
                "vendor_data": "your-customer-reference",
                "metadata": {
                  "reference": "example"
                },
                "return_url": "https://app.example.com/identity/complete"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/DigitalIdWalletApiUaePassWalletVerificationStartRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/DigitalIdWalletApiUaePassWalletVerificationStartRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationResponse"
                },
                "example": {
                  "request_id": "00000000-0000-4000-8000-000000000001",
                  "wallet_verification": {
                    "wallet": {
                      "id": "uae_pass",
                      "name": "UAE PASS",
                      "issuing_authority": "UAE Digital Government Authority"
                    },
                    "country": "ARE",
                    "status": "Not Finished",
                    "outcome": "pending",
                    "error": null,
                    "interaction": "redirect",
                    "simulated": false,
                    "expires_at": "2026-01-01T10:10:00Z",
                    "next_action": {
                      "type": "redirect",
                      "url": "https://wallet.example.com/authorize"
                    },
                    "identity": null,
                    "attributes": null,
                    "level_of_assurance": null,
                    "verified_at": null,
                    "signature_valid": null,
                    "credential_type": "person_identification"
                  },
                  "vendor_data": "your-customer-reference",
                  "metadata": {
                    "reference": "example"
                  },
                  "created_at": "2026-01-01T10:00:00Z"
                }
              }
            },
            "description": ""
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationStartBadRequest"
                }
              }
            },
            "description": "Feldvalidierungsfehler ({field: [messages]}) oder Fehler return_url_invalid, return_url_not_allowed, invalid_personal_code, invalid_phone_number oder idempotency_key_invalid."
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationStartForbidden"
                }
              }
            },
            "description": "Fehlende Anmeldedaten ({detail}) oder Fehler wallet_unavailable, insufficient_credits oder contract_rate_missing."
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationError"
                }
              }
            },
            "description": "Fehler idempotency_key_reused oder idempotency_key_in_progress (mit Retry-After)."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationError"
                }
              }
            },
            "description": "Fehler wallet_provider_unavailable: Der Anbieter konnte nicht gestartet werden; es wurde nichts erstellt."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationError"
                }
              }
            },
            "description": "Fehler wallet_not_configured: Diese Umgebung kann die Wallet nicht erreichen."
          }
        },
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "cURL",
            "source": "curl --request POST \\\n  --url https://verification.didit.me/v3/id-verification/wallets/uae-pass/ \\\n  --header 'x-api-key: YOUR_API_KEY' \\\n  --header 'Idempotency-Key: your-unique-attempt-key' \\\n  --header 'Content-Type: application/json' \\\n  --data '{\n  \"country\": \"ARE\",\n  \"vendor_data\": \"your-customer-reference\",\n  \"metadata\": {\n    \"reference\": \"example\"\n  },\n  \"return_url\": \"https://app.example.com/identity/complete\"\n}'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.id_wallets.start_uae_pass(\n    vendor_data=\"your-customer-reference\",\n    metadata={\"reference\": \"example\"},\n    country=\"ARE\",\n    return_url=\"https://app.example.com/identity/complete\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.idWallets.startUaePass({\n  vendor_data: \"your-customer-reference\",\n  metadata: { reference: \"example\" },\n  country: \"ARE\",\n  return_url: \"https://app.example.com/identity/complete\",\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.IDWallets.StartUaePass(ctx, didit.IDWalletsStartUaePassParams{\n\tBody: didit.DigitalIDWalletAPIUaePassWalletVerificationStartRequest{\n\t\tVendorData: didit.String(\"your-customer-reference\"),\n\t\tMetadata:   didit.Some(map[string]any{\"reference\": \"example\"}),\n\t\tCountry:    didit.Some(didit.DigitalIDWalletAPIUaePassWalletVerificationStartCountryEnum(\"ARE\")),\n\t\tReturnURL:  \"https://app.example.com/identity/complete\",\n\t},\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import java.util.Map;\nimport me.didit.Didit;\nimport me.didit.types.DigitalIdWalletApiUaePassWalletVerificationStartCountryEnum;\nimport me.didit.types.DigitalIdWalletApiUaePassWalletVerificationStartRequest;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.idWallets().startUaePass(DigitalIdWalletApiUaePassWalletVerificationStartRequest.builder()\n        .vendorData(\"your-customer-reference\")\n        .metadata(Map.of(\"reference\", \"example\"))\n        .country(DigitalIdWalletApiUaePassWalletVerificationStartCountryEnum.of(\"ARE\"))\n        .returnUrl(\"https://app.example.com/identity/complete\")\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->idWallets->startUaePass([\n    'vendor_data' => 'your-customer-reference',\n    'metadata' => ['reference' => 'example'],\n    'country' => 'ARE',\n    'return_url' => 'https://app.example.com/identity/complete',\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.id_wallets.start_uae_pass(\n  vendor_data: \"your-customer-reference\",\n  metadata: { reference: \"example\" },\n  country: \"ARE\",\n  return_url: \"https://app.example.com/identity/complete\"\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Collections.Generic;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.IdWallets.StartUaePassAsync(new DigitalIdWalletApiUaePassWalletVerificationStartRequest\n{\n    VendorData = \"your-customer-reference\",\n    Metadata = new Dictionary<string, object> { [\"reference\"] = \"example\" },\n    Country = new DigitalIdWalletApiUaePassWalletVerificationStartCountryEnum(\"ARE\"),\n    ReturnUrl = \"https://app.example.com/identity/complete\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "x-didit-wallet-id": "uae_pass"
      }
    },
    "/v3/id-verification/wallets/govbr/": {
      "post": {
        "operationId": "start_govbr_wallet_verification",
        "x-didit-sdk": {
          "resource": "id_wallets",
          "method": "start_govbr",
          "auth": "api_key",
          "server": true
        },
        "description": "Starten Sie eine gov.br-Anmeldung (Governo Federal do Brasil; BRA) ohne Workflow. Wird einmalig abgerechnet, nur wenn die Identität verifiziert ist. Die Antwort enthält next_action.type=redirect mit der URL, an die der Browser des Benutzers geleitet werden soll; der Benutzer kehrt zu return_url zurück, an die request_id und result angehängt sind. Lesen Sie das Ergebnis mit GET /v3/id-verification/wallets/verifications/{request_id}/ oder aus dem Webhook aus, niemals aus der URL. Sandbox-Anwendungen erhalten eine deterministische Simulation (simulated: true), die den Anbieter niemals kontaktiert.",
        "summary": "gov.br-Verifizierung starten",
        "parameters": [
          {
            "in": "header",
            "name": "Idempotency-Key",
            "schema": {
              "type": "string"
            },
            "description": "Optionaler Schlüssel zur Wiederholungssicherheit (max. 255 Zeichen). Ein erneuter Versuch mit demselben Schlüssel, derselben Wallet und demselben Body gibt die ursprüngliche Verifizierung zurück, ohne eine zweite Anmeldung zu starten; derselbe Schlüssel mit einer anderen Wallet oder einem anderen Body gibt 409 idempotency_key_reused zurück."
          }
        ],
        "tags": [
          "Digital ID wallets"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DigitalIdWalletApiGovbrWalletVerificationStartRequest"
              },
              "example": {
                "country": "BRA",
                "vendor_data": "your-customer-reference",
                "metadata": {
                  "reference": "example"
                },
                "return_url": "https://app.example.com/identity/complete"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/DigitalIdWalletApiGovbrWalletVerificationStartRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/DigitalIdWalletApiGovbrWalletVerificationStartRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationResponse"
                },
                "example": {
                  "request_id": "00000000-0000-4000-8000-000000000001",
                  "wallet_verification": {
                    "wallet": {
                      "id": "govbr",
                      "name": "gov.br",
                      "issuing_authority": "Governo Federal do Brasil"
                    },
                    "country": "BRA",
                    "status": "Not Finished",
                    "outcome": "pending",
                    "error": null,
                    "interaction": "redirect",
                    "simulated": false,
                    "expires_at": "2026-01-01T10:10:00Z",
                    "next_action": {
                      "type": "redirect",
                      "url": "https://wallet.example.com/authorize"
                    },
                    "identity": null,
                    "attributes": null,
                    "level_of_assurance": null,
                    "verified_at": null,
                    "signature_valid": null,
                    "credential_type": "person_identification"
                  },
                  "vendor_data": "your-customer-reference",
                  "metadata": {
                    "reference": "example"
                  },
                  "created_at": "2026-01-01T10:00:00Z"
                }
              }
            },
            "description": ""
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationStartBadRequest"
                }
              }
            },
            "description": "Feldvalidierungsfehler ({field: [messages]}) oder Fehler return_url_invalid, return_url_not_allowed, invalid_personal_code, invalid_phone_number oder idempotency_key_invalid."
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationStartForbidden"
                }
              }
            },
            "description": "Fehlende Anmeldedaten ({detail}) oder Fehler wallet_unavailable, insufficient_credits oder contract_rate_missing."
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationError"
                }
              }
            },
            "description": "Fehler idempotency_key_reused oder idempotency_key_in_progress (mit Retry-After)."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationError"
                }
              }
            },
            "description": "Fehler wallet_provider_unavailable: Der Anbieter konnte nicht gestartet werden; es wurde nichts erstellt."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationError"
                }
              }
            },
            "description": "Fehler wallet_not_configured: Diese Umgebung kann die Wallet nicht erreichen."
          }
        },
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "cURL",
            "source": "curl --request POST \\\n  --url https://verification.didit.me/v3/id-verification/wallets/govbr/ \\\n  --header 'x-api-key: YOUR_API_KEY' \\\n  --header 'Idempotency-Key: your-unique-attempt-key' \\\n  --header 'Content-Type: application/json' \\\n  --data '{\n  \"country\": \"BRA\",\n  \"vendor_data\": \"your-customer-reference\",\n  \"metadata\": {\n    \"reference\": \"example\"\n  },\n  \"return_url\": \"https://app.example.com/identity/complete\"\n}'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.id_wallets.start_govbr(\n    vendor_data=\"your-customer-reference\",\n    metadata={\"reference\": \"example\"},\n    country=\"BRA\",\n    return_url=\"https://app.example.com/identity/complete\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.idWallets.startGovbr({\n  vendor_data: \"your-customer-reference\",\n  metadata: { reference: \"example\" },\n  country: \"BRA\",\n  return_url: \"https://app.example.com/identity/complete\",\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.IDWallets.StartGovbr(ctx, didit.IDWalletsStartGovbrParams{\n\tBody: didit.DigitalIDWalletAPIGovbrWalletVerificationStartRequest{\n\t\tVendorData: didit.String(\"your-customer-reference\"),\n\t\tMetadata:   didit.Some(map[string]any{\"reference\": \"example\"}),\n\t\tCountry:    didit.Some(didit.DigitalIDWalletAPIGovbrWalletVerificationStartCountryEnum(\"BRA\")),\n\t\tReturnURL:  \"https://app.example.com/identity/complete\",\n\t},\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import java.util.Map;\nimport me.didit.Didit;\nimport me.didit.types.DigitalIdWalletApiGovbrWalletVerificationStartCountryEnum;\nimport me.didit.types.DigitalIdWalletApiGovbrWalletVerificationStartRequest;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.idWallets().startGovbr(DigitalIdWalletApiGovbrWalletVerificationStartRequest.builder()\n        .vendorData(\"your-customer-reference\")\n        .metadata(Map.of(\"reference\", \"example\"))\n        .country(DigitalIdWalletApiGovbrWalletVerificationStartCountryEnum.of(\"BRA\"))\n        .returnUrl(\"https://app.example.com/identity/complete\")\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->idWallets->startGovbr([\n    'vendor_data' => 'your-customer-reference',\n    'metadata' => ['reference' => 'example'],\n    'country' => 'BRA',\n    'return_url' => 'https://app.example.com/identity/complete',\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.id_wallets.start_govbr(\n  vendor_data: \"your-customer-reference\",\n  metadata: { reference: \"example\" },\n  country: \"BRA\",\n  return_url: \"https://app.example.com/identity/complete\"\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Collections.Generic;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.IdWallets.StartGovbrAsync(new DigitalIdWalletApiGovbrWalletVerificationStartRequest\n{\n    VendorData = \"your-customer-reference\",\n    Metadata = new Dictionary<string, object> { [\"reference\"] = \"example\" },\n    Country = new DigitalIdWalletApiGovbrWalletVerificationStartCountryEnum(\"BRA\"),\n    ReturnUrl = \"https://app.example.com/identity/complete\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "x-didit-wallet-id": "govbr"
      }
    },
    "/v3/id-verification/wallets/oneid/": {
      "post": {
        "operationId": "start_oneid_wallet_verification",
        "x-didit-sdk": {
          "resource": "id_wallets",
          "method": "start_oneid",
          "auth": "api_key",
          "server": true
        },
        "description": "Starten Sie eine OneID-Anmeldung (OneID (im Vereinigten Königreich bankbestätigte Identität); GBR) ohne Workflow. Wird einmalig abgerechnet, nur wenn die Identität verifiziert ist. Die Antwort enthält next_action.type=redirect mit der URL, an die der Browser des Benutzers geleitet werden soll; der Benutzer kehrt zu return_url zurück, an die request_id und result angehängt sind. Lesen Sie das Ergebnis mit GET /v3/id-verification/wallets/verifications/{request_id}/ oder aus dem Webhook aus, niemals aus der URL. Sandbox-Anwendungen erhalten eine deterministische Simulation (simulated: true), die den Anbieter niemals kontaktiert.",
        "summary": "OneID-Verifizierung starten",
        "parameters": [
          {
            "in": "header",
            "name": "Idempotency-Key",
            "schema": {
              "type": "string"
            },
            "description": "Optionaler Schlüssel zur Wiederholungssicherheit (max. 255 Zeichen). Ein erneuter Versuch mit demselben Schlüssel, derselben Wallet und demselben Body gibt die ursprüngliche Verifizierung zurück, ohne eine zweite Anmeldung zu starten; derselbe Schlüssel mit einer anderen Wallet oder einem anderen Body gibt 409 idempotency_key_reused zurück."
          }
        ],
        "tags": [
          "Digital ID wallets"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DigitalIdWalletApiOneidWalletVerificationStartRequest"
              },
              "example": {
                "country": "GBR",
                "vendor_data": "your-customer-reference",
                "metadata": {
                  "reference": "example"
                },
                "return_url": "https://app.example.com/identity/complete"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/DigitalIdWalletApiOneidWalletVerificationStartRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/DigitalIdWalletApiOneidWalletVerificationStartRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationResponse"
                },
                "example": {
                  "request_id": "00000000-0000-4000-8000-000000000001",
                  "wallet_verification": {
                    "wallet": {
                      "id": "oneid",
                      "name": "OneID",
                      "issuing_authority": "OneID (UK bank-verified identity)"
                    },
                    "country": "GBR",
                    "status": "Not Finished",
                    "outcome": "pending",
                    "error": null,
                    "interaction": "redirect",
                    "simulated": false,
                    "expires_at": "2026-01-01T10:10:00Z",
                    "next_action": {
                      "type": "redirect",
                      "url": "https://wallet.example.com/authorize"
                    },
                    "identity": null,
                    "attributes": null,
                    "level_of_assurance": null,
                    "verified_at": null,
                    "signature_valid": null,
                    "credential_type": "person_identification"
                  },
                  "vendor_data": "your-customer-reference",
                  "metadata": {
                    "reference": "example"
                  },
                  "created_at": "2026-01-01T10:00:00Z"
                }
              }
            },
            "description": ""
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationStartBadRequest"
                }
              }
            },
            "description": "Feldvalidierungsfehler ({field: [messages]}) oder Fehler return_url_invalid, return_url_not_allowed, invalid_personal_code, invalid_phone_number oder idempotency_key_invalid."
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationStartForbidden"
                }
              }
            },
            "description": "Fehlende Anmeldedaten ({detail}) oder Fehler wallet_unavailable, insufficient_credits oder contract_rate_missing."
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationError"
                }
              }
            },
            "description": "Fehler idempotency_key_reused oder idempotency_key_in_progress (mit Retry-After)."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationError"
                }
              }
            },
            "description": "Fehler wallet_provider_unavailable: Der Anbieter konnte nicht gestartet werden; es wurde nichts erstellt."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationError"
                }
              }
            },
            "description": "Fehler wallet_not_configured: Diese Umgebung kann die Wallet nicht erreichen."
          }
        },
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "cURL",
            "source": "curl --request POST \\\n  --url https://verification.didit.me/v3/id-verification/wallets/oneid/ \\\n  --header 'x-api-key: YOUR_API_KEY' \\\n  --header 'Idempotency-Key: your-unique-attempt-key' \\\n  --header 'Content-Type: application/json' \\\n  --data '{\n  \"country\": \"GBR\",\n  \"vendor_data\": \"your-customer-reference\",\n  \"metadata\": {\n    \"reference\": \"example\"\n  },\n  \"return_url\": \"https://app.example.com/identity/complete\"\n}'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.id_wallets.start_oneid(\n    vendor_data=\"your-customer-reference\",\n    metadata={\"reference\": \"example\"},\n    country=\"GBR\",\n    return_url=\"https://app.example.com/identity/complete\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.idWallets.startOneid({\n  vendor_data: \"your-customer-reference\",\n  metadata: { reference: \"example\" },\n  country: \"GBR\",\n  return_url: \"https://app.example.com/identity/complete\",\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.IDWallets.StartOneid(ctx, didit.IDWalletsStartOneidParams{\n\tBody: didit.DigitalIDWalletAPIOneidWalletVerificationStartRequest{\n\t\tVendorData: didit.String(\"your-customer-reference\"),\n\t\tMetadata:   didit.Some(map[string]any{\"reference\": \"example\"}),\n\t\tCountry:    didit.Some(didit.DigitalIDWalletAPICountry520enum(\"GBR\")),\n\t\tReturnURL:  \"https://app.example.com/identity/complete\",\n\t},\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import java.util.Map;\nimport me.didit.Didit;\nimport me.didit.types.DigitalIdWalletApiCountry520Enum;\nimport me.didit.types.DigitalIdWalletApiOneidWalletVerificationStartRequest;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.idWallets().startOneid(DigitalIdWalletApiOneidWalletVerificationStartRequest.builder()\n        .vendorData(\"your-customer-reference\")\n        .metadata(Map.of(\"reference\", \"example\"))\n        .country(DigitalIdWalletApiCountry520Enum.of(\"GBR\"))\n        .returnUrl(\"https://app.example.com/identity/complete\")\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->idWallets->startOneid([\n    'vendor_data' => 'your-customer-reference',\n    'metadata' => ['reference' => 'example'],\n    'country' => 'GBR',\n    'return_url' => 'https://app.example.com/identity/complete',\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.id_wallets.start_oneid(\n  vendor_data: \"your-customer-reference\",\n  metadata: { reference: \"example\" },\n  country: \"GBR\",\n  return_url: \"https://app.example.com/identity/complete\"\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Collections.Generic;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.IdWallets.StartOneidAsync(new DigitalIdWalletApiOneidWalletVerificationStartRequest\n{\n    VendorData = \"your-customer-reference\",\n    Metadata = new Dictionary<string, object> { [\"reference\"] = \"example\" },\n    Country = new DigitalIdWalletApiCountry520Enum(\"GBR\"),\n    ReturnUrl = \"https://app.example.com/identity/complete\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "x-didit-wallet-id": "oneid"
      }
    },
    "/v3/id-verification/wallets/govuk-wallet/": {
      "post": {
        "operationId": "start_govuk_wallet_wallet_verification",
        "x-didit-sdk": {
          "resource": "id_wallets",
          "method": "start_govuk_wallet",
          "auth": "api_key",
          "server": true
        },
        "description": "Starten Sie eine GOV.UK-Wallet-Anmeldung (UK Government Digital Service; GBR) ohne Workflow. Die Abrechnung erfolgt einmalig, nur wenn die Identität verifiziert wurde. Die Antwort enthält next_action.type=redirect mit der URL, an die der Browser des Benutzers weitergeleitet werden soll; der Benutzer kehrt zu return_url zurück, an die request_id und result angehängt sind. Lesen Sie das Ergebnis über GET /v3/id-verification/wallets/verifications/{request_id}/ oder über den Webhook aus, niemals aus der URL. Sandbox-Anwendungen erhalten eine deterministische Simulation (simulated: true), die niemals den Anbieter kontaktiert.",
        "summary": "GOV.UK Wallet-Verifizierung starten",
        "parameters": [
          {
            "in": "header",
            "name": "Idempotency-Key",
            "schema": {
              "type": "string"
            },
            "description": "Optionaler Schlüssel zur Wiederholungssicherheit (max. 255 Zeichen). Ein erneuter Versuch mit demselben Schlüssel, derselben Wallet und demselben Body gibt die ursprüngliche Verifizierung zurück, ohne eine zweite Anmeldung zu starten; derselbe Schlüssel mit einer anderen Wallet oder einem anderen Body gibt 409 idempotency_key_reused zurück."
          }
        ],
        "tags": [
          "Digital ID wallets"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DigitalIdWalletApiGovukWalletWalletVerificationStartRequest"
              },
              "example": {
                "country": "GBR",
                "vendor_data": "your-customer-reference",
                "metadata": {
                  "reference": "example"
                },
                "return_url": "https://app.example.com/identity/complete"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/DigitalIdWalletApiGovukWalletWalletVerificationStartRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/DigitalIdWalletApiGovukWalletWalletVerificationStartRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationResponse"
                },
                "example": {
                  "request_id": "00000000-0000-4000-8000-000000000001",
                  "wallet_verification": {
                    "wallet": {
                      "id": "govuk_wallet",
                      "name": "GOV.UK Wallet",
                      "issuing_authority": "UK Government Digital Service"
                    },
                    "country": "GBR",
                    "status": "Not Finished",
                    "outcome": "pending",
                    "error": null,
                    "interaction": "redirect",
                    "simulated": false,
                    "expires_at": "2026-01-01T10:10:00Z",
                    "next_action": {
                      "type": "redirect",
                      "url": "https://wallet.example.com/authorize"
                    },
                    "identity": null,
                    "attributes": null,
                    "level_of_assurance": null,
                    "verified_at": null,
                    "signature_valid": null,
                    "credential_type": "person_identification"
                  },
                  "vendor_data": "your-customer-reference",
                  "metadata": {
                    "reference": "example"
                  },
                  "created_at": "2026-01-01T10:00:00Z"
                }
              }
            },
            "description": ""
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationStartBadRequest"
                }
              }
            },
            "description": "Feldvalidierungsfehler ({field: [messages]}) oder Fehler return_url_invalid, return_url_not_allowed, invalid_personal_code, invalid_phone_number oder idempotency_key_invalid."
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationStartForbidden"
                }
              }
            },
            "description": "Fehlende Anmeldedaten ({detail}) oder Fehler wallet_unavailable, insufficient_credits oder contract_rate_missing."
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationError"
                }
              }
            },
            "description": "Fehler idempotency_key_reused oder idempotency_key_in_progress (mit Retry-After)."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationError"
                }
              }
            },
            "description": "Fehler wallet_provider_unavailable: Der Anbieter konnte nicht gestartet werden; es wurde nichts erstellt."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationError"
                }
              }
            },
            "description": "Fehler wallet_not_configured: Diese Umgebung kann die Wallet nicht erreichen."
          }
        },
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "cURL",
            "source": "curl --request POST \\\n  --url https://verification.didit.me/v3/id-verification/wallets/govuk-wallet/ \\\n  --header 'x-api-key: YOUR_API_KEY' \\\n  --header 'Idempotency-Key: your-unique-attempt-key' \\\n  --header 'Content-Type: application/json' \\\n  --data '{\n  \"country\": \"GBR\",\n  \"vendor_data\": \"your-customer-reference\",\n  \"metadata\": {\n    \"reference\": \"example\"\n  },\n  \"return_url\": \"https://app.example.com/identity/complete\"\n}'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.id_wallets.start_govuk_wallet(\n    vendor_data=\"your-customer-reference\",\n    metadata={\"reference\": \"example\"},\n    country=\"GBR\",\n    return_url=\"https://app.example.com/identity/complete\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.idWallets.startGovukWallet({\n  vendor_data: \"your-customer-reference\",\n  metadata: { reference: \"example\" },\n  country: \"GBR\",\n  return_url: \"https://app.example.com/identity/complete\",\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.IDWallets.StartGovukWallet(ctx, didit.IDWalletsStartGovukWalletParams{\n\tBody: didit.DigitalIDWalletAPIGovukWalletWalletVerificationStartRequest{\n\t\tVendorData: didit.String(\"your-customer-reference\"),\n\t\tMetadata:   didit.Some(map[string]any{\"reference\": \"example\"}),\n\t\tCountry:    didit.Some(didit.DigitalIDWalletAPICountry520enum(\"GBR\")),\n\t\tReturnURL:  \"https://app.example.com/identity/complete\",\n\t},\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import java.util.Map;\nimport me.didit.Didit;\nimport me.didit.types.DigitalIdWalletApiCountry520Enum;\nimport me.didit.types.DigitalIdWalletApiGovukWalletWalletVerificationStartRequest;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.idWallets().startGovukWallet(DigitalIdWalletApiGovukWalletWalletVerificationStartRequest.builder()\n        .vendorData(\"your-customer-reference\")\n        .metadata(Map.of(\"reference\", \"example\"))\n        .country(DigitalIdWalletApiCountry520Enum.of(\"GBR\"))\n        .returnUrl(\"https://app.example.com/identity/complete\")\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->idWallets->startGovukWallet([\n    'vendor_data' => 'your-customer-reference',\n    'metadata' => ['reference' => 'example'],\n    'country' => 'GBR',\n    'return_url' => 'https://app.example.com/identity/complete',\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.id_wallets.start_govuk_wallet(\n  vendor_data: \"your-customer-reference\",\n  metadata: { reference: \"example\" },\n  country: \"GBR\",\n  return_url: \"https://app.example.com/identity/complete\"\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Collections.Generic;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.IdWallets.StartGovukWalletAsync(new DigitalIdWalletApiGovukWalletWalletVerificationStartRequest\n{\n    VendorData = \"your-customer-reference\",\n    Metadata = new Dictionary<string, object> { [\"reference\"] = \"example\" },\n    Country = new DigitalIdWalletApiCountry520Enum(\"GBR\"),\n    ReturnUrl = \"https://app.example.com/identity/complete\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "x-didit-wallet-id": "govuk_wallet"
      }
    },
    "/v3/id-verification/wallets/smart-id/": {
      "post": {
        "operationId": "start_smart_id_wallet_verification",
        "x-didit-sdk": {
          "resource": "id_wallets",
          "method": "start_smart_id",
          "auth": "api_key",
          "server": true
        },
        "description": "Starten Sie eine Smart-ID-Anmeldung (SK ID Solutions; EST, LVA, LTU, BEL) ohne Workflow. Wird einmalig abgerechnet, nur wenn die Identität verifiziert ist. Die Antwort enthält next_action.type=confirm_in_app mit dem Vergleichscode, der dem Benutzer angezeigt werden soll; der Benutzer bestätigt ihn und gibt seine PIN in der App ein (erfassen Sie die PIN niemals). Rufen Sie POST /v3/id-verification/wallets/verifications/{request_id}/poll/ alle poll_interval_seconds ab oder verlassen Sie sich auf den Webhook: Didit pollt ebenfalls im Hintergrund. Sandbox-Anwendungen erhalten eine deterministische Simulation (simulated: true), die den Anbieter niemals kontaktiert.",
        "summary": "Smart-ID-Verifizierung starten",
        "parameters": [
          {
            "in": "header",
            "name": "Idempotency-Key",
            "schema": {
              "type": "string"
            },
            "description": "Optionaler Schlüssel zur Wiederholungssicherheit (max. 255 Zeichen). Ein erneuter Versuch mit demselben Schlüssel, derselben Wallet und demselben Body gibt die ursprüngliche Verifizierung zurück, ohne eine zweite Anmeldung zu starten; derselbe Schlüssel mit einer anderen Wallet oder einem anderen Body gibt 409 idempotency_key_reused zurück."
          }
        ],
        "tags": [
          "Digital ID wallets"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DigitalIdWalletApiSmartIdWalletVerificationStartRequest"
              },
              "example": {
                "country": "EST",
                "vendor_data": "your-customer-reference",
                "metadata": {
                  "reference": "example"
                },
                "personal_code": "00000000000"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/DigitalIdWalletApiSmartIdWalletVerificationStartRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/DigitalIdWalletApiSmartIdWalletVerificationStartRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationResponse"
                },
                "example": {
                  "request_id": "00000000-0000-4000-8000-000000000001",
                  "wallet_verification": {
                    "wallet": {
                      "id": "smart_id",
                      "name": "Smart-ID",
                      "issuing_authority": "SK ID Solutions"
                    },
                    "country": "EST",
                    "status": "Not Finished",
                    "outcome": "pending",
                    "error": null,
                    "interaction": "in_app",
                    "simulated": true,
                    "expires_at": "2026-01-01T10:10:00Z",
                    "next_action": {
                      "type": "confirm_in_app",
                      "verification_code": "1234",
                      "poll_interval_seconds": 2
                    },
                    "identity": null,
                    "attributes": null,
                    "level_of_assurance": null,
                    "verified_at": null,
                    "signature_valid": null,
                    "credential_type": "person_identification"
                  },
                  "vendor_data": "your-customer-reference",
                  "metadata": {
                    "reference": "example"
                  },
                  "created_at": "2026-01-01T10:00:00Z"
                }
              }
            },
            "description": ""
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationStartBadRequest"
                }
              }
            },
            "description": "Feldvalidierungsfehler ({field: [messages]}) oder Fehler return_url_invalid, return_url_not_allowed, invalid_personal_code, invalid_phone_number oder idempotency_key_invalid."
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationStartForbidden"
                }
              }
            },
            "description": "Fehlende Anmeldedaten ({detail}) oder Fehler wallet_unavailable, insufficient_credits oder contract_rate_missing."
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationError"
                }
              }
            },
            "description": "Fehler idempotency_key_reused oder idempotency_key_in_progress (mit Retry-After)."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationError"
                }
              }
            },
            "description": "Fehler wallet_provider_unavailable: Der Anbieter konnte nicht gestartet werden; es wurde nichts erstellt."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationError"
                }
              }
            },
            "description": "Fehler wallet_not_configured: Diese Umgebung kann die Wallet nicht erreichen."
          }
        },
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "cURL",
            "source": "curl --request POST \\\n  --url https://verification.didit.me/v3/id-verification/wallets/smart-id/ \\\n  --header 'x-api-key: YOUR_API_KEY' \\\n  --header 'Idempotency-Key: your-unique-attempt-key' \\\n  --header 'Content-Type: application/json' \\\n  --data '{\n  \"country\": \"EST\",\n  \"vendor_data\": \"your-customer-reference\",\n  \"metadata\": {\n    \"reference\": \"example\"\n  },\n  \"personal_code\": \"00000000000\"\n}'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.id_wallets.start_smart_id(\n    vendor_data=\"your-customer-reference\",\n    metadata={\"reference\": \"example\"},\n    country=\"EST\",\n    personal_code=\"00000000000\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.idWallets.startSmartId({\n  vendor_data: \"your-customer-reference\",\n  metadata: { reference: \"example\" },\n  country: \"EST\",\n  personal_code: \"00000000000\",\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.IDWallets.StartSmartID(ctx, didit.IDWalletsStartSmartIDParams{\n\tBody: didit.DigitalIDWalletAPISmartIDWalletVerificationStartRequest{\n\t\tVendorData:   didit.String(\"your-customer-reference\"),\n\t\tMetadata:     didit.Some(map[string]any{\"reference\": \"example\"}),\n\t\tCountry:      didit.DigitalIDWalletAPISmartIDWalletVerificationStartCountryEnum(\"EST\"),\n\t\tPersonalCode: \"00000000000\",\n\t},\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import java.util.Map;\nimport me.didit.Didit;\nimport me.didit.types.DigitalIdWalletApiSmartIdWalletVerificationStartCountryEnum;\nimport me.didit.types.DigitalIdWalletApiSmartIdWalletVerificationStartRequest;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.idWallets().startSmartId(DigitalIdWalletApiSmartIdWalletVerificationStartRequest.builder()\n        .vendorData(\"your-customer-reference\")\n        .metadata(Map.of(\"reference\", \"example\"))\n        .country(DigitalIdWalletApiSmartIdWalletVerificationStartCountryEnum.of(\"EST\"))\n        .personalCode(\"00000000000\")\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->idWallets->startSmartId([\n    'vendor_data' => 'your-customer-reference',\n    'metadata' => ['reference' => 'example'],\n    'country' => 'EST',\n    'personal_code' => '00000000000',\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.id_wallets.start_smart_id(\n  vendor_data: \"your-customer-reference\",\n  metadata: { reference: \"example\" },\n  country: \"EST\",\n  personal_code: \"00000000000\"\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Collections.Generic;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.IdWallets.StartSmartIdAsync(new DigitalIdWalletApiSmartIdWalletVerificationStartRequest\n{\n    VendorData = \"your-customer-reference\",\n    Metadata = new Dictionary<string, object> { [\"reference\"] = \"example\" },\n    Country = \"EST\",\n    PersonalCode = \"00000000000\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "x-didit-wallet-id": "smart_id"
      }
    },
    "/v3/id-verification/wallets/mobile-id/": {
      "post": {
        "operationId": "start_mobile_id_wallet_verification",
        "x-didit-sdk": {
          "resource": "id_wallets",
          "method": "start_mobile_id",
          "auth": "api_key",
          "server": true
        },
        "description": "Starten Sie eine Mobile-ID-Anmeldung (SK ID Solutions mit den nationalen Mobilfunkanbietern; EST, LTU) ohne Workflow. Die Abrechnung erfolgt einmalig, nur wenn die Identität verifiziert wurde. Die Antwort enthält next_action.type=confirm_in_app mit dem Vergleichscode, der dem Benutzer angezeigt werden soll; der Benutzer bestätigt ihn und gibt seine PIN in der App ein (erfassen Sie die PIN niemals selbst). Führen Sie alle poll_interval_seconds eine POST-Anfrage an /v3/id-verification/wallets/verifications/{request_id}/poll/ durch, oder verlassen Sie sich auf den Webhook: Didit führt die Abfrage ebenfalls im Hintergrund durch. Sandbox-Anwendungen erhalten eine deterministische Simulation (simulated: true), die niemals den Anbieter kontaktiert.",
        "summary": "Mobile-ID-Verifizierung starten",
        "parameters": [
          {
            "in": "header",
            "name": "Idempotency-Key",
            "schema": {
              "type": "string"
            },
            "description": "Optionaler Schlüssel zur Wiederholungssicherheit (max. 255 Zeichen). Ein erneuter Versuch mit demselben Schlüssel, derselben Wallet und demselben Body gibt die ursprüngliche Verifizierung zurück, ohne eine zweite Anmeldung zu starten; derselbe Schlüssel mit einer anderen Wallet oder einem anderen Body gibt 409 idempotency_key_reused zurück."
          }
        ],
        "tags": [
          "Digital ID wallets"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DigitalIdWalletApiMobileIdWalletVerificationStartRequest"
              },
              "example": {
                "country": "EST",
                "vendor_data": "your-customer-reference",
                "metadata": {
                  "reference": "example"
                },
                "personal_code": "00000000000",
                "phone_number": "+37200000000"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/DigitalIdWalletApiMobileIdWalletVerificationStartRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/DigitalIdWalletApiMobileIdWalletVerificationStartRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationResponse"
                },
                "example": {
                  "request_id": "00000000-0000-4000-8000-000000000001",
                  "wallet_verification": {
                    "wallet": {
                      "id": "mobile_id",
                      "name": "Mobile-ID",
                      "issuing_authority": "SK ID Solutions with the national mobile operators"
                    },
                    "country": "EST",
                    "status": "Not Finished",
                    "outcome": "pending",
                    "error": null,
                    "interaction": "in_app",
                    "simulated": true,
                    "expires_at": "2026-01-01T10:10:00Z",
                    "next_action": {
                      "type": "confirm_in_app",
                      "verification_code": "1234",
                      "poll_interval_seconds": 2
                    },
                    "identity": null,
                    "attributes": null,
                    "level_of_assurance": null,
                    "verified_at": null,
                    "signature_valid": null,
                    "credential_type": "person_identification"
                  },
                  "vendor_data": "your-customer-reference",
                  "metadata": {
                    "reference": "example"
                  },
                  "created_at": "2026-01-01T10:00:00Z"
                }
              }
            },
            "description": ""
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationStartBadRequest"
                }
              }
            },
            "description": "Feldvalidierungsfehler ({field: [messages]}) oder Fehler return_url_invalid, return_url_not_allowed, invalid_personal_code, invalid_phone_number oder idempotency_key_invalid."
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationStartForbidden"
                }
              }
            },
            "description": "Fehlende Anmeldedaten ({detail}) oder Fehler wallet_unavailable, insufficient_credits oder contract_rate_missing."
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationError"
                }
              }
            },
            "description": "Fehler idempotency_key_reused oder idempotency_key_in_progress (mit Retry-After)."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationError"
                }
              }
            },
            "description": "Fehler wallet_provider_unavailable: Der Anbieter konnte nicht gestartet werden; es wurde nichts erstellt."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationError"
                }
              }
            },
            "description": "Fehler wallet_not_configured: Diese Umgebung kann die Wallet nicht erreichen."
          }
        },
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "cURL",
            "source": "curl --request POST \\\n  --url https://verification.didit.me/v3/id-verification/wallets/mobile-id/ \\\n  --header 'x-api-key: YOUR_API_KEY' \\\n  --header 'Idempotency-Key: your-unique-attempt-key' \\\n  --header 'Content-Type: application/json' \\\n  --data '{\n  \"country\": \"EST\",\n  \"vendor_data\": \"your-customer-reference\",\n  \"metadata\": {\n    \"reference\": \"example\"\n  },\n  \"personal_code\": \"00000000000\",\n  \"phone_number\": \"+37200000000\"\n}'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.id_wallets.start_mobile_id(\n    vendor_data=\"your-customer-reference\",\n    metadata={\"reference\": \"example\"},\n    country=\"EST\",\n    personal_code=\"00000000000\",\n    phone_number=\"+37200000000\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.idWallets.startMobileId({\n  vendor_data: \"your-customer-reference\",\n  metadata: { reference: \"example\" },\n  country: \"EST\",\n  personal_code: \"00000000000\",\n  phone_number: \"+37200000000\",\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.IDWallets.StartMobileID(ctx, didit.IDWalletsStartMobileIDParams{\n\tBody: didit.DigitalIDWalletAPIMobileIDWalletVerificationStartRequest{\n\t\tVendorData:   didit.String(\"your-customer-reference\"),\n\t\tMetadata:     didit.Some(map[string]any{\"reference\": \"example\"}),\n\t\tCountry:      didit.DigitalIDWalletAPIMobileIDWalletVerificationStartCountryEnum(\"EST\"),\n\t\tPersonalCode: \"00000000000\",\n\t\tPhoneNumber:  \"+37200000000\",\n\t},\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import java.util.Map;\nimport me.didit.Didit;\nimport me.didit.types.DigitalIdWalletApiMobileIdWalletVerificationStartCountryEnum;\nimport me.didit.types.DigitalIdWalletApiMobileIdWalletVerificationStartRequest;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.idWallets().startMobileId(DigitalIdWalletApiMobileIdWalletVerificationStartRequest.builder()\n        .vendorData(\"your-customer-reference\")\n        .metadata(Map.of(\"reference\", \"example\"))\n        .country(DigitalIdWalletApiMobileIdWalletVerificationStartCountryEnum.of(\"EST\"))\n        .personalCode(\"00000000000\")\n        .phoneNumber(\"+37200000000\")\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->idWallets->startMobileId([\n    'vendor_data' => 'your-customer-reference',\n    'metadata' => ['reference' => 'example'],\n    'country' => 'EST',\n    'personal_code' => '00000000000',\n    'phone_number' => '+37200000000',\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.id_wallets.start_mobile_id(\n  vendor_data: \"your-customer-reference\",\n  metadata: { reference: \"example\" },\n  country: \"EST\",\n  personal_code: \"00000000000\",\n  phone_number: \"+37200000000\"\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Collections.Generic;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.IdWallets.StartMobileIdAsync(new DigitalIdWalletApiMobileIdWalletVerificationStartRequest\n{\n    VendorData = \"your-customer-reference\",\n    Metadata = new Dictionary<string, object> { [\"reference\"] = \"example\" },\n    Country = \"EST\",\n    PersonalCode = \"00000000000\",\n    PhoneNumber = \"+37200000000\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "x-didit-wallet-id": "mobile_id"
      }
    },
    "/v3/id-verification/wallets/idcard-ee/": {
      "post": {
        "operationId": "start_idcard_ee_wallet_verification",
        "x-didit-sdk": {
          "resource": "id_wallets",
          "method": "start_idcard_ee",
          "auth": "api_key",
          "server": true
        },
        "description": "Starten Sie eine Anmeldung mit einer estnischen ID-Karte (Police and Border Guard Board (Estonia); EST) ohne einen Workflow. Wird einmalig abgerechnet, nur wenn die Identität verifiziert ist. Die Antwort enthält next_action.type=redirect mit der URL, an die der Browser des Benutzers weitergeleitet werden soll; der Benutzer kehrt mit angehängtem request_id und result zu return_url zurück. Lesen Sie das Ergebnis mit GET /v3/id-verification/wallets/verifications/{request_id}/ oder aus dem Webhook aus, niemals aus der URL. Sandbox-Anwendungen erhalten eine deterministische Simulation (simulated: true), die den Anbieter niemals kontaktiert.",
        "summary": "Estnische ID-Karten-Verifizierung starten",
        "parameters": [
          {
            "in": "header",
            "name": "Idempotency-Key",
            "schema": {
              "type": "string"
            },
            "description": "Optionaler Schlüssel zur Wiederholungssicherheit (max. 255 Zeichen). Ein erneuter Versuch mit demselben Schlüssel, derselben Wallet und demselben Body gibt die ursprüngliche Verifizierung zurück, ohne eine zweite Anmeldung zu starten; derselbe Schlüssel mit einer anderen Wallet oder einem anderen Body gibt 409 idempotency_key_reused zurück."
          }
        ],
        "tags": [
          "Digital ID wallets"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DigitalIdWalletApiIdcardEeWalletVerificationStartRequest"
              },
              "example": {
                "country": "EST",
                "vendor_data": "your-customer-reference",
                "metadata": {
                  "reference": "example"
                },
                "return_url": "https://app.example.com/identity/complete"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/DigitalIdWalletApiIdcardEeWalletVerificationStartRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/DigitalIdWalletApiIdcardEeWalletVerificationStartRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationResponse"
                },
                "example": {
                  "request_id": "00000000-0000-4000-8000-000000000001",
                  "wallet_verification": {
                    "wallet": {
                      "id": "idcard_ee",
                      "name": "Estonian ID-card",
                      "issuing_authority": "Police and Border Guard Board (Estonia)"
                    },
                    "country": "EST",
                    "status": "Not Finished",
                    "outcome": "pending",
                    "error": null,
                    "interaction": "redirect",
                    "simulated": false,
                    "expires_at": "2026-01-01T10:10:00Z",
                    "next_action": {
                      "type": "redirect",
                      "url": "https://wallet.example.com/authorize"
                    },
                    "identity": null,
                    "attributes": null,
                    "level_of_assurance": null,
                    "verified_at": null,
                    "signature_valid": null,
                    "credential_type": "person_identification"
                  },
                  "vendor_data": "your-customer-reference",
                  "metadata": {
                    "reference": "example"
                  },
                  "created_at": "2026-01-01T10:00:00Z"
                }
              }
            },
            "description": ""
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationStartBadRequest"
                }
              }
            },
            "description": "Feldvalidierungsfehler ({field: [messages]}) oder Fehler return_url_invalid, return_url_not_allowed, invalid_personal_code, invalid_phone_number oder idempotency_key_invalid."
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationStartForbidden"
                }
              }
            },
            "description": "Fehlende Anmeldedaten ({detail}) oder Fehler wallet_unavailable, insufficient_credits oder contract_rate_missing."
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationError"
                }
              }
            },
            "description": "Fehler idempotency_key_reused oder idempotency_key_in_progress (mit Retry-After)."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationError"
                }
              }
            },
            "description": "Fehler wallet_provider_unavailable: Der Anbieter konnte nicht gestartet werden; es wurde nichts erstellt."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationError"
                }
              }
            },
            "description": "Fehler wallet_not_configured: Diese Umgebung kann die Wallet nicht erreichen."
          }
        },
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "cURL",
            "source": "curl --request POST \\\n  --url https://verification.didit.me/v3/id-verification/wallets/idcard-ee/ \\\n  --header 'x-api-key: YOUR_API_KEY' \\\n  --header 'Idempotency-Key: your-unique-attempt-key' \\\n  --header 'Content-Type: application/json' \\\n  --data '{\n  \"country\": \"EST\",\n  \"vendor_data\": \"your-customer-reference\",\n  \"metadata\": {\n    \"reference\": \"example\"\n  },\n  \"return_url\": \"https://app.example.com/identity/complete\"\n}'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.id_wallets.start_idcard_ee(\n    vendor_data=\"your-customer-reference\",\n    metadata={\"reference\": \"example\"},\n    country=\"EST\",\n    return_url=\"https://app.example.com/identity/complete\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.idWallets.startIdcardEe({\n  vendor_data: \"your-customer-reference\",\n  metadata: { reference: \"example\" },\n  country: \"EST\",\n  return_url: \"https://app.example.com/identity/complete\",\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.IDWallets.StartIdcardEe(ctx, didit.IDWalletsStartIdcardEeParams{\n\tBody: didit.DigitalIDWalletAPIIdcardEeWalletVerificationStartRequest{\n\t\tVendorData: didit.String(\"your-customer-reference\"),\n\t\tMetadata:   didit.Some(map[string]any{\"reference\": \"example\"}),\n\t\tCountry:    didit.Some(didit.DigitalIDWalletAPIIdcardEeWalletVerificationStartCountryEnum(\"EST\")),\n\t\tReturnURL:  \"https://app.example.com/identity/complete\",\n\t},\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import java.util.Map;\nimport me.didit.Didit;\nimport me.didit.types.DigitalIdWalletApiIdcardEeWalletVerificationStartCountryEnum;\nimport me.didit.types.DigitalIdWalletApiIdcardEeWalletVerificationStartRequest;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.idWallets().startIdcardEe(DigitalIdWalletApiIdcardEeWalletVerificationStartRequest.builder()\n        .vendorData(\"your-customer-reference\")\n        .metadata(Map.of(\"reference\", \"example\"))\n        .country(DigitalIdWalletApiIdcardEeWalletVerificationStartCountryEnum.of(\"EST\"))\n        .returnUrl(\"https://app.example.com/identity/complete\")\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->idWallets->startIdcardEe([\n    'vendor_data' => 'your-customer-reference',\n    'metadata' => ['reference' => 'example'],\n    'country' => 'EST',\n    'return_url' => 'https://app.example.com/identity/complete',\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.id_wallets.start_idcard_ee(\n  vendor_data: \"your-customer-reference\",\n  metadata: { reference: \"example\" },\n  country: \"EST\",\n  return_url: \"https://app.example.com/identity/complete\"\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Collections.Generic;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.IdWallets.StartIdcardEeAsync(new DigitalIdWalletApiIdcardEeWalletVerificationStartRequest\n{\n    VendorData = \"your-customer-reference\",\n    Metadata = new Dictionary<string, object> { [\"reference\"] = \"example\" },\n    Country = new DigitalIdWalletApiIdcardEeWalletVerificationStartCountryEnum(\"EST\"),\n    ReturnUrl = \"https://app.example.com/identity/complete\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "x-didit-wallet-id": "idcard_ee"
      }
    },
    "/v3/id-verification/wallets/eparaksts-mobile/": {
      "post": {
        "operationId": "start_eparaksts_mobile_wallet_verification",
        "x-didit-sdk": {
          "resource": "id_wallets",
          "method": "start_eparaksts_mobile",
          "auth": "api_key",
          "server": true
        },
        "description": "Starten Sie eine eParaksts-mobile-Anmeldung (LVRTC (Latvian State Radio and Television Centre); LVA) ohne Workflow. Wird einmalig abgerechnet, nur wenn die Identität verifiziert ist. Die Antwort enthält next_action.type=redirect mit der URL, an die der Browser des Benutzers geleitet werden soll; der Benutzer kehrt zu return_url zurück, an das request_id und result angehängt sind. Lesen Sie das Ergebnis mit GET /v3/id-verification/wallets/verifications/{request_id}/ oder aus dem Webhook aus, niemals aus der URL. Sandbox-Anwendungen erhalten eine deterministische Simulation (simulated: true), die den Anbieter niemals kontaktiert.",
        "summary": "Mobile eParaksts-Verifizierung starten",
        "parameters": [
          {
            "in": "header",
            "name": "Idempotency-Key",
            "schema": {
              "type": "string"
            },
            "description": "Optionaler Schlüssel zur Wiederholungssicherheit (max. 255 Zeichen). Ein erneuter Versuch mit demselben Schlüssel, derselben Wallet und demselben Body gibt die ursprüngliche Verifizierung zurück, ohne eine zweite Anmeldung zu starten; derselbe Schlüssel mit einer anderen Wallet oder einem anderen Body gibt 409 idempotency_key_reused zurück."
          }
        ],
        "tags": [
          "Digital ID wallets"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DigitalIdWalletApiEparakstsMobileWalletVerificationStartRequest"
              },
              "example": {
                "country": "LVA",
                "vendor_data": "your-customer-reference",
                "metadata": {
                  "reference": "example"
                },
                "return_url": "https://app.example.com/identity/complete"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/DigitalIdWalletApiEparakstsMobileWalletVerificationStartRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/DigitalIdWalletApiEparakstsMobileWalletVerificationStartRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationResponse"
                },
                "example": {
                  "request_id": "00000000-0000-4000-8000-000000000001",
                  "wallet_verification": {
                    "wallet": {
                      "id": "eparaksts_mobile",
                      "name": "eParaksts mobile",
                      "issuing_authority": "LVRTC (Latvian State Radio and Television Centre)"
                    },
                    "country": "LVA",
                    "status": "Not Finished",
                    "outcome": "pending",
                    "error": null,
                    "interaction": "redirect",
                    "simulated": false,
                    "expires_at": "2026-01-01T10:10:00Z",
                    "next_action": {
                      "type": "redirect",
                      "url": "https://wallet.example.com/authorize"
                    },
                    "identity": null,
                    "attributes": null,
                    "level_of_assurance": null,
                    "verified_at": null,
                    "signature_valid": null,
                    "credential_type": "person_identification"
                  },
                  "vendor_data": "your-customer-reference",
                  "metadata": {
                    "reference": "example"
                  },
                  "created_at": "2026-01-01T10:00:00Z"
                }
              }
            },
            "description": ""
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationStartBadRequest"
                }
              }
            },
            "description": "Feldvalidierungsfehler ({field: [messages]}) oder Fehler return_url_invalid, return_url_not_allowed, invalid_personal_code, invalid_phone_number oder idempotency_key_invalid."
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationStartForbidden"
                }
              }
            },
            "description": "Fehlende Anmeldedaten ({detail}) oder Fehler wallet_unavailable, insufficient_credits oder contract_rate_missing."
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationError"
                }
              }
            },
            "description": "Fehler idempotency_key_reused oder idempotency_key_in_progress (mit Retry-After)."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationError"
                }
              }
            },
            "description": "Fehler wallet_provider_unavailable: Der Anbieter konnte nicht gestartet werden; es wurde nichts erstellt."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationError"
                }
              }
            },
            "description": "Fehler wallet_not_configured: Diese Umgebung kann die Wallet nicht erreichen."
          }
        },
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "cURL",
            "source": "curl --request POST \\\n  --url https://verification.didit.me/v3/id-verification/wallets/eparaksts-mobile/ \\\n  --header 'x-api-key: YOUR_API_KEY' \\\n  --header 'Idempotency-Key: your-unique-attempt-key' \\\n  --header 'Content-Type: application/json' \\\n  --data '{\n  \"country\": \"LVA\",\n  \"vendor_data\": \"your-customer-reference\",\n  \"metadata\": {\n    \"reference\": \"example\"\n  },\n  \"return_url\": \"https://app.example.com/identity/complete\"\n}'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.id_wallets.start_eparaksts_mobile(\n    vendor_data=\"your-customer-reference\",\n    metadata={\"reference\": \"example\"},\n    country=\"LVA\",\n    return_url=\"https://app.example.com/identity/complete\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.idWallets.startEparakstsMobile({\n  vendor_data: \"your-customer-reference\",\n  metadata: { reference: \"example\" },\n  country: \"LVA\",\n  return_url: \"https://app.example.com/identity/complete\",\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.IDWallets.StartEparakstsMobile(ctx, didit.IDWalletsStartEparakstsMobileParams{\n\tBody: didit.DigitalIDWalletAPIEparakstsMobileWalletVerificationStartRequest{\n\t\tVendorData: didit.String(\"your-customer-reference\"),\n\t\tMetadata:   didit.Some(map[string]any{\"reference\": \"example\"}),\n\t\tCountry:    didit.Some(didit.DigitalIDWalletAPIEparakstsMobileWalletVerificationStartCountryEnum(\"LVA\")),\n\t\tReturnURL:  \"https://app.example.com/identity/complete\",\n\t},\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import java.util.Map;\nimport me.didit.Didit;\nimport me.didit.types.DigitalIdWalletApiEparakstsMobileWalletVerificationStartCountryEnum;\nimport me.didit.types.DigitalIdWalletApiEparakstsMobileWalletVerificationStartRequest;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.idWallets().startEparakstsMobile(DigitalIdWalletApiEparakstsMobileWalletVerificationStartRequest.builder()\n        .vendorData(\"your-customer-reference\")\n        .metadata(Map.of(\"reference\", \"example\"))\n        .country(DigitalIdWalletApiEparakstsMobileWalletVerificationStartCountryEnum.of(\"LVA\"))\n        .returnUrl(\"https://app.example.com/identity/complete\")\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->idWallets->startEparakstsMobile([\n    'vendor_data' => 'your-customer-reference',\n    'metadata' => ['reference' => 'example'],\n    'country' => 'LVA',\n    'return_url' => 'https://app.example.com/identity/complete',\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.id_wallets.start_eparaksts_mobile(\n  vendor_data: \"your-customer-reference\",\n  metadata: { reference: \"example\" },\n  country: \"LVA\",\n  return_url: \"https://app.example.com/identity/complete\"\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Collections.Generic;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.IdWallets.StartEparakstsMobileAsync(new DigitalIdWalletApiEparakstsMobileWalletVerificationStartRequest\n{\n    VendorData = \"your-customer-reference\",\n    Metadata = new Dictionary<string, object> { [\"reference\"] = \"example\" },\n    Country = new DigitalIdWalletApiEparakstsMobileWalletVerificationStartCountryEnum(\"LVA\"),\n    ReturnUrl = \"https://app.example.com/identity/complete\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "x-didit-wallet-id": "eparaksts_mobile"
      }
    },
    "/v3/id-verification/wallets/bankid-cz/": {
      "post": {
        "operationId": "start_bankid_cz_wallet_verification",
        "x-didit-sdk": {
          "resource": "id_wallets",
          "method": "start_bankid_cz",
          "auth": "api_key",
          "server": true
        },
        "description": "Starten Sie eine Bank iD-Anmeldung (Bankovní identita, a.s.; CZE) ohne Workflow. Wird einmalig abgerechnet, nur wenn die Identität verifiziert ist. Die Antwort enthält next_action.type=redirect mit der URL, an die der Browser des Benutzers weitergeleitet werden soll; der Benutzer kehrt mit angehängter request_id und result zu return_url zurück. Lesen Sie das Ergebnis über GET /v3/id-verification/wallets/verifications/{request_id}/ oder aus dem Webhook aus, niemals aus der URL. Sandbox-Anwendungen erhalten eine deterministische Simulation (simulated: true), die den Anbieter niemals kontaktiert.",
        "summary": "Bank iD-Verifizierung starten",
        "parameters": [
          {
            "in": "header",
            "name": "Idempotency-Key",
            "schema": {
              "type": "string"
            },
            "description": "Optionaler Schlüssel zur Wiederholungssicherheit (max. 255 Zeichen). Ein erneuter Versuch mit demselben Schlüssel, derselben Wallet und demselben Body gibt die ursprüngliche Verifizierung zurück, ohne eine zweite Anmeldung zu starten; derselbe Schlüssel mit einer anderen Wallet oder einem anderen Body gibt 409 idempotency_key_reused zurück."
          }
        ],
        "tags": [
          "Digital ID wallets"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DigitalIdWalletApiBankidCzWalletVerificationStartRequest"
              },
              "example": {
                "country": "CZE",
                "vendor_data": "your-customer-reference",
                "metadata": {
                  "reference": "example"
                },
                "return_url": "https://app.example.com/identity/complete"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/DigitalIdWalletApiBankidCzWalletVerificationStartRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/DigitalIdWalletApiBankidCzWalletVerificationStartRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationResponse"
                },
                "example": {
                  "request_id": "00000000-0000-4000-8000-000000000001",
                  "wallet_verification": {
                    "wallet": {
                      "id": "bankid_cz",
                      "name": "Bank iD",
                      "issuing_authority": "Bankovní identita, a.s."
                    },
                    "country": "CZE",
                    "status": "Not Finished",
                    "outcome": "pending",
                    "error": null,
                    "interaction": "redirect",
                    "simulated": false,
                    "expires_at": "2026-01-01T10:10:00Z",
                    "next_action": {
                      "type": "redirect",
                      "url": "https://wallet.example.com/authorize"
                    },
                    "identity": null,
                    "attributes": null,
                    "level_of_assurance": null,
                    "verified_at": null,
                    "signature_valid": null,
                    "credential_type": "person_identification"
                  },
                  "vendor_data": "your-customer-reference",
                  "metadata": {
                    "reference": "example"
                  },
                  "created_at": "2026-01-01T10:00:00Z"
                }
              }
            },
            "description": ""
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationStartBadRequest"
                }
              }
            },
            "description": "Feldvalidierungsfehler ({field: [messages]}) oder Fehler return_url_invalid, return_url_not_allowed, invalid_personal_code, invalid_phone_number oder idempotency_key_invalid."
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationStartForbidden"
                }
              }
            },
            "description": "Fehlende Anmeldedaten ({detail}) oder Fehler wallet_unavailable, insufficient_credits oder contract_rate_missing."
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationError"
                }
              }
            },
            "description": "Fehler idempotency_key_reused oder idempotency_key_in_progress (mit Retry-After)."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationError"
                }
              }
            },
            "description": "Fehler wallet_provider_unavailable: Der Anbieter konnte nicht gestartet werden; es wurde nichts erstellt."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationError"
                }
              }
            },
            "description": "Fehler wallet_not_configured: Diese Umgebung kann die Wallet nicht erreichen."
          }
        },
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "cURL",
            "source": "curl --request POST \\\n  --url https://verification.didit.me/v3/id-verification/wallets/bankid-cz/ \\\n  --header 'x-api-key: YOUR_API_KEY' \\\n  --header 'Idempotency-Key: your-unique-attempt-key' \\\n  --header 'Content-Type: application/json' \\\n  --data '{\n  \"country\": \"CZE\",\n  \"vendor_data\": \"your-customer-reference\",\n  \"metadata\": {\n    \"reference\": \"example\"\n  },\n  \"return_url\": \"https://app.example.com/identity/complete\"\n}'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.id_wallets.start_bankid_cz(\n    vendor_data=\"your-customer-reference\",\n    metadata={\"reference\": \"example\"},\n    country=\"CZE\",\n    return_url=\"https://app.example.com/identity/complete\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.idWallets.startBankidCz({\n  vendor_data: \"your-customer-reference\",\n  metadata: { reference: \"example\" },\n  country: \"CZE\",\n  return_url: \"https://app.example.com/identity/complete\",\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.IDWallets.StartBankidCz(ctx, didit.IDWalletsStartBankidCzParams{\n\tBody: didit.DigitalIDWalletAPIBankidCzWalletVerificationStartRequest{\n\t\tVendorData: didit.String(\"your-customer-reference\"),\n\t\tMetadata:   didit.Some(map[string]any{\"reference\": \"example\"}),\n\t\tCountry:    didit.Some(didit.DigitalIDWalletAPICountryE2dEnum(\"CZE\")),\n\t\tReturnURL:  \"https://app.example.com/identity/complete\",\n\t},\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import java.util.Map;\nimport me.didit.Didit;\nimport me.didit.types.DigitalIdWalletApiBankidCzWalletVerificationStartRequest;\nimport me.didit.types.DigitalIdWalletApiCountryE2dEnum;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.idWallets().startBankidCz(DigitalIdWalletApiBankidCzWalletVerificationStartRequest.builder()\n        .vendorData(\"your-customer-reference\")\n        .metadata(Map.of(\"reference\", \"example\"))\n        .country(DigitalIdWalletApiCountryE2dEnum.of(\"CZE\"))\n        .returnUrl(\"https://app.example.com/identity/complete\")\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->idWallets->startBankidCz([\n    'vendor_data' => 'your-customer-reference',\n    'metadata' => ['reference' => 'example'],\n    'country' => 'CZE',\n    'return_url' => 'https://app.example.com/identity/complete',\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.id_wallets.start_bankid_cz(\n  vendor_data: \"your-customer-reference\",\n  metadata: { reference: \"example\" },\n  country: \"CZE\",\n  return_url: \"https://app.example.com/identity/complete\"\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Collections.Generic;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.IdWallets.StartBankidCzAsync(new DigitalIdWalletApiBankidCzWalletVerificationStartRequest\n{\n    VendorData = \"your-customer-reference\",\n    Metadata = new Dictionary<string, object> { [\"reference\"] = \"example\" },\n    Country = new DigitalIdWalletApiCountryE2dEnum(\"CZE\"),\n    ReturnUrl = \"https://app.example.com/identity/complete\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "x-didit-wallet-id": "bankid_cz"
      }
    },
    "/v3/id-verification/wallets/mojeid/": {
      "post": {
        "operationId": "start_mojeid_wallet_verification",
        "x-didit-sdk": {
          "resource": "id_wallets",
          "method": "start_mojeid",
          "auth": "api_key",
          "server": true
        },
        "description": "Starten Sie eine MojeID-Anmeldung (CZ.NIC; CZE) ohne Workflow. Wird einmalig abgerechnet, nur wenn die Identität verifiziert ist. Die Antwort enthält next_action.type=redirect mit der URL, an die der Browser des Benutzers geleitet werden soll; der Benutzer kehrt zu return_url zurück, an die request_id und result angehängt sind. Lesen Sie das Ergebnis mit GET /v3/id-verification/wallets/verifications/{request_id}/ oder aus dem Webhook aus, niemals aus der URL. Sandbox-Anwendungen erhalten eine deterministische Simulation (simulated: true), die den Anbieter niemals kontaktiert.",
        "summary": "MojeID-Verifizierung starten",
        "parameters": [
          {
            "in": "header",
            "name": "Idempotency-Key",
            "schema": {
              "type": "string"
            },
            "description": "Optionaler Schlüssel zur Wiederholungssicherheit (max. 255 Zeichen). Ein erneuter Versuch mit demselben Schlüssel, derselben Wallet und demselben Body gibt die ursprüngliche Verifizierung zurück, ohne eine zweite Anmeldung zu starten; derselbe Schlüssel mit einer anderen Wallet oder einem anderen Body gibt 409 idempotency_key_reused zurück."
          }
        ],
        "tags": [
          "Digital ID wallets"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DigitalIdWalletApiMojeidWalletVerificationStartRequest"
              },
              "example": {
                "country": "CZE",
                "vendor_data": "your-customer-reference",
                "metadata": {
                  "reference": "example"
                },
                "return_url": "https://app.example.com/identity/complete"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/DigitalIdWalletApiMojeidWalletVerificationStartRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/DigitalIdWalletApiMojeidWalletVerificationStartRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationResponse"
                },
                "example": {
                  "request_id": "00000000-0000-4000-8000-000000000001",
                  "wallet_verification": {
                    "wallet": {
                      "id": "mojeid",
                      "name": "MojeID",
                      "issuing_authority": "CZ.NIC"
                    },
                    "country": "CZE",
                    "status": "Not Finished",
                    "outcome": "pending",
                    "error": null,
                    "interaction": "redirect",
                    "simulated": false,
                    "expires_at": "2026-01-01T10:10:00Z",
                    "next_action": {
                      "type": "redirect",
                      "url": "https://wallet.example.com/authorize"
                    },
                    "identity": null,
                    "attributes": null,
                    "level_of_assurance": null,
                    "verified_at": null,
                    "signature_valid": null,
                    "credential_type": "person_identification"
                  },
                  "vendor_data": "your-customer-reference",
                  "metadata": {
                    "reference": "example"
                  },
                  "created_at": "2026-01-01T10:00:00Z"
                }
              }
            },
            "description": ""
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationStartBadRequest"
                }
              }
            },
            "description": "Feldvalidierungsfehler ({field: [messages]}) oder Fehler return_url_invalid, return_url_not_allowed, invalid_personal_code, invalid_phone_number oder idempotency_key_invalid."
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationStartForbidden"
                }
              }
            },
            "description": "Fehlende Anmeldedaten ({detail}) oder Fehler wallet_unavailable, insufficient_credits oder contract_rate_missing."
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationError"
                }
              }
            },
            "description": "Fehler idempotency_key_reused oder idempotency_key_in_progress (mit Retry-After)."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationError"
                }
              }
            },
            "description": "Fehler wallet_provider_unavailable: Der Anbieter konnte nicht gestartet werden; es wurde nichts erstellt."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationError"
                }
              }
            },
            "description": "Fehler wallet_not_configured: Diese Umgebung kann die Wallet nicht erreichen."
          }
        },
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "cURL",
            "source": "curl --request POST \\\n  --url https://verification.didit.me/v3/id-verification/wallets/mojeid/ \\\n  --header 'x-api-key: YOUR_API_KEY' \\\n  --header 'Idempotency-Key: your-unique-attempt-key' \\\n  --header 'Content-Type: application/json' \\\n  --data '{\n  \"country\": \"CZE\",\n  \"vendor_data\": \"your-customer-reference\",\n  \"metadata\": {\n    \"reference\": \"example\"\n  },\n  \"return_url\": \"https://app.example.com/identity/complete\"\n}'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.id_wallets.start_mojeid(\n    vendor_data=\"your-customer-reference\",\n    metadata={\"reference\": \"example\"},\n    country=\"CZE\",\n    return_url=\"https://app.example.com/identity/complete\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.idWallets.startMojeid({\n  vendor_data: \"your-customer-reference\",\n  metadata: { reference: \"example\" },\n  country: \"CZE\",\n  return_url: \"https://app.example.com/identity/complete\",\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.IDWallets.StartMojeid(ctx, didit.IDWalletsStartMojeidParams{\n\tBody: didit.DigitalIDWalletAPIMojeidWalletVerificationStartRequest{\n\t\tVendorData: didit.String(\"your-customer-reference\"),\n\t\tMetadata:   didit.Some(map[string]any{\"reference\": \"example\"}),\n\t\tCountry:    didit.Some(didit.DigitalIDWalletAPICountryE2dEnum(\"CZE\")),\n\t\tReturnURL:  \"https://app.example.com/identity/complete\",\n\t},\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import java.util.Map;\nimport me.didit.Didit;\nimport me.didit.types.DigitalIdWalletApiCountryE2dEnum;\nimport me.didit.types.DigitalIdWalletApiMojeidWalletVerificationStartRequest;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.idWallets().startMojeid(DigitalIdWalletApiMojeidWalletVerificationStartRequest.builder()\n        .vendorData(\"your-customer-reference\")\n        .metadata(Map.of(\"reference\", \"example\"))\n        .country(DigitalIdWalletApiCountryE2dEnum.of(\"CZE\"))\n        .returnUrl(\"https://app.example.com/identity/complete\")\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->idWallets->startMojeid([\n    'vendor_data' => 'your-customer-reference',\n    'metadata' => ['reference' => 'example'],\n    'country' => 'CZE',\n    'return_url' => 'https://app.example.com/identity/complete',\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.id_wallets.start_mojeid(\n  vendor_data: \"your-customer-reference\",\n  metadata: { reference: \"example\" },\n  country: \"CZE\",\n  return_url: \"https://app.example.com/identity/complete\"\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Collections.Generic;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.IdWallets.StartMojeidAsync(new DigitalIdWalletApiMojeidWalletVerificationStartRequest\n{\n    VendorData = \"your-customer-reference\",\n    Metadata = new Dictionary<string, object> { [\"reference\"] = \"example\" },\n    Country = new DigitalIdWalletApiCountryE2dEnum(\"CZE\"),\n    ReturnUrl = \"https://app.example.com/identity/complete\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "x-didit-wallet-id": "mojeid"
      }
    },
    "/v3/id-verification/wallets/diia/": {
      "post": {
        "operationId": "start_diia_wallet_verification",
        "x-didit-sdk": {
          "resource": "id_wallets",
          "method": "start_diia",
          "auth": "api_key",
          "server": true
        },
        "description": "Starten Sie eine Diia-Anmeldung (Ministry of Digital Transformation of Ukraine; UKR) ohne einen Workflow. Wird einmalig abgerechnet, nur wenn die Identität verifiziert ist. Die Antwort enthält next_action.type=redirect mit der URL, an die der Browser des Benutzers weitergeleitet werden soll; der Benutzer kehrt mit angehängtem request_id und result zu return_url zurück. Lesen Sie das Ergebnis mit GET /v3/id-verification/wallets/verifications/{request_id}/ oder aus dem Webhook aus, niemals aus der URL. Sandbox-Anwendungen erhalten eine deterministische Simulation (simulated: true), die den Anbieter niemals kontaktiert.",
        "summary": "Diia-Verifizierung starten",
        "parameters": [
          {
            "in": "header",
            "name": "Idempotency-Key",
            "schema": {
              "type": "string"
            },
            "description": "Optionaler Schlüssel zur Wiederholungssicherheit (max. 255 Zeichen). Ein erneuter Versuch mit demselben Schlüssel, derselben Wallet und demselben Body gibt die ursprüngliche Verifizierung zurück, ohne eine zweite Anmeldung zu starten; derselbe Schlüssel mit einer anderen Wallet oder einem anderen Body gibt 409 idempotency_key_reused zurück."
          }
        ],
        "tags": [
          "Digital ID wallets"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DigitalIdWalletApiDiiaWalletVerificationStartRequest"
              },
              "example": {
                "country": "UKR",
                "vendor_data": "your-customer-reference",
                "metadata": {
                  "reference": "example"
                },
                "return_url": "https://app.example.com/identity/complete"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/DigitalIdWalletApiDiiaWalletVerificationStartRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/DigitalIdWalletApiDiiaWalletVerificationStartRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationResponse"
                },
                "example": {
                  "request_id": "00000000-0000-4000-8000-000000000001",
                  "wallet_verification": {
                    "wallet": {
                      "id": "diia",
                      "name": "Diia",
                      "issuing_authority": "Ministry of Digital Transformation of Ukraine"
                    },
                    "country": "UKR",
                    "status": "Not Finished",
                    "outcome": "pending",
                    "error": null,
                    "interaction": "redirect",
                    "simulated": false,
                    "expires_at": "2026-01-01T10:10:00Z",
                    "next_action": {
                      "type": "redirect",
                      "url": "https://wallet.example.com/authorize"
                    },
                    "identity": null,
                    "attributes": null,
                    "level_of_assurance": null,
                    "verified_at": null,
                    "signature_valid": null,
                    "credential_type": "person_identification"
                  },
                  "vendor_data": "your-customer-reference",
                  "metadata": {
                    "reference": "example"
                  },
                  "created_at": "2026-01-01T10:00:00Z"
                }
              }
            },
            "description": ""
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationStartBadRequest"
                }
              }
            },
            "description": "Feldvalidierungsfehler ({field: [messages]}) oder Fehler return_url_invalid, return_url_not_allowed, invalid_personal_code, invalid_phone_number oder idempotency_key_invalid."
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationStartForbidden"
                }
              }
            },
            "description": "Fehlende Anmeldedaten ({detail}) oder Fehler wallet_unavailable, insufficient_credits oder contract_rate_missing."
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationError"
                }
              }
            },
            "description": "Fehler idempotency_key_reused oder idempotency_key_in_progress (mit Retry-After)."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationError"
                }
              }
            },
            "description": "Fehler wallet_provider_unavailable: Der Anbieter konnte nicht gestartet werden; es wurde nichts erstellt."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationError"
                }
              }
            },
            "description": "Fehler wallet_not_configured: Diese Umgebung kann die Wallet nicht erreichen."
          }
        },
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "cURL",
            "source": "curl --request POST \\\n  --url https://verification.didit.me/v3/id-verification/wallets/diia/ \\\n  --header 'x-api-key: YOUR_API_KEY' \\\n  --header 'Idempotency-Key: your-unique-attempt-key' \\\n  --header 'Content-Type: application/json' \\\n  --data '{\n  \"country\": \"UKR\",\n  \"vendor_data\": \"your-customer-reference\",\n  \"metadata\": {\n    \"reference\": \"example\"\n  },\n  \"return_url\": \"https://app.example.com/identity/complete\"\n}'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.id_wallets.start_diia(\n    vendor_data=\"your-customer-reference\",\n    metadata={\"reference\": \"example\"},\n    country=\"UKR\",\n    return_url=\"https://app.example.com/identity/complete\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.idWallets.startDiia({\n  vendor_data: \"your-customer-reference\",\n  metadata: { reference: \"example\" },\n  country: \"UKR\",\n  return_url: \"https://app.example.com/identity/complete\",\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.IDWallets.StartDiia(ctx, didit.IDWalletsStartDiiaParams{\n\tBody: didit.DigitalIDWalletAPIDiiaWalletVerificationStartRequest{\n\t\tVendorData: didit.String(\"your-customer-reference\"),\n\t\tMetadata:   didit.Some(map[string]any{\"reference\": \"example\"}),\n\t\tCountry:    didit.Some(didit.DigitalIDWalletAPIDiiaWalletVerificationStartCountryEnum(\"UKR\")),\n\t\tReturnURL:  \"https://app.example.com/identity/complete\",\n\t},\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import java.util.Map;\nimport me.didit.Didit;\nimport me.didit.types.DigitalIdWalletApiDiiaWalletVerificationStartCountryEnum;\nimport me.didit.types.DigitalIdWalletApiDiiaWalletVerificationStartRequest;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.idWallets().startDiia(DigitalIdWalletApiDiiaWalletVerificationStartRequest.builder()\n        .vendorData(\"your-customer-reference\")\n        .metadata(Map.of(\"reference\", \"example\"))\n        .country(DigitalIdWalletApiDiiaWalletVerificationStartCountryEnum.of(\"UKR\"))\n        .returnUrl(\"https://app.example.com/identity/complete\")\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->idWallets->startDiia([\n    'vendor_data' => 'your-customer-reference',\n    'metadata' => ['reference' => 'example'],\n    'country' => 'UKR',\n    'return_url' => 'https://app.example.com/identity/complete',\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.id_wallets.start_diia(\n  vendor_data: \"your-customer-reference\",\n  metadata: { reference: \"example\" },\n  country: \"UKR\",\n  return_url: \"https://app.example.com/identity/complete\"\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Collections.Generic;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.IdWallets.StartDiiaAsync(new DigitalIdWalletApiDiiaWalletVerificationStartRequest\n{\n    VendorData = \"your-customer-reference\",\n    Metadata = new Dictionary<string, object> { [\"reference\"] = \"example\" },\n    Country = new DigitalIdWalletApiDiiaWalletVerificationStartCountryEnum(\"UKR\"),\n    ReturnUrl = \"https://app.example.com/identity/complete\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "x-didit-wallet-id": "diia"
      }
    },
    "/v3/id-verification/wallets/franceconnect/": {
      "post": {
        "operationId": "start_franceconnect_wallet_verification",
        "x-didit-sdk": {
          "resource": "id_wallets",
          "method": "start_franceconnect",
          "auth": "api_key",
          "server": true
        },
        "description": "Starten Sie eine FranceConnect-Anmeldung (DINUM (französischer Staat); FRA) ohne Workflow. Die Abrechnung erfolgt einmalig, nur wenn die Identität verifiziert wurde. Die Antwort enthält next_action.type=redirect mit der URL, an die der Browser des Benutzers weitergeleitet werden soll; der Benutzer kehrt zu return_url zurück, an die request_id und result angehängt werden. Lesen Sie das Ergebnis über GET /v3/id-verification/wallets/verifications/{request_id}/ oder über den Webhook aus, niemals aus der URL. Sandbox-Anwendungen erhalten eine deterministische Simulation (simulated: true), die niemals den Anbieter kontaktiert.",
        "summary": "FranceConnect-Verifizierung starten",
        "parameters": [
          {
            "in": "header",
            "name": "Idempotency-Key",
            "schema": {
              "type": "string"
            },
            "description": "Optionaler Schlüssel zur Wiederholungssicherheit (max. 255 Zeichen). Ein erneuter Versuch mit demselben Schlüssel, derselben Wallet und demselben Body gibt die ursprüngliche Verifizierung zurück, ohne eine zweite Anmeldung zu starten; derselbe Schlüssel mit einer anderen Wallet oder einem anderen Body gibt 409 idempotency_key_reused zurück."
          }
        ],
        "tags": [
          "Digital ID wallets"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DigitalIdWalletApiFranceconnectWalletVerificationStartRequest"
              },
              "example": {
                "country": "FRA",
                "vendor_data": "your-customer-reference",
                "metadata": {
                  "reference": "example"
                },
                "return_url": "https://app.example.com/identity/complete"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/DigitalIdWalletApiFranceconnectWalletVerificationStartRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/DigitalIdWalletApiFranceconnectWalletVerificationStartRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationResponse"
                },
                "example": {
                  "request_id": "00000000-0000-4000-8000-000000000001",
                  "wallet_verification": {
                    "wallet": {
                      "id": "franceconnect",
                      "name": "FranceConnect",
                      "issuing_authority": "DINUM (French state)"
                    },
                    "country": "FRA",
                    "status": "Not Finished",
                    "outcome": "pending",
                    "error": null,
                    "interaction": "redirect",
                    "simulated": false,
                    "expires_at": "2026-01-01T10:10:00Z",
                    "next_action": {
                      "type": "redirect",
                      "url": "https://wallet.example.com/authorize"
                    },
                    "identity": null,
                    "attributes": null,
                    "level_of_assurance": null,
                    "verified_at": null,
                    "signature_valid": null,
                    "credential_type": "person_identification"
                  },
                  "vendor_data": "your-customer-reference",
                  "metadata": {
                    "reference": "example"
                  },
                  "created_at": "2026-01-01T10:00:00Z"
                }
              }
            },
            "description": ""
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationStartBadRequest"
                }
              }
            },
            "description": "Feldvalidierungsfehler ({field: [messages]}) oder Fehler return_url_invalid, return_url_not_allowed, invalid_personal_code, invalid_phone_number oder idempotency_key_invalid."
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationStartForbidden"
                }
              }
            },
            "description": "Fehlende Anmeldedaten ({detail}) oder Fehler wallet_unavailable, insufficient_credits oder contract_rate_missing."
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationError"
                }
              }
            },
            "description": "Fehler idempotency_key_reused oder idempotency_key_in_progress (mit Retry-After)."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationError"
                }
              }
            },
            "description": "Fehler wallet_provider_unavailable: Der Anbieter konnte nicht gestartet werden; es wurde nichts erstellt."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationError"
                }
              }
            },
            "description": "Fehler wallet_not_configured: Diese Umgebung kann die Wallet nicht erreichen."
          }
        },
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "cURL",
            "source": "curl --request POST \\\n  --url https://verification.didit.me/v3/id-verification/wallets/franceconnect/ \\\n  --header 'x-api-key: YOUR_API_KEY' \\\n  --header 'Idempotency-Key: your-unique-attempt-key' \\\n  --header 'Content-Type: application/json' \\\n  --data '{\n  \"country\": \"FRA\",\n  \"vendor_data\": \"your-customer-reference\",\n  \"metadata\": {\n    \"reference\": \"example\"\n  },\n  \"return_url\": \"https://app.example.com/identity/complete\"\n}'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.id_wallets.start_franceconnect(\n    vendor_data=\"your-customer-reference\",\n    metadata={\"reference\": \"example\"},\n    country=\"FRA\",\n    return_url=\"https://app.example.com/identity/complete\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.idWallets.startFranceconnect({\n  vendor_data: \"your-customer-reference\",\n  metadata: { reference: \"example\" },\n  country: \"FRA\",\n  return_url: \"https://app.example.com/identity/complete\",\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.IDWallets.StartFranceconnect(ctx, didit.IDWalletsStartFranceconnectParams{\n\tBody: didit.DigitalIDWalletAPIFranceconnectWalletVerificationStartRequest{\n\t\tVendorData: didit.String(\"your-customer-reference\"),\n\t\tMetadata:   didit.Some(map[string]any{\"reference\": \"example\"}),\n\t\tCountry:    didit.Some(didit.DigitalIDWalletAPIFranceconnectWalletVerificationStartCountryEnum(\"FRA\")),\n\t\tReturnURL:  \"https://app.example.com/identity/complete\",\n\t},\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import java.util.Map;\nimport me.didit.Didit;\nimport me.didit.types.DigitalIdWalletApiFranceconnectWalletVerificationStartCountryEnum;\nimport me.didit.types.DigitalIdWalletApiFranceconnectWalletVerificationStartRequest;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.idWallets().startFranceconnect(DigitalIdWalletApiFranceconnectWalletVerificationStartRequest.builder()\n        .vendorData(\"your-customer-reference\")\n        .metadata(Map.of(\"reference\", \"example\"))\n        .country(DigitalIdWalletApiFranceconnectWalletVerificationStartCountryEnum.of(\"FRA\"))\n        .returnUrl(\"https://app.example.com/identity/complete\")\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->idWallets->startFranceconnect([\n    'vendor_data' => 'your-customer-reference',\n    'metadata' => ['reference' => 'example'],\n    'country' => 'FRA',\n    'return_url' => 'https://app.example.com/identity/complete',\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.id_wallets.start_franceconnect(\n  vendor_data: \"your-customer-reference\",\n  metadata: { reference: \"example\" },\n  country: \"FRA\",\n  return_url: \"https://app.example.com/identity/complete\"\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Collections.Generic;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.IdWallets.StartFranceconnectAsync(new DigitalIdWalletApiFranceconnectWalletVerificationStartRequest\n{\n    VendorData = \"your-customer-reference\",\n    Metadata = new Dictionary<string, object> { [\"reference\"] = \"example\" },\n    Country = new DigitalIdWalletApiFranceconnectWalletVerificationStartCountryEnum(\"FRA\"),\n    ReturnUrl = \"https://app.example.com/identity/complete\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "x-didit-wallet-id": "franceconnect"
      }
    },
    "/v3/id-verification/wallets/audkenni/": {
      "post": {
        "operationId": "start_audkenni_wallet_verification",
        "x-didit-sdk": {
          "resource": "id_wallets",
          "method": "start_audkenni",
          "auth": "api_key",
          "server": true
        },
        "description": "Starten Sie eine Auðkenni-Anmeldung (Auðkenni (isländische elektronische ID); ISL) ohne Workflow. Wird einmalig abgerechnet, nur wenn die Identität verifiziert ist. Die Antwort enthält next_action.type=redirect mit der URL, an die der Browser des Benutzers weitergeleitet werden soll; der Benutzer kehrt mit angehängter request_id und result zu return_url zurück. Lesen Sie das Ergebnis über GET /v3/id-verification/wallets/verifications/{request_id}/ oder aus dem Webhook aus, niemals aus der URL. Sandbox-Anwendungen erhalten eine deterministische Simulation (simulated: true), die den Anbieter niemals kontaktiert.",
        "summary": "Auðkenni-Verifizierung starten",
        "parameters": [
          {
            "in": "header",
            "name": "Idempotency-Key",
            "schema": {
              "type": "string"
            },
            "description": "Optionaler Schlüssel zur Wiederholungssicherheit (max. 255 Zeichen). Ein erneuter Versuch mit demselben Schlüssel, derselben Wallet und demselben Body gibt die ursprüngliche Verifizierung zurück, ohne eine zweite Anmeldung zu starten; derselbe Schlüssel mit einer anderen Wallet oder einem anderen Body gibt 409 idempotency_key_reused zurück."
          }
        ],
        "tags": [
          "Digital ID wallets"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DigitalIdWalletApiAudkenniWalletVerificationStartRequest"
              },
              "example": {
                "country": "ISL",
                "vendor_data": "your-customer-reference",
                "metadata": {
                  "reference": "example"
                },
                "return_url": "https://app.example.com/identity/complete"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/DigitalIdWalletApiAudkenniWalletVerificationStartRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/DigitalIdWalletApiAudkenniWalletVerificationStartRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationResponse"
                },
                "example": {
                  "request_id": "00000000-0000-4000-8000-000000000001",
                  "wallet_verification": {
                    "wallet": {
                      "id": "audkenni",
                      "name": "Auðkenni",
                      "issuing_authority": "Auðkenni (Icelandic electronic ID)"
                    },
                    "country": "ISL",
                    "status": "Not Finished",
                    "outcome": "pending",
                    "error": null,
                    "interaction": "redirect",
                    "simulated": false,
                    "expires_at": "2026-01-01T10:10:00Z",
                    "next_action": {
                      "type": "redirect",
                      "url": "https://wallet.example.com/authorize"
                    },
                    "identity": null,
                    "attributes": null,
                    "level_of_assurance": null,
                    "verified_at": null,
                    "signature_valid": null,
                    "credential_type": "person_identification"
                  },
                  "vendor_data": "your-customer-reference",
                  "metadata": {
                    "reference": "example"
                  },
                  "created_at": "2026-01-01T10:00:00Z"
                }
              }
            },
            "description": ""
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationStartBadRequest"
                }
              }
            },
            "description": "Feldvalidierungsfehler ({field: [messages]}) oder Fehler return_url_invalid, return_url_not_allowed, invalid_personal_code, invalid_phone_number oder idempotency_key_invalid."
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationStartForbidden"
                }
              }
            },
            "description": "Fehlende Anmeldedaten ({detail}) oder Fehler wallet_unavailable, insufficient_credits oder contract_rate_missing."
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationError"
                }
              }
            },
            "description": "Fehler idempotency_key_reused oder idempotency_key_in_progress (mit Retry-After)."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationError"
                }
              }
            },
            "description": "Fehler wallet_provider_unavailable: Der Anbieter konnte nicht gestartet werden; es wurde nichts erstellt."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationError"
                }
              }
            },
            "description": "Fehler wallet_not_configured: Diese Umgebung kann die Wallet nicht erreichen."
          }
        },
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "cURL",
            "source": "curl --request POST \\\n  --url https://verification.didit.me/v3/id-verification/wallets/audkenni/ \\\n  --header 'x-api-key: YOUR_API_KEY' \\\n  --header 'Idempotency-Key: your-unique-attempt-key' \\\n  --header 'Content-Type: application/json' \\\n  --data '{\n  \"country\": \"ISL\",\n  \"vendor_data\": \"your-customer-reference\",\n  \"metadata\": {\n    \"reference\": \"example\"\n  },\n  \"return_url\": \"https://app.example.com/identity/complete\"\n}'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.id_wallets.start_audkenni(\n    vendor_data=\"your-customer-reference\",\n    metadata={\"reference\": \"example\"},\n    country=\"ISL\",\n    return_url=\"https://app.example.com/identity/complete\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.idWallets.startAudkenni({\n  vendor_data: \"your-customer-reference\",\n  metadata: { reference: \"example\" },\n  country: \"ISL\",\n  return_url: \"https://app.example.com/identity/complete\",\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.IDWallets.StartAudkenni(ctx, didit.IDWalletsStartAudkenniParams{\n\tBody: didit.DigitalIDWalletAPIAudkenniWalletVerificationStartRequest{\n\t\tVendorData: didit.String(\"your-customer-reference\"),\n\t\tMetadata:   didit.Some(map[string]any{\"reference\": \"example\"}),\n\t\tCountry:    didit.Some(didit.DigitalIDWalletAPIAudkenniWalletVerificationStartCountryEnum(\"ISL\")),\n\t\tReturnURL:  \"https://app.example.com/identity/complete\",\n\t},\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import java.util.Map;\nimport me.didit.Didit;\nimport me.didit.types.DigitalIdWalletApiAudkenniWalletVerificationStartCountryEnum;\nimport me.didit.types.DigitalIdWalletApiAudkenniWalletVerificationStartRequest;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.idWallets().startAudkenni(DigitalIdWalletApiAudkenniWalletVerificationStartRequest.builder()\n        .vendorData(\"your-customer-reference\")\n        .metadata(Map.of(\"reference\", \"example\"))\n        .country(DigitalIdWalletApiAudkenniWalletVerificationStartCountryEnum.of(\"ISL\"))\n        .returnUrl(\"https://app.example.com/identity/complete\")\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->idWallets->startAudkenni([\n    'vendor_data' => 'your-customer-reference',\n    'metadata' => ['reference' => 'example'],\n    'country' => 'ISL',\n    'return_url' => 'https://app.example.com/identity/complete',\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.id_wallets.start_audkenni(\n  vendor_data: \"your-customer-reference\",\n  metadata: { reference: \"example\" },\n  country: \"ISL\",\n  return_url: \"https://app.example.com/identity/complete\"\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Collections.Generic;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.IdWallets.StartAudkenniAsync(new DigitalIdWalletApiAudkenniWalletVerificationStartRequest\n{\n    VendorData = \"your-customer-reference\",\n    Metadata = new Dictionary<string, object> { [\"reference\"] = \"example\" },\n    Country = new DigitalIdWalletApiAudkenniWalletVerificationStartCountryEnum(\"ISL\"),\n    ReturnUrl = \"https://app.example.com/identity/complete\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "x-didit-wallet-id": "audkenni"
      }
    },
    "/v3/id-verification/wallets/connectid/": {
      "post": {
        "operationId": "start_connectid_wallet_verification",
        "x-didit-sdk": {
          "resource": "id_wallets",
          "method": "start_connectid",
          "auth": "api_key",
          "server": true
        },
        "description": "Starten Sie eine ConnectID-Anmeldung (Australian Payments Plus; AUS) ohne einen Workflow. Wird einmalig abgerechnet, nur wenn die Identität verifiziert ist. Die Antwort enthält next_action.type=redirect mit der URL, an die der Browser des Benutzers weitergeleitet werden soll; der Benutzer kehrt mit angehängtem request_id und result zu return_url zurück. Lesen Sie das Ergebnis mit GET /v3/id-verification/wallets/verifications/{request_id}/ oder aus dem Webhook aus, niemals aus der URL. Sandbox-Anwendungen erhalten eine deterministische Simulation (simulated: true), die den Anbieter niemals kontaktiert.",
        "summary": "ConnectID-Verifizierung starten",
        "parameters": [
          {
            "in": "header",
            "name": "Idempotency-Key",
            "schema": {
              "type": "string"
            },
            "description": "Optionaler Schlüssel zur Wiederholungssicherheit (max. 255 Zeichen). Ein erneuter Versuch mit demselben Schlüssel, derselben Wallet und demselben Body gibt die ursprüngliche Verifizierung zurück, ohne eine zweite Anmeldung zu starten; derselbe Schlüssel mit einer anderen Wallet oder einem anderen Body gibt 409 idempotency_key_reused zurück."
          }
        ],
        "tags": [
          "Digital ID wallets"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DigitalIdWalletApiConnectidWalletVerificationStartRequest"
              },
              "example": {
                "country": "AUS",
                "vendor_data": "your-customer-reference",
                "metadata": {
                  "reference": "example"
                },
                "return_url": "https://app.example.com/identity/complete"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/DigitalIdWalletApiConnectidWalletVerificationStartRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/DigitalIdWalletApiConnectidWalletVerificationStartRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationResponse"
                },
                "example": {
                  "request_id": "00000000-0000-4000-8000-000000000001",
                  "wallet_verification": {
                    "wallet": {
                      "id": "connectid",
                      "name": "ConnectID",
                      "issuing_authority": "Australian Payments Plus"
                    },
                    "country": "AUS",
                    "status": "Not Finished",
                    "outcome": "pending",
                    "error": null,
                    "interaction": "redirect",
                    "simulated": false,
                    "expires_at": "2026-01-01T10:10:00Z",
                    "next_action": {
                      "type": "redirect",
                      "url": "https://wallet.example.com/authorize"
                    },
                    "identity": null,
                    "attributes": null,
                    "level_of_assurance": null,
                    "verified_at": null,
                    "signature_valid": null,
                    "credential_type": "person_identification"
                  },
                  "vendor_data": "your-customer-reference",
                  "metadata": {
                    "reference": "example"
                  },
                  "created_at": "2026-01-01T10:00:00Z"
                }
              }
            },
            "description": ""
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationStartBadRequest"
                }
              }
            },
            "description": "Feldvalidierungsfehler ({field: [messages]}) oder Fehler return_url_invalid, return_url_not_allowed, invalid_personal_code, invalid_phone_number oder idempotency_key_invalid."
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationStartForbidden"
                }
              }
            },
            "description": "Fehlende Anmeldedaten ({detail}) oder Fehler wallet_unavailable, insufficient_credits oder contract_rate_missing."
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationError"
                }
              }
            },
            "description": "Fehler idempotency_key_reused oder idempotency_key_in_progress (mit Retry-After)."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationError"
                }
              }
            },
            "description": "Fehler wallet_provider_unavailable: Der Anbieter konnte nicht gestartet werden; es wurde nichts erstellt."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationError"
                }
              }
            },
            "description": "Fehler wallet_not_configured: Diese Umgebung kann die Wallet nicht erreichen."
          }
        },
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "cURL",
            "source": "curl --request POST \\\n  --url https://verification.didit.me/v3/id-verification/wallets/connectid/ \\\n  --header 'x-api-key: YOUR_API_KEY' \\\n  --header 'Idempotency-Key: your-unique-attempt-key' \\\n  --header 'Content-Type: application/json' \\\n  --data '{\n  \"country\": \"AUS\",\n  \"vendor_data\": \"your-customer-reference\",\n  \"metadata\": {\n    \"reference\": \"example\"\n  },\n  \"return_url\": \"https://app.example.com/identity/complete\"\n}'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.id_wallets.start_connectid(\n    vendor_data=\"your-customer-reference\",\n    metadata={\"reference\": \"example\"},\n    country=\"AUS\",\n    return_url=\"https://app.example.com/identity/complete\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.idWallets.startConnectid({\n  vendor_data: \"your-customer-reference\",\n  metadata: { reference: \"example\" },\n  country: \"AUS\",\n  return_url: \"https://app.example.com/identity/complete\",\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.IDWallets.StartConnectid(ctx, didit.IDWalletsStartConnectidParams{\n\tBody: didit.DigitalIDWalletAPIConnectidWalletVerificationStartRequest{\n\t\tVendorData: didit.String(\"your-customer-reference\"),\n\t\tMetadata:   didit.Some(map[string]any{\"reference\": \"example\"}),\n\t\tCountry:    didit.Some(didit.DigitalIDWalletAPIConnectidWalletVerificationStartCountryEnum(\"AUS\")),\n\t\tReturnURL:  \"https://app.example.com/identity/complete\",\n\t},\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import java.util.Map;\nimport me.didit.Didit;\nimport me.didit.types.DigitalIdWalletApiConnectidWalletVerificationStartCountryEnum;\nimport me.didit.types.DigitalIdWalletApiConnectidWalletVerificationStartRequest;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.idWallets().startConnectid(DigitalIdWalletApiConnectidWalletVerificationStartRequest.builder()\n        .vendorData(\"your-customer-reference\")\n        .metadata(Map.of(\"reference\", \"example\"))\n        .country(DigitalIdWalletApiConnectidWalletVerificationStartCountryEnum.of(\"AUS\"))\n        .returnUrl(\"https://app.example.com/identity/complete\")\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->idWallets->startConnectid([\n    'vendor_data' => 'your-customer-reference',\n    'metadata' => ['reference' => 'example'],\n    'country' => 'AUS',\n    'return_url' => 'https://app.example.com/identity/complete',\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.id_wallets.start_connectid(\n  vendor_data: \"your-customer-reference\",\n  metadata: { reference: \"example\" },\n  country: \"AUS\",\n  return_url: \"https://app.example.com/identity/complete\"\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Collections.Generic;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.IdWallets.StartConnectidAsync(new DigitalIdWalletApiConnectidWalletVerificationStartRequest\n{\n    VendorData = \"your-customer-reference\",\n    Metadata = new Dictionary<string, object> { [\"reference\"] = \"example\" },\n    Country = new DigitalIdWalletApiConnectidWalletVerificationStartCountryEnum(\"AUS\"),\n    ReturnUrl = \"https://app.example.com/identity/complete\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "x-didit-wallet-id": "connectid"
      }
    },
    "/v3/id-verification/wallets/eudi/": {
      "post": {
        "operationId": "start_eudi_wallet_verification",
        "x-didit-sdk": {
          "resource": "id_wallets",
          "method": "start_eudi",
          "auth": "api_key",
          "server": true
        },
        "description": "Starten Sie eine EUDI Wallet-Anmeldung (Der Mitgliedstaat des Benutzers; der Aussteller unterscheidet sich je nach Land; AUT, BEL, BGR, HRV, CYP, CZE, DNK, EST, FIN, FRA, DEU, GRC, HUN, IRL, ITA, LVA, LTU, LUX, MLT, NLD, POL, PRT, ROU, SVK, SVN, ESP, SWE, ISL, LIE, NOR) ohne einen Workflow. Wird einmalig abgerechnet, nur wenn die Identität verifiziert ist. Die Antwort enthält next_action.type=redirect mit der URL, an die der Browser des Benutzers weitergeleitet werden soll; der Benutzer kehrt mit angehängtem request_id und result zu return_url zurück. Lesen Sie das Ergebnis mit GET /v3/id-verification/wallets/verifications/{request_id}/ oder aus dem Webhook aus, niemals aus der URL. Sandbox-Anwendungen erhalten eine deterministische Simulation (simulated: true), die den Anbieter niemals kontaktiert.",
        "summary": "EUDI Wallet-Verifizierung starten",
        "parameters": [
          {
            "in": "header",
            "name": "Idempotency-Key",
            "schema": {
              "type": "string"
            },
            "description": "Optionaler Schlüssel zur Wiederholungssicherheit (max. 255 Zeichen). Ein erneuter Versuch mit demselben Schlüssel, derselben Wallet und demselben Body gibt die ursprüngliche Verifizierung zurück, ohne eine zweite Anmeldung zu starten; derselbe Schlüssel mit einer anderen Wallet oder einem anderen Body gibt 409 idempotency_key_reused zurück."
          }
        ],
        "tags": [
          "Digital ID wallets"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DigitalIdWalletApiEudiWalletVerificationStartRequest"
              },
              "example": {
                "country": "AUT",
                "vendor_data": "your-customer-reference",
                "metadata": {
                  "reference": "example"
                },
                "return_url": "https://app.example.com/identity/complete"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/DigitalIdWalletApiEudiWalletVerificationStartRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/DigitalIdWalletApiEudiWalletVerificationStartRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationResponse"
                },
                "example": {
                  "request_id": "00000000-0000-4000-8000-000000000001",
                  "wallet_verification": {
                    "wallet": {
                      "id": "eudi",
                      "name": "EUDI Wallet",
                      "issuing_authority": "The user's own member state; the issuer differs per country"
                    },
                    "country": "AUT",
                    "status": "Not Finished",
                    "outcome": "pending",
                    "error": null,
                    "interaction": "redirect",
                    "simulated": false,
                    "expires_at": "2026-01-01T10:10:00Z",
                    "next_action": {
                      "type": "redirect",
                      "url": "https://wallet.example.com/authorize"
                    },
                    "identity": null,
                    "attributes": null,
                    "level_of_assurance": null,
                    "verified_at": null,
                    "signature_valid": null,
                    "credential_type": "person_identification"
                  },
                  "vendor_data": "your-customer-reference",
                  "metadata": {
                    "reference": "example"
                  },
                  "created_at": "2026-01-01T10:00:00Z"
                }
              }
            },
            "description": ""
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationStartBadRequest"
                }
              }
            },
            "description": "Feldvalidierungsfehler ({field: [messages]}) oder Fehler return_url_invalid, return_url_not_allowed, invalid_personal_code, invalid_phone_number oder idempotency_key_invalid."
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationStartForbidden"
                }
              }
            },
            "description": "Fehlende Anmeldedaten ({detail}) oder Fehler wallet_unavailable, insufficient_credits oder contract_rate_missing."
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationError"
                }
              }
            },
            "description": "Fehler idempotency_key_reused oder idempotency_key_in_progress (mit Retry-After)."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationError"
                }
              }
            },
            "description": "Fehler wallet_provider_unavailable: Der Anbieter konnte nicht gestartet werden; es wurde nichts erstellt."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationError"
                }
              }
            },
            "description": "Fehler wallet_not_configured: Diese Umgebung kann die Wallet nicht erreichen."
          }
        },
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "cURL",
            "source": "curl --request POST \\\n  --url https://verification.didit.me/v3/id-verification/wallets/eudi/ \\\n  --header 'x-api-key: YOUR_API_KEY' \\\n  --header 'Idempotency-Key: your-unique-attempt-key' \\\n  --header 'Content-Type: application/json' \\\n  --data '{\n  \"country\": \"AUT\",\n  \"vendor_data\": \"your-customer-reference\",\n  \"metadata\": {\n    \"reference\": \"example\"\n  },\n  \"return_url\": \"https://app.example.com/identity/complete\"\n}'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.id_wallets.start_eudi(\n    vendor_data=\"your-customer-reference\",\n    metadata={\"reference\": \"example\"},\n    country=\"AUT\",\n    return_url=\"https://app.example.com/identity/complete\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.idWallets.startEudi({\n  vendor_data: \"your-customer-reference\",\n  metadata: { reference: \"example\" },\n  country: \"AUT\",\n  return_url: \"https://app.example.com/identity/complete\",\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.IDWallets.StartEudi(ctx, didit.IDWalletsStartEudiParams{\n\tBody: didit.DigitalIDWalletAPIEudiWalletVerificationStartRequest{\n\t\tVendorData: didit.String(\"your-customer-reference\"),\n\t\tMetadata:   didit.Some(map[string]any{\"reference\": \"example\"}),\n\t\tCountry:    didit.DigitalIDWalletAPIEudiWalletVerificationStartCountryEnum(\"AUT\"),\n\t\tReturnURL:  \"https://app.example.com/identity/complete\",\n\t},\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import java.util.Map;\nimport me.didit.Didit;\nimport me.didit.types.DigitalIdWalletApiEudiWalletVerificationStartCountryEnum;\nimport me.didit.types.DigitalIdWalletApiEudiWalletVerificationStartRequest;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.idWallets().startEudi(DigitalIdWalletApiEudiWalletVerificationStartRequest.builder()\n        .vendorData(\"your-customer-reference\")\n        .metadata(Map.of(\"reference\", \"example\"))\n        .country(DigitalIdWalletApiEudiWalletVerificationStartCountryEnum.of(\"AUT\"))\n        .returnUrl(\"https://app.example.com/identity/complete\")\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->idWallets->startEudi([\n    'vendor_data' => 'your-customer-reference',\n    'metadata' => ['reference' => 'example'],\n    'country' => 'AUT',\n    'return_url' => 'https://app.example.com/identity/complete',\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.id_wallets.start_eudi(\n  vendor_data: \"your-customer-reference\",\n  metadata: { reference: \"example\" },\n  country: \"AUT\",\n  return_url: \"https://app.example.com/identity/complete\"\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Collections.Generic;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.IdWallets.StartEudiAsync(new DigitalIdWalletApiEudiWalletVerificationStartRequest\n{\n    VendorData = \"your-customer-reference\",\n    Metadata = new Dictionary<string, object> { [\"reference\"] = \"example\" },\n    Country = \"AUT\",\n    ReturnUrl = \"https://app.example.com/identity/complete\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "x-didit-wallet-id": "eudi"
      }
    },
    "/v3/organization/{organization_id}/application/{application_id}/cases/teams/": {
      "get": {
        "summary": "Prüfteams auflisten",
        "description": "Erfordert `list:cases` für die angeforderte Anwendung.",
        "operationId": "list_case_teams",
        "x-didit-sdk": {
          "resource": "cases.teams",
          "method": "list",
          "auth": "api_key",
          "server": true,
          "scope": "application"
        },
        "tags": [
          "Case Assignment"
        ],
        "parameters": [
          {
            "name": "organization_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "UUID der Organisation."
          },
          {
            "name": "application_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Anwendungs-UUID."
          },
          {
            "name": "limit",
            "in": "query",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 50
            }
          },
          {
            "name": "offset",
            "in": "query",
            "schema": {
              "type": "integer",
              "minimum": 0,
              "maximum": 1000000,
              "default": 0
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Erfolg",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "results": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/CaseReviewTeam"
                      }
                    },
                    "count": {
                      "type": "integer",
                      "description": "Anzahl der Treffer, begrenzt auf 100. Verwenden Sie next, um über die Obergrenze hinaus fortzufahren."
                    },
                    "next": {
                      "type": "string",
                      "nullable": true
                    },
                    "previous": {
                      "type": "string",
                      "nullable": true
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Ungültige Eingabe."
          },
          "403": {
            "description": "Unzureichende Berechtigung."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "x-codeSamples": [
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nfor item in client.cases.teams.list():\n    print(item)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nfor await (const item of didit.cases.teams.list()) {\n  console.log(item);\n}"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\niter := client.Cases.Teams.ListAutoPaging(ctx, didit.CasesTeamsListParams{})\nfor iter.Next() {\n\tfmt.Printf(\"%+v\\n\", iter.Current())\n}\nif err := iter.Err(); err != nil {\n\tlog.Fatal(err)\n}"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nfor (var item : client.cases().teams().list()) {\n    System.out.println(item);\n}"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\n$didit = new DiditClient();\n\nforeach ($didit->cases->teams->list() as $item) {\n    print_r($item->toArray());\n}"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\ndidit.cases.teams.list.auto_paging_each do |item|\n  puts item.to_h\nend"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nawait foreach (var item in await client.Cases.Teams.ListAsync())\n{\n    Console.WriteLine(JsonSerializer.Serialize(item));\n}"
          }
        ]
      },
      "post": {
        "summary": "Prüfungsteam erstellen",
        "description": "Erfordert `write:cases` für die angeforderte Anwendung.",
        "operationId": "create_case_teams",
        "x-didit-sdk": {
          "resource": "cases.teams",
          "method": "create",
          "auth": "api_key",
          "server": true,
          "scope": "application"
        },
        "tags": [
          "Case Assignment"
        ],
        "parameters": [
          {
            "name": "organization_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "UUID der Organisation."
          },
          {
            "name": "application_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Anwendungs-UUID."
          }
        ],
        "responses": {
          "201": {
            "description": "Erfolg",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CaseReviewTeam"
                }
              }
            }
          },
          "400": {
            "description": "Ungültige Eingabe."
          },
          "403": {
            "description": "Unzureichende Berechtigung."
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CaseReviewTeamCreate"
              },
              "example": {
                "name": "AML analysts",
                "members": [
                  {
                    "user_id": "9a000000-0000-4000-8000-0000000000aa",
                    "capacity": 10
                  }
                ]
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "x-codeSamples": [
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.cases.teams.create(\n    name=\"AML analysts\",\n    members=[{\n        \"user_id\": \"9a000000-0000-4000-8000-0000000000aa\",\n        \"capacity\": 10,\n    }],\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.cases.teams.create({\n  name: \"AML analysts\",\n  members: [{\n    user_id: \"9a000000-0000-4000-8000-0000000000aa\",\n    capacity: 10,\n  }],\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.Cases.Teams.Create(ctx, didit.CaseReviewTeamCreate{\n\tName: \"AML analysts\",\n\tMembers: []didit.CaseReviewTeamMemberParam{{\n\t\tUserID:   \"9a000000-0000-4000-8000-0000000000aa\",\n\t\tCapacity: didit.Int(10),\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;\nimport me.didit.Didit;\nimport me.didit.types.CaseReviewTeamCreate;\nimport me.didit.types.CaseReviewTeamMember;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.cases().teams().create(CaseReviewTeamCreate.builder()\n        .name(\"AML analysts\")\n        .members(List.of(CaseReviewTeamMember.builder()\n                .userId(\"9a000000-0000-4000-8000-0000000000aa\")\n                .capacity(10L)\n                .build()))\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\n$didit = new DiditClient();\n\n$result = $didit->cases->teams->create([\n    'name' => 'AML analysts',\n    'members' => [[\n        'user_id' => '9a000000-0000-4000-8000-0000000000aa',\n        'capacity' => 10,\n    ]],\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.cases.teams.create(\n  name: \"AML analysts\",\n  members: [{\n    user_id: \"9a000000-0000-4000-8000-0000000000aa\",\n    capacity: 10,\n  }]\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.Cases.Teams.CreateAsync(new CaseReviewTeamCreate\n{\n    Name = \"AML analysts\",\n    Members = new CaseReviewTeamMember[]\n    {\n        new()\n        {\n            UserId = \"9a000000-0000-4000-8000-0000000000aa\",\n            Capacity = 10,\n        },\n    },\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ]
      }
    },
    "/v3/fraud/checks/{check_id}/": {
      "get": {
        "operationId": "root_retrieve",
        "x-didit-sdk": {
          "resource": "fraud_checks",
          "method": "retrieve",
          "auth": "api_key",
          "server": true
        },
        "description": "Ruft eine zuvor erstellte Prüfung anhand ihrer `check_id` ab.",
        "summary": "Eine Betrugsprüfung abrufen",
        "parameters": [
          {
            "in": "path",
            "name": "check_id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "required": true
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/FraudCheckResponse"
                }
              }
            },
            "description": ""
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/FraudClientCredentialsErrorMessage"
                }
              }
            },
            "description": ""
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/FraudClientCredentialsForbiddenErrorMessage"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "tags": [
          "Fraud Check"
        ],
        "x-codeSamples": [
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.fraud_checks.retrieve(\n    \"11111111-2222-3333-4444-555555555555\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.fraudChecks.retrieve(\"11111111-2222-3333-4444-555555555555\");\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.FraudChecks.Retrieve(ctx, \"11111111-2222-3333-4444-555555555555\")\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.fraudChecks().retrieve(\"11111111-2222-3333-4444-555555555555\");\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->fraudChecks->retrieve('11111111-2222-3333-4444-555555555555');\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.fraud_checks.retrieve(\"11111111-2222-3333-4444-555555555555\")\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.FraudChecks.RetrieveAsync(\"11111111-2222-3333-4444-555555555555\");\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ]
      }
    },
    "/v3/organization/{organization_id}/application/{application_id}/cases/{case_uuid}/requests/": {
      "get": {
        "operationId": "organization_application_cases_requests_list",
        "x-didit-sdk": {
          "resource": "cases.requests",
          "method": "list",
          "auth": "api_key",
          "server": true,
          "scope": "application"
        },
        "parameters": [
          {
            "in": "path",
            "name": "organization_id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "required": true
          },
          {
            "in": "path",
            "name": "application_id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "required": true
          },
          {
            "in": "path",
            "name": "case_uuid",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "required": true
          },
          {
            "name": "ordering",
            "required": false,
            "in": "query",
            "description": "Welches Feld für die Sortierung der Ergebnisse verwendet werden soll.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "limit",
            "required": false,
            "in": "query",
            "description": "Anzahl der pro Seite zurückzugebenden Ergebnisse.",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "offset",
            "required": false,
            "in": "query",
            "description": "Der Startindex, ab dem die Ergebnisse zurückgegeben werden sollen.",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "tags": [
          "Case Management"
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CustomerMessagingPaginatedCaseRequestList"
                }
              }
            },
            "description": ""
          },
          "404": {
            "description": "Die Anfrage oder der Fall ist für diesen Aufrufer nicht verfügbar."
          },
          "403": {
            "description": "Dem Aufrufer fehlt die erforderliche Berechtigung für Fälle."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "x-codeSamples": [
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nfor item in client.cases.requests.list(\n    \"11111111-2222-3333-4444-555555555555\",\n):\n    print(item)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nfor await (const item of didit.cases.requests.list(\"11111111-2222-3333-4444-555555555555\")) {\n  console.log(item);\n}"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\niter := client.Cases.Requests.ListAutoPaging(ctx, \"11111111-2222-3333-4444-555555555555\", didit.CasesRequestsListParams{})\nfor iter.Next() {\n\tfmt.Printf(\"%+v\\n\", iter.Current())\n}\nif err := iter.Err(); err != nil {\n\tlog.Fatal(err)\n}"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nfor (var item : client.cases().requests().list(\"11111111-2222-3333-4444-555555555555\")) {\n    System.out.println(item);\n}"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\n$didit = new DiditClient();\n\nforeach ($didit->cases->requests->list('11111111-2222-3333-4444-555555555555') as $item) {\n    print_r($item->toArray());\n}"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\ndidit.cases.requests.list(\"11111111-2222-3333-4444-555555555555\").auto_paging_each do |item|\n  puts item.to_h\nend"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nawait foreach (var item in await client.Cases.Requests.ListAsync(\"11111111-2222-3333-4444-555555555555\"))\n{\n    Console.WriteLine(JsonSerializer.Serialize(item));\n}"
          }
        ]
      },
      "post": {
        "operationId": "organization_application_cases_requests_create",
        "x-didit-sdk": {
          "resource": "cases.requests",
          "method": "create",
          "auth": "api_key",
          "server": true,
          "scope": "application"
        },
        "parameters": [
          {
            "in": "path",
            "name": "organization_id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "required": true
          },
          {
            "in": "path",
            "name": "application_id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "required": true
          },
          {
            "in": "path",
            "name": "case_uuid",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "required": true
          }
        ],
        "tags": [
          "Case Management"
        ],
        "requestBody": {
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/CustomerMessagingCaseRequestConfirmRequest"
              }
            },
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CustomerMessagingCaseRequestConfirmRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/CustomerMessagingCaseRequestConfirmRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "404": {
            "description": "Die Anfrage oder der Fall ist für diesen Aufrufer nicht verfügbar."
          },
          "403": {
            "description": "Dem Aufrufer fehlt die erforderliche Berechtigung für Fälle."
          },
          "400": {
            "description": "Ungültige Eingaben, nicht unterstützter Verwendungszweck, nicht verfügbarer verifizierter Kontakt oder eine bestehende unveränderliche Antwort."
          },
          "409": {
            "description": "Die Vorschau hat sich geändert oder ist abgelaufen. Vor dem Bestätigen erneut eine Vorschau anzeigen."
          },
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CustomerMessagingCaseRequest"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "description": "Bestätigen Sie die exakte signierte Vorschau innerhalb von 15 Minuten. Es werden nur feste Vorlagen und ein per OTP verifizierter Kontakt akzeptiert, der dem Betroffenen des Falls gehört. Die Anfrage-ID macht Wiederholungsversuche idempotent. Die Zustellung wird eingereiht; SENT, SIMULATED und UNKNOWN sind unterschiedliche Ergebnisse. Eine handlungsrelevante Anfrage setzt den Fall auf „Awaiting user“. Eine Prüfungsaktualisierung lässt den Status unverändert.",
        "x-codeSamples": [
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.cases.requests.create(\n    \"11111111-2222-3333-4444-555555555555\",\n    contact_id=\"11111111-2222-3333-4444-555555555555\",\n    purpose=\"identity_document\",\n    request_id=\"11111111-2222-3333-4444-555555555555\",\n    expires_at=\"2026-01-15T10:00:00Z\",\n    preview_token=\"your-preview-token\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.cases.requests.create(\"11111111-2222-3333-4444-555555555555\", {\n  contact_id: \"11111111-2222-3333-4444-555555555555\",\n  purpose: \"identity_document\",\n  request_id: \"11111111-2222-3333-4444-555555555555\",\n  expires_at: \"2026-01-15T10:00:00Z\",\n  preview_token: \"your-preview-token\",\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.Cases.Requests.Create(ctx, \"11111111-2222-3333-4444-555555555555\", didit.CustomerMessagingCaseRequestConfirmRequest{\n\tContactID:    \"11111111-2222-3333-4444-555555555555\",\n\tPurpose:      didit.CustomerMessagingPurposeEnum(\"identity_document\"),\n\tRequestID:    \"11111111-2222-3333-4444-555555555555\",\n\tExpiresAt:    time.Date(2026, 1, 15, 10, 0, 0, 0, time.UTC),\n\tPreviewToken: \"your-preview-token\",\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import java.time.OffsetDateTime;\nimport me.didit.Didit;\nimport me.didit.types.CustomerMessagingCaseRequestConfirmRequest;\nimport me.didit.types.CustomerMessagingPurposeEnum;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.cases().requests().create(\"11111111-2222-3333-4444-555555555555\", CustomerMessagingCaseRequestConfirmRequest.builder()\n        .contactId(\"11111111-2222-3333-4444-555555555555\")\n        .purpose(CustomerMessagingPurposeEnum.of(\"identity_document\"))\n        .requestId(\"11111111-2222-3333-4444-555555555555\")\n        .expiresAt(OffsetDateTime.parse(\"2026-01-15T10:00:00Z\"))\n        .previewToken(\"your-preview-token\")\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\n$didit = new DiditClient();\n\n$result = $didit->cases->requests->create('11111111-2222-3333-4444-555555555555', [\n    'contact_id' => '11111111-2222-3333-4444-555555555555',\n    'purpose' => 'identity_document',\n    'request_id' => '11111111-2222-3333-4444-555555555555',\n    'expires_at' => '2026-01-15T10:00:00Z',\n    'preview_token' => 'your-preview-token',\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.cases.requests.create(\n  \"11111111-2222-3333-4444-555555555555\",\n  contact_id: \"11111111-2222-3333-4444-555555555555\",\n  purpose: \"identity_document\",\n  request_id: \"11111111-2222-3333-4444-555555555555\",\n  expires_at: \"2026-01-15T10:00:00Z\",\n  preview_token: \"your-preview-token\"\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.Cases.Requests.CreateAsync(\"11111111-2222-3333-4444-555555555555\", new CustomerMessagingCaseRequestConfirmRequest\n{\n    ContactId = \"11111111-2222-3333-4444-555555555555\",\n    Purpose = \"identity_document\",\n    RequestId = \"11111111-2222-3333-4444-555555555555\",\n    ExpiresAt = DateTimeOffset.Parse(\"2026-01-15T10:00:00Z\"),\n    PreviewToken = \"your-preview-token\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ]
      }
    },
    "/v3/fraud/checks/": {
      "post": {
        "operationId": "create_fraud_check",
        "x-didit-sdk": {
          "resource": "fraud_checks",
          "method": "create",
          "auth": "api_key",
          "server": true
        },
        "description": "Übermitteln Sie einen oder mehrere typisierte Identifikatoren und erhalten Sie Normalisierung, aktuelle Anreicherung, maßgebliche Validierung (sofern Land und Identifikatortyp abgedeckt sind), unabhängige Risikodimensionen und eine Empfehlung in einer Antwort.\n\nDiese Profile unterstützen Identifikatorprüfungen. Die Selfie-basierte Identitätsbindung (`biometric_identity`) erfordert die Profilversion `2026-09-14.2` und eine brasilianische CPF; sie wird nur mit Einwilligung des Benutzers ausgeführt und wenn Ihre Organisation dazu berechtigt ist. Frühere Versionen melden dies als `not_available_in_profile_version`. Module, die nicht ausgeführt werden können, werden mit einem deterministischen Grund als übersprungen gemeldet; eine Quelle, die nicht antworten konnte, wird niemals als Identitätsabweichung gemeldet.",
        "summary": "Einen Betrugs-Check durchführen",
        "requestBody": {
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/FraudCheckRequestRequest"
              }
            },
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/FraudCheckRequestRequest"
              },
              "example": {
                "client_reference": "review-attempt-001",
                "subject": {
                  "identifiers": [
                    {
                      "type": "email",
                      "value": "applicant@example.com"
                    }
                  ],
                  "attributes": {
                    "first_name": "Alex",
                    "last_name": "Example"
                  }
                },
                "checks": {
                  "include": [
                    "networks_same_org",
                    "networks_cross_org",
                    "email_risk"
                  ]
                }
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/FraudCheckRequestRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/FraudCheckResponse"
                }
              }
            },
            "description": ""
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/FraudClientCredentialsErrorMessage"
                }
              }
            },
            "description": ""
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/FraudClientCredentialsForbiddenErrorMessage"
                }
              }
            },
            "description": ""
          },
          "409": {
            "description": "Konflikt, ohne Berechnung zurückgegeben: Die `client_reference` wurde bereits mit einem anderen Anfrageinhalt verwendet; eine Prüfung mit derselben `client_reference` läuft noch (nach Ablauf von `Retry-After` Sekunden mit derselben Referenz wiederholen); oder die Verifizierung, in der diese Prüfung erfasst wird, wurde gelöscht, bevor die Prüfung abgeschlossen war.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "error"
                  ]
                },
                "examples": {
                  "different_body": {
                    "summary": "Referenz mit einem anderen Body wiederverwendet",
                    "value": {
                      "error": "client_reference has already been used with a different request body."
                    }
                  },
                  "still_running": {
                    "summary": "Eine Prüfung mit dieser Referenz wird noch ausgeführt",
                    "value": {
                      "error": "A check with this client_reference is already running. Retry with the same reference later."
                    }
                  },
                  "verification_deleted": {
                    "summary": "Die Verifizierung wurde gelöscht, bevor die Prüfung abgeschlossen war",
                    "value": {
                      "error": "This verification was deleted before the check completed."
                    }
                  }
                }
              }
            },
            "headers": {
              "Retry-After": {
                "description": "Anzahl der Sekunden, die vor einem Wiederholungsversuch gewartet werden muss; dieser Wert wird übermittelt, wenn eine Prüfung mit derselben `client_reference` noch läuft.",
                "schema": {
                  "type": "integer"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "tags": [
          "Fraud Check"
        ],
        "x-codeSamples": [
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.fraud_checks.create(\n    client_reference=\"review-attempt-001\",\n    subject={\n        \"identifiers\": [{\n            \"type\": \"email\",\n            \"value\": \"applicant@example.com\",\n        }],\n        \"attributes\": {\n            \"first_name\": \"Alex\",\n            \"last_name\": \"Example\",\n        },\n    },\n    checks={\n        \"include\": [\"networks_same_org\", \"networks_cross_org\", \"email_risk\"],\n    },\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.fraudChecks.create({\n  client_reference: \"review-attempt-001\",\n  subject: {\n    identifiers: [{\n      type: \"email\",\n      value: \"applicant@example.com\",\n    }],\n    attributes: {\n      first_name: \"Alex\",\n      last_name: \"Example\",\n    },\n  },\n  checks: {\n    include: [\"networks_same_org\", \"networks_cross_org\", \"email_risk\"],\n  },\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.FraudChecks.Create(ctx, didit.FraudCheckRequestRequest{\n\tClientReference: didit.String(\"review-attempt-001\"),\n\tSubject: didit.FraudCheckSubjectRequest{\n\t\tIdentifiers: []didit.FraudCheckIdentifierRequest{{\n\t\t\tType:  didit.FraudTypeEnum(\"email\"),\n\t\t\tValue: \"applicant@example.com\",\n\t\t}},\n\t\tAttributes: didit.Some(didit.FraudCheckAttributesRequest{\n\t\t\tFirstName: didit.String(\"Alex\"),\n\t\t\tLastName:  didit.String(\"Example\"),\n\t\t}),\n\t},\n\tChecks: didit.Some(didit.FraudCheckModuleSelectionRequest{\n\t\tInclude: didit.Some([]didit.FraudExcludeEnum{didit.FraudExcludeEnum(\"networks_same_org\"), didit.FraudExcludeEnum(\"networks_cross_org\"), didit.FraudExcludeEnum(\"email_risk\")}),\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;\nimport me.didit.Didit;\nimport me.didit.types.FraudCheckAttributesRequest;\nimport me.didit.types.FraudCheckIdentifierRequest;\nimport me.didit.types.FraudCheckModuleSelectionRequest;\nimport me.didit.types.FraudCheckRequestRequest;\nimport me.didit.types.FraudCheckSubjectRequest;\nimport me.didit.types.FraudExcludeEnum;\nimport me.didit.types.FraudTypeEnum;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.fraudChecks().create(FraudCheckRequestRequest.builder()\n        .clientReference(\"review-attempt-001\")\n        .subject(FraudCheckSubjectRequest.builder()\n                .identifiers(List.of(FraudCheckIdentifierRequest.builder()\n                        .type(FraudTypeEnum.of(\"email\"))\n                        .value(\"applicant@example.com\")\n                        .build()))\n                .attributes(FraudCheckAttributesRequest.builder()\n                        .firstName(\"Alex\")\n                        .lastName(\"Example\")\n                        .build())\n                .build())\n        .checks(FraudCheckModuleSelectionRequest.builder()\n                .include(List.of(FraudExcludeEnum.of(\"networks_same_org\"), FraudExcludeEnum.of(\"networks_cross_org\"), FraudExcludeEnum.of(\"email_risk\")))\n                .build())\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->fraudChecks->create([\n    'client_reference' => 'review-attempt-001',\n    'subject' => [\n        'identifiers' => [[\n            'type' => 'email',\n            'value' => 'applicant@example.com',\n        ]],\n        'attributes' => [\n            'first_name' => 'Alex',\n            'last_name' => 'Example',\n        ],\n    ],\n    'checks' => [\n        'include' => ['networks_same_org', 'networks_cross_org', 'email_risk'],\n    ],\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.fraud_checks.create(\n  client_reference: \"review-attempt-001\",\n  subject: {\n    identifiers: [{\n      type: \"email\",\n      value: \"applicant@example.com\",\n    }],\n    attributes: {\n      first_name: \"Alex\",\n      last_name: \"Example\",\n    },\n  },\n  checks: {\n    include: [\"networks_same_org\", \"networks_cross_org\", \"email_risk\"],\n  }\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.FraudChecks.CreateAsync(new FraudCheckRequestRequest\n{\n    ClientReference = \"review-attempt-001\",\n    Subject = new()\n    {\n        Identifiers = new FraudCheckIdentifierRequest[]\n        {\n            new()\n            {\n                Type = \"email\",\n                Value = \"applicant@example.com\",\n            },\n        },\n        Attributes = new FraudCheckAttributesRequest\n        {\n            FirstName = \"Alex\",\n            LastName = \"Example\",\n        },\n    },\n    Checks = new FraudCheckModuleSelectionRequest\n    {\n        Include = new FraudExcludeEnum[] { \"networks_same_org\", \"networks_cross_org\", \"email_risk\" },\n    },\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ]
      }
    },
    "/v3/organization/{organization_id}/application/{application_id}/cases/{case_uuid}/requests/{request_uuid}/cancel/": {
      "post": {
        "operationId": "organization_application_cases_requests_cancel_create",
        "x-didit-sdk": {
          "resource": "cases.requests",
          "method": "cancel",
          "auth": "api_key",
          "server": true,
          "scope": "application"
        },
        "parameters": [
          {
            "in": "path",
            "name": "organization_id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "required": true
          },
          {
            "in": "path",
            "name": "application_id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "required": true
          },
          {
            "in": "path",
            "name": "case_uuid",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "required": true
          },
          {
            "in": "path",
            "name": "request_uuid",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "required": true
          }
        ],
        "tags": [
          "Case Management"
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CustomerMessagingCaseRequest"
                }
              }
            },
            "description": ""
          },
          "404": {
            "description": "Die Anfrage oder der Fall ist für diesen Aufrufer nicht verfügbar."
          },
          "403": {
            "description": "Dem Aufrufer fehlt die erforderliche Berechtigung für Fälle."
          },
          "400": {
            "description": "Ungültige Eingaben, nicht unterstützter Verwendungszweck, nicht verfügbarer verifizierter Kontakt oder eine bestehende unveränderliche Antwort."
          },
          "409": {
            "description": "Die Vorschau hat sich geändert oder ist abgelaufen. Vor dem Bestätigen erneut eine Vorschau anzeigen."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "x-codeSamples": [
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.cases.requests.cancel(\n    \"11111111-2222-3333-4444-555555555555\",\n    \"11111111-2222-3333-4444-555555555555\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.cases.requests.cancel(\n  \"11111111-2222-3333-4444-555555555555\",\n  \"11111111-2222-3333-4444-555555555555\",\n);\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.Cases.Requests.Cancel(ctx, \"11111111-2222-3333-4444-555555555555\", \"11111111-2222-3333-4444-555555555555\")\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.cases().requests().cancel(\"11111111-2222-3333-4444-555555555555\", \"11111111-2222-3333-4444-555555555555\");\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\n$didit = new DiditClient();\n\n$result = $didit->cases->requests->cancel('11111111-2222-3333-4444-555555555555', '11111111-2222-3333-4444-555555555555');\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.cases.requests.cancel(\n  \"11111111-2222-3333-4444-555555555555\",\n  \"11111111-2222-3333-4444-555555555555\"\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.Cases.Requests.CancelAsync(\"11111111-2222-3333-4444-555555555555\", \"11111111-2222-3333-4444-555555555555\");\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ]
      }
    },
    "/v3/organization/{organization_id}/application/{application_id}/cases/{case_uuid}/requests/options/": {
      "get": {
        "operationId": "organization_application_cases_requests_options_retrieve",
        "x-didit-sdk": {
          "resource": "cases.requests",
          "method": "retrieve_options",
          "auth": "api_key",
          "server": true,
          "scope": "application"
        },
        "parameters": [
          {
            "in": "path",
            "name": "organization_id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "required": true
          },
          {
            "in": "path",
            "name": "application_id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "required": true
          },
          {
            "in": "path",
            "name": "case_uuid",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "required": true
          }
        ],
        "tags": [
          "Case Management"
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CustomerMessagingCaseRequestOptions"
                }
              }
            },
            "description": ""
          },
          "404": {
            "description": "Die Anfrage oder der Fall ist für diesen Aufrufer nicht verfügbar."
          },
          "403": {
            "description": "Dem Aufrufer fehlt die erforderliche Berechtigung für Fälle."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "x-codeSamples": [
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.cases.requests.retrieve_options(\n    \"11111111-2222-3333-4444-555555555555\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.cases.requests.retrieveOptions(\"11111111-2222-3333-4444-555555555555\");\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.Cases.Requests.RetrieveOptions(ctx, \"11111111-2222-3333-4444-555555555555\")\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.cases().requests().retrieveOptions(\"11111111-2222-3333-4444-555555555555\");\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\n$didit = new DiditClient();\n\n$result = $didit->cases->requests->retrieveOptions('11111111-2222-3333-4444-555555555555');\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.cases.requests.retrieve_options(\"11111111-2222-3333-4444-555555555555\")\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.Cases.Requests.RetrieveOptionsAsync(\"11111111-2222-3333-4444-555555555555\");\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ]
      }
    },
    "/v3/organization/{organization_id}/application/{application_id}/cases/{case_uuid}/requests/{request_uuid}/attachment/": {
      "get": {
        "operationId": "organization_application_cases_requests_attachment_retrieve",
        "x-didit-sdk": {
          "resource": "cases.requests",
          "method": "retrieve_attachment",
          "auth": "api_key",
          "server": true,
          "scope": "application"
        },
        "parameters": [
          {
            "in": "path",
            "name": "organization_id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "required": true
          },
          {
            "in": "path",
            "name": "application_id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "required": true
          },
          {
            "in": "path",
            "name": "case_uuid",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "required": true
          },
          {
            "in": "path",
            "name": "request_uuid",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "required": true
          }
        ],
        "tags": [
          "Case Management"
        ],
        "responses": {
          "200": {
            "content": {
              "image/jpeg": {
                "schema": {
                  "type": "string",
                  "format": "binary"
                }
              }
            },
            "description": ""
          },
          "404": {
            "description": "Die Anfrage oder der Fall ist für diesen Aufrufer nicht verfügbar."
          },
          "403": {
            "description": "Dem Aufrufer fehlt die erforderliche Berechtigung für Fälle."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "x-codeSamples": [
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\ncontent = client.cases.requests.retrieve_attachment(\n    \"11111111-2222-3333-4444-555555555555\",\n    \"11111111-2222-3333-4444-555555555555\",\n)\nwith open(\"download.png\", \"wb\") as file:\n    file.write(content)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import { writeFile } from \"node:fs/promises\";\nimport Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst content = await didit.cases.requests.retrieveAttachment(\n  \"11111111-2222-3333-4444-555555555555\",\n  \"11111111-2222-3333-4444-555555555555\",\n);\nawait writeFile(\"download.png\", Buffer.from(await content.arrayBuffer()));"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresp, err := client.Cases.Requests.RetrieveAttachment(ctx, \"11111111-2222-3333-4444-555555555555\", \"11111111-2222-3333-4444-555555555555\")\nif err != nil {\n\tlog.Fatal(err)\n}\ndefer resp.Body.Close()\nfile, err := os.Create(\"download.png\")\nif err != nil {\n\tlog.Fatal(err)\n}\ndefer file.Close()\nif _, err := io.Copy(file, resp.Body); err != nil {\n\tlog.Fatal(err)\n}"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import java.nio.file.Path;\nimport me.didit.Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nclient.cases().requests().retrieveAttachment(\"11111111-2222-3333-4444-555555555555\", \"11111111-2222-3333-4444-555555555555\")\n        .writeTo(Path.of(\"download.png\"));"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\n$didit = new DiditClient();\n\n$content = $didit->cases->requests->retrieveAttachment('11111111-2222-3333-4444-555555555555', '11111111-2222-3333-4444-555555555555');\n$content->saveTo('download.png');"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\ncontent = didit.cases.requests.retrieve_attachment(\n  \"11111111-2222-3333-4444-555555555555\",\n  \"11111111-2222-3333-4444-555555555555\"\n)\nFile.binwrite(\"download.png\", content)"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar content = await client.Cases.Requests.RetrieveAttachmentAsync(\"11111111-2222-3333-4444-555555555555\", \"11111111-2222-3333-4444-555555555555\");\nawait content.SaveToAsync(\"download.png\");"
          }
        ]
      }
    },
    "/v3/organization/{organization_id}/application/{application_id}/cases/routing-rules/{record_uuid}/history/": {
      "get": {
        "operationId": "list_case_routing_rule_history",
        "x-didit-sdk": {
          "resource": "cases.routing_rules",
          "method": "list_history",
          "auth": "api_key",
          "server": true,
          "scope": "application"
        },
        "parameters": [
          {
            "in": "path",
            "name": "organization_id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "required": true
          },
          {
            "in": "path",
            "name": "application_id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "required": true
          },
          {
            "in": "path",
            "name": "record_uuid",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "required": true
          },
          {
            "name": "ordering",
            "required": false,
            "in": "query",
            "description": "Welches Feld für die Sortierung der Ergebnisse verwendet werden soll.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "limit",
            "required": false,
            "in": "query",
            "description": "Anzahl der pro Seite zurückzugebenden Ergebnisse.",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "offset",
            "required": false,
            "in": "query",
            "description": "Der Startindex, ab dem die Ergebnisse zurückgegeben werden sollen.",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "tags": [
          "Case Assignment"
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RoutingPublicationPaginatedPolicyRevisionList"
                }
              }
            },
            "description": ""
          },
          "403": {
            "description": "Zugriff auf den Fall ist erforderlich."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "x-codeSamples": [
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nfor item in client.cases.routing_rules.list_history(\n    \"11111111-2222-3333-4444-555555555555\",\n):\n    print(item)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nfor await (const item of didit.cases.routingRules.listHistory(\"11111111-2222-3333-4444-555555555555\")) {\n  console.log(item);\n}"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\niter := client.Cases.RoutingRules.ListHistoryAutoPaging(ctx, \"11111111-2222-3333-4444-555555555555\", didit.CasesRoutingRulesListHistoryParams{})\nfor iter.Next() {\n\tfmt.Printf(\"%+v\\n\", iter.Current())\n}\nif err := iter.Err(); err != nil {\n\tlog.Fatal(err)\n}"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nfor (var item : client.cases().routingRules().listHistory(\"11111111-2222-3333-4444-555555555555\")) {\n    System.out.println(item);\n}"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\n$didit = new DiditClient();\n\nforeach ($didit->cases->routingRules->listHistory('11111111-2222-3333-4444-555555555555') as $item) {\n    print_r($item->toArray());\n}"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\ndidit.cases.routing_rules.list_history(\"11111111-2222-3333-4444-555555555555\").auto_paging_each do |item|\n  puts item.to_h\nend"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nawait foreach (var item in await client.Cases.RoutingRules.ListHistoryAsync(\"11111111-2222-3333-4444-555555555555\"))\n{\n    Console.WriteLine(JsonSerializer.Serialize(item));\n}"
          }
        ]
      }
    },
    "/v3/session/{sessionId}/resubmission-preview/": {
      "post": {
        "summary": "Vorschau einer E-Mail zur erneuten Einreichung anzeigen",
        "description": "Rendern Sie die E-Mail, die einer erneuten KYC- oder KYB-Einreichung beiliegen würde, ohne die Sitzung zu ändern, Prüfungen zurückzusetzen, den Ablauf der Sitzung zu verlängern, Prüfungen durchzuführen oder E-Mails zu senden. Erfordert die Berechtigung `write:sessions` (ein berechtigungsbeschränkter API-Schlüssel benötigt Schreibzugriff auf Entscheidungen) und eine Sitzung im Status `Approved`, `Declined`, `In Review`, `Kyc Expired` oder `Abandoned`. Der Server validiert die ausgewählten Workflow-Schritte und rendert seine feste übersetzte Vorlage mit dem entsprechenden verifizierten White-Label-Absender und Branding. Die Anfrage kann weder Betreff, Nachrichtentext noch Aktions-URL festlegen.\n\n`email_address` ist optional. Ohne diesen Parameter geht die E-Mail an die eigene Adresse der Person: diejenige, die sie in einem E-Mail-Verifizierungsschritt des Workflows bestätigt hat, andernfalls die bei der Sitzungserstellung in `contact_details` angegebene Adresse. Eine von Ihnen übergebene Adresse hat Vorrang (`recipient_source: request`). Wenn keine Adresse bekannt ist und Sie keine übergeben, sind `recipient` und `preview_token` leere Zeichenfolgen und es kann keine E-Mail gesendet werden.\n\nDie Antwort enthält den Empfänger und die Quelle, aus der er stammt, den Absender, den Betreff, das HTML, die Sprache, die ermittelten Schritte, die Angabe, ob die Bestätigung die E-Mail sendet (`will_be_sent`, `not_sent_reason`) und ein signiertes `preview_token`. `requires_user_action` ist `false`, wenn jeder ausgewählte Schritt ohne die Person ausgeführt wird: Die erneute Einreichung wird dann selbstständig abgeschlossen und es wird keine E-Mail versendet (`not_sent_reason: no_user_action`).\n\nDiese Vorschau reserviert weder den Sitzungsstatus noch autorisiert sie die Zustellung. Rufen Sie nach der Prüfung [Update Session Status](/de/sessions-api/update-status) mit `new_status: Resubmitted`, denselben `nodes_to_resubmit` und derselben `email_language` wie in der Vorschau, `send_email: true`, `email_address` auf `recipient` gesetzt und `email_preview_token` auf `preview_token` gesetzt auf. Der Beleg läuft nach 15 Minuten ab. Wenn ein Beleg angegeben ist, geben geänderte Eingaben, Nachrichteninhalte, Absender oder der Sitzungsstatus vor jeder Mutation oder jedem Senden `409` zurück. Bestehende Integrationen können den Beleg weglassen. Generieren Sie die Vorschau nach einem Konflikt neu. Behandeln Sie die Antwort als vertraulichen Verifizierungsinhalt; Antworten verwenden `Cache-Control: no-store`. Rendern Sie HTML in einem Sandbox-Frame, niemals direkt im DOM Ihrer Anwendung.",
        "operationId": "post_v3_session_resubmission_preview",
        "x-didit-sdk": {
          "resource": "sessions",
          "method": "preview_resubmission",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Sessions"
        ],
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "parameters": [
          {
            "in": "path",
            "name": "sessionId",
            "required": true,
            "description": "UUID der zu aktualisierenden Verifizierungssitzung. Akzeptiert sowohl Benutzer- (KYC) als auch Unternehmens- (KYB) Sitzungs-IDs — der Dienst löst die ID über beide Sitzungstypen hinweg auf.",
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "11111111-2222-3333-4444-555555555555"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "nodes_to_resubmit": {
                    "type": "array",
                    "description": "Schritte für die Vorschau unter Verwendung derselben Validierung, Auswahl und Workflow-Reihenfolge wie bei einer erneuten Einreichung. Weglassen, um aufgezeichnete Versuche, die eine erneute Einreichung erfordern, automatisch auszuwählen.",
                    "items": {
                      "type": "object",
                      "required": [
                        "node_id",
                        "feature"
                      ],
                      "properties": {
                        "node_id": {
                          "type": "string",
                          "description": "Knotenbezeichner, wie er in der Workflow-Definition der Sitzung vorkommt (z. B. `feature_ocr`, `feature_liveness`).",
                          "example": "feature_ocr"
                        },
                        "feature": {
                          "type": "string",
                          "description": "Funktionstyp des Knotens. Die Aliase `ID_VERIFICATION`, `POA`, `PHONE` und `EMAIL` werden serverseitig zu `OCR`, `PROOF_OF_ADDRESS`, `PHONE_VERIFICATION` und `EMAIL_VERIFICATION` normalisiert. `KYB_REGISTRY`, `KYB_KEY_PEOPLE` und `KYB` bestehen die Schema-Validierung, werden jedoch immer mit dem in den Beispielen gezeigten Business-Rule-`400`-Fehler abgelehnt.",
                          "enum": [
                            "OCR",
                            "OCR_BACK",
                            "NFC",
                            "AML",
                            "FACE",
                            "LIVENESS",
                            "FACE_MATCH",
                            "IP_ANALYSIS",
                            "AGE_ESTIMATION",
                            "PROOF_OF_ADDRESS",
                            "PHONE_VERIFICATION",
                            "EMAIL_VERIFICATION",
                            "FACE_SEARCH",
                            "DATABASE_VALIDATION",
                            "QUESTIONNAIRE",
                            "DOCUMENT_AI",
                            "KYB_DOCUMENTS",
                            "ID_VERIFICATION",
                            "POA",
                            "PHONE",
                            "EMAIL",
                            "KYB_REGISTRY",
                            "KYB_KEY_PEOPLE",
                            "KYB",
                            "GEOLOCATION"
                          ],
                          "example": "OCR"
                        }
                      }
                    }
                  },
                  "email_address": {
                    "type": "string",
                    "format": "email",
                    "description": "Optional. Sendet die E-Mail an diese Adresse statt an die eigene Adresse der Person. Ohne diese Angabe ist der Empfänger die Adresse, die die Person im Ablauf verifiziert hat, andernfalls die in `contact_details` angegebene Adresse. Durch diesen Aufruf wird keine E-Mail versendet.",
                    "example": "user@example.com"
                  },
                  "email_language": {
                    "type": "string",
                    "description": "Sprache für die Benachrichtigungs-E-Mail. Akzeptiert auf Schemaebene beliebige Zeichenketten; bei nicht unterstützten Codes wird stillschweigend auf Englisch (`en`) zurückgegriffen.",
                    "default": "en",
                    "example": "en"
                  }
                }
              },
              "examples": {
                "Person's Own Address": {
                  "summary": "Vorschau einer erneuten Adressnachweis-Einreichung für die eigene Adresse der Person anzeigen",
                  "value": {
                    "nodes_to_resubmit": [
                      {
                        "node_id": "feature_poa_1",
                        "feature": "POA"
                      }
                    ],
                    "email_language": "en"
                  }
                },
                "Named Recipient": {
                  "summary": "Vorschau der E-Mail für eine von Ihnen angegebene Adresse anzeigen",
                  "value": {
                    "nodes_to_resubmit": [
                      {
                        "node_id": "feature_ocr",
                        "feature": "OCR"
                      }
                    ],
                    "email_address": "person@example.com",
                    "email_language": "en"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Nur Vorschau. Die Sitzung bleibt unverändert und es wird keine E-Mail gesendet.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "recipient",
                    "recipient_source",
                    "sender",
                    "sender_name",
                    "sender_email",
                    "sender_kind",
                    "subject",
                    "html",
                    "text",
                    "language",
                    "will_be_sent",
                    "not_sent_reason",
                    "preview_token",
                    "nodes_to_resubmit",
                    "requires_user_action"
                  ],
                  "properties": {
                    "recipient": {
                      "type": "string",
                      "description": "Die Adresse, an die die E-Mail gesendet wird. Eine leere Zeichenkette, wenn keine Adresse für die Person bekannt ist: Dann kann keine E-Mail gesendet werden und `preview_token` ist ebenfalls leer. Übergeben Sie sie als `email_address`, wenn Sie bestätigen.",
                      "example": "person@example.com"
                    },
                    "recipient_source": {
                      "type": "string",
                      "enum": [
                        "email_verification",
                        "contact_details",
                        "request",
                        ""
                      ],
                      "description": "Woher `recipient` stammt. `request`: die von Ihnen übergebene `email_address`. `email_verification`: die Adresse, die die Person in einem E-Mail-Verifizierungsschritt des Ablaufs verifiziert hat. `contact_details`: die in `contact_details` bei der Erstellung der Sitzung angegebene Adresse. Eine leere Zeichenkette, wenn keine Adresse vorhanden ist.",
                      "example": "email_verification"
                    },
                    "sender": {
                      "type": "string",
                      "description": "Der `From`-Header, mit dem die E-Mail gesendet wird.",
                      "example": "Example App <no-reply@mail.example.com>"
                    },
                    "sender_name": {
                      "type": "string",
                      "description": "Der Teil des Anzeigenamens von `sender`.",
                      "example": "Example App"
                    },
                    "sender_email": {
                      "type": "string",
                      "format": "email",
                      "description": "Der Adressteil von `sender`.",
                      "example": "no-reply@mail.example.com"
                    },
                    "sender_kind": {
                      "type": "string",
                      "enum": [
                        "customer",
                        "didit"
                      ],
                      "description": "`customer`: Die E-Mail wird von der verifizierten Absender-Domain Ihrer Anwendung versendet (White-Label). `didit`: Sie wird vom Didit-eigenen Absender versendet.",
                      "example": "customer"
                    },
                    "subject": {
                      "type": "string",
                      "description": "Die Betreffzeile genau so, wie sie gesendet wird.",
                      "example": "Action Required: Complete your verification in Example App"
                    },
                    "html": {
                      "type": "string",
                      "description": "Das HTML der E-Mail exakt so, wie es versendet wird, mit eingebettetem Logo als Data-URL. Rendern Sie es in einem Sandboxed-Frame, niemals direkt im DOM Ihrer Anwendung.",
                      "example": "<!DOCTYPE html><html><body>...</body></html>"
                    },
                    "text": {
                      "type": "string",
                      "description": "Der Text der E-Mail als Klartext, wie ihn der Nachrichtenverlauf der Person speichert, für eine kompakte Vorschau (das HTML bleibt die E-Mail, die die Person erhält).",
                      "example": "Almost there\n\nSome steps need to be completed again.\nHere’s what to fix:\n\nhttps://verify.didit.me/session/abc123"
                    },
                    "language": {
                      "type": "string",
                      "description": "Die Sprache, in der die E-Mail verfasst ist. Englisch (`en`), wenn das angeforderte `email_language` nicht angeboten wird.",
                      "example": "en"
                    },
                    "will_be_sent": {
                      "type": "boolean",
                      "description": "Gibt an, ob das Bestätigen der Änderung mit `send_email: true` diese E-Mail versendet. `false`, wenn `not_sent_reason` gesetzt ist.",
                      "example": true
                    },
                    "not_sent_reason": {
                      "type": "string",
                      "nullable": true,
                      "enum": [
                        "no_user_action",
                        "no_recipient",
                        "sandbox",
                        null
                      ],
                      "description": "Warum bei der Bestätigung keine E-Mail gesendet werden würde, oder `null`, wenn sie gesendet wird. `no_user_action`: Jeder ausgewählte Schritt wird ohne die Person ausgeführt, sodass die erneute Einreichung von selbst abgeschlossen wird und keine E-Mail versendet wird. `no_recipient`: Für die Person ist keine Adresse bekannt und Sie haben keine übergeben. `sandbox`: Eine Sandbox-Sitzung, deren Empfänger die Sandbox-E-Mail-Zustellung nicht aktiviert hat, sodass der Versand nur simuliert wird.",
                      "example": null
                    },
                    "nodes_to_resubmit": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "required": [
                          "node_id",
                          "feature"
                        ],
                        "properties": {
                          "node_id": {
                            "type": "string",
                            "description": "Knotenbezeichner, wie er in der Workflow-Definition der Sitzung vorkommt (z. B. `feature_ocr`, `feature_liveness`).",
                            "example": "feature_ocr"
                          },
                          "feature": {
                            "type": "string",
                            "description": "Funktionstyp des Knotens. Die Aliase `ID_VERIFICATION`, `POA`, `PHONE` und `EMAIL` werden serverseitig zu `OCR`, `PROOF_OF_ADDRESS`, `PHONE_VERIFICATION` und `EMAIL_VERIFICATION` normalisiert. `KYB_REGISTRY`, `KYB_KEY_PEOPLE` und `KYB` bestehen die Schema-Validierung, werden jedoch immer mit dem in den Beispielen gezeigten Business-Rule-`400`-Fehler abgelehnt.",
                            "enum": [
                              "OCR",
                              "OCR_BACK",
                              "NFC",
                              "AML",
                              "FACE",
                              "LIVENESS",
                              "FACE_MATCH",
                              "IP_ANALYSIS",
                              "AGE_ESTIMATION",
                              "PROOF_OF_ADDRESS",
                              "PHONE_VERIFICATION",
                              "EMAIL_VERIFICATION",
                              "FACE_SEARCH",
                              "DATABASE_VALIDATION",
                              "QUESTIONNAIRE",
                              "DOCUMENT_AI",
                              "KYB_DOCUMENTS",
                              "ID_VERIFICATION",
                              "POA",
                              "PHONE",
                              "EMAIL",
                              "KYB_REGISTRY",
                              "KYB_KEY_PEOPLE",
                              "KYB",
                              "GEOLOCATION"
                            ],
                            "example": "OCR"
                          }
                        }
                      }
                    },
                    "requires_user_action": {
                      "type": "boolean",
                      "description": "Gibt an, ob mindestens eine ausgewählte Prüfung eine Benutzerinteraktion erfordert. Dies lässt keinen Rückschluss auf das endgültige Workflow-Ergebnis zu."
                    },
                    "preview_token": {
                      "type": "string",
                      "description": "Signierte Quittung für genau diese E-Mail, gültig für 15 Minuten. Übergeben Sie sie als `email_preview_token` an [Sitzungsstatus aktualisieren](/de/sessions-api/update-status). Eine leere Zeichenfolge, wenn kein Empfänger vorhanden ist.",
                      "example": "eyJkaWdlc3QiOiI0ZjJhIn0:1uExAm:Pl3x4mpleS1gnatureValue000000000000000"
                    }
                  }
                },
                "examples": {
                  "Will Be Sent": {
                    "summary": "Standardempfänger: die im Ablauf verifizierte Adresse",
                    "value": {
                      "recipient": "person@example.com",
                      "recipient_source": "email_verification",
                      "sender": "Example App <no-reply@mail.example.com>",
                      "sender_name": "Example App",
                      "sender_email": "no-reply@mail.example.com",
                      "sender_kind": "customer",
                      "subject": "Action Required: Complete your verification in Example App",
                      "html": "<!DOCTYPE html><html><body>...</body></html>",
                      "language": "en",
                      "will_be_sent": true,
                      "not_sent_reason": null,
                      "nodes_to_resubmit": [
                        {
                          "node_id": "feature_poa_1",
                          "feature": "PROOF_OF_ADDRESS"
                        }
                      ],
                      "requires_user_action": true,
                      "preview_token": "eyJkaWdlc3QiOiI0ZjJhIn0:1uExAm:Pl3x4mpleS1gnatureValue000000000000000"
                    }
                  },
                  "No User Action": {
                    "summary": "Es sind nur Backend-Schritte ausgewählt, daher wird keine E-Mail versendet",
                    "value": {
                      "recipient": "person@example.com",
                      "recipient_source": "contact_details",
                      "sender": "Example App <no-reply@mail.example.com>",
                      "sender_name": "Example App",
                      "sender_email": "no-reply@mail.example.com",
                      "sender_kind": "customer",
                      "subject": "Action Required: Complete your verification in Example App",
                      "html": "<!DOCTYPE html><html><body>...</body></html>",
                      "language": "en",
                      "will_be_sent": false,
                      "not_sent_reason": "no_user_action",
                      "nodes_to_resubmit": [
                        {
                          "node_id": "feature_aml",
                          "feature": "AML"
                        }
                      ],
                      "requires_user_action": false,
                      "preview_token": "eyJkaWdlc3QiOiI0ZjJhIn0:1uExAm:Pl3x4mpleS1gnatureValue000000000000000"
                    }
                  }
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "description": "Immer `no-store`: Die Vorschau enthält Verifizierungsinhalte und darf nicht zwischengespeichert werden.",
                "schema": {
                  "type": "string",
                  "example": "no-store"
                }
              }
            }
          },
          "400": {
            "description": "Die Sitzung befindet sich nicht in einem Status, den dieser Endpoint akzeptiert, sie ist bereits `Resubmitted`, die ausgewählten Schritte können nicht erneut eingereicht werden, oder ein Feld ist ungültig.",
            "content": {
              "application/json": {
                "examples": {
                  "Wrong Current Status": {
                    "summary": "Sitzung befindet sich nicht in einem Status, den dieser Endpoint akzeptiert",
                    "value": {
                      "detail": "Only sessions with status Approved, Declined, In Review, Kyc Expired, Abandoned, Resubmitted can be updated. Current status: In Progress"
                    }
                  },
                  "Already Resubmitted": {
                    "summary": "Die Sitzung ist bereits Resubmitted",
                    "value": [
                      "The new status is the same as the current status."
                    ]
                  },
                  "Nothing To Resubmit": {
                    "summary": "Automatische Auswahl fand keinen Schritt, der erneut übermittelt werden muss",
                    "value": {
                      "nodes_to_resubmit": "No features found that need resubmission. All features are already approved."
                    }
                  },
                  "Invalid Email": {
                    "summary": "email_address ist keine E-Mail-Adresse",
                    "value": {
                      "email_address": [
                        "Enter a valid email address."
                      ]
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Der API-Schlüssel mit eingeschränktem Geltungsbereich ist abgelaufen.",
            "content": {
              "application/json": {
                "examples": {
                  "Expired API Key": {
                    "summary": "API-Schlüssel mit eingeschränktem Berechtigungsumfang nach Ablaufdatum",
                    "value": {
                      "detail": "This API key has expired."
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Fehlende Anmeldedaten, ein Aufrufer ohne das `write:sessions`-Privileg, ein API-Schlüssel mit Gültigkeitsbereich ohne den für diesen Endpoint erforderlichen Zugriff oder eine `session_id`, die zu einer anderen Anwendung gehört.",
            "content": {
              "application/json": {
                "examples": {
                  "Invalid Credentials": {
                    "summary": "Fehlender oder ungültiger x-api-key",
                    "value": {
                      "detail": "Authentication credentials were not provided or are invalid."
                    }
                  },
                  "Missing Privilege": {
                    "summary": "Dem Aufrufer fehlt write:sessions",
                    "value": {
                      "detail": "You do not have permission to perform this action."
                    }
                  },
                  "Scoped Key Without Access": {
                    "summary": "API-Schlüssel mit eingeschränktem Berechtigungsumfang ohne diesen Zugriff",
                    "value": {
                      "detail": "This API key has no write access to decisions."
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Es existiert keine KYC- oder KYB-Sitzung mit dieser `session_id`.",
            "content": {
              "application/json": {
                "examples": {
                  "Not Found": {
                    "summary": "Unbekannte session_id",
                    "value": {
                      "detail": "Not found."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Die erneut einzureichenden Schritte sind alle reine Backend-Schritte (AML, DATABASE_VALIDATION, IP_ANALYSIS), und die Sitzung wurde innerhalb der letzten 30 Sekunden bereits für reine Backend-Schritte erneut übermittelt, sodass Update Session Status die erneute Übermittlung verweigern würde. Versuchen Sie es nach dem Intervall in `Retry-After` erneut.",
            "content": {
              "application/json": {
                "examples": {
                  "Backend-only resubmit throttled": {
                    "value": {
                      "detail": "This session was already resubmitted for backend-only features within the last 30 seconds; repeating it cannot change the outcome. Wait before resubmitting again."
                    }
                  }
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.sessions.preview_resubmission(\n    \"11111111-2222-3333-4444-555555555555\",\n    nodes_to_resubmit=[{\n        \"node_id\": \"feature_poa_1\",\n        \"feature\": \"POA\",\n    }],\n    email_language=\"en\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.sessions.previewResubmission(\"11111111-2222-3333-4444-555555555555\", {\n  nodes_to_resubmit: [{\n    node_id: \"feature_poa_1\",\n    feature: \"POA\",\n  }],\n  email_language: \"en\",\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Sessions.PreviewResubmission(ctx, \"11111111-2222-3333-4444-555555555555\", didit.SessionsPreviewResubmissionParams{\n\tNodesToResubmit: didit.Some([]didit.SessionsPreviewResubmissionParamsNodesToResubmit{{\n\t\tNodeID:  \"feature_poa_1\",\n\t\tFeature: \"POA\",\n\t}}),\n\tEmailLanguage: didit.String(\"en\"),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import java.util.List;\nimport me.didit.Didit;\nimport me.didit.types.SessionsPreviewResubmissionParams;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.sessions().previewResubmission(\"11111111-2222-3333-4444-555555555555\", SessionsPreviewResubmissionParams.builder()\n        .nodesToResubmit(List.of(SessionsPreviewResubmissionParams.NodesToResubmit.builder()\n                .nodeId(\"feature_poa_1\")\n                .feature(SessionsPreviewResubmissionParams.NodesToResubmit.Feature.of(\"POA\"))\n                .build()))\n        .emailLanguage(\"en\")\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->sessions->previewResubmission('11111111-2222-3333-4444-555555555555', [\n    'nodes_to_resubmit' => [[\n        'node_id' => 'feature_poa_1',\n        'feature' => 'POA',\n    ]],\n    'email_language' => 'en',\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.sessions.preview_resubmission(\n  \"11111111-2222-3333-4444-555555555555\",\n  nodes_to_resubmit: [{\n    node_id: \"feature_poa_1\",\n    feature: \"POA\",\n  }],\n  email_language: \"en\"\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Sessions.PreviewResubmissionAsync(\"11111111-2222-3333-4444-555555555555\", new SessionsPreviewResubmissionParams\n{\n    NodesToResubmit = new SessionsPreviewResubmissionParamsNodesToResubmit[]\n    {\n        new()\n        {\n            NodeId = \"feature_poa_1\",\n            Feature = \"POA\",\n        },\n    },\n    EmailLanguage = \"en\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ]
      }
    },
    "/v3/organization/{organization_id}/application/{application_id}/cases/routing-rules/{record_uuid}/": {
      "get": {
        "summary": "Routing-Regel abrufen",
        "description": "Erfordert `read:cases` für die angeforderte Anwendung.",
        "operationId": "retrieve_case_routing_rules",
        "x-didit-sdk": {
          "resource": "cases.routing_rules",
          "method": "retrieve",
          "auth": "api_key",
          "server": true,
          "scope": "application"
        },
        "tags": [
          "Case Assignment"
        ],
        "parameters": [
          {
            "name": "organization_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "UUID der Organisation."
          },
          {
            "name": "application_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Anwendungs-UUID."
          },
          {
            "name": "record_uuid",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Erfolg",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CaseRoutingRule"
                }
              }
            }
          },
          "400": {
            "description": "Ungültige Eingabe."
          },
          "403": {
            "description": "Unzureichende Berechtigung."
          },
          "404": {
            "description": "Datensatz in dieser Anwendung nicht gefunden."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "x-codeSamples": [
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.cases.routing_rules.retrieve(\n    \"11111111-2222-3333-4444-555555555555\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.cases.routingRules.retrieve(\"11111111-2222-3333-4444-555555555555\");\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.Cases.RoutingRules.Retrieve(ctx, \"11111111-2222-3333-4444-555555555555\")\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.cases().routingRules().retrieve(\"11111111-2222-3333-4444-555555555555\");\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\n$didit = new DiditClient();\n\n$result = $didit->cases->routingRules->retrieve('11111111-2222-3333-4444-555555555555');\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.cases.routing_rules.retrieve(\"11111111-2222-3333-4444-555555555555\")\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.Cases.RoutingRules.RetrieveAsync(\"11111111-2222-3333-4444-555555555555\");\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ]
      },
      "patch": {
        "summary": "Routing-Regel aktualisieren",
        "description": "Erfordert `write:cases` für die angeforderte Anwendung.",
        "operationId": "update_case_routing_rules",
        "x-didit-sdk": {
          "resource": "cases.routing_rules",
          "method": "update",
          "auth": "api_key",
          "server": true,
          "scope": "application"
        },
        "tags": [
          "Case Assignment"
        ],
        "parameters": [
          {
            "name": "organization_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "UUID der Organisation."
          },
          {
            "name": "application_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Anwendungs-UUID."
          },
          {
            "name": "record_uuid",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Erfolg",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CaseRoutingRule"
                }
              }
            }
          },
          "400": {
            "description": "Ungültige Eingabe."
          },
          "403": {
            "description": "Unzureichende Berechtigung."
          },
          "404": {
            "description": "Datensatz in dieser Anwendung nicht gefunden."
          },
          "409": {
            "description": "Die Routing-Regel wurde seit expected_version geändert. Überprüfen Sie die neueste Regel vor einem Wiederholungsversuch."
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CaseRoutingRuleUpdate"
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "x-codeSamples": [
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.cases.routing_rules.update(\n    \"11111111-2222-3333-4444-555555555555\",\n    name=\"your-name\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.cases.routingRules.update(\"11111111-2222-3333-4444-555555555555\", {\n  name: \"your-name\",\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.Cases.RoutingRules.Update(ctx, \"11111111-2222-3333-4444-555555555555\", didit.CaseRoutingRuleUpdate{\n\tName: didit.String(\"your-name\"),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\nimport me.didit.types.CaseRoutingRuleUpdate;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.cases().routingRules().update(\"11111111-2222-3333-4444-555555555555\", CaseRoutingRuleUpdate.builder()\n        .name(\"your-name\")\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\n$didit = new DiditClient();\n\n$result = $didit->cases->routingRules->update('11111111-2222-3333-4444-555555555555', [\n    'name' => 'your-name',\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.cases.routing_rules.update(\n  \"11111111-2222-3333-4444-555555555555\",\n  name: \"your-name\"\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.Cases.RoutingRules.UpdateAsync(\"11111111-2222-3333-4444-555555555555\", new CaseRoutingRuleUpdate\n{\n    Name = \"your-name\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ]
      }
    },
    "/v3/case-requests/{request_uuid}/": {
      "get": {
        "operationId": "case_requests_retrieve",
        "x-didit-sdk": {
          "resource": "case_requests",
          "method": "retrieve",
          "auth": "device_token",
          "server": false
        },
        "parameters": [
          {
            "in": "path",
            "name": "request_uuid",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "required": true
          }
        ],
        "tags": [
          "Case Management"
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CustomerMessagingCaseRequestPublic"
                }
              }
            },
            "description": ""
          },
          "404": {
            "description": "Die Anfrage oder der Fall ist für diesen Aufrufer nicht verfügbar."
          }
        },
        "security": [
          {
            "CaseRequestToken": []
          }
        ],
        "description": "Ermöglicht den Zugriff auf eine Kundenanfrage über deren anfragespezifischen Token. Es werden keine privaten Fallergebnisse, Original-Identitätsdaten oder Empfängeradressen zurückgegeben. Ausführbare Anfragen laufen nach sieben Tagen ab. Eine Stornierung oder der Abschluss des Falls macht den Link ungültig. Antworten sind unveränderlich und dienen Prüfern weiterhin als Nachweis; sie genehmigen oder aktualisieren niemals eine Quellverifizierung."
      },
      "post": {
        "operationId": "case_requests_create",
        "x-didit-sdk": {
          "resource": "case_requests",
          "method": "respond",
          "auth": "device_token",
          "server": false
        },
        "parameters": [
          {
            "in": "path",
            "name": "request_uuid",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "required": true
          }
        ],
        "tags": [
          "Case Management"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CustomerMessagingCaseCustomerResponseRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/CustomerMessagingCaseCustomerResponseRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CustomerMessagingCaseCustomerResponseResult"
                }
              }
            },
            "description": ""
          },
          "404": {
            "description": "Die Anfrage oder der Fall ist für diesen Aufrufer nicht verfügbar."
          },
          "400": {
            "description": "Ungültige Eingaben, nicht unterstützter Verwendungszweck, nicht verfügbarer verifizierter Kontakt oder eine bestehende unveränderliche Antwort."
          },
          "409": {
            "description": "Die Vorschau hat sich geändert oder ist abgelaufen. Vor dem Bestätigen erneut eine Vorschau anzeigen."
          }
        },
        "security": [
          {
            "CaseRequestToken": []
          }
        ],
        "description": "Ermöglicht den Zugriff auf eine Kundenanfrage über deren anfragespezifischen Token. Es werden keine privaten Fallergebnisse, Original-Identitätsdaten oder Empfängeradressen zurückgegeben. Ausführbare Anfragen laufen nach sieben Tagen ab. Eine Stornierung oder der Abschluss des Falls macht den Link ungültig. Antworten sind unveränderlich und dienen Prüfern weiterhin als Nachweis; sie genehmigen oder aktualisieren niemals eine Quellverifizierung."
      }
    },
    "/v3/fraud/checks/plan/": {
      "post": {
        "operationId": "plan_create",
        "x-didit-sdk": {
          "resource": "fraud_checks",
          "method": "plan",
          "auth": "api_key",
          "server": true
        },
        "description": "Ausgewählte Prüfungen validieren und ihren Preis schätzen, ohne sie auszuführen, eine Sitzung zu erstellen oder abzurechnen.",
        "summary": "Betrugsprüfung planen",
        "tags": [
          "Fraud Check"
        ],
        "requestBody": {
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/FraudCheckRequestRequest"
              }
            },
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/FraudCheckRequestRequest"
              },
              "example": {
                "client_reference": "review-attempt-001",
                "subject": {
                  "identifiers": [
                    {
                      "type": "email",
                      "value": "applicant@example.com"
                    }
                  ],
                  "attributes": {
                    "first_name": "Alex",
                    "last_name": "Example"
                  }
                },
                "checks": {
                  "include": [
                    "networks_same_org",
                    "networks_cross_org",
                    "email_risk"
                  ]
                }
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/FraudCheckRequestRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/FraudCheckPlan"
                }
              }
            },
            "description": ""
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/FraudBadRequestErrorMessage"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-codeSamples": [
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.fraud_checks.plan(\n    client_reference=\"review-attempt-001\",\n    subject={\n        \"identifiers\": [{\n            \"type\": \"email\",\n            \"value\": \"applicant@example.com\",\n        }],\n        \"attributes\": {\n            \"first_name\": \"Alex\",\n            \"last_name\": \"Example\",\n        },\n    },\n    checks={\n        \"include\": [\"networks_same_org\", \"networks_cross_org\", \"email_risk\"],\n    },\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.fraudChecks.plan({\n  client_reference: \"review-attempt-001\",\n  subject: {\n    identifiers: [{\n      type: \"email\",\n      value: \"applicant@example.com\",\n    }],\n    attributes: {\n      first_name: \"Alex\",\n      last_name: \"Example\",\n    },\n  },\n  checks: {\n    include: [\"networks_same_org\", \"networks_cross_org\", \"email_risk\"],\n  },\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.FraudChecks.Plan(ctx, didit.FraudCheckRequestRequest{\n\tClientReference: didit.String(\"review-attempt-001\"),\n\tSubject: didit.FraudCheckSubjectRequest{\n\t\tIdentifiers: []didit.FraudCheckIdentifierRequest{{\n\t\t\tType:  didit.FraudTypeEnum(\"email\"),\n\t\t\tValue: \"applicant@example.com\",\n\t\t}},\n\t\tAttributes: didit.Some(didit.FraudCheckAttributesRequest{\n\t\t\tFirstName: didit.String(\"Alex\"),\n\t\t\tLastName:  didit.String(\"Example\"),\n\t\t}),\n\t},\n\tChecks: didit.Some(didit.FraudCheckModuleSelectionRequest{\n\t\tInclude: didit.Some([]didit.FraudExcludeEnum{didit.FraudExcludeEnum(\"networks_same_org\"), didit.FraudExcludeEnum(\"networks_cross_org\"), didit.FraudExcludeEnum(\"email_risk\")}),\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;\nimport me.didit.Didit;\nimport me.didit.types.FraudCheckAttributesRequest;\nimport me.didit.types.FraudCheckIdentifierRequest;\nimport me.didit.types.FraudCheckModuleSelectionRequest;\nimport me.didit.types.FraudCheckRequestRequest;\nimport me.didit.types.FraudCheckSubjectRequest;\nimport me.didit.types.FraudExcludeEnum;\nimport me.didit.types.FraudTypeEnum;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.fraudChecks().plan(FraudCheckRequestRequest.builder()\n        .clientReference(\"review-attempt-001\")\n        .subject(FraudCheckSubjectRequest.builder()\n                .identifiers(List.of(FraudCheckIdentifierRequest.builder()\n                        .type(FraudTypeEnum.of(\"email\"))\n                        .value(\"applicant@example.com\")\n                        .build()))\n                .attributes(FraudCheckAttributesRequest.builder()\n                        .firstName(\"Alex\")\n                        .lastName(\"Example\")\n                        .build())\n                .build())\n        .checks(FraudCheckModuleSelectionRequest.builder()\n                .include(List.of(FraudExcludeEnum.of(\"networks_same_org\"), FraudExcludeEnum.of(\"networks_cross_org\"), FraudExcludeEnum.of(\"email_risk\")))\n                .build())\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->fraudChecks->plan([\n    'client_reference' => 'review-attempt-001',\n    'subject' => [\n        'identifiers' => [[\n            'type' => 'email',\n            'value' => 'applicant@example.com',\n        ]],\n        'attributes' => [\n            'first_name' => 'Alex',\n            'last_name' => 'Example',\n        ],\n    ],\n    'checks' => [\n        'include' => ['networks_same_org', 'networks_cross_org', 'email_risk'],\n    ],\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.fraud_checks.plan(\n  client_reference: \"review-attempt-001\",\n  subject: {\n    identifiers: [{\n      type: \"email\",\n      value: \"applicant@example.com\",\n    }],\n    attributes: {\n      first_name: \"Alex\",\n      last_name: \"Example\",\n    },\n  },\n  checks: {\n    include: [\"networks_same_org\", \"networks_cross_org\", \"email_risk\"],\n  }\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.FraudChecks.PlanAsync(new FraudCheckRequestRequest\n{\n    ClientReference = \"review-attempt-001\",\n    Subject = new()\n    {\n        Identifiers = new FraudCheckIdentifierRequest[]\n        {\n            new()\n            {\n                Type = \"email\",\n                Value = \"applicant@example.com\",\n            },\n        },\n        Attributes = new FraudCheckAttributesRequest\n        {\n            FirstName = \"Alex\",\n            LastName = \"Example\",\n        },\n    },\n    Checks = new FraudCheckModuleSelectionRequest\n    {\n        Include = new FraudExcludeEnum[] { \"networks_same_org\", \"networks_cross_org\", \"email_risk\" },\n    },\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ]
      }
    },
    "/v3/organization/{organization_id}/application/{application_id}/cases/routing-rules/": {
      "get": {
        "summary": "Routing-Regeln auflisten",
        "description": "Erfordert `list:cases` für die angeforderte Anwendung.",
        "operationId": "list_case_routing_rules",
        "x-didit-sdk": {
          "resource": "cases.routing_rules",
          "method": "list",
          "auth": "api_key",
          "server": true,
          "scope": "application"
        },
        "tags": [
          "Case Assignment"
        ],
        "parameters": [
          {
            "name": "organization_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "UUID der Organisation."
          },
          {
            "name": "application_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Anwendungs-UUID."
          },
          {
            "name": "limit",
            "in": "query",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 50
            }
          },
          {
            "name": "offset",
            "in": "query",
            "schema": {
              "type": "integer",
              "minimum": 0,
              "maximum": 1000000,
              "default": 0
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Erfolg",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "results": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/CaseRoutingRule"
                      }
                    },
                    "count": {
                      "type": "integer",
                      "description": "Anzahl der Treffer, begrenzt auf 100. Verwenden Sie next, um über die Obergrenze hinaus fortzufahren."
                    },
                    "next": {
                      "type": "string",
                      "nullable": true
                    },
                    "previous": {
                      "type": "string",
                      "nullable": true
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Ungültige Eingabe."
          },
          "403": {
            "description": "Unzureichende Berechtigung."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "x-codeSamples": [
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nfor item in client.cases.routing_rules.list():\n    print(item)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nfor await (const item of didit.cases.routingRules.list()) {\n  console.log(item);\n}"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\niter := client.Cases.RoutingRules.ListAutoPaging(ctx, didit.CasesRoutingRulesListParams{})\nfor iter.Next() {\n\tfmt.Printf(\"%+v\\n\", iter.Current())\n}\nif err := iter.Err(); err != nil {\n\tlog.Fatal(err)\n}"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nfor (var item : client.cases().routingRules().list()) {\n    System.out.println(item);\n}"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\n$didit = new DiditClient();\n\nforeach ($didit->cases->routingRules->list() as $item) {\n    print_r($item->toArray());\n}"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\ndidit.cases.routing_rules.list.auto_paging_each do |item|\n  puts item.to_h\nend"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nawait foreach (var item in await client.Cases.RoutingRules.ListAsync())\n{\n    Console.WriteLine(JsonSerializer.Serialize(item));\n}"
          }
        ]
      },
      "post": {
        "summary": "Routing-Regel erstellen",
        "description": "Erfordert `write:cases` für die angeforderte Anwendung. Setzen Sie publish=false, um einen unveröffentlichten Entwurf zu erstellen; Publish erstellt dessen erste Live-Version. Das Verwerfen eines nie veröffentlichten Entwurfs löscht diesen.",
        "operationId": "create_case_routing_rules",
        "x-didit-sdk": {
          "resource": "cases.routing_rules",
          "method": "create",
          "auth": "api_key",
          "server": true,
          "scope": "application"
        },
        "tags": [
          "Case Assignment"
        ],
        "parameters": [
          {
            "name": "organization_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "UUID der Organisation."
          },
          {
            "name": "application_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Anwendungs-UUID."
          }
        ],
        "responses": {
          "201": {
            "description": "Erfolg",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CaseRoutingRule"
                }
              }
            }
          },
          "400": {
            "description": "Ungültige Eingabe."
          },
          "403": {
            "description": "Unzureichende Berechtigung."
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CaseRoutingRuleCreate"
              },
              "example": {
                "name": "AML screening alerts",
                "conditions": [
                  {
                    "field": "source",
                    "operator": "equals",
                    "value": "AML_SCREENING"
                  }
                ],
                "blueprint": "b1de0000-0000-4000-8000-000000000002"
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "x-codeSamples": [
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.cases.routing_rules.create(\n    name=\"AML screening alerts\",\n    conditions=[{\n        \"field\": \"source\",\n        \"operator\": \"equals\",\n        \"value\": \"AML_SCREENING\",\n    }],\n    blueprint=\"b1de0000-0000-4000-8000-000000000002\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.cases.routingRules.create({\n  name: \"AML screening alerts\",\n  conditions: [{\n    field: \"source\",\n    operator: \"equals\",\n    value: \"AML_SCREENING\",\n  }],\n  blueprint: \"b1de0000-0000-4000-8000-000000000002\",\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.Cases.RoutingRules.Create(ctx, didit.CaseRoutingRuleCreate{\n\tName: \"AML screening alerts\",\n\tConditions: []didit.CaseRoutingConditionParam{{\n\t\tField:    \"source\",\n\t\tOperator: \"equals\",\n\t\tValue:    \"AML_SCREENING\",\n\t}},\n\tBlueprint: \"b1de0000-0000-4000-8000-000000000002\",\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import java.util.List;\nimport me.didit.Didit;\nimport me.didit.types.CaseRoutingCondition;\nimport me.didit.types.CaseRoutingRuleCreate;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.cases().routingRules().create(CaseRoutingRuleCreate.builder()\n        .name(\"AML screening alerts\")\n        .conditions(List.of(CaseRoutingCondition.builder()\n                .field(CaseRoutingCondition.Field.of(\"source\"))\n                .operator(CaseRoutingCondition.Operator.of(\"equals\"))\n                .value(CaseRoutingCondition.Value.ofString(\"AML_SCREENING\"))\n                .build()))\n        .blueprint(\"b1de0000-0000-4000-8000-000000000002\")\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\n$didit = new DiditClient();\n\n$result = $didit->cases->routingRules->create([\n    'name' => 'AML screening alerts',\n    'conditions' => [[\n        'field' => 'source',\n        'operator' => 'equals',\n        'value' => 'AML_SCREENING',\n    ]],\n    'blueprint' => 'b1de0000-0000-4000-8000-000000000002',\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.cases.routing_rules.create(\n  name: \"AML screening alerts\",\n  conditions: [{\n    field: \"source\",\n    operator: \"equals\",\n    value: \"AML_SCREENING\",\n  }],\n  blueprint: \"b1de0000-0000-4000-8000-000000000002\"\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.Cases.RoutingRules.CreateAsync(new CaseRoutingRuleCreate\n{\n    Name = \"AML screening alerts\",\n    Conditions = new CaseRoutingCondition[]\n    {\n        new()\n        {\n            Field = \"source\",\n            Operator = \"equals\",\n            Value = \"AML_SCREENING\",\n        },\n    },\n    Blueprint = \"b1de0000-0000-4000-8000-000000000002\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ]
      }
    },
    "/v3/organization/{organization_id}/application/{application_id}/cases/routing-rules/{record_uuid}/publish/": {
      "post": {
        "operationId": "publish_case_routing_rule",
        "x-didit-sdk": {
          "resource": "cases.routing_rules",
          "method": "publish",
          "auth": "api_key",
          "server": true,
          "scope": "application"
        },
        "parameters": [
          {
            "in": "path",
            "name": "organization_id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "required": true
          },
          {
            "in": "path",
            "name": "application_id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "required": true
          },
          {
            "in": "path",
            "name": "record_uuid",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "required": true
          }
        ],
        "tags": [
          "Case Assignment"
        ],
        "requestBody": {
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/RoutingPublicationPolicyDraftPreconditionRequest"
              }
            },
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RoutingPublicationPolicyDraftPreconditionRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/RoutingPublicationPolicyDraftPreconditionRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RoutingPublicationCaseRoutingRule"
                }
              }
            },
            "description": ""
          },
          "403": {
            "description": "Zugriff auf den Fall ist erforderlich."
          },
          "409": {
            "description": "Die veröffentlichte Version oder Entwurfsrevision hat sich geändert. Vor einem erneuten Versuch neu laden."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "x-codeSamples": [
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.cases.routing_rules.publish(\n    \"11111111-2222-3333-4444-555555555555\",\n    expected_version=0,\n    expected_revision=\"11111111-2222-3333-4444-555555555555\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.cases.routingRules.publish(\"11111111-2222-3333-4444-555555555555\", {\n  expected_version: 0,\n  expected_revision: \"11111111-2222-3333-4444-555555555555\",\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.Cases.RoutingRules.Publish(ctx, \"11111111-2222-3333-4444-555555555555\", didit.RoutingPublicationPolicyDraftPreconditionRequest{\n\tExpectedVersion:  0,\n\tExpectedRevision: didit.String(\"11111111-2222-3333-4444-555555555555\"),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\nimport me.didit.types.RoutingPublicationPolicyDraftPreconditionRequest;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.cases().routingRules().publish(\"11111111-2222-3333-4444-555555555555\", RoutingPublicationPolicyDraftPreconditionRequest.builder()\n        .expectedVersion(0L)\n        .expectedRevision(\"11111111-2222-3333-4444-555555555555\")\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\n$didit = new DiditClient();\n\n$result = $didit->cases->routingRules->publish('11111111-2222-3333-4444-555555555555', [\n    'expected_version' => 0,\n    'expected_revision' => '11111111-2222-3333-4444-555555555555',\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.cases.routing_rules.publish(\n  \"11111111-2222-3333-4444-555555555555\",\n  expected_version: 0,\n  expected_revision: \"11111111-2222-3333-4444-555555555555\"\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.Cases.RoutingRules.PublishAsync(\"11111111-2222-3333-4444-555555555555\", new RoutingPublicationPolicyDraftPreconditionRequest\n{\n    ExpectedVersion = 0,\n    ExpectedRevision = \"11111111-2222-3333-4444-555555555555\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ]
      }
    },
    "/v3/organization/{organization_id}/application/{application_id}/cases/blueprints/{blueprint_uuid}/publish/": {
      "post": {
        "operationId": "publish_case_blueprint",
        "x-didit-sdk": {
          "resource": "cases.blueprints",
          "method": "publish",
          "auth": "api_key",
          "server": true,
          "scope": "application"
        },
        "parameters": [
          {
            "in": "path",
            "name": "organization_id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "required": true
          },
          {
            "in": "path",
            "name": "application_id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "required": true
          },
          {
            "in": "path",
            "name": "blueprint_uuid",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "required": true
          }
        ],
        "tags": [
          "Case Management"
        ],
        "requestBody": {
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/CasePublicationPolicyDraftPreconditionRequest"
              }
            },
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CasePublicationPolicyDraftPreconditionRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/CasePublicationPolicyDraftPreconditionRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CasePublicationCaseBlueprint"
                }
              }
            },
            "description": ""
          },
          "409": {
            "description": "Veröffentlichte Version oder gespeicherte Entwurfsrevision hat sich geändert. Vor einem erneuten Versuch neu laden."
          },
          "403": {
            "description": "Erforderliche Fallberechtigung fehlt."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "x-codeSamples": [
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.cases.blueprints.publish(\n    \"11111111-2222-3333-4444-555555555555\",\n    expected_version=0,\n    expected_revision=\"11111111-2222-3333-4444-555555555555\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.cases.blueprints.publish(\"11111111-2222-3333-4444-555555555555\", {\n  expected_version: 0,\n  expected_revision: \"11111111-2222-3333-4444-555555555555\",\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.Cases.Blueprints.Publish(ctx, \"11111111-2222-3333-4444-555555555555\", didit.CasePublicationPolicyDraftPreconditionRequest{\n\tExpectedVersion:  0,\n\tExpectedRevision: didit.String(\"11111111-2222-3333-4444-555555555555\"),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\nimport me.didit.types.CasePublicationPolicyDraftPreconditionRequest;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.cases().blueprints().publish(\"11111111-2222-3333-4444-555555555555\", CasePublicationPolicyDraftPreconditionRequest.builder()\n        .expectedVersion(0L)\n        .expectedRevision(\"11111111-2222-3333-4444-555555555555\")\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\n$didit = new DiditClient();\n\n$result = $didit->cases->blueprints->publish('11111111-2222-3333-4444-555555555555', [\n    'expected_version' => 0,\n    'expected_revision' => '11111111-2222-3333-4444-555555555555',\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.cases.blueprints.publish(\n  \"11111111-2222-3333-4444-555555555555\",\n  expected_version: 0,\n  expected_revision: \"11111111-2222-3333-4444-555555555555\"\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.Cases.Blueprints.PublishAsync(\"11111111-2222-3333-4444-555555555555\", new CasePublicationPolicyDraftPreconditionRequest\n{\n    ExpectedVersion = 0,\n    ExpectedRevision = \"11111111-2222-3333-4444-555555555555\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ]
      }
    },
    "/v3/organization/{organization_id}/application/{application_id}/cases/{case_uuid}/requests/preview/": {
      "post": {
        "operationId": "organization_application_cases_requests_preview_create",
        "x-didit-sdk": {
          "resource": "cases.requests",
          "method": "preview",
          "auth": "api_key",
          "server": true,
          "scope": "application"
        },
        "parameters": [
          {
            "in": "path",
            "name": "organization_id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "required": true
          },
          {
            "in": "path",
            "name": "application_id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "required": true
          },
          {
            "in": "path",
            "name": "case_uuid",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "required": true
          }
        ],
        "tags": [
          "Case Management"
        ],
        "requestBody": {
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/CustomerMessagingCaseRequestPreviewRequest"
              }
            },
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CustomerMessagingCaseRequestPreviewRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/CustomerMessagingCaseRequestPreviewRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CustomerMessagingCaseRequestPreviewResponse"
                }
              }
            },
            "description": ""
          },
          "404": {
            "description": "Die Anfrage oder der Fall ist für diesen Aufrufer nicht verfügbar."
          },
          "403": {
            "description": "Dem Aufrufer fehlt die erforderliche Berechtigung für Fälle."
          },
          "400": {
            "description": "Ungültige Eingaben, nicht unterstützter Verwendungszweck, nicht verfügbarer verifizierter Kontakt oder eine bestehende unveränderliche Antwort."
          },
          "409": {
            "description": "Die Vorschau hat sich geändert oder ist abgelaufen. Vor dem Bestätigen erneut eine Vorschau anzeigen."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "description": "Rendern Sie die Produktions-E-Mail, ohne den Fall zu ändern oder etwas zu senden. Gibt den exakten Empfänger, Absender, Betreff, Text und ein signiertes preview_token zurück. Senden Sie dieselben Werte für contact_id, purpose, language, request_id, expires_at und preview_token, um innerhalb von 15 Minuten zu bestätigen.",
        "x-codeSamples": [
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.cases.requests.preview(\n    \"11111111-2222-3333-4444-555555555555\",\n    contact_id=\"11111111-2222-3333-4444-555555555555\",\n    purpose=\"identity_document\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.cases.requests.preview(\"11111111-2222-3333-4444-555555555555\", {\n  contact_id: \"11111111-2222-3333-4444-555555555555\",\n  purpose: \"identity_document\",\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.Cases.Requests.Preview(ctx, \"11111111-2222-3333-4444-555555555555\", didit.CustomerMessagingCaseRequestPreviewRequest{\n\tContactID: \"11111111-2222-3333-4444-555555555555\",\n\tPurpose:   didit.CustomerMessagingPurposeEnum(\"identity_document\"),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\nimport me.didit.types.CustomerMessagingCaseRequestPreviewRequest;\nimport me.didit.types.CustomerMessagingPurposeEnum;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.cases().requests().preview(\"11111111-2222-3333-4444-555555555555\", CustomerMessagingCaseRequestPreviewRequest.builder()\n        .contactId(\"11111111-2222-3333-4444-555555555555\")\n        .purpose(CustomerMessagingPurposeEnum.of(\"identity_document\"))\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\n$didit = new DiditClient();\n\n$result = $didit->cases->requests->preview('11111111-2222-3333-4444-555555555555', [\n    'contact_id' => '11111111-2222-3333-4444-555555555555',\n    'purpose' => 'identity_document',\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.cases.requests.preview(\n  \"11111111-2222-3333-4444-555555555555\",\n  contact_id: \"11111111-2222-3333-4444-555555555555\",\n  purpose: \"identity_document\"\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.Cases.Requests.PreviewAsync(\"11111111-2222-3333-4444-555555555555\", new CustomerMessagingCaseRequestPreviewRequest\n{\n    ContactId = \"11111111-2222-3333-4444-555555555555\",\n    Purpose = \"identity_document\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ]
      }
    },
    "/v3/organization/{organization_id}/application/{application_id}/cases/{case_uuid}/action-receipts/": {
      "get": {
        "operationId": "action_receipts_retrieve",
        "x-didit-sdk": {
          "resource": "cases",
          "method": "list_action_receipts",
          "auth": "api_key",
          "server": true,
          "scope": "application"
        },
        "parameters": [
          {
            "in": "path",
            "name": "organization_id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "required": true
          },
          {
            "in": "path",
            "name": "application_id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "required": true
          },
          {
            "in": "path",
            "name": "case_uuid",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "required": true
          },
          {
            "in": "query",
            "name": "offset",
            "schema": {
              "type": "integer",
              "maximum": 1000000,
              "minimum": 0,
              "default": 0
            }
          }
        ],
        "tags": [
          "Case Management"
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CaseActionCaseActionReceiptPage"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "description": "Belege für Subjekt-Aktionen auflisten, die neuesten zuerst, mit maximal 20 Ergebnissen pro Seite. Verwenden Sie next_offset für die nächste Seite. Eingegebener Notiztext wird im Verlauf nicht offengelegt.",
        "x-codeSamples": [
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.cases.list_action_receipts(\n    \"11111111-2222-3333-4444-555555555555\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.cases.listActionReceipts(\"11111111-2222-3333-4444-555555555555\");\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.Cases.ListActionReceipts(ctx, \"11111111-2222-3333-4444-555555555555\", didit.CasesListActionReceiptsParams{})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.cases().listActionReceipts(\"11111111-2222-3333-4444-555555555555\");\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\n$didit = new DiditClient();\n\n$result = $didit->cases->listActionReceipts('11111111-2222-3333-4444-555555555555');\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.cases.list_action_receipts(\"11111111-2222-3333-4444-555555555555\")\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.Cases.ListActionReceiptsAsync(\"11111111-2222-3333-4444-555555555555\");\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ]
      }
    },
    "/v3/organization/{organization_id}/application/{application_id}/networks/{network_uuid}/notes/{note_uuid}/": {
      "delete": {
        "operationId": "delete_network_note",
        "x-didit-sdk": {
          "resource": "networks.notes",
          "method": "delete",
          "auth": "api_key",
          "server": true,
          "scope": "application"
        },
        "tags": [
          "Networks"
        ],
        "summary": "Ihre Netzwerknotiz löschen",
        "description": "Erfordert write:networks und den authentifizierten Autor der Notiz. Das Löschen ist unwiderruflich. Verknüpfte Konto- und Verifizierungsdaten bleiben unberührt.",
        "parameters": [
          {
            "name": "organization_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "UUID der Organisation."
          },
          {
            "name": "application_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Anwendungs-UUID."
          },
          {
            "name": "network_uuid",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Netzwerk-UUID."
          },
          {
            "name": "note_uuid",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "Authorization",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Console-Benutzer-Zugriffstoken im Format Bearer <token>."
          }
        ],
        "responses": {
          "204": {
            "description": "Notiz gelöscht."
          },
          "401": {
            "description": "Authentifizierung ist erforderlich."
          },
          "403": {
            "description": "Fehlende Berechtigung oder fehlender Networks-Zugriff."
          },
          "404": {
            "description": "Netzwerk oder Notiz ist für diese Anwendung nicht sichtbar."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "x-codeSamples": [
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\n# Also needs a console user's access token.\nclient = Didit()\n\nclient.networks.notes.delete(\n    \"11111111-2222-3333-4444-555555555555\",\n    \"11111111-2222-3333-4444-555555555555\",\n    extra_headers={\"Authorization\": \"Bearer YOUR_CONSOLE_USER_TOKEN\"},\n)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\n// Also needs a console user's access token.\nconst didit = new Didit({\n  fetch: (url, init) => {\n    const headers = new Headers(init?.headers);\n    headers.set(\"Authorization\", \"Bearer YOUR_CONSOLE_USER_TOKEN\");\n    return fetch(url, { ...init, headers });\n  },\n});\n\nawait didit.networks.notes.delete(\n  \"11111111-2222-3333-4444-555555555555\",\n  \"11111111-2222-3333-4444-555555555555\",\n);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\n// Also needs a console user's access token.\nclient := didit.NewClient()\n\nif err := client.Networks.Notes.Delete(ctx, \"11111111-2222-3333-4444-555555555555\", \"11111111-2222-3333-4444-555555555555\", didit.NetworksNotesDeleteParams{\n\tAuthorization: \"Bearer YOUR_CONSOLE_USER_TOKEN\",\n}); err != nil {\n\tlog.Fatal(err)\n}"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\nimport me.didit.core.RequestOptions;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\n// Also needs a console user's access token.\nDidit client = new Didit();\n\nclient.networks().notes().delete(\"11111111-2222-3333-4444-555555555555\", \"11111111-2222-3333-4444-555555555555\", RequestOptions.builder()\n        .header(\"Authorization\", \"Bearer YOUR_CONSOLE_USER_TOKEN\")\n        .build());"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\n// Also needs a console user's access token.\n$didit = new DiditClient();\n\n$didit->networks->notes->delete('11111111-2222-3333-4444-555555555555', '11111111-2222-3333-4444-555555555555', [\n    'authorization' => 'Bearer YOUR_CONSOLE_USER_TOKEN',\n]);"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\n# Also needs a console user's access token.\ndidit = Didit::Client.new\n\ndidit.networks.notes.delete(\n  \"11111111-2222-3333-4444-555555555555\",\n  \"11111111-2222-3333-4444-555555555555\",\n  request_options: { extra_headers: { \"Authorization\" => \"Bearer YOUR_CONSOLE_USER_TOKEN\" } }\n)"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Collections.Generic;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\n// Also needs a console user's access token.\nusing var client = new DiditClient();\n\nawait client.Networks.Notes.DeleteAsync(\"11111111-2222-3333-4444-555555555555\", \"11111111-2222-3333-4444-555555555555\", requestOptions: new RequestOptions\n{\n    Headers = new Dictionary<string, string>\n    {\n        [\"Authorization\"] = \"Bearer YOUR_CONSOLE_USER_TOKEN\",\n    },\n});"
          }
        ]
      }
    },
    "/v3/organization/{organization_id}/application/{application_id}/cases/{case_uuid}/action-receipts/{receipt_uuid}/retry/": {
      "post": {
        "operationId": "action_receipts_retry_create",
        "x-didit-sdk": {
          "resource": "cases",
          "method": "retry_action_receipt",
          "auth": "api_key",
          "server": true,
          "scope": "application"
        },
        "parameters": [
          {
            "in": "path",
            "name": "organization_id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "required": true
          },
          {
            "in": "path",
            "name": "application_id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "required": true
          },
          {
            "in": "path",
            "name": "case_uuid",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "required": true
          },
          {
            "in": "path",
            "name": "receipt_uuid",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "required": true
          }
        ],
        "tags": [
          "Case Management"
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CaseActionCaseActionReceipt"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "description": "Nur diese fehlgeschlagene Subjektaktion mit ihren gespeicherten Eingaben wiederholen. Die aktuelle Schreibberechtigung wird geprüft. Angewendete Aktionen geben ihren Beleg zurück, ohne erneut ausgeführt zu werden. Der Fallabschluss ist unabhängig.",
        "x-codeSamples": [
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.cases.retry_action_receipt(\n    \"11111111-2222-3333-4444-555555555555\",\n    \"11111111-2222-3333-4444-555555555555\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.cases.retryActionReceipt(\n  \"11111111-2222-3333-4444-555555555555\",\n  \"11111111-2222-3333-4444-555555555555\",\n);\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.Cases.RetryActionReceipt(ctx, \"11111111-2222-3333-4444-555555555555\", \"11111111-2222-3333-4444-555555555555\")\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.cases().retryActionReceipt(\"11111111-2222-3333-4444-555555555555\", \"11111111-2222-3333-4444-555555555555\");\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\n$didit = new DiditClient();\n\n$result = $didit->cases->retryActionReceipt('11111111-2222-3333-4444-555555555555', '11111111-2222-3333-4444-555555555555');\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.cases.retry_action_receipt(\n  \"11111111-2222-3333-4444-555555555555\",\n  \"11111111-2222-3333-4444-555555555555\"\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.Cases.RetryActionReceiptAsync(\"11111111-2222-3333-4444-555555555555\", \"11111111-2222-3333-4444-555555555555\");\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ]
      }
    },
    "/v3/organization/{organization_id}/application/{application_id}/cases/blueprints/{blueprint_uuid}/draft/": {
      "get": {
        "operationId": "get_case_blueprint_draft",
        "x-didit-sdk": {
          "resource": "cases.blueprints",
          "method": "retrieve_draft",
          "auth": "api_key",
          "server": true,
          "scope": "application"
        },
        "parameters": [
          {
            "in": "path",
            "name": "organization_id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "required": true
          },
          {
            "in": "path",
            "name": "application_id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "required": true
          },
          {
            "in": "path",
            "name": "blueprint_uuid",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "required": true
          }
        ],
        "tags": [
          "Case Management"
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CasePublicationPolicyDraftResponse"
                }
              }
            },
            "description": ""
          },
          "403": {
            "description": "Erforderliche Fallberechtigung fehlt."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "x-codeSamples": [
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.cases.blueprints.retrieve_draft(\n    \"11111111-2222-3333-4444-555555555555\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.cases.blueprints.retrieveDraft(\"11111111-2222-3333-4444-555555555555\");\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.Cases.Blueprints.RetrieveDraft(ctx, \"11111111-2222-3333-4444-555555555555\")\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.cases().blueprints().retrieveDraft(\"11111111-2222-3333-4444-555555555555\");\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\n$didit = new DiditClient();\n\n$result = $didit->cases->blueprints->retrieveDraft('11111111-2222-3333-4444-555555555555');\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.cases.blueprints.retrieve_draft(\"11111111-2222-3333-4444-555555555555\")\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.Cases.Blueprints.RetrieveDraftAsync(\"11111111-2222-3333-4444-555555555555\");\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ]
      },
      "put": {
        "operationId": "save_case_blueprint_draft",
        "x-didit-sdk": {
          "resource": "cases.blueprints",
          "method": "save_draft",
          "auth": "api_key",
          "server": true,
          "scope": "application"
        },
        "parameters": [
          {
            "in": "path",
            "name": "organization_id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "required": true
          },
          {
            "in": "path",
            "name": "application_id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "required": true
          },
          {
            "in": "path",
            "name": "blueprint_uuid",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "required": true
          }
        ],
        "tags": [
          "Case Management"
        ],
        "requestBody": {
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/CasePublicationPolicyDraftWriteRequest"
              }
            },
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CasePublicationPolicyDraftWriteRequest"
              },
              "example": {
                "expected_version": 1,
                "expected_revision": "4e5f0000-0000-4000-8000-000000000003",
                "changes": {
                  "max_active_cases": 20
                }
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/CasePublicationPolicyDraftWriteRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CasePublicationPolicyDraft"
                }
              }
            },
            "description": ""
          },
          "409": {
            "description": "Veröffentlichte Version oder gespeicherte Entwurfsrevision hat sich geändert. Vor einem erneuten Versuch neu laden."
          },
          "403": {
            "description": "Erforderliche Fallberechtigung fehlt."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "x-codeSamples": [
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.cases.blueprints.save_draft(\n    \"11111111-2222-3333-4444-555555555555\",\n    expected_version=1,\n    expected_revision=\"4e5f0000-0000-4000-8000-000000000003\",\n    changes={\"max_active_cases\": 20},\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.cases.blueprints.saveDraft(\"11111111-2222-3333-4444-555555555555\", {\n  expected_version: 1,\n  expected_revision: \"4e5f0000-0000-4000-8000-000000000003\",\n  changes: { max_active_cases: 20 },\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.Cases.Blueprints.SaveDraft(ctx, \"11111111-2222-3333-4444-555555555555\", didit.CasePublicationPolicyDraftWriteRequest{\n\tExpectedVersion:  1,\n\tExpectedRevision: didit.String(\"4e5f0000-0000-4000-8000-000000000003\"),\n\tChanges:          map[string]any{\"max_active_cases\": 20},\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import java.util.Map;\nimport me.didit.Didit;\nimport me.didit.types.CasePublicationPolicyDraftWriteRequest;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.cases().blueprints().saveDraft(\"11111111-2222-3333-4444-555555555555\", CasePublicationPolicyDraftWriteRequest.builder()\n        .expectedVersion(1L)\n        .expectedRevision(\"4e5f0000-0000-4000-8000-000000000003\")\n        .changes(Map.of(\"max_active_cases\", 20))\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\n$didit = new DiditClient();\n\n$result = $didit->cases->blueprints->saveDraft('11111111-2222-3333-4444-555555555555', [\n    'expected_version' => 1,\n    'expected_revision' => '4e5f0000-0000-4000-8000-000000000003',\n    'changes' => ['max_active_cases' => 20],\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.cases.blueprints.save_draft(\n  \"11111111-2222-3333-4444-555555555555\",\n  expected_version: 1,\n  expected_revision: \"4e5f0000-0000-4000-8000-000000000003\",\n  changes: { max_active_cases: 20 }\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Collections.Generic;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.Cases.Blueprints.SaveDraftAsync(\"11111111-2222-3333-4444-555555555555\", new CasePublicationPolicyDraftWriteRequest\n{\n    ExpectedVersion = 1,\n    ExpectedRevision = \"4e5f0000-0000-4000-8000-000000000003\",\n    Changes = new Dictionary<string, object> { [\"max_active_cases\"] = 20 },\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ]
      },
      "delete": {
        "operationId": "discard_case_blueprint_draft",
        "x-didit-sdk": {
          "resource": "cases.blueprints",
          "method": "discard_draft",
          "auth": "api_key",
          "server": true,
          "scope": "application"
        },
        "parameters": [
          {
            "in": "path",
            "name": "organization_id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "required": true
          },
          {
            "in": "path",
            "name": "application_id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "required": true
          },
          {
            "in": "path",
            "name": "blueprint_uuid",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "required": true
          }
        ],
        "tags": [
          "Case Management"
        ],
        "responses": {
          "204": {
            "description": "Kein Antwort-Body"
          },
          "409": {
            "description": "Veröffentlichte Version oder gespeicherte Entwurfsrevision hat sich geändert. Vor einem erneuten Versuch neu laden."
          },
          "403": {
            "description": "Erforderliche Fallberechtigung fehlt."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CasePublicationPolicyDraftPreconditionRequest"
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nclient.cases.blueprints.discard_draft(\n    \"11111111-2222-3333-4444-555555555555\",\n    expected_version=0,\n    expected_revision=\"11111111-2222-3333-4444-555555555555\",\n)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nawait didit.cases.blueprints.discardDraft(\"11111111-2222-3333-4444-555555555555\", {\n  expected_version: 0,\n  expected_revision: \"11111111-2222-3333-4444-555555555555\",\n});"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nif err := client.Cases.Blueprints.DiscardDraft(ctx, \"11111111-2222-3333-4444-555555555555\", didit.CasePublicationPolicyDraftPreconditionRequest{\n\tExpectedVersion:  0,\n\tExpectedRevision: didit.String(\"11111111-2222-3333-4444-555555555555\"),\n}); err != nil {\n\tlog.Fatal(err)\n}"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\nimport me.didit.types.CasePublicationPolicyDraftPreconditionRequest;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nclient.cases().blueprints().discardDraft(\"11111111-2222-3333-4444-555555555555\", CasePublicationPolicyDraftPreconditionRequest.builder()\n        .expectedVersion(0L)\n        .expectedRevision(\"11111111-2222-3333-4444-555555555555\")\n        .build());"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\n$didit = new DiditClient();\n\n$didit->cases->blueprints->discardDraft('11111111-2222-3333-4444-555555555555', [\n    'expected_version' => 0,\n    'expected_revision' => '11111111-2222-3333-4444-555555555555',\n]);"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\ndidit.cases.blueprints.discard_draft(\n  \"11111111-2222-3333-4444-555555555555\",\n  expected_version: 0,\n  expected_revision: \"11111111-2222-3333-4444-555555555555\"\n)"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nawait client.Cases.Blueprints.DiscardDraftAsync(\"11111111-2222-3333-4444-555555555555\", new CasePublicationPolicyDraftPreconditionRequest\n{\n    ExpectedVersion = 0,\n    ExpectedRevision = \"11111111-2222-3333-4444-555555555555\",\n});"
          }
        ]
      }
    },
    "/v3/organization/{organization_id}/application/{application_id}/cases/teams/{record_uuid}/": {
      "get": {
        "summary": "Prüfteam abrufen",
        "description": "Erfordert `read:cases` für die angeforderte Anwendung.",
        "operationId": "retrieve_case_teams",
        "x-didit-sdk": {
          "resource": "cases.teams",
          "method": "retrieve",
          "auth": "api_key",
          "server": true,
          "scope": "application"
        },
        "tags": [
          "Case Assignment"
        ],
        "parameters": [
          {
            "name": "organization_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "UUID der Organisation."
          },
          {
            "name": "application_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Anwendungs-UUID."
          },
          {
            "name": "record_uuid",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Erfolg",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CaseReviewTeam"
                }
              }
            }
          },
          "400": {
            "description": "Ungültige Eingabe."
          },
          "403": {
            "description": "Unzureichende Berechtigung."
          },
          "404": {
            "description": "Datensatz in dieser Anwendung nicht gefunden."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "x-codeSamples": [
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.cases.teams.retrieve(\n    \"11111111-2222-3333-4444-555555555555\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.cases.teams.retrieve(\"11111111-2222-3333-4444-555555555555\");\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.Cases.Teams.Retrieve(ctx, \"11111111-2222-3333-4444-555555555555\")\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.cases().teams().retrieve(\"11111111-2222-3333-4444-555555555555\");\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\n$didit = new DiditClient();\n\n$result = $didit->cases->teams->retrieve('11111111-2222-3333-4444-555555555555');\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.cases.teams.retrieve(\"11111111-2222-3333-4444-555555555555\")\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.Cases.Teams.RetrieveAsync(\"11111111-2222-3333-4444-555555555555\");\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ]
      },
      "patch": {
        "summary": "Prüferteam aktualisieren",
        "description": "Erfordert `write:cases` für die angeforderte Anwendung.",
        "operationId": "update_case_teams",
        "x-didit-sdk": {
          "resource": "cases.teams",
          "method": "update",
          "auth": "api_key",
          "server": true,
          "scope": "application"
        },
        "tags": [
          "Case Assignment"
        ],
        "parameters": [
          {
            "name": "organization_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "UUID der Organisation."
          },
          {
            "name": "application_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Anwendungs-UUID."
          },
          {
            "name": "record_uuid",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Erfolg",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CaseReviewTeam"
                }
              }
            }
          },
          "400": {
            "description": "Ungültige Eingabe."
          },
          "403": {
            "description": "Unzureichende Berechtigung."
          },
          "404": {
            "description": "Datensatz in dieser Anwendung nicht gefunden."
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CaseReviewTeamUpdate"
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "x-codeSamples": [
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.cases.teams.update(\n    \"11111111-2222-3333-4444-555555555555\",\n    name=\"your-name\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.cases.teams.update(\"11111111-2222-3333-4444-555555555555\", {\n  name: \"your-name\",\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.Cases.Teams.Update(ctx, \"11111111-2222-3333-4444-555555555555\", didit.CaseReviewTeamUpdate{\n\tName: didit.String(\"your-name\"),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\nimport me.didit.types.CaseReviewTeamUpdate;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.cases().teams().update(\"11111111-2222-3333-4444-555555555555\", CaseReviewTeamUpdate.builder()\n        .name(\"your-name\")\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\n$didit = new DiditClient();\n\n$result = $didit->cases->teams->update('11111111-2222-3333-4444-555555555555', [\n    'name' => 'your-name',\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.cases.teams.update(\n  \"11111111-2222-3333-4444-555555555555\",\n  name: \"your-name\"\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.Cases.Teams.UpdateAsync(\"11111111-2222-3333-4444-555555555555\", new CaseReviewTeamUpdate\n{\n    Name = \"your-name\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ]
      }
    },
    "/v3/organization/{organization_id}/application/{application_id}/networks/{network_uuid}/report/": {
      "get": {
        "operationId": "download_network_report",
        "x-didit-sdk": {
          "resource": "networks",
          "method": "download_report",
          "auth": "api_key",
          "server": true,
          "scope": "application"
        },
        "tags": [
          "Networks"
        ],
        "summary": "Einen Netzwerk-Evidenzbericht herunterladen",
        "description": "Laden Sie ein PDF des aktuellen Organisationsnetzwerks, seiner beobachteten Kontoverbindungen, Signalreferenzen und des Prüfungsstatus herunter. Erfordert read:networks. Globale Erkenntnisse und private Analystennotizen sind nicht enthalten. Jede Konten- und Signalliste ist auf 500 Einträge begrenzt, und der Bericht gibt an, wenn er unvollständig ist. Die Anfrage ändert den Netzwerkstatus nicht. Fehler werden als JSON zurückgegeben.",
        "parameters": [
          {
            "name": "organization_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "UUID der Organisation."
          },
          {
            "name": "application_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Anwendungs-UUID."
          },
          {
            "name": "network_uuid",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Netzwerk-UUID."
          },
          {
            "name": "Authorization",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Console-Benutzer-Zugriffstoken im Format Bearer <token>."
          }
        ],
        "responses": {
          "200": {
            "description": "Netzwerk-Nachweisbericht. Cache-Control: no-store.",
            "content": {
              "application/pdf": {
                "schema": {
                  "type": "string",
                  "format": "binary"
                }
              }
            }
          },
          "401": {
            "description": "Authentifizierung ist erforderlich."
          },
          "403": {
            "description": "Fehlende Berechtigung oder fehlender Networks-Zugriff."
          },
          "404": {
            "description": "Netzwerk oder Notiz ist für diese Anwendung nicht sichtbar."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "x-codeSamples": [
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\n# Also needs a console user's access token.\nclient = Didit()\n\ncontent = client.networks.download_report(\n    \"11111111-2222-3333-4444-555555555555\",\n    extra_headers={\"Authorization\": \"Bearer YOUR_CONSOLE_USER_TOKEN\"},\n)\nwith open(\"download.pdf\", \"wb\") as file:\n    file.write(content)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import { writeFile } from \"node:fs/promises\";\nimport Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\n// Also needs a console user's access token.\nconst didit = new Didit({\n  fetch: (url, init) => {\n    const headers = new Headers(init?.headers);\n    headers.set(\"Authorization\", \"Bearer YOUR_CONSOLE_USER_TOKEN\");\n    return fetch(url, { ...init, headers });\n  },\n});\n\nconst content = await didit.networks.downloadReport(\"11111111-2222-3333-4444-555555555555\");\nawait writeFile(\"download.pdf\", Buffer.from(await content.arrayBuffer()));"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\n// Also needs a console user's access token.\nclient := didit.NewClient()\n\nresp, err := client.Networks.DownloadReport(ctx, \"11111111-2222-3333-4444-555555555555\", didit.NetworksDownloadReportParams{\n\tAuthorization: \"Bearer YOUR_CONSOLE_USER_TOKEN\",\n})\nif err != nil {\n\tlog.Fatal(err)\n}\ndefer resp.Body.Close()\nfile, err := os.Create(\"download.pdf\")\nif err != nil {\n\tlog.Fatal(err)\n}\ndefer file.Close()\nif _, err := io.Copy(file, resp.Body); err != nil {\n\tlog.Fatal(err)\n}"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import java.nio.file.Path;\nimport me.didit.Didit;\nimport me.didit.core.RequestOptions;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\n// Also needs a console user's access token.\nDidit client = new Didit();\n\nclient.networks().downloadReport(\"11111111-2222-3333-4444-555555555555\", RequestOptions.builder()\n        .header(\"Authorization\", \"Bearer YOUR_CONSOLE_USER_TOKEN\")\n        .build())\n        .writeTo(Path.of(\"download.pdf\"));"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\n// Also needs a console user's access token.\n$didit = new DiditClient();\n\n$content = $didit->networks->downloadReport('11111111-2222-3333-4444-555555555555', [\n    'authorization' => 'Bearer YOUR_CONSOLE_USER_TOKEN',\n]);\n$content->saveTo('download.pdf');"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\n# Also needs a console user's access token.\ndidit = Didit::Client.new\n\ncontent = didit.networks.download_report(\n  \"11111111-2222-3333-4444-555555555555\",\n  request_options: { extra_headers: { \"Authorization\" => \"Bearer YOUR_CONSOLE_USER_TOKEN\" } }\n)\nFile.binwrite(\"download.pdf\", content)"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Collections.Generic;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\n// Also needs a console user's access token.\nusing var client = new DiditClient();\n\nvar content = await client.Networks.DownloadReportAsync(\"11111111-2222-3333-4444-555555555555\", requestOptions: new RequestOptions\n{\n    Headers = new Dictionary<string, string>\n    {\n        [\"Authorization\"] = \"Bearer YOUR_CONSOLE_USER_TOKEN\",\n    },\n});\nawait content.SaveToAsync(\"download.pdf\");"
          }
        ]
      }
    },
    "/v3/organization/{organization_id}/application/{application_id}/networks/{network_uuid}/notes/": {
      "get": {
        "operationId": "list_network_notes",
        "x-didit-sdk": {
          "resource": "networks.notes",
          "method": "list",
          "auth": "api_key",
          "server": true,
          "scope": "application"
        },
        "tags": [
          "Networks"
        ],
        "summary": "Private Netzwerknotizen auflisten",
        "description": "Console-Benutzer mit read:networks können Notizen zu einem Netzwerk lesen, das für die Anwendung sichtbar ist. Notizen verbleiben innerhalb der Organisation und fließen nicht in gemeinsame Erkenntnisse ein. Die neuesten Notizen werden zuerst angezeigt.",
        "parameters": [
          {
            "name": "organization_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "UUID der Organisation."
          },
          {
            "name": "application_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Anwendungs-UUID."
          },
          {
            "name": "network_uuid",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Netzwerk-UUID."
          },
          {
            "name": "Authorization",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Console-Benutzer-Zugriffstoken im Format Bearer <token>."
          },
          {
            "name": "limit",
            "in": "query",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 30
            }
          },
          {
            "name": "offset",
            "in": "query",
            "schema": {
              "type": "integer",
              "minimum": 0,
              "maximum": 1000000,
              "default": 0
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Eine Seite mit Notizen. Die Anzahl ist auf 100 begrenzt; verwenden Sie next, um fortzufahren.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "count": {
                      "type": "integer"
                    },
                    "next": {
                      "type": "string",
                      "nullable": true
                    },
                    "previous": {
                      "type": "string",
                      "nullable": true
                    },
                    "results": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/NetworkNote"
                      }
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Authentifizierung ist erforderlich."
          },
          "403": {
            "description": "Fehlende Berechtigung oder fehlender Networks-Zugriff."
          },
          "404": {
            "description": "Netzwerk oder Notiz ist für diese Anwendung nicht sichtbar."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "x-codeSamples": [
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\n# Also needs a console user's access token.\nclient = Didit()\n\nfor item in client.networks.notes.list(\n    \"11111111-2222-3333-4444-555555555555\",\n    extra_headers={\"Authorization\": \"Bearer YOUR_CONSOLE_USER_TOKEN\"},\n):\n    print(item)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\n// Also needs a console user's access token.\nconst didit = new Didit({\n  fetch: (url, init) => {\n    const headers = new Headers(init?.headers);\n    headers.set(\"Authorization\", \"Bearer YOUR_CONSOLE_USER_TOKEN\");\n    return fetch(url, { ...init, headers });\n  },\n});\n\nfor await (const item of didit.networks.notes.list(\"11111111-2222-3333-4444-555555555555\")) {\n  console.log(item);\n}"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\n// Also needs a console user's access token.\nclient := didit.NewClient()\n\niter := client.Networks.Notes.ListAutoPaging(ctx, \"11111111-2222-3333-4444-555555555555\", didit.NetworksNotesListParams{\n\tAuthorization: \"Bearer YOUR_CONSOLE_USER_TOKEN\",\n})\nfor iter.Next() {\n\tfmt.Printf(\"%+v\\n\", iter.Current())\n}\nif err := iter.Err(); err != nil {\n\tlog.Fatal(err)\n}"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\nimport me.didit.core.RequestOptions;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\n// Also needs a console user's access token.\nDidit client = new Didit();\n\nfor (var item : client.networks().notes().list(\"11111111-2222-3333-4444-555555555555\", RequestOptions.builder()\n        .header(\"Authorization\", \"Bearer YOUR_CONSOLE_USER_TOKEN\")\n        .build())) {\n    System.out.println(item);\n}"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\n// Also needs a console user's access token.\n$didit = new DiditClient();\n\nforeach ($didit->networks->notes->list('11111111-2222-3333-4444-555555555555', [\n    'authorization' => 'Bearer YOUR_CONSOLE_USER_TOKEN',\n]) as $item) {\n    print_r($item->toArray());\n}"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\n# Also needs a console user's access token.\ndidit = Didit::Client.new\n\ndidit.networks.notes.list(\n  \"11111111-2222-3333-4444-555555555555\",\n  request_options: { extra_headers: { \"Authorization\" => \"Bearer YOUR_CONSOLE_USER_TOKEN\" } }\n).auto_paging_each do |item|\n  puts item.to_h\nend"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Collections.Generic;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\n// Also needs a console user's access token.\nusing var client = new DiditClient();\n\nawait foreach (var item in await client.Networks.Notes.ListAsync(\"11111111-2222-3333-4444-555555555555\", requestOptions: new RequestOptions\n{\n    Headers = new Dictionary<string, string>\n    {\n        [\"Authorization\"] = \"Bearer YOUR_CONSOLE_USER_TOKEN\",\n    },\n}))\n{\n    Console.WriteLine(JsonSerializer.Serialize(item));\n}"
          }
        ]
      },
      "post": {
        "operationId": "create_network_note",
        "x-didit-sdk": {
          "resource": "networks.notes",
          "method": "create",
          "auth": "api_key",
          "server": true,
          "scope": "application"
        },
        "tags": [
          "Networks"
        ],
        "summary": "Private Netzwerknotiz hinzufügen",
        "description": "Erfordert einen Console-Benutzer mit write:networks. Der Autor wird anhand des authentifizierten Benutzers zugewiesen. Übergeben Sie für jede Notiz eine neue zufällige UUID als client_reference; wiederholen Sie bei einer unklaren Antwort denselben Body und dieselbe Referenz, um Duplikate zu vermeiden. Die Wiederverwendung einer Referenz für einen anderen Body, Autor oder ein anderes Netzwerk gibt 409 zurück. Notizen folgen bei der Zusammenführung von Netzwerken der verbleibenden Untersuchung.",
        "parameters": [
          {
            "name": "organization_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "UUID der Organisation."
          },
          {
            "name": "application_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Anwendungs-UUID."
          },
          {
            "name": "network_uuid",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Netzwerk-UUID."
          },
          {
            "name": "Authorization",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Console-Benutzer-Zugriffstoken im Format Bearer <token>."
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "comment",
                  "client_reference"
                ],
                "properties": {
                  "comment": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 10000
                  },
                  "client_reference": {
                    "type": "string",
                    "format": "uuid"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Gespeicherte private Notiz.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NetworkNote"
                }
              }
            }
          },
          "200": {
            "description": "Gespeicherte private Notiz.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NetworkNote"
                }
              }
            }
          },
          "400": {
            "description": "Ungültige oder leere Notiz."
          },
          "409": {
            "description": "Die Referenz wurde bereits für eine andere Notiz verwendet."
          },
          "401": {
            "description": "Authentifizierung ist erforderlich."
          },
          "403": {
            "description": "Fehlende Berechtigung oder fehlender Networks-Zugriff."
          },
          "404": {
            "description": "Netzwerk oder Notiz ist für diese Anwendung nicht sichtbar."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "x-codeSamples": [
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\n# Also needs a console user's access token.\nclient = Didit()\n\nresult = client.networks.notes.create(\n    \"11111111-2222-3333-4444-555555555555\",\n    comment=\"your-comment\",\n    client_reference=\"11111111-2222-3333-4444-555555555555\",\n    extra_headers={\"Authorization\": \"Bearer YOUR_CONSOLE_USER_TOKEN\"},\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\n// Also needs a console user's access token.\nconst didit = new Didit({\n  fetch: (url, init) => {\n    const headers = new Headers(init?.headers);\n    headers.set(\"Authorization\", \"Bearer YOUR_CONSOLE_USER_TOKEN\");\n    return fetch(url, { ...init, headers });\n  },\n});\n\nconst result = await didit.networks.notes.create(\"11111111-2222-3333-4444-555555555555\", {\n  comment: \"your-comment\",\n  client_reference: \"11111111-2222-3333-4444-555555555555\",\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\n// Also needs a console user's access token.\nclient := didit.NewClient()\n\nresult, err := client.Networks.Notes.Create(ctx, \"11111111-2222-3333-4444-555555555555\", didit.NetworksNotesCreateParams{\n\tComment:         \"your-comment\",\n\tClientReference: \"11111111-2222-3333-4444-555555555555\",\n\tAuthorization:   \"Bearer YOUR_CONSOLE_USER_TOKEN\",\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\nimport me.didit.core.RequestOptions;\nimport me.didit.types.NetworksNotesCreateParams;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\n// Also needs a console user's access token.\nDidit client = new Didit();\n\nvar result = client.networks().notes().create(\"11111111-2222-3333-4444-555555555555\", NetworksNotesCreateParams.builder()\n        .comment(\"your-comment\")\n        .clientReference(\"11111111-2222-3333-4444-555555555555\")\n        .build(), RequestOptions.builder()\n        .header(\"Authorization\", \"Bearer YOUR_CONSOLE_USER_TOKEN\")\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\n// Also needs a console user's access token.\n$didit = new DiditClient();\n\n$result = $didit->networks->notes->create('11111111-2222-3333-4444-555555555555', [\n    'comment' => 'your-comment',\n    'client_reference' => '11111111-2222-3333-4444-555555555555',\n    'authorization' => 'Bearer YOUR_CONSOLE_USER_TOKEN',\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\n# Also needs a console user's access token.\ndidit = Didit::Client.new\n\nresult = didit.networks.notes.create(\n  \"11111111-2222-3333-4444-555555555555\",\n  comment: \"your-comment\",\n  client_reference: \"11111111-2222-3333-4444-555555555555\",\n  request_options: { extra_headers: { \"Authorization\" => \"Bearer YOUR_CONSOLE_USER_TOKEN\" } }\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Collections.Generic;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\n// Also needs a console user's access token.\nusing var client = new DiditClient();\n\nvar result = await client.Networks.Notes.CreateAsync(\"11111111-2222-3333-4444-555555555555\", new NetworksNotesCreateParams\n{\n    Comment = \"your-comment\",\n    ClientReference = \"11111111-2222-3333-4444-555555555555\",\n}, requestOptions: new RequestOptions\n{\n    Headers = new Dictionary<string, string>\n    {\n        [\"Authorization\"] = \"Bearer YOUR_CONSOLE_USER_TOKEN\",\n    },\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ]
      }
    },
    "/v3/organization/{organization_id}/application/{application_id}/cases/routing-rules/{record_uuid}/draft/": {
      "get": {
        "operationId": "get_case_routing_rule_draft",
        "x-didit-sdk": {
          "resource": "cases.routing_rules",
          "method": "retrieve_draft",
          "auth": "api_key",
          "server": true,
          "scope": "application"
        },
        "parameters": [
          {
            "in": "path",
            "name": "organization_id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "required": true
          },
          {
            "in": "path",
            "name": "application_id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "required": true
          },
          {
            "in": "path",
            "name": "record_uuid",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "required": true
          }
        ],
        "tags": [
          "Case Assignment"
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RoutingPublicationPolicyDraftResponse"
                }
              }
            },
            "description": ""
          },
          "403": {
            "description": "Zugriff auf den Fall ist erforderlich."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "x-codeSamples": [
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.cases.routing_rules.retrieve_draft(\n    \"11111111-2222-3333-4444-555555555555\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.cases.routingRules.retrieveDraft(\"11111111-2222-3333-4444-555555555555\");\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.Cases.RoutingRules.RetrieveDraft(ctx, \"11111111-2222-3333-4444-555555555555\")\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.cases().routingRules().retrieveDraft(\"11111111-2222-3333-4444-555555555555\");\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\n$didit = new DiditClient();\n\n$result = $didit->cases->routingRules->retrieveDraft('11111111-2222-3333-4444-555555555555');\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.cases.routing_rules.retrieve_draft(\"11111111-2222-3333-4444-555555555555\")\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.Cases.RoutingRules.RetrieveDraftAsync(\"11111111-2222-3333-4444-555555555555\");\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ]
      },
      "put": {
        "operationId": "save_case_routing_rule_draft",
        "x-didit-sdk": {
          "resource": "cases.routing_rules",
          "method": "save_draft",
          "auth": "api_key",
          "server": true,
          "scope": "application"
        },
        "parameters": [
          {
            "in": "path",
            "name": "organization_id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "required": true
          },
          {
            "in": "path",
            "name": "application_id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "required": true
          },
          {
            "in": "path",
            "name": "record_uuid",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "required": true
          }
        ],
        "tags": [
          "Case Assignment"
        ],
        "requestBody": {
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/RoutingPublicationPolicyDraftWriteRequest"
              }
            },
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RoutingPublicationPolicyDraftWriteRequest"
              },
              "example": {
                "expected_version": 1,
                "expected_revision": "4e5f0000-0000-4000-8000-000000000003",
                "changes": {
                  "priority": 10
                }
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/RoutingPublicationPolicyDraftWriteRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RoutingPublicationPolicyDraft"
                }
              }
            },
            "description": ""
          },
          "403": {
            "description": "Zugriff auf den Fall ist erforderlich."
          },
          "409": {
            "description": "Die veröffentlichte Version oder Entwurfsrevision hat sich geändert. Vor einem erneuten Versuch neu laden."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "x-codeSamples": [
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.cases.routing_rules.save_draft(\n    \"11111111-2222-3333-4444-555555555555\",\n    expected_version=1,\n    expected_revision=\"4e5f0000-0000-4000-8000-000000000003\",\n    changes={\"priority\": 10},\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.cases.routingRules.saveDraft(\"11111111-2222-3333-4444-555555555555\", {\n  expected_version: 1,\n  expected_revision: \"4e5f0000-0000-4000-8000-000000000003\",\n  changes: { priority: 10 },\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.Cases.RoutingRules.SaveDraft(ctx, \"11111111-2222-3333-4444-555555555555\", didit.RoutingPublicationPolicyDraftWriteRequest{\n\tExpectedVersion:  1,\n\tExpectedRevision: didit.String(\"4e5f0000-0000-4000-8000-000000000003\"),\n\tChanges:          map[string]any{\"priority\": 10},\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import java.util.Map;\nimport me.didit.Didit;\nimport me.didit.types.RoutingPublicationPolicyDraftWriteRequest;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.cases().routingRules().saveDraft(\"11111111-2222-3333-4444-555555555555\", RoutingPublicationPolicyDraftWriteRequest.builder()\n        .expectedVersion(1L)\n        .expectedRevision(\"4e5f0000-0000-4000-8000-000000000003\")\n        .changes(Map.of(\"priority\", 10))\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\n$didit = new DiditClient();\n\n$result = $didit->cases->routingRules->saveDraft('11111111-2222-3333-4444-555555555555', [\n    'expected_version' => 1,\n    'expected_revision' => '4e5f0000-0000-4000-8000-000000000003',\n    'changes' => ['priority' => 10],\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.cases.routing_rules.save_draft(\n  \"11111111-2222-3333-4444-555555555555\",\n  expected_version: 1,\n  expected_revision: \"4e5f0000-0000-4000-8000-000000000003\",\n  changes: { priority: 10 }\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Collections.Generic;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.Cases.RoutingRules.SaveDraftAsync(\"11111111-2222-3333-4444-555555555555\", new RoutingPublicationPolicyDraftWriteRequest\n{\n    ExpectedVersion = 1,\n    ExpectedRevision = \"4e5f0000-0000-4000-8000-000000000003\",\n    Changes = new Dictionary<string, object> { [\"priority\"] = 10 },\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ]
      },
      "delete": {
        "operationId": "discard_case_routing_rule_draft",
        "x-didit-sdk": {
          "resource": "cases.routing_rules",
          "method": "discard_draft",
          "auth": "api_key",
          "server": true,
          "scope": "application"
        },
        "parameters": [
          {
            "in": "path",
            "name": "organization_id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "required": true
          },
          {
            "in": "path",
            "name": "application_id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "required": true
          },
          {
            "in": "path",
            "name": "record_uuid",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "required": true
          }
        ],
        "tags": [
          "Case Assignment"
        ],
        "responses": {
          "204": {
            "description": "Kein Antwort-Body"
          },
          "403": {
            "description": "Zugriff auf den Fall ist erforderlich."
          },
          "409": {
            "description": "Die veröffentlichte Version oder Entwurfsrevision hat sich geändert. Vor einem erneuten Versuch neu laden."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RoutingPublicationPolicyDraftPreconditionRequest"
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nclient.cases.routing_rules.discard_draft(\n    \"11111111-2222-3333-4444-555555555555\",\n    expected_version=0,\n    expected_revision=\"11111111-2222-3333-4444-555555555555\",\n)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nawait didit.cases.routingRules.discardDraft(\"11111111-2222-3333-4444-555555555555\", {\n  expected_version: 0,\n  expected_revision: \"11111111-2222-3333-4444-555555555555\",\n});"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nif err := client.Cases.RoutingRules.DiscardDraft(ctx, \"11111111-2222-3333-4444-555555555555\", didit.RoutingPublicationPolicyDraftPreconditionRequest{\n\tExpectedVersion:  0,\n\tExpectedRevision: didit.String(\"11111111-2222-3333-4444-555555555555\"),\n}); err != nil {\n\tlog.Fatal(err)\n}"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\nimport me.didit.types.RoutingPublicationPolicyDraftPreconditionRequest;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nclient.cases().routingRules().discardDraft(\"11111111-2222-3333-4444-555555555555\", RoutingPublicationPolicyDraftPreconditionRequest.builder()\n        .expectedVersion(0L)\n        .expectedRevision(\"11111111-2222-3333-4444-555555555555\")\n        .build());"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\n$didit = new DiditClient();\n\n$didit->cases->routingRules->discardDraft('11111111-2222-3333-4444-555555555555', [\n    'expected_version' => 0,\n    'expected_revision' => '11111111-2222-3333-4444-555555555555',\n]);"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\ndidit.cases.routing_rules.discard_draft(\n  \"11111111-2222-3333-4444-555555555555\",\n  expected_version: 0,\n  expected_revision: \"11111111-2222-3333-4444-555555555555\"\n)"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nawait client.Cases.RoutingRules.DiscardDraftAsync(\"11111111-2222-3333-4444-555555555555\", new RoutingPublicationPolicyDraftPreconditionRequest\n{\n    ExpectedVersion = 0,\n    ExpectedRevision = \"11111111-2222-3333-4444-555555555555\",\n});"
          }
        ]
      }
    },
    "/v3/organization/{organization_id}/application/{application_id}/cases/duplicates/": {
      "post": {
        "operationId": "duplicates_create",
        "x-didit-sdk": {
          "resource": "cases",
          "method": "find_duplicates",
          "auth": "api_key",
          "server": true,
          "scope": "application"
        },
        "parameters": [
          {
            "in": "path",
            "name": "organization_id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "required": true
          },
          {
            "in": "path",
            "name": "application_id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "required": true
          }
        ],
        "tags": [
          "Case Management"
        ],
        "requestBody": {
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/CaseDuplicateCaseDuplicateQueryRequest"
              }
            },
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CaseDuplicateCaseDuplicateQueryRequest"
              },
              "example": {
                "subject": {
                  "type": "user",
                  "uuid": "5b9a0000-0000-4000-8000-00000000f00d"
                }
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/CaseDuplicateCaseDuplicateQueryRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CaseDuplicateCaseDuplicatePage"
                }
              }
            },
            "description": ""
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "description": "Prüfen Sie bestehende Fälle für ein Subjekt oder einen eigenen Quelldatensatz vor der manuellen Fallerstellung. Es werden sowohl offene als auch abgeschlossene Untersuchungen zurückgegeben. Jede Seite enthält maximal 20 Fälle; verwenden Sie next_offset, um eine weitere Seite anzufordern.",
        "x-codeSamples": [
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.cases.find_duplicates(\n    subject={\n        \"type\": \"user\",\n        \"uuid\": \"5b9a0000-0000-4000-8000-00000000f00d\",\n    },\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.cases.findDuplicates({\n  subject: {\n    type: \"user\",\n    uuid: \"5b9a0000-0000-4000-8000-00000000f00d\",\n  },\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.Cases.FindDuplicates(ctx, didit.CaseDuplicateCaseDuplicateQueryRequest{\n\tSubject: didit.Some(didit.CaseDuplicateCaseSubjectInputRequest{\n\t\tType: didit.CaseDuplicateTypeEnum(\"user\"),\n\t\tUUID: \"5b9a0000-0000-4000-8000-00000000f00d\",\n\t}),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\nimport me.didit.types.CaseDuplicateCaseDuplicateQueryRequest;\nimport me.didit.types.CaseDuplicateCaseSubjectInputRequest;\nimport me.didit.types.CaseDuplicateTypeEnum;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.cases().findDuplicates(CaseDuplicateCaseDuplicateQueryRequest.builder()\n        .subject(CaseDuplicateCaseSubjectInputRequest.builder()\n                .type(CaseDuplicateTypeEnum.of(\"user\"))\n                .uuid(\"5b9a0000-0000-4000-8000-00000000f00d\")\n                .build())\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\n$didit = new DiditClient();\n\n$result = $didit->cases->findDuplicates([\n    'subject' => [\n        'type' => 'user',\n        'uuid' => '5b9a0000-0000-4000-8000-00000000f00d',\n    ],\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.cases.find_duplicates(\n  subject: {\n    type: \"user\",\n    uuid: \"5b9a0000-0000-4000-8000-00000000f00d\",\n  }\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.Cases.FindDuplicatesAsync(new CaseDuplicateCaseDuplicateQueryRequest\n{\n    Subject = new CaseDuplicateCaseSubjectInputRequest\n    {\n        Type = \"user\",\n        Uuid = \"5b9a0000-0000-4000-8000-00000000f00d\",\n    },\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ]
      }
    },
    "/v3/organization/{organization_id}/application/{application_id}/cases/routing-rules/preview/": {
      "post": {
        "summary": "Fall-Routing testen",
        "description": "Erfordert `read:cases` für die angeforderte Anwendung. Wertet aktuelle Regeln oder einen bereitgestellten Entwurf anhand der aktuellen Zugriffsrechte, Verfügbarkeit, Fähigkeiten und Kapazität der Prüfer aus. Speichert den Entwurf nicht und reserviert keine Prüferkapazität.",
        "operationId": "preview_case_routing",
        "x-didit-sdk": {
          "resource": "cases.routing_rules",
          "method": "preview",
          "auth": "api_key",
          "server": true,
          "scope": "application"
        },
        "tags": [
          "Case Assignment"
        ],
        "parameters": [
          {
            "name": "organization_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "UUID der Organisation."
          },
          {
            "name": "application_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Anwendungs-UUID."
          }
        ],
        "responses": {
          "200": {
            "description": "Erfolg",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CaseRoutingPreview"
                }
              }
            }
          },
          "400": {
            "description": "Ungültige Eingabe."
          },
          "403": {
            "description": "Unzureichende Berechtigung."
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CaseRoutingPreviewRequest"
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "x-codeSamples": [
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.cases.routing_rules.preview(\n    source=\"MANUAL\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.cases.routingRules.preview({\n  source: \"MANUAL\",\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.Cases.RoutingRules.Preview(ctx, didit.CaseRoutingPreviewRequest{\n\tSource: \"MANUAL\",\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\nimport me.didit.types.CaseRoutingPreviewRequest;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.cases().routingRules().preview(CaseRoutingPreviewRequest.builder()\n        .source(CaseRoutingPreviewRequest.Source.of(\"MANUAL\"))\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\n$didit = new DiditClient();\n\n$result = $didit->cases->routingRules->preview([\n    'source' => 'MANUAL',\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.cases.routing_rules.preview(source: \"MANUAL\")\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.Cases.RoutingRules.PreviewAsync(new CaseRoutingPreviewRequest\n{\n    Source = \"MANUAL\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ]
      }
    },
    "/v3/organization/{organization_id}/application/{application_id}/cases/reviewers/": {
      "get": {
        "summary": "Berechtigte Fallprüfer auflisten",
        "description": "Erfordert `list:cases` für die angeforderte Anwendung.",
        "operationId": "list_case_reviewers",
        "x-didit-sdk": {
          "resource": "cases",
          "method": "list_reviewers",
          "auth": "api_key",
          "server": true,
          "scope": "application"
        },
        "tags": [
          "Case Assignment"
        ],
        "parameters": [
          {
            "name": "organization_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "UUID der Organisation."
          },
          {
            "name": "application_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Anwendungs-UUID."
          }
        ],
        "responses": {
          "200": {
            "description": "Erfolg",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "results": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "user_id": {
                            "type": "string",
                            "format": "uuid"
                          },
                          "email": {
                            "type": "string",
                            "format": "email"
                          },
                          "name": {
                            "type": "string"
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Ungültige Eingabe."
          },
          "403": {
            "description": "Unzureichende Berechtigung."
          },
          "503": {
            "description": "Der Prüferzugriff konnte nicht verifiziert werden. Wiederholen Sie den Versuch später."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "x-codeSamples": [
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.cases.list_reviewers()\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.cases.listReviewers();\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.Cases.ListReviewers(ctx)\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.cases().listReviewers();\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\n$didit = new DiditClient();\n\n$result = $didit->cases->listReviewers();\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.cases.list_reviewers\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.Cases.ListReviewersAsync();\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ]
      }
    },
    "/v3/organization/{organization_id}/application/{application_id}/cases/blueprints/{blueprint_uuid}/history/": {
      "get": {
        "operationId": "list_case_blueprint_history",
        "x-didit-sdk": {
          "resource": "cases.blueprints",
          "method": "list_history",
          "auth": "api_key",
          "server": true,
          "scope": "application"
        },
        "parameters": [
          {
            "in": "path",
            "name": "organization_id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "required": true
          },
          {
            "in": "path",
            "name": "application_id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "required": true
          },
          {
            "in": "path",
            "name": "blueprint_uuid",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "required": true
          },
          {
            "name": "ordering",
            "required": false,
            "in": "query",
            "description": "Welches Feld für die Sortierung der Ergebnisse verwendet werden soll.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "limit",
            "required": false,
            "in": "query",
            "description": "Anzahl der pro Seite zurückzugebenden Ergebnisse.",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "offset",
            "required": false,
            "in": "query",
            "description": "Der Startindex, ab dem die Ergebnisse zurückgegeben werden sollen.",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "tags": [
          "Case Management"
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CasePublicationPaginatedPolicyRevisionList"
                }
              }
            },
            "description": ""
          },
          "403": {
            "description": "Erforderliche Fallberechtigung fehlt."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "x-codeSamples": [
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nfor item in client.cases.blueprints.list_history(\n    \"11111111-2222-3333-4444-555555555555\",\n):\n    print(item)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nfor await (const item of didit.cases.blueprints.listHistory(\"11111111-2222-3333-4444-555555555555\")) {\n  console.log(item);\n}"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\niter := client.Cases.Blueprints.ListHistoryAutoPaging(ctx, \"11111111-2222-3333-4444-555555555555\", didit.CasesBlueprintsListHistoryParams{})\nfor iter.Next() {\n\tfmt.Printf(\"%+v\\n\", iter.Current())\n}\nif err := iter.Err(); err != nil {\n\tlog.Fatal(err)\n}"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nfor (var item : client.cases().blueprints().listHistory(\"11111111-2222-3333-4444-555555555555\")) {\n    System.out.println(item);\n}"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\n$didit = new DiditClient();\n\nforeach ($didit->cases->blueprints->listHistory('11111111-2222-3333-4444-555555555555') as $item) {\n    print_r($item->toArray());\n}"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\ndidit.cases.blueprints.list_history(\"11111111-2222-3333-4444-555555555555\").auto_paging_each do |item|\n  puts item.to_h\nend"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nawait foreach (var item in await client.Cases.Blueprints.ListHistoryAsync(\"11111111-2222-3333-4444-555555555555\"))\n{\n    Console.WriteLine(JsonSerializer.Serialize(item));\n}"
          }
        ]
      }
    },
    "/v3/session/{sessionId}/signatures/{nodeId}/documents/{documentId}/file/": {
      "get": {
        "summary": "Ein signiertes Dokument herunterladen",
        "description": "Laden Sie das signierte PDF eines Dokuments aus einem E-Signatur-Schritt herunter. Verwenden Sie den Pfad `signed_file` von `signatures[].documents[]` in der Entscheidung. Das PDF enthält das Dokument, das dem Unterzeichner angezeigt wurde, mit seinen eingestempelten Feldwerten sowie die Nachweisseite (sofern `signature_evidence_page` nicht deaktiviert ist). Ein Advanced-(AES-)PDF enthält zudem die PAdES-Signatur mit ihrem Zeitstempel; ein Simple-PDF enthält keine digitale Signatur, kein Siegel und keinen Zeitstempel. Didit prüft die Datei vor der Rückgabe anhand von `sha256_signed`.\n\nFunktioniert für Sitzungen der Benutzerverifizierung (KYC) und Unternehmensverifizierung (KYB). Erfordert `read:sessions`; Ihr API-Schlüssel funktioniert. Siehe den [E-Signatur-Bericht](/de/core-technology/electronic-signature/report-electronic-signature#signierte-dokumente-herunterladen).",
        "operationId": "get_v3_session_signature_document_file",
        "x-didit-sdk": {
          "resource": "sessions.signatures",
          "method": "download_document",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Sessions"
        ],
        "parameters": [
          {
            "name": "sessionId",
            "in": "path",
            "required": true,
            "description": "Die Sitzung zur Benutzerverifizierung (KYC) oder Unternehmensverifizierung (KYB).",
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "11111111-2222-3333-4444-555555555555"
            }
          },
          {
            "name": "nodeId",
            "in": "path",
            "required": true,
            "description": "Der E-Signatur-Schritt: `node_id` des Elements in `signatures[]`.",
            "schema": {
              "type": "string",
              "example": "feature_signature"
            }
          },
          {
            "name": "documentId",
            "in": "path",
            "required": true,
            "description": "`id` des Dokuments in `signatures[].documents[]`.",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "Das signierte PDF.",
            "headers": {
              "Content-Disposition": {
                "description": "Anhang mit dem Dateinamen.",
                "schema": {
                  "type": "string",
                  "example": "attachment; filename=\"agreement-signed.pdf\""
                }
              }
            },
            "content": {
              "application/pdf": {
                "schema": {
                  "type": "string",
                  "format": "binary"
                }
              }
            }
          },
          "403": {
            "description": "Fehlende Anmeldedaten oder Anmeldedaten, die diese Sitzung nicht lesen können. Ein fehlender Schlüssel führt zu einer `403`-Antwort; ein falscher, widerrufener oder abgelaufener Schlüssel führt zu einer `401`-Antwort.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string"
                    }
                  }
                },
                "example": {
                  "detail": "You do not have permission to perform this action."
                }
              }
            }
          },
          "404": {
            "description": "Kein signiertes Dokument stimmt überein: Die Sitzung, der Schritt oder das Dokument existiert nicht, wurde gelöscht oder ist noch nicht signiert.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "string"
                    },
                    "detail": {
                      "type": "string"
                    }
                  }
                },
                "examples": {
                  "Not signed yet": {
                    "summary": "Der Unterzeichner hat nicht unterschrieben",
                    "value": {
                      "code": "signature_not_signed",
                      "detail": "signature_not_signed"
                    }
                  },
                  "Unknown document": {
                    "summary": "Kein solches Dokument in diesem Schritt",
                    "value": {
                      "code": "signature_not_found",
                      "detail": "signature_not_found"
                    }
                  }
                }
              }
            }
          },
          "409": {
            "description": "Die gespeicherte Datei stimmt nicht mehr mit ihrem erfassten SHA-256 überein. Es wird nichts zurückgegeben.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "string"
                    },
                    "detail": {
                      "type": "string"
                    }
                  }
                },
                "examples": {
                  "Changed file": {
                    "summary": "Gespeicherte Datei stimmt nicht mit ihrem Hash überein",
                    "value": {
                      "code": "signature_document_changed",
                      "detail": "signature_document_changed"
                    }
                  }
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\ncontent = client.sessions.signatures.download_document(\n    \"11111111-2222-3333-4444-555555555555\",\n    \"feature_signature\",\n    \"11111111-2222-3333-4444-555555555555\",\n)\nwith open(\"download.pdf\", \"wb\") as file:\n    file.write(content)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import { writeFile } from \"node:fs/promises\";\nimport Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst content = await didit.sessions.signatures.downloadDocument(\n  \"11111111-2222-3333-4444-555555555555\",\n  \"feature_signature\",\n  \"11111111-2222-3333-4444-555555555555\",\n);\nawait writeFile(\"download.pdf\", Buffer.from(await content.arrayBuffer()));"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresp, err := client.Sessions.Signatures.DownloadDocument(ctx, \"11111111-2222-3333-4444-555555555555\", \"feature_signature\", \"11111111-2222-3333-4444-555555555555\")\nif err != nil {\n\tlog.Fatal(err)\n}\ndefer resp.Body.Close()\nfile, err := os.Create(\"download.pdf\")\nif err != nil {\n\tlog.Fatal(err)\n}\ndefer file.Close()\nif _, err := io.Copy(file, resp.Body); err != nil {\n\tlog.Fatal(err)\n}"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import java.nio.file.Path;\nimport me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nclient.sessions().signatures().downloadDocument(\"11111111-2222-3333-4444-555555555555\", \"feature_signature\", \"11111111-2222-3333-4444-555555555555\")\n        .writeTo(Path.of(\"download.pdf\"));"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$content = $didit->sessions->signatures->downloadDocument('11111111-2222-3333-4444-555555555555', 'feature_signature', '11111111-2222-3333-4444-555555555555');\n$content->saveTo('download.pdf');"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\ncontent = didit.sessions.signatures.download_document(\n  \"11111111-2222-3333-4444-555555555555\",\n  \"feature_signature\",\n  \"11111111-2222-3333-4444-555555555555\"\n)\nFile.binwrite(\"download.pdf\", content)"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar content = await client.Sessions.Signatures.DownloadDocumentAsync(\"11111111-2222-3333-4444-555555555555\", \"feature_signature\", \"11111111-2222-3333-4444-555555555555\");\nawait content.SaveToAsync(\"download.pdf\");"
          }
        ]
      }
    },
    "/v3/session/{sessionId}/signatures/{nodeId}/evidence/": {
      "get": {
        "summary": "Signaturnachweis herunterladen",
        "description": "Laden Sie das Nachweis-PDF eines Unterzeichners herunter: Stufe und Format, Unterzeichner, IP-Adresse, jedes Dokument mit seinem ursprünglichen SHA-256-Wert und den Feldwerten sowie der SHA-256-Wert jeder signierten Datei; bei einer Advanced-(AES-)Signatur zusätzlich die verifizierte Identitätssitzung, die Code-Bestätigung, das Zertifikat und der Zeitstempel. Verwenden Sie den Pfad `evidence_file` des Eintrags des Unterzeichners in `signatures[]`.\n\nÜbergeben Sie immer `signature_id`, wenn ein Schritt der Unternehmensverifizierung (KYB) mehrere Unterzeichner hat: Ohne diese Angabe wählt die Route einen der Unterzeichner des Schritts aus. Erfordert `read:sessions`; Ihr API-Schlüssel funktioniert.",
        "operationId": "get_v3_session_signature_evidence",
        "x-didit-sdk": {
          "resource": "sessions.signatures",
          "method": "download_evidence",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Sessions"
        ],
        "parameters": [
          {
            "name": "sessionId",
            "in": "path",
            "required": true,
            "description": "Die Sitzung zur Benutzerverifizierung (KYC) oder Unternehmensverifizierung (KYB).",
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "11111111-2222-3333-4444-555555555555"
            }
          },
          {
            "name": "nodeId",
            "in": "path",
            "required": true,
            "description": "Der E-Signatur-Schritt: `node_id` des Elements in `signatures[]`.",
            "schema": {
              "type": "string",
              "example": "feature_signature"
            }
          },
          {
            "name": "signature_id",
            "in": "query",
            "required": false,
            "description": "`id` des Eintrags des Unterzeichners in `signatures[]`.",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "Das Nachweis-PDF.",
            "headers": {
              "Content-Disposition": {
                "description": "Anhang mit dem Dateinamen.",
                "schema": {
                  "type": "string",
                  "example": "attachment; filename=\"signature-evidence.pdf\""
                }
              }
            },
            "content": {
              "application/pdf": {
                "schema": {
                  "type": "string",
                  "format": "binary"
                }
              }
            }
          },
          "403": {
            "description": "Fehlende Anmeldedaten oder Anmeldedaten, die diese Sitzung nicht lesen können. Ein fehlender Schlüssel führt zu einer `403`-Antwort; ein falscher, widerrufener oder abgelaufener Schlüssel führt zu einer `401`-Antwort.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string"
                    }
                  }
                },
                "example": {
                  "detail": "You do not have permission to perform this action."
                }
              }
            }
          },
          "404": {
            "description": "Kein Nachweis stimmt überein: Die Sitzung, der Schritt oder der Unterzeichner existiert nicht, wurde gelöscht oder hat nicht unterzeichnet.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "string"
                    },
                    "detail": {
                      "type": "string"
                    }
                  }
                },
                "examples": {
                  "Not signed yet": {
                    "summary": "Der Unterzeichner hat nicht unterschrieben",
                    "value": {
                      "code": "signature_not_signed",
                      "detail": "signature_not_signed"
                    }
                  },
                  "Unknown signer": {
                    "summary": "Keine solche Signatur in diesem Schritt",
                    "value": {
                      "code": "signature_not_found",
                      "detail": "signature_not_found"
                    }
                  }
                }
              }
            }
          },
          "409": {
            "description": "Die gespeicherte Datei stimmt nicht mehr mit ihrem erfassten SHA-256 überein. Es wird nichts zurückgegeben.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "string"
                    },
                    "detail": {
                      "type": "string"
                    }
                  }
                },
                "examples": {
                  "Changed file": {
                    "summary": "Gespeicherte Datei stimmt nicht mit ihrem Hash überein",
                    "value": {
                      "code": "signature_document_changed",
                      "detail": "signature_document_changed"
                    }
                  }
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\ncontent = client.sessions.signatures.download_evidence(\n    \"11111111-2222-3333-4444-555555555555\",\n    \"feature_signature\",\n)\nwith open(\"download.pdf\", \"wb\") as file:\n    file.write(content)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import { writeFile } from \"node:fs/promises\";\nimport Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst content = await didit.sessions.signatures.downloadEvidence(\n  \"11111111-2222-3333-4444-555555555555\",\n  \"feature_signature\",\n);\nawait writeFile(\"download.pdf\", Buffer.from(await content.arrayBuffer()));"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresp, err := client.Sessions.Signatures.DownloadEvidence(ctx, \"11111111-2222-3333-4444-555555555555\", \"feature_signature\", didit.SessionsSignaturesDownloadEvidenceParams{})\nif err != nil {\n\tlog.Fatal(err)\n}\ndefer resp.Body.Close()\nfile, err := os.Create(\"download.pdf\")\nif err != nil {\n\tlog.Fatal(err)\n}\ndefer file.Close()\nif _, err := io.Copy(file, resp.Body); err != nil {\n\tlog.Fatal(err)\n}"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import java.nio.file.Path;\nimport me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nclient.sessions().signatures().downloadEvidence(\"11111111-2222-3333-4444-555555555555\", \"feature_signature\")\n        .writeTo(Path.of(\"download.pdf\"));"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$content = $didit->sessions->signatures->downloadEvidence('11111111-2222-3333-4444-555555555555', 'feature_signature');\n$content->saveTo('download.pdf');"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\ncontent = didit.sessions.signatures.download_evidence(\n  \"11111111-2222-3333-4444-555555555555\",\n  \"feature_signature\"\n)\nFile.binwrite(\"download.pdf\", content)"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar content = await client.Sessions.Signatures.DownloadEvidenceAsync(\"11111111-2222-3333-4444-555555555555\", \"feature_signature\");\nawait content.SaveToAsync(\"download.pdf\");"
          }
        ]
      }
    },
    "/v3/session/{sessionId}/signatures/{nodeId}/fields/{fieldId}/image/": {
      "get": {
        "summary": "Ein Signaturbild herunterladen",
        "description": "Laden Sie die Signatur oder die Initialen, die ein Unterzeichner auf ein Feld angebracht hat, als PNG herunter. Verwenden Sie die `image_url` des Felds in `signatures[].documents[].fields[]`. Erfordert `read:sessions`; Ihr API-Schlüssel funktioniert.",
        "operationId": "get_v3_session_signature_field_image",
        "x-didit-sdk": {
          "resource": "sessions.signatures",
          "method": "download_field_image",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Sessions"
        ],
        "parameters": [
          {
            "name": "sessionId",
            "in": "path",
            "required": true,
            "description": "Die Sitzung zur Benutzerverifizierung (KYC) oder Unternehmensverifizierung (KYB).",
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "11111111-2222-3333-4444-555555555555"
            }
          },
          {
            "name": "nodeId",
            "in": "path",
            "required": true,
            "description": "Der E-Signatur-Schritt: `node_id` des Elements in `signatures[]`.",
            "schema": {
              "type": "string",
              "example": "feature_signature"
            }
          },
          {
            "name": "fieldId",
            "in": "path",
            "required": true,
            "description": "Das Feld auf der Kopie für diesen Unterzeichner, wie in der `image_url` des Felds.",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "Das Bild.",
            "content": {
              "image/png": {
                "schema": {
                  "type": "string",
                  "format": "binary"
                }
              }
            }
          },
          "400": {
            "description": "Das gespeicherte Bild stimmt nicht mehr mit seinem erfassten SHA-256 überein.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "string"
                    },
                    "detail": {
                      "type": "string"
                    }
                  }
                },
                "example": {
                  "code": "signature_document_changed",
                  "detail": "signature_document_changed"
                }
              }
            }
          },
          "403": {
            "description": "Fehlende Anmeldedaten oder Anmeldedaten, die diese Sitzung nicht lesen können. Ein fehlender Schlüssel führt zu einer `403`-Antwort; ein falscher, widerrufener oder abgelaufener Schlüssel führt zu einer `401`-Antwort.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string"
                    }
                  }
                },
                "example": {
                  "detail": "You do not have permission to perform this action."
                }
              }
            }
          },
          "404": {
            "description": "Kein Bild stimmt überein: Die Sitzung, der Schritt oder das Feld existiert nicht, wurde gelöscht oder es wurden keine Signatur oder Initialen angewendet.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "string"
                    },
                    "detail": {
                      "type": "string"
                    }
                  }
                },
                "examples": {
                  "Unknown field": {
                    "summary": "Kein solches Feld",
                    "value": {
                      "code": "signature_field_not_found",
                      "detail": "signature_field_not_found"
                    }
                  }
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\ncontent = client.sessions.signatures.download_field_image(\n    \"11111111-2222-3333-4444-555555555555\",\n    \"feature_signature\",\n    \"11111111-2222-3333-4444-555555555555\",\n)\nwith open(\"download.png\", \"wb\") as file:\n    file.write(content)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import { writeFile } from \"node:fs/promises\";\nimport Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst content = await didit.sessions.signatures.downloadFieldImage(\n  \"11111111-2222-3333-4444-555555555555\",\n  \"feature_signature\",\n  \"11111111-2222-3333-4444-555555555555\",\n);\nawait writeFile(\"download.png\", Buffer.from(await content.arrayBuffer()));"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresp, err := client.Sessions.Signatures.DownloadFieldImage(ctx, \"11111111-2222-3333-4444-555555555555\", \"feature_signature\", \"11111111-2222-3333-4444-555555555555\")\nif err != nil {\n\tlog.Fatal(err)\n}\ndefer resp.Body.Close()\nfile, err := os.Create(\"download.png\")\nif err != nil {\n\tlog.Fatal(err)\n}\ndefer file.Close()\nif _, err := io.Copy(file, resp.Body); err != nil {\n\tlog.Fatal(err)\n}"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import java.nio.file.Path;\nimport me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nclient.sessions().signatures().downloadFieldImage(\"11111111-2222-3333-4444-555555555555\", \"feature_signature\", \"11111111-2222-3333-4444-555555555555\")\n        .writeTo(Path.of(\"download.png\"));"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$content = $didit->sessions->signatures->downloadFieldImage('11111111-2222-3333-4444-555555555555', 'feature_signature', '11111111-2222-3333-4444-555555555555');\n$content->saveTo('download.png');"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\ncontent = didit.sessions.signatures.download_field_image(\n  \"11111111-2222-3333-4444-555555555555\",\n  \"feature_signature\",\n  \"11111111-2222-3333-4444-555555555555\"\n)\nFile.binwrite(\"download.png\", content)"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar content = await client.Sessions.Signatures.DownloadFieldImageAsync(\"11111111-2222-3333-4444-555555555555\", \"feature_signature\", \"11111111-2222-3333-4444-555555555555\");\nawait content.SaveToAsync(\"download.png\");"
          }
        ]
      }
    },
    "/v3/session/{sessionId}/signatures/{nodeId}/validate/": {
      "post": {
        "summary": "Signaturen erneut validieren",
        "description": "Überprüfen Sie die signierten Dokumente eines E-Signatur-Schritts erneut. Didit liest jedes signierte PDF erneut ein, prüft dessen SHA-256 und validiert bei einer fortgeschrittenen Signatur (AES) die PAdES-Signatur, das Zertifikat, die Sperrdaten sowie den Zeitstempel (eine einfache Signatur hat keine digitale Signatur, daher wird nur die Dateiintegrität geprüft). Anschließend speichert Didit das Ergebnis in `validation` des jeweiligen Unterzeichners und gibt die aktualisierten Elemente zurück. Es wird nichts erneut signiert. Übergeben Sie `signature_id`, um einen einzelnen Unterzeichner zu prüfen; ohne diesen Parameter wird jeder Unterzeichner des Schritts geprüft, und der Aufruf schlägt fehl, wenn einer von ihnen noch nicht signiert hat.\n\nErfordert `write:sessions`; Ihr API-Schlüssel funktioniert. In der Konsole ist dies die Schaltfläche **Validate again**.",
        "operationId": "post_v3_session_signature_validate",
        "x-didit-sdk": {
          "resource": "sessions.signatures",
          "method": "validate",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Sessions"
        ],
        "parameters": [
          {
            "name": "sessionId",
            "in": "path",
            "required": true,
            "description": "Die Sitzung zur Benutzerverifizierung (KYC) oder Unternehmensverifizierung (KYB).",
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "11111111-2222-3333-4444-555555555555"
            }
          },
          {
            "name": "nodeId",
            "in": "path",
            "required": true,
            "description": "Der E-Signatur-Schritt: `node_id` des Elements in `signatures[]`.",
            "schema": {
              "type": "string",
              "example": "feature_signature"
            }
          }
        ],
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "signature_id": {
                    "type": "string",
                    "format": "uuid",
                    "description": "`id` des Eintrags eines Unterzeichners in `signatures[]`."
                  }
                }
              },
              "example": {
                "signature_id": "0e6c2a8e-6c2f-4b8e-9a51-3f2f6a7d9b10"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Die geprüften Unterzeichner mit ihrer aktualisierten `validation`.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "signatures": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/SignatureResult"
                      }
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Ein gespeichertes signiertes PDF stimmt nicht mehr mit dem beim Signieren erfassten SHA-256 überein.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "string"
                    },
                    "detail": {
                      "type": "string"
                    }
                  }
                },
                "examples": {
                  "Document changed": {
                    "summary": "Eine signierte Datei stimmt nicht mehr mit ihrem Hash überein",
                    "value": {
                      "code": "signature_document_changed",
                      "detail": "signature_document_changed"
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Fehlende Anmeldedaten oder Anmeldedaten, die diese Sitzung nicht lesen können. Ein fehlender Schlüssel führt zu einer `403`-Antwort; ein falscher, widerrufener oder abgelaufener Schlüssel führt zu einer `401`-Antwort.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string"
                    }
                  }
                },
                "example": {
                  "detail": "You do not have permission to perform this action."
                }
              }
            }
          },
          "404": {
            "description": "Keine Signatur stimmt überein: Die Sitzung, der Schritt oder der Unterzeichner existiert nicht oder wurde gelöscht.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "string"
                    },
                    "detail": {
                      "type": "string"
                    }
                  }
                },
                "examples": {
                  "Unknown signer": {
                    "summary": "Keine solche Signatur in diesem Schritt",
                    "value": {
                      "code": "signature_not_found",
                      "detail": "signature_not_found"
                    }
                  }
                }
              }
            }
          },
          "409": {
            "description": "Ein Unterzeichner des Schritts hat noch nicht signiert, daher gibt es nichts zu validieren.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "string"
                    },
                    "detail": {
                      "type": "string"
                    }
                  }
                },
                "examples": {
                  "Not signed": {
                    "summary": "Ein Unterzeichner hat noch nicht signiert",
                    "value": {
                      "code": "signature_not_signed",
                      "detail": "signature_not_signed"
                    }
                  }
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.sessions.signatures.validate(\n    \"11111111-2222-3333-4444-555555555555\",\n    \"feature_signature\",\n    signature_id=\"0e6c2a8e-6c2f-4b8e-9a51-3f2f6a7d9b10\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.sessions.signatures.validate(\n  \"11111111-2222-3333-4444-555555555555\",\n  \"feature_signature\",\n  {\n    signature_id: \"0e6c2a8e-6c2f-4b8e-9a51-3f2f6a7d9b10\",\n  },\n);\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Sessions.Signatures.Validate(ctx, \"11111111-2222-3333-4444-555555555555\", \"feature_signature\", didit.SessionsSignaturesValidateParams{\n\tSignatureID: didit.String(\"0e6c2a8e-6c2f-4b8e-9a51-3f2f6a7d9b10\"),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\nimport me.didit.types.SessionsSignaturesValidateParams;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.sessions().signatures().validate(\"11111111-2222-3333-4444-555555555555\", \"feature_signature\", SessionsSignaturesValidateParams.builder()\n        .signatureId(\"0e6c2a8e-6c2f-4b8e-9a51-3f2f6a7d9b10\")\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->sessions->signatures->validate('11111111-2222-3333-4444-555555555555', 'feature_signature', [\n    'signature_id' => '0e6c2a8e-6c2f-4b8e-9a51-3f2f6a7d9b10',\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.sessions.signatures.validate(\n  \"11111111-2222-3333-4444-555555555555\",\n  \"feature_signature\",\n  signature_id: \"0e6c2a8e-6c2f-4b8e-9a51-3f2f6a7d9b10\"\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Sessions.Signatures.ValidateAsync(\"11111111-2222-3333-4444-555555555555\", \"feature_signature\", new SessionsSignaturesValidateParams\n{\n    SignatureId = \"0e6c2a8e-6c2f-4b8e-9a51-3f2f6a7d9b10\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ]
      }
    },
    "/v3/document-ai/{sessionId}/documents/{documentUuid}/": {
      "patch": {
        "summary": "Document AI-Dokument aktualisieren",
        "description": "Korrigieren Sie die von Document AI aus einem hochgeladenen Dokument extrahierten Felder, legen Sie dessen Prüfstatus fest oder beides in einer KYC- oder KYB-Sitzung. `extracted_data` muss ein JSON-Objekt sein und wird Schlüssel für Schlüssel zusammengeführt: Ein von Ihnen gesendeter Schlüssel ersetzt den gespeicherten Wert (ein als `null` gesendeter Schlüssel wird als `null` gespeichert), und weggelassene Schlüssel behalten ihre Werte. Der Dokumentenstatus fließt in das Document AI-Ergebnis seines Workflow-Knotens in der Sitzungsentscheidung ein; der Sitzungsstatus selbst wird nicht neu berechnet. Jeder erfolgreiche Aufruf, auch einer, der nichts ändert, sendet einen `data.updated`-[Webhook](https://docs.didit.me/de/integration/webhooks) mit dem Auslöser `manual_review`. Ein berechtigungsbeschränkter API-Schlüssel erfordert `decisions: write`; siehe [Document AI](https://docs.didit.me/de/core-technology/document-ai/overview).",
        "operationId": "patch_v3_document_ai_document",
        "x-didit-sdk": {
          "resource": "sessions",
          "method": "update_document_ai_data",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Sessions"
        ],
        "parameters": [
          {
            "name": "sessionId",
            "in": "path",
            "required": true,
            "description": "UUID der Verifizierungssitzung (die von `POST /v3/session/` zurückgegebene `session_id`). Akzeptiert Sitzungs-IDs sowohl für die Benutzerverifizierung (KYC) als auch für die Unternehmensverifizierung (KYB): Der Server löst die ID über beide Sitzungstypen hinweg auf. Muss eine wohlgeformte UUID sein; ein fehlerhafter Wert entspricht nicht der Route und gibt ein HTML-`404` zurück.",
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "11111111-2222-3333-4444-555555555555"
            }
          },
          {
            "name": "documentUuid",
            "in": "path",
            "required": true,
            "description": "UUID des Document AI-Dokuments (`document_ai_documents[].items[].uuid` in `GET /v3/session/{sessionId}/decision/`). Es muss zu der Sitzung im Pfad gehören.",
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "44444444-5555-6666-7777-888888888888"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "extracted_data": {
                    "type": "object",
                    "additionalProperties": true,
                    "description": "Feldschlüssel (die von Ihnen für das Dokument konfigurierten Schlüssel) und deren korrigierte Werte. Muss ein JSON-Objekt sein; wird Schlüssel für Schlüssel in die gespeicherten Daten zusammengeführt. Lassen Sie das Feld lieber weg, anstatt `null` zu senden, was zu einem `400` führt.",
                    "example": {
                      "invoice_number": "INV-2026-0042"
                    }
                  },
                  "status": {
                    "type": "string",
                    "enum": [
                      "Approved",
                      "Declined",
                      "In Review",
                      "Not Finished"
                    ],
                    "description": "Neuer Prüfungsstatus des Dokuments.",
                    "example": "Approved"
                  }
                }
              },
              "example": {
                "extracted_data": {
                  "invoice_number": "INV-2026-0042"
                },
                "status": "Approved"
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X PATCH 'https://verification.didit.me/v3/document-ai/11111111-2222-3333-4444-555555555555/documents/44444444-5555-6666-7777-888888888888/' \\\n  -H 'x-api-key: YOUR_API_KEY' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\"extracted_data\": {\"invoice_number\": \"INV-2026-0042\"}, \"status\": \"Approved\"}'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.sessions.update_document_ai_data(\n    \"11111111-2222-3333-4444-555555555555\",\n    \"44444444-5555-6666-7777-888888888888\",\n    extracted_data={\"invoice_number\": \"INV-2026-0042\"},\n    status=\"Approved\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.sessions.updateDocumentAiData(\n  \"11111111-2222-3333-4444-555555555555\",\n  \"44444444-5555-6666-7777-888888888888\",\n  {\n    extracted_data: { invoice_number: \"INV-2026-0042\" },\n    status: \"Approved\",\n  },\n);\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Sessions.UpdateDocumentAiData(ctx, \"11111111-2222-3333-4444-555555555555\", \"44444444-5555-6666-7777-888888888888\", didit.SessionsUpdateDocumentAiDataParams{\n\tExtractedData: didit.Some(map[string]any{\"invoice_number\": \"INV-2026-0042\"}),\n\tStatus:        didit.Some(didit.SessionsUpdateDocumentAiDataParamsStatus(\"Approved\")),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import java.util.Map;\nimport me.didit.Didit;\nimport me.didit.types.SessionsUpdateDocumentAiDataParams;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.sessions().updateDocumentAiData(\"11111111-2222-3333-4444-555555555555\", \"44444444-5555-6666-7777-888888888888\", SessionsUpdateDocumentAiDataParams.builder()\n        .extractedData(Map.of(\"invoice_number\", \"INV-2026-0042\"))\n        .status(SessionsUpdateDocumentAiDataParams.Status.of(\"Approved\"))\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->sessions->updateDocumentAiData('11111111-2222-3333-4444-555555555555', '44444444-5555-6666-7777-888888888888', [\n    'extracted_data' => ['invoice_number' => 'INV-2026-0042'],\n    'status' => 'Approved',\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.sessions.update_document_ai_data(\n  \"11111111-2222-3333-4444-555555555555\",\n  \"44444444-5555-6666-7777-888888888888\",\n  extracted_data: { invoice_number: \"INV-2026-0042\" },\n  status: \"Approved\"\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Collections.Generic;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Sessions.UpdateDocumentAiDataAsync(\"11111111-2222-3333-4444-555555555555\", \"44444444-5555-6666-7777-888888888888\", new SessionsUpdateDocumentAiDataParams\n{\n    ExtractedData = new Dictionary<string, object> { [\"invoice_number\"] = \"INV-2026-0042\" },\n    Status = new SessionsUpdateDocumentAiDataParamsStatus(\"Approved\"),\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "responses": {
          "200": {
            "description": "Dokument aktualisiert. Gibt das Dokument nach dem Merge zurück.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "uuid",
                    "document_key",
                    "original_filename",
                    "file_url",
                    "status",
                    "extracted_data"
                  ],
                  "properties": {
                    "uuid": {
                      "type": "string",
                      "format": "uuid",
                      "description": "Dokumentenbezeichner."
                    },
                    "document_key": {
                      "type": "string",
                      "description": "Das konfigurierte Dokument, dem dieser Upload entspricht."
                    },
                    "original_filename": {
                      "type": "string",
                      "nullable": true,
                      "description": "Dateiname, mit dem das Dokument hochgeladen wurde."
                    },
                    "file_url": {
                      "type": "string",
                      "nullable": true,
                      "description": "Speicherpfad der hochgeladenen Datei. Dies ist kein Download-Link: Lesen Sie die vorab signierte `file_url` aus der Sitzungsentscheidung aus, um die Datei herunterzuladen."
                    },
                    "status": {
                      "type": "string",
                      "enum": [
                        "Not Finished",
                        "Approved",
                        "Declined",
                        "In Review",
                        "Resub Requested"
                      ],
                      "description": "Prüfstatus des Dokuments."
                    },
                    "extracted_data": {
                      "type": "object",
                      "nullable": true,
                      "additionalProperties": true,
                      "description": "Alle extrahierten Felder nach der Zusammenführung, indexiert nach Feldschlüssel."
                    }
                  }
                },
                "example": {
                  "uuid": "44444444-5555-6666-7777-888888888888",
                  "document_key": "invoice",
                  "original_filename": "invoice-2026-09.pdf",
                  "file_url": "document_ai/11111111-2222-3333-4444-555555555555-66666666-7777-8888-9999-000000000000.pdf",
                  "status": "Approved",
                  "extracted_data": {
                    "invoice_number": "INV-2026-0042",
                    "total_amount": 1250.0,
                    "issue_date": "2026-09-01"
                  }
                }
              }
            }
          },
          "400": {
            "description": "Validierungsfehler, der vor dem Nachschlagen des Dokuments geprüft wird: `status` ist keiner der zulässigen Werte oder `extracted_data` wurde als `null` übermittelt.",
            "content": {
              "application/json": {
                "examples": {
                  "Invalid status": {
                    "summary": "status nicht im Enum enthalten",
                    "value": {
                      "status": [
                        "\"Rejected\" is not a valid choice."
                      ]
                    }
                  },
                  "Null extracted_data": {
                    "summary": "extracted_data ist null",
                    "value": {
                      "extracted_data": [
                        "This field may not be null."
                      ]
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Der API-Schlüssel mit eingeschränktem Geltungsbereich ist abgelaufen. Dies ist der einzige Fall, der `401` zurückgibt: Ein fehlender, ungültiger oder widerrufener Schlüssel gibt `403` zurück.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string",
                      "description": "Lesbare Fehlermeldung."
                    }
                  }
                },
                "examples": {
                  "Expired key": {
                    "summary": "Das Ablaufdatum des Schlüssels ist überschritten",
                    "value": {
                      "detail": "This API key has expired."
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Authentifizierungs- oder Autorisierungsfehler. Ein fehlender Schlüssel gibt `403` zurück, ebenso wie der Schlüssel einer anderen Anwendung, ein berechtigungsbeschränkter Schlüssel ohne die für diesen Endpoint erforderliche Berechtigung sowie eine Anfrage von außerhalb der IP-Allowlist des Schlüssels; ein falscher, widerrufener oder abgelaufener Schlüssel gibt `401` zurück. Unterscheiden Sie diese anhand von `detail`.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string",
                      "description": "Lesbare Fehlermeldung."
                    }
                  }
                },
                "examples": {
                  "Missing or invalid credentials": {
                    "summary": "Kein x-api-key-Header vorhanden oder die Validierung des Schlüssels ist fehlgeschlagen",
                    "value": {
                      "detail": "Authentication credentials were not provided or are invalid."
                    }
                  },
                  "Other application": {
                    "summary": "Ein gültiger Schlüssel, der zu einer anderen Anwendung als die Sitzung gehört",
                    "value": {
                      "detail": "You do not have permission to perform this action."
                    }
                  },
                  "Scoped key without decisions write": {
                    "summary": "Dem Schlüssel mit eingeschränktem Berechtigungsumfang fehlt decisions: write",
                    "value": {
                      "detail": "This API key has no write access to decisions."
                    }
                  },
                  "IP not allowed": {
                    "summary": "Anfrage von außerhalb der IP-Allowlist des Schlüssels",
                    "value": {
                      "detail": "This API key can't be used from this IP address."
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Die Sitzung existiert nicht, wurde gelöscht oder liegt außerhalb der Beschränkungen eines Scoped Keys, oder es gehört kein aktuelles Dokument mit dieser UUID dazu. Die Sitzungssuche erfolgt vor der Prüfung der Anmeldedaten, sodass eine unbekannte `sessionId` auch ohne gültigen Schlüssel `404` zurückgibt.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string",
                      "description": "Lesbare Fehlermeldung."
                    }
                  }
                },
                "examples": {
                  "Unknown session": {
                    "summary": "Es existiert keine Sitzung mit dieser ID oder sie wurde gelöscht",
                    "value": {
                      "detail": "Not found."
                    }
                  },
                  "Outside key limits": {
                    "summary": "Die Sitzung liegt außerhalb der Beschränkungen eines Scoped Keys (wird auch für eine vor Kurzem gelöschte Sitzung zurückgegeben)",
                    "value": {
                      "detail": "Session not found."
                    }
                  },
                  "Unknown document": {
                    "summary": "documentUuid gehört nicht zur Sitzung",
                    "value": {
                      "detail": "Document AI document not found."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate-Limit überschritten: 300 Schreibanfragen (POST, PATCH, DELETE) pro Minute pro API-Schlüssel. Warten Sie `Retry-After` Sekunden vor einem Wiederholungsversuch; die `X-RateLimit-*`-Header zeigen das Budget an.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string",
                      "description": "Lesbare Fehlermeldung."
                    }
                  }
                },
                "examples": {
                  "Rate limited": {
                    "summary": "Budget für die aktuelle Minute erschöpft",
                    "value": {
                      "detail": "Write request rate limit exceeded. You can make up to 300 requests per minute."
                    }
                  }
                }
              }
            },
            "headers": {
              "Retry-After": {
                "description": "Sekunden, die vor einem Wiederholungsversuch gewartet werden müssen.",
                "schema": {
                  "type": "integer",
                  "minimum": 1,
                  "example": 30
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/v3/aml/dataset-freshness/": {
      "get": {
        "summary": "Aktualität des AML-Datensatzes abrufen",
        "description": "Geben Sie an, wie aktuell die Datensätze hinter dem AML-Screening pro Quellenfamilie (`sanctions`, `pep`, `warnings`, `adverse_media`) sind, als Audit-Nachweis für die [laufende AML-Überwachung](https://docs.didit.me/de/core-technology/aml-screening/continuous-monitoring-aml-screening#nachweis-über-die-durchführung-der-überwachung). Die Antwort gilt plattformweit: keine Sitzung im Pfad, keine Kundendaten im Body, dieselbe Antwort für jede Anwendung.\n\nImmer `200` für einen akzeptierten Schlüssel. Prüfen Sie zuerst `availability`: Wenn sie nicht `available` ist, ist `dataset_freshness` gleich `null`. Datumsangaben werden niemals geschätzt: Eine Familie, deren Datensätze kein Datum gemeldet haben, fehlt in `sources`, und eine Familie, bei der nur einige Datensätze eines gemeldet haben, weist `oldest_updated_at: null` auf. Messungen werden während der laufenden Überwachung erfasst, nicht bei jedem Aufruf; `captured_at` gibt den Zeitpunkt an.\n\nEin berechtigungsbeschränkter API-Schlüssel benötigt `sessions: read`; ein Schlüssel, der auf bestimmte Workflows oder genehmigte Sitzungen beschränkt ist, kann diesen Endpoint nicht aufrufen. Es wird nichts in Rechnung gestellt.",
        "operationId": "get_aml_dataset_freshness",
        "x-didit-sdk": {
          "resource": "aml",
          "method": "retrieve_dataset_freshness",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Standalone APIs"
        ],
        "parameters": [],
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X GET 'https://verification.didit.me/v3/aml/dataset-freshness/' \\\n  -H 'x-api-key: YOUR_API_KEY'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.aml.retrieve_dataset_freshness()\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.aml.retrieveDatasetFreshness();\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.AML.RetrieveDatasetFreshness(ctx)\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.aml().retrieveDatasetFreshness();\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->aml->retrieveDatasetFreshness();\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.aml.retrieve_dataset_freshness\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Aml.RetrieveDatasetFreshnessAsync();\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "responses": {
          "200": {
            "description": "Der neueste Messwert zur Aktualität des Datensatzes oder `null` mit der Begründung.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "dataset_freshness",
                    "availability"
                  ],
                  "properties": {
                    "dataset_freshness": {
                      "allOf": [
                        {
                          "$ref": "#/components/schemas/AMLDatasetFreshness"
                        }
                      ],
                      "nullable": true,
                      "description": "Der neueste Messwert oder `null`, wenn `availability` nicht `available` ist."
                    },
                    "availability": {
                      "type": "string",
                      "enum": [
                        "available",
                        "not_configured",
                        "not_yet_collected"
                      ],
                      "description": "`available`, wenn ein Messwert vorhanden ist; `not_configured`, wenn Datumsangaben der Datensätze in dieser Umgebung nicht erfasst werden; `not_yet_collected`, wenn die Erfassung eingerichtet ist, aber noch kein Messwert vorliegt."
                    }
                  }
                },
                "examples": {
                  "Available": {
                    "value": {
                      "dataset_freshness": {
                        "captured_at": "2026-10-17T06:00:12.345678+00:00",
                        "provider": "aml_data_source",
                        "catalog_version": "20261017054500-abc",
                        "sources": {
                          "sanctions": {
                            "last_updated_at": "2026-10-17T04:10:00+00:00",
                            "oldest_updated_at": "2026-10-15T22:30:00+00:00",
                            "dataset_count": 48,
                            "dated_dataset_count": 48
                          },
                          "pep": {
                            "last_updated_at": "2026-10-16T23:05:00+00:00",
                            "oldest_updated_at": null,
                            "dataset_count": 12,
                            "dated_dataset_count": 11
                          }
                        }
                      },
                      "availability": "available"
                    }
                  },
                  "Not collected yet": {
                    "value": {
                      "dataset_freshness": null,
                      "availability": "not_yet_collected"
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Der API-Schlüssel ist abgelaufen. Nur ein Schlüssel, der mit einem Ablaufdatum erstellt wurde, kann ablaufen; nach diesem Datum antwortet jede Anfrage damit mit `401`.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string"
                    }
                  }
                },
                "examples": {
                  "Expired key": {
                    "value": {
                      "detail": "This API key has expired."
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Die Anfrage ist nicht zulässig. Bei einem fehlenden Schlüssel wird die generische Nachricht zurückgegeben; ein falscher, widerrufener oder abgelaufener Schlüssel erhält `401`.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string"
                    }
                  }
                },
                "examples": {
                  "Missing or invalid key": {
                    "value": {
                      "detail": "You do not have permission to perform this action."
                    }
                  },
                  "Scoped key without sessions read": {
                    "value": {
                      "detail": "This API key has no read access to sessions."
                    }
                  },
                  "Key limited to workflows or approved sessions": {
                    "value": {
                      "detail": "This API key only reaches sessions inside its workflow or status limits, so it can't use this endpoint."
                    }
                  },
                  "Outside the key's IP list": {
                    "value": {
                      "detail": "This API key can't be used from this IP address."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Mehr als 600 GET-Anfragen pro Minute mit diesem API-Schlüssel. Warten Sie die Anzahl der Sekunden in `Retry-After` ab und führen Sie dann einen Wiederholungsversuch durch.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string"
                    }
                  }
                },
                "examples": {
                  "Throttled": {
                    "value": {
                      "detail": "GET request rate limit exceeded. You can make up to 600 requests per minute."
                    }
                  }
                }
              }
            },
            "headers": {
              "Retry-After": {
                "description": "Sekunden bis zum Zurücksetzen des aktuellen Ein-Minuten-Fensters.",
                "schema": {
                  "type": "integer",
                  "example": 23
                }
              },
              "X-RateLimit-Limit": {
                "description": "Pro Minute in diesem Budget zulässige Anfragen.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Im aktuellen Zeitfenster verbleibende Anfragen.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix-Zeit, zu der das Zeitfenster zurückgesetzt wird.",
                "schema": {
                  "type": "integer"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/v3/lists/": {
      "get": {
        "summary": "Listen auflisten",
        "description": "Gibt die Listen der Anwendung zurück, die neuesten zuerst: die von Didit bereitgestellten Systemlisten (eine Sperrliste pro Eintragstyp, die benutzerdefinierte Liste **High Risk Countries** und etwaige System-Positivlisten) sowie die von Ihnen erstellten Positivlisten und benutzerdefinierten Listen. Filtern Sie mit `list_type` und `entry_type`; gelöschte Listen werden nie angezeigt. Die Ergebnisse werden mit `limit` und `offset` paginiert. Ein API-Schlüssel mit eingeschränktem Berechtigungsumfang benötigt `workflows: read`. Unter [Listen](https://docs.didit.me/de/management-api/lists/overview) erfahren Sie, wozu die einzelnen Listentypen dienen.",
        "operationId": "list_lists",
        "x-didit-sdk": {
          "resource": "lists",
          "method": "list",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Lists"
        ],
        "parameters": [
          {
            "name": "list_type",
            "in": "query",
            "required": false,
            "description": "Nur Listen dieses Typs.",
            "schema": {
              "type": "string",
              "enum": [
                "blocklist",
                "allowlist",
                "custom"
              ]
            }
          },
          {
            "name": "entry_type",
            "in": "query",
            "required": false,
            "description": "Nur Listen dieses Eintragstyps.",
            "schema": {
              "type": "string",
              "enum": [
                "face",
                "document",
                "phone",
                "email",
                "ip_address",
                "device_fingerprint",
                "wallet_address",
                "bank_account",
                "country",
                "user",
                "business",
                "key"
              ]
            }
          },
          {
            "name": "ordering",
            "in": "query",
            "required": false,
            "description": "Sortierreihenfolge: `-created_at` (neueste zuerst, Standardwert) oder `created_at` (älteste zuerst).",
            "schema": {
              "type": "string",
              "enum": [
                "-created_at",
                "created_at"
              ],
              "default": "-created_at"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Seitengröße. Standardmäßig 50. Ein Wert über 1000000 gibt `400` zurück; 0, ein negativer oder ein nicht-numerischer Wert fällt auf 50 zurück.",
            "schema": {
              "type": "integer",
              "default": 50,
              "minimum": 1,
              "maximum": 1000000
            }
          },
          {
            "name": "offset",
            "in": "query",
            "required": false,
            "description": "Nullbasierter Index des ersten zurückzugebenden Elements. Folgen Sie vorzugsweise `next`. Ein Wert über 1000000 gibt `400` zurück; ein negativer oder nicht-numerischer Wert fällt auf 0 zurück.",
            "schema": {
              "type": "integer",
              "default": 0,
              "minimum": 0,
              "maximum": 1000000
            }
          }
        ],
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X GET 'https://verification.didit.me/v3/lists/?list_type=blocklist' \\\n  -H 'x-api-key: YOUR_API_KEY'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nfor item in client.lists.list():\n    print(item)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nfor await (const item of didit.lists.list()) {\n  console.log(item);\n}"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\niter := client.Lists.ListAutoPaging(ctx, didit.ListsListParams{})\nfor iter.Next() {\n\tfmt.Printf(\"%+v\\n\", iter.Current())\n}\nif err := iter.Err(); err != nil {\n\tlog.Fatal(err)\n}"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nfor (var item : client.lists().list()) {\n    System.out.println(item);\n}"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\nforeach ($didit->lists->list() as $item) {\n    print_r($item->toArray());\n}"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\ndidit.lists.list.auto_paging_each do |item|\n  puts item.to_h\nend"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nawait foreach (var item in await client.Lists.ListAsync())\n{\n    Console.WriteLine(JsonSerializer.Serialize(item));\n}"
          }
        ],
        "responses": {
          "200": {
            "description": "Eine Seite mit Listen.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "count",
                    "next",
                    "previous",
                    "results"
                  ],
                  "properties": {
                    "count": {
                      "type": "integer",
                      "minimum": 0,
                      "description": "Gesamtzahl der Listen, die den Filtern entsprechen."
                    },
                    "next": {
                      "type": "string",
                      "format": "uri",
                      "nullable": true,
                      "description": "Absolute URL der nächsten Seite oder `null` auf der letzten Seite."
                    },
                    "previous": {
                      "type": "string",
                      "format": "uri",
                      "nullable": true,
                      "description": "Absolute URL der vorherigen Seite oder `null` auf der ersten Seite."
                    },
                    "results": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/ComplianceList"
                      }
                    }
                  }
                },
                "examples": {
                  "Lists": {
                    "value": {
                      "count": 2,
                      "next": null,
                      "previous": null,
                      "results": [
                        {
                          "uuid": "22222222-3333-4444-5555-666666666666",
                          "name": "Trusted office IPs",
                          "description": "Office egress ranges",
                          "list_type": "allowlist",
                          "entry_type": "ip_address",
                          "is_system": false,
                          "entry_count": 3,
                          "last_entry_added_at": "2026-10-02T08:15:27.501334Z",
                          "created_at": "2026-09-30T13:20:45.889120Z",
                          "updated_at": "2026-09-30T13:20:45.889120Z"
                        },
                        {
                          "uuid": "11111111-2222-3333-4444-555555555555",
                          "name": "Face Blocklist",
                          "description": "Blocked biometric faces. When a face matching an entry in this list is detected during liveness verification, the session will be automatically declined.",
                          "list_type": "blocklist",
                          "entry_type": "face",
                          "is_system": true,
                          "entry_count": 12,
                          "last_entry_added_at": "2026-10-09T16:42:03.118204Z",
                          "created_at": "2026-01-14T10:02:11.402917Z",
                          "updated_at": "2026-01-14T10:02:11.402917Z"
                        }
                      ]
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Ein Abfrageparameter ist ungültig.",
            "content": {
              "application/json": {
                "examples": {
                  "Unknown list type": {
                    "value": {
                      "list_type": [
                        "\"denylist\" is not a valid choice."
                      ]
                    }
                  },
                  "Unsupported ordering": {
                    "value": {
                      "ordering": [
                        "\"name\" is not a valid choice."
                      ]
                    }
                  },
                  "Limit too large": {
                    "value": [
                      "limit must not exceed 1000000."
                    ]
                  }
                }
              }
            }
          },
          "401": {
            "description": "Der API-Schlüssel mit eingeschränktem Geltungsbereich ist abgelaufen. Andere Authentifizierungsfehler geben `403` zurück.",
            "content": {
              "application/json": {
                "examples": {
                  "Expired API key": {
                    "value": {
                      "detail": "This API key has expired."
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Der `x-api-key`-Header fehlt (ein falscher, widerrufener oder abgelaufener Schlüssel erhält `401`), oder ein berechtigungseingeschränkter API-Schlüssel verfügt nicht über `workflows: read` oder wird von einer IP-Adresse außerhalb seiner Zulassungsliste verwendet.",
            "content": {
              "application/json": {
                "examples": {
                  "Missing or invalid API key": {
                    "value": {
                      "detail": "You do not have permission to perform this action."
                    }
                  },
                  "Scoped key without workflows access": {
                    "value": {
                      "detail": "This API key has no read access to workflows."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Das geteilte Leselimit von 600 Anfragen pro Minute pro API-Schlüssel wurde überschritten. Beachten Sie `Retry-After`, bevor Sie es erneut versuchen.",
            "content": {
              "application/json": {
                "examples": {
                  "Rate limited": {
                    "value": {
                      "detail": "GET request rate limit exceeded. You can make up to 600 requests per minute."
                    }
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      },
      "post": {
        "summary": "Erstellen Sie eine Liste",
        "description": "Erstellt eine Positivliste oder eine benutzerdefinierte Liste in der Anwendung, zu der der API-Schlüssel gehört. Sperrlisten können nicht erstellt werden: Didit stellt eine System-Sperrliste pro Eintragstyp bereit, die Sie mit [Listeneintrag erstellen](https://docs.didit.me/de/management-api/lists/create-entry) erweitern können. `entry_type` kann nach der Erstellung nicht mehr geändert werden und bestimmt, wie Eintragswerte validiert und abgeglichen werden. Positivlisten-Einträge markieren übereinstimmende Elemente als vertrauenswürdig (beispielsweise überspringt eine Gesichts-Positivliste die Aktion für doppelte Gesichter) und heben einen Sperrlisten-Treffer niemals auf; verweisen Sie über eine Workflow- oder Transaktionsregel-Bedingung mit `value_type: \"list\"` auf beliebige Listen. Ein API-Schlüssel mit eingeschränktem Berechtigungsumfang erfordert `workflows: write`.",
        "operationId": "create_list",
        "x-didit-sdk": {
          "resource": "lists",
          "method": "create",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Lists"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "name",
                  "list_type",
                  "entry_type"
                ],
                "properties": {
                  "name": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 255,
                    "description": "Listenname. Muss sich vom Namen jeder anderen Liste der Anwendung unterscheiden, einschließlich Systemlisten."
                  },
                  "description": {
                    "type": "string",
                    "default": "",
                    "description": "Optionale Freitextbeschreibung."
                  },
                  "list_type": {
                    "type": "string",
                    "enum": [
                      "allowlist",
                      "custom"
                    ],
                    "description": "`allowlist` oder `custom`. `blocklist` wird mit `400` abgewiesen."
                  },
                  "entry_type": {
                    "type": "string",
                    "enum": [
                      "face",
                      "document",
                      "phone",
                      "email",
                      "ip_address",
                      "device_fingerprint",
                      "wallet_address",
                      "bank_account",
                      "country",
                      "user",
                      "business",
                      "key"
                    ],
                    "description": "Was die Liste enthält: `face`, `document` (Dokumentennummer), `phone`, `email`, `ip_address` (Adresse oder CIDR-Bereich), `device_fingerprint`, `wallet_address`, `bank_account`, `country` (ISO 3166-1 alpha-3), `user` oder `business` (Ihre `vendor_data`) oder `key` (eine beliebige Zeichenkette). Damit wird bestimmt, wie Eintragswerte validiert und abgeglichen werden. Kann später nicht mehr geändert werden."
                  }
                }
              },
              "examples": {
                "IP allowlist": {
                  "value": {
                    "name": "Trusted office IPs",
                    "description": "Office egress ranges",
                    "list_type": "allowlist",
                    "entry_type": "ip_address"
                  }
                },
                "Custom country list": {
                  "value": {
                    "name": "Enhanced due diligence countries",
                    "list_type": "custom",
                    "entry_type": "country"
                  }
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X POST 'https://verification.didit.me/v3/lists/' \\\n  -H 'x-api-key: YOUR_API_KEY' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\n    \"name\": \"Trusted office IPs\",\n    \"description\": \"Office egress ranges\",\n    \"list_type\": \"allowlist\",\n    \"entry_type\": \"ip_address\"\n  }'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.lists.create(\n    name=\"Trusted office IPs\",\n    description=\"Office egress ranges\",\n    list_type=\"allowlist\",\n    entry_type=\"ip_address\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.lists.create({\n  name: \"Trusted office IPs\",\n  description: \"Office egress ranges\",\n  list_type: \"allowlist\",\n  entry_type: \"ip_address\",\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Lists.Create(ctx, didit.ListsCreateParams{\n\tName:        \"Trusted office IPs\",\n\tDescription: didit.String(\"Office egress ranges\"),\n\tListType:    \"allowlist\",\n\tEntryType:   \"ip_address\",\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\nimport me.didit.types.ListsCreateParams;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.lists().create(ListsCreateParams.builder()\n        .name(\"Trusted office IPs\")\n        .description(\"Office egress ranges\")\n        .listType(ListsCreateParams.ListType.of(\"allowlist\"))\n        .entryType(ListsCreateParams.EntryType.of(\"ip_address\"))\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->lists->create([\n    'name' => 'Trusted office IPs',\n    'description' => 'Office egress ranges',\n    'list_type' => 'allowlist',\n    'entry_type' => 'ip_address',\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.lists.create(\n  name: \"Trusted office IPs\",\n  description: \"Office egress ranges\",\n  list_type: \"allowlist\",\n  entry_type: \"ip_address\"\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Lists.CreateAsync(new ListsCreateParams\n{\n    Name = \"Trusted office IPs\",\n    Description = \"Office egress ranges\",\n    ListType = \"allowlist\",\n    EntryType = \"ip_address\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "responses": {
          "201": {
            "description": "Die Liste wurde erstellt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ComplianceList"
                },
                "examples": {
                  "New allowlist": {
                    "value": {
                      "uuid": "22222222-3333-4444-5555-666666666666",
                      "name": "Trusted office IPs",
                      "description": "Office egress ranges",
                      "list_type": "allowlist",
                      "entry_type": "ip_address",
                      "is_system": false,
                      "entry_count": 0,
                      "last_entry_added_at": null,
                      "created_at": "2026-10-12T09:15:44.031876Z",
                      "updated_at": "2026-10-12T09:15:44.031876Z"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Der Body ist ungültig.",
            "content": {
              "application/json": {
                "examples": {
                  "Blocklist refused": {
                    "value": {
                      "list_type": [
                        "Cannot create additional blocklist lists. System blocklists are auto-created for each application."
                      ]
                    }
                  },
                  "Duplicate name": {
                    "value": {
                      "name": [
                        "A list with this name already exists for this application."
                      ]
                    }
                  },
                  "Missing fields": {
                    "value": {
                      "name": [
                        "This field is required."
                      ],
                      "list_type": [
                        "This field is required."
                      ],
                      "entry_type": [
                        "This field is required."
                      ]
                    }
                  },
                  "Unknown entry type": {
                    "value": {
                      "entry_type": [
                        "\"iban\" is not a valid choice."
                      ]
                    }
                  },
                  "Name too long": {
                    "value": {
                      "name": [
                        "Ensure this field has no more than 255 characters."
                      ]
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Der API-Schlüssel mit eingeschränktem Geltungsbereich ist abgelaufen. Andere Authentifizierungsfehler geben `403` zurück.",
            "content": {
              "application/json": {
                "examples": {
                  "Expired API key": {
                    "value": {
                      "detail": "This API key has expired."
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Der `x-api-key`-Header fehlt (ein falscher, widerrufener oder abgelaufener Schlüssel erhält `401`), oder ein API-Schlüssel mit Berechtigungseinschränkungen verfügt nicht über `workflows: write` oder wird von einer IP-Adresse außerhalb seiner Zulassungsliste verwendet.",
            "content": {
              "application/json": {
                "examples": {
                  "Missing or invalid API key": {
                    "value": {
                      "detail": "You do not have permission to perform this action."
                    }
                  },
                  "Scoped key without workflows access": {
                    "value": {
                      "detail": "This API key has no write access to workflows."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/RateLimitedWrite"
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/v3/lists/{list_uuid}/": {
      "get": {
        "summary": "Liste abrufen",
        "description": "Gibt eine Liste der Anwendung mit ihrer Eintragsanzahl und dem Zeitpunkt zurück, zu dem ihr neuester Eintrag hinzugefügt wurde. Eine Liste einer anderen Anwendung oder eine gelöschte Liste gibt `404` zurück. Dies gibt nur die Liste zurück: Lesen Sie deren Werte mit [Listeneinträge auflisten](https://docs.didit.me/de/management-api/lists/list-entries). Ein API-Schlüssel mit Scopes benötigt `workflows: read`.",
        "operationId": "get_list",
        "x-didit-sdk": {
          "resource": "lists",
          "method": "retrieve",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Lists"
        ],
        "parameters": [
          {
            "name": "list_uuid",
            "in": "path",
            "required": true,
            "description": "UUID der Liste, wie sie von „Listen auflisten“ oder „Liste erstellen“ zurückgegeben wird.",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "example": "11111111-2222-3333-4444-555555555555"
          }
        ],
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X GET 'https://verification.didit.me/v3/lists/11111111-2222-3333-4444-555555555555/' \\\n  -H 'x-api-key: YOUR_API_KEY'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.lists.retrieve(\n    \"11111111-2222-3333-4444-555555555555\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.lists.retrieve(\"11111111-2222-3333-4444-555555555555\");\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Lists.Retrieve(ctx, \"11111111-2222-3333-4444-555555555555\")\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.lists().retrieve(\"11111111-2222-3333-4444-555555555555\");\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->lists->retrieve('11111111-2222-3333-4444-555555555555');\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.lists.retrieve(\"11111111-2222-3333-4444-555555555555\")\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Lists.RetrieveAsync(\"11111111-2222-3333-4444-555555555555\");\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "responses": {
          "200": {
            "description": "Die Liste.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ComplianceList"
                },
                "examples": {
                  "System face blocklist": {
                    "value": {
                      "uuid": "11111111-2222-3333-4444-555555555555",
                      "name": "Face Blocklist",
                      "description": "Blocked biometric faces. When a face matching an entry in this list is detected during liveness verification, the session will be automatically declined.",
                      "list_type": "blocklist",
                      "entry_type": "face",
                      "is_system": true,
                      "entry_count": 12,
                      "last_entry_added_at": "2026-10-09T16:42:03.118204Z",
                      "created_at": "2026-01-14T10:02:11.402917Z",
                      "updated_at": "2026-01-14T10:02:11.402917Z"
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Der API-Schlüssel mit eingeschränktem Geltungsbereich ist abgelaufen. Andere Authentifizierungsfehler geben `403` zurück.",
            "content": {
              "application/json": {
                "examples": {
                  "Expired API key": {
                    "value": {
                      "detail": "This API key has expired."
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Der `x-api-key`-Header fehlt (ein falscher, widerrufener oder abgelaufener Schlüssel erhält `401`), oder ein berechtigungseingeschränkter API-Schlüssel verfügt nicht über `workflows: read` oder wird von einer IP-Adresse außerhalb seiner Zulassungsliste verwendet.",
            "content": {
              "application/json": {
                "examples": {
                  "Missing or invalid API key": {
                    "value": {
                      "detail": "You do not have permission to perform this action."
                    }
                  },
                  "Scoped key without workflows access": {
                    "value": {
                      "detail": "This API key has no read access to workflows."
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "In der Anwendung des API-Schlüssels existiert keine Liste mit dieser UUID, oder sie wurde gelöscht.",
            "content": {
              "application/json": {
                "examples": {
                  "Not found": {
                    "value": {
                      "detail": "No List matches the given query."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Das geteilte Leselimit von 600 Anfragen pro Minute pro API-Schlüssel wurde überschritten. Beachten Sie `Retry-After`, bevor Sie es erneut versuchen.",
            "content": {
              "application/json": {
                "examples": {
                  "Rate limited": {
                    "value": {
                      "detail": "GET request rate limit exceeded. You can make up to 600 requests per minute."
                    }
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      },
      "patch": {
        "summary": "Liste aktualisieren",
        "description": "Benennt eine Liste um oder ändert deren Beschreibung. Es werden nur `name` und `description` gelesen; jedes andere Feld wird ignoriert, sodass `list_type` und `entry_type` die Werte behalten, mit denen sie erstellt wurden. Systemlisten können nicht geändert werden und geben `400` zurück. Die Antwort enthält nur `name` und `description`: Rufen Sie [Liste abrufen](https://docs.didit.me/de/management-api/lists/get) auf, um die vollständige Liste zu erhalten. Ein API-Schlüssel mit Scopes benötigt `workflows: write`.",
        "operationId": "update_list",
        "x-didit-sdk": {
          "resource": "lists",
          "method": "update",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Lists"
        ],
        "parameters": [
          {
            "name": "list_uuid",
            "in": "path",
            "required": true,
            "description": "UUID der Liste, wie sie von „Listen auflisten“ oder „Liste erstellen“ zurückgegeben wird.",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "example": "11111111-2222-3333-4444-555555555555"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "name": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 255,
                    "description": "Neuer Name. Muss sich vom Namen jeder anderen Liste der Anwendung unterscheiden."
                  },
                  "description": {
                    "type": "string",
                    "description": "Neue Beschreibung. Senden Sie eine leere Zeichenkette, um sie zu löschen."
                  }
                }
              },
              "examples": {
                "Rename": {
                  "value": {
                    "name": "Trusted office and VPN IPs"
                  }
                },
                "Rename and describe": {
                  "value": {
                    "name": "Trusted office and VPN IPs",
                    "description": "Office egress ranges and the corporate VPN"
                  }
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X PATCH 'https://verification.didit.me/v3/lists/11111111-2222-3333-4444-555555555555/' \\\n  -H 'x-api-key: YOUR_API_KEY' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\"name\": \"Trusted office and VPN IPs\"}'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.lists.update(\n    \"11111111-2222-3333-4444-555555555555\",\n    name=\"Trusted office and VPN IPs\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.lists.update(\"11111111-2222-3333-4444-555555555555\", {\n  name: \"Trusted office and VPN IPs\",\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Lists.Update(ctx, \"11111111-2222-3333-4444-555555555555\", didit.ListsUpdateParams{\n\tName: didit.String(\"Trusted office and VPN IPs\"),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\nimport me.didit.types.ListsUpdateParams;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.lists().update(\"11111111-2222-3333-4444-555555555555\", ListsUpdateParams.builder()\n        .name(\"Trusted office and VPN IPs\")\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->lists->update('11111111-2222-3333-4444-555555555555', [\n    'name' => 'Trusted office and VPN IPs',\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.lists.update(\n  \"11111111-2222-3333-4444-555555555555\",\n  name: \"Trusted office and VPN IPs\"\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Lists.UpdateAsync(\"11111111-2222-3333-4444-555555555555\", new ListsUpdateParams\n{\n    Name = \"Trusted office and VPN IPs\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "responses": {
          "200": {
            "description": "Die Liste wurde aktualisiert. Nur die bearbeitbaren Felder werden zurückgegeben.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "name",
                    "description"
                  ],
                  "properties": {
                    "name": {
                      "type": "string",
                      "description": "Der Name der Liste nach der Aktualisierung."
                    },
                    "description": {
                      "type": "string",
                      "description": "Die Beschreibung der Liste nach der Aktualisierung."
                    }
                  }
                },
                "examples": {
                  "Renamed": {
                    "value": {
                      "name": "Trusted office and VPN IPs",
                      "description": "Office egress ranges"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Die Liste ist eine Systemliste oder der Anfragetext ist ungültig.",
            "content": {
              "application/json": {
                "examples": {
                  "System list": {
                    "value": {
                      "non_field_errors": [
                        "System lists cannot be modified."
                      ]
                    }
                  },
                  "Duplicate name": {
                    "value": {
                      "name": [
                        "A list with this name already exists for this application."
                      ]
                    }
                  },
                  "Blank name": {
                    "value": {
                      "name": [
                        "This field may not be blank."
                      ]
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Der API-Schlüssel mit eingeschränktem Geltungsbereich ist abgelaufen. Andere Authentifizierungsfehler geben `403` zurück.",
            "content": {
              "application/json": {
                "examples": {
                  "Expired API key": {
                    "value": {
                      "detail": "This API key has expired."
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Der `x-api-key`-Header fehlt (ein falscher, widerrufener oder abgelaufener Schlüssel erhält `401`), oder ein API-Schlüssel mit Berechtigungseinschränkungen verfügt nicht über `workflows: write` oder wird von einer IP-Adresse außerhalb seiner Zulassungsliste verwendet.",
            "content": {
              "application/json": {
                "examples": {
                  "Missing or invalid API key": {
                    "value": {
                      "detail": "You do not have permission to perform this action."
                    }
                  },
                  "Scoped key without workflows access": {
                    "value": {
                      "detail": "This API key has no write access to workflows."
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "In der Anwendung des API-Schlüssels existiert keine Liste mit dieser UUID, oder sie wurde gelöscht.",
            "content": {
              "application/json": {
                "examples": {
                  "Not found": {
                    "value": {
                      "detail": "No List matches the given query."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/RateLimitedWrite"
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      },
      "delete": {
        "summary": "Eine Liste löschen",
        "description": "Löscht eine Positivliste oder benutzerdefinierte Liste zusammen mit ihren Einträgen. Die Löschung ist unwiderruflich: Die Liste und ihre Einträge erscheinen bei keinem Lesevorgang mehr, und Bedingungen in Workflows und Transaktionsregeln, die auf die Liste verweisen, werten diese ab diesem Zeitpunkt als leere Liste aus. Bereits ausgewertete Sitzungen und Transaktionen behalten ihre Ergebnisse, und der Name kann für eine neue Liste wiederverwendet werden. Systemlisten können nicht gelöscht werden und geben `400` zurück; um eine solche Liste zu leeren, [löschen Sie deren Einträge](https://docs.didit.me/de/management-api/lists/delete-entry). Ein eingeschränkter API-Schlüssel benötigt `workflows: write`.",
        "operationId": "delete_list",
        "x-didit-sdk": {
          "resource": "lists",
          "method": "delete",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Lists"
        ],
        "parameters": [
          {
            "name": "list_uuid",
            "in": "path",
            "required": true,
            "description": "UUID der Liste, wie sie von „Listen auflisten“ oder „Liste erstellen“ zurückgegeben wird.",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "example": "11111111-2222-3333-4444-555555555555"
          }
        ],
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X DELETE 'https://verification.didit.me/v3/lists/11111111-2222-3333-4444-555555555555/' \\\n  -H 'x-api-key: YOUR_API_KEY'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nclient.lists.delete(\n    \"11111111-2222-3333-4444-555555555555\",\n)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nawait didit.lists.delete(\"11111111-2222-3333-4444-555555555555\");"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nif err := client.Lists.Delete(ctx, \"11111111-2222-3333-4444-555555555555\"); err != nil {\n\tlog.Fatal(err)\n}"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nclient.lists().delete(\"11111111-2222-3333-4444-555555555555\");"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$didit->lists->delete('11111111-2222-3333-4444-555555555555');"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\ndidit.lists.delete(\"11111111-2222-3333-4444-555555555555\")"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nawait client.Lists.DeleteAsync(\"11111111-2222-3333-4444-555555555555\");"
          }
        ],
        "responses": {
          "204": {
            "description": "Die Liste und ihre Einträge wurden gelöscht. Kein Body."
          },
          "400": {
            "description": "Die Liste ist eine Systemliste.",
            "content": {
              "application/json": {
                "examples": {
                  "System list": {
                    "value": {
                      "detail": "System lists cannot be deleted."
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Der API-Schlüssel mit eingeschränktem Geltungsbereich ist abgelaufen. Andere Authentifizierungsfehler geben `403` zurück.",
            "content": {
              "application/json": {
                "examples": {
                  "Expired API key": {
                    "value": {
                      "detail": "This API key has expired."
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Der `x-api-key`-Header fehlt (ein falscher, widerrufener oder abgelaufener Schlüssel erhält `401`), oder ein API-Schlüssel mit Berechtigungseinschränkungen verfügt nicht über `workflows: write` oder wird von einer IP-Adresse außerhalb seiner Zulassungsliste verwendet.",
            "content": {
              "application/json": {
                "examples": {
                  "Missing or invalid API key": {
                    "value": {
                      "detail": "You do not have permission to perform this action."
                    }
                  },
                  "Scoped key without workflows access": {
                    "value": {
                      "detail": "This API key has no write access to workflows."
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "In der Anwendung des API-Schlüssels existiert keine Liste mit dieser UUID, oder sie wurde bereits gelöscht.",
            "content": {
              "application/json": {
                "examples": {
                  "Not found": {
                    "value": {
                      "detail": "No List matches the given query."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/RateLimitedWrite"
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/v3/lists/{list_uuid}/entries/": {
      "get": {
        "summary": "Listeneinträge auflisten",
        "description": "Gibt die aktuellen Einträge einer Liste zurück, die neuesten zuerst. `search` gleicht unabhängig von der Groß-/Kleinschreibung Teile des `value` oder `display_label` eines Eintrags ab, und `reference_session_id` grenzt die Ergebnisse auf Einträge aus einer Personenverifizierungssitzung ein. Bild-URLs in `metadata` sind kurzlebige signierte URLs, die bei jedem Aufruf neu ausgestellt werden; ein API-Schlüssel mit eingeschränktem Berechtigungsumfang ohne `media: read` erhält stattdessen `null`. Ein API-Schlüssel mit eingeschränktem Berechtigungsumfang benötigt `workflows: read`.",
        "operationId": "list_list_entries",
        "x-didit-sdk": {
          "resource": "lists.entries",
          "method": "list",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Lists"
        ],
        "parameters": [
          {
            "name": "list_uuid",
            "in": "path",
            "required": true,
            "description": "UUID der Liste, wie sie von „Listen auflisten“ oder „Liste erstellen“ zurückgegeben wird.",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "example": "11111111-2222-3333-4444-555555555555"
          },
          {
            "name": "search",
            "in": "query",
            "required": false,
            "description": "Text (ohne Berücksichtigung von Groß-/Kleinschreibung), den `value` oder `display_label` des Eintrags enthalten muss.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "reference_session_id",
            "in": "query",
            "required": false,
            "description": "Nur die Einträge aus dieser Personen-Verifizierungssitzung, um beispielsweise zu sehen, welche ihrer Gesichter bereits aufgeführt sind.",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Seitengröße. Standardmäßig 50. Ein Wert über 1000000 gibt `400` zurück; 0, ein negativer oder ein nicht-numerischer Wert fällt auf 50 zurück.",
            "schema": {
              "type": "integer",
              "default": 50,
              "minimum": 1,
              "maximum": 1000000
            }
          },
          {
            "name": "offset",
            "in": "query",
            "required": false,
            "description": "Nullbasierter Index des ersten zurückzugebenden Elements. Folgen Sie vorzugsweise `next`. Ein Wert über 1000000 gibt `400` zurück; ein negativer oder nicht-numerischer Wert fällt auf 0 zurück.",
            "schema": {
              "type": "integer",
              "default": 0,
              "minimum": 0,
              "maximum": 1000000
            }
          }
        ],
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X GET 'https://verification.didit.me/v3/lists/11111111-2222-3333-4444-555555555555/entries/?search=example.com' \\\n  -H 'x-api-key: YOUR_API_KEY'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nfor item in client.lists.entries.list(\n    \"11111111-2222-3333-4444-555555555555\",\n):\n    print(item)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nfor await (const item of didit.lists.entries.list(\"11111111-2222-3333-4444-555555555555\")) {\n  console.log(item);\n}"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\niter := client.Lists.Entries.ListAutoPaging(ctx, \"11111111-2222-3333-4444-555555555555\", didit.ListsEntriesListParams{})\nfor iter.Next() {\n\tfmt.Printf(\"%+v\\n\", iter.Current())\n}\nif err := iter.Err(); err != nil {\n\tlog.Fatal(err)\n}"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nfor (var item : client.lists().entries().list(\"11111111-2222-3333-4444-555555555555\")) {\n    System.out.println(item);\n}"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\nforeach ($didit->lists->entries->list('11111111-2222-3333-4444-555555555555') as $item) {\n    print_r($item->toArray());\n}"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\ndidit.lists.entries.list(\"11111111-2222-3333-4444-555555555555\").auto_paging_each do |item|\n  puts item.to_h\nend"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nawait foreach (var item in await client.Lists.Entries.ListAsync(\"11111111-2222-3333-4444-555555555555\"))\n{\n    Console.WriteLine(JsonSerializer.Serialize(item));\n}"
          }
        ],
        "responses": {
          "200": {
            "description": "Eine Seite mit Einträgen, neueste zuerst.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "count",
                    "next",
                    "previous",
                    "results"
                  ],
                  "properties": {
                    "count": {
                      "type": "integer",
                      "minimum": 0,
                      "description": "Gesamtzahl der Einträge, die den Filtern entsprechen."
                    },
                    "next": {
                      "type": "string",
                      "format": "uri",
                      "nullable": true,
                      "description": "Absolute URL der nächsten Seite oder `null` auf der letzten Seite."
                    },
                    "previous": {
                      "type": "string",
                      "format": "uri",
                      "nullable": true,
                      "description": "Absolute URL der vorherigen Seite oder `null` auf der ersten Seite."
                    },
                    "results": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/ComplianceListEntry"
                      }
                    }
                  }
                },
                "examples": {
                  "Entries": {
                    "value": {
                      "count": 2,
                      "next": null,
                      "previous": null,
                      "results": [
                        {
                          "uuid": "bbbbbbbb-cccc-dddd-eeee-ffffffffffff",
                          "value": "X1234567",
                          "display_label": "Jane Doe - X1234567",
                          "comment": "",
                          "added_by": "api",
                          "reference_session_id": "33333333-4444-5555-6666-777777777777",
                          "reference_session_number": 1042,
                          "reference_session_type": "kyc",
                          "reference_object_uuid": "66666666-7777-8888-9999-000000000000",
                          "metadata": {
                            "full_name": "Jane Doe",
                            "issuing_state": "ESP",
                            "document_type": "ID",
                            "region": "",
                            "document_number": "X1234567"
                          },
                          "created_at": "2026-10-12T10:06:12.774915Z"
                        },
                        {
                          "uuid": "eeeeeeee-ffff-0000-1111-222222222222",
                          "value": "y7654321",
                          "display_label": "",
                          "comment": "Reported by a partner",
                          "added_by": "api",
                          "reference_session_id": null,
                          "reference_session_number": null,
                          "reference_session_type": null,
                          "reference_object_uuid": null,
                          "metadata": null,
                          "created_at": "2026-10-03T07:48:30.552810Z"
                        }
                      ]
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Ein Abfrageparameter ist ungültig.",
            "content": {
              "application/json": {
                "examples": {
                  "Invalid session id": {
                    "value": {
                      "reference_session_id": [
                        "Must be a valid UUID."
                      ]
                    }
                  },
                  "Limit too large": {
                    "value": [
                      "limit must not exceed 1000000."
                    ]
                  }
                }
              }
            }
          },
          "401": {
            "description": "Der API-Schlüssel mit eingeschränktem Geltungsbereich ist abgelaufen. Andere Authentifizierungsfehler geben `403` zurück.",
            "content": {
              "application/json": {
                "examples": {
                  "Expired API key": {
                    "value": {
                      "detail": "This API key has expired."
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Der `x-api-key`-Header fehlt (ein falscher, widerrufener oder abgelaufener Schlüssel erhält `401`), oder ein berechtigungseingeschränkter API-Schlüssel verfügt nicht über `workflows: read` oder wird von einer IP-Adresse außerhalb seiner Zulassungsliste verwendet.",
            "content": {
              "application/json": {
                "examples": {
                  "Missing or invalid API key": {
                    "value": {
                      "detail": "You do not have permission to perform this action."
                    }
                  },
                  "Scoped key without workflows access": {
                    "value": {
                      "detail": "This API key has no read access to workflows."
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "In der Anwendung des API-Schlüssels existiert keine Liste mit dieser UUID, oder sie wurde gelöscht.",
            "content": {
              "application/json": {
                "examples": {
                  "Not found": {
                    "value": {
                      "detail": "List not found."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Das geteilte Leselimit von 600 Anfragen pro Minute pro API-Schlüssel wurde überschritten. Beachten Sie `Retry-After`, bevor Sie es erneut versuchen.",
            "content": {
              "application/json": {
                "examples": {
                  "Rate limited": {
                    "value": {
                      "detail": "GET request rate limit exceeded. You can make up to 600 requests per minute."
                    }
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      },
      "post": {
        "summary": "Erstellen Sie einen Listeneintrag",
        "description": "Fügt einen Eintrag zu einer Liste hinzu, auf eine von drei Arten: nach `value`; aus einer Verifizierungssitzung mit `reference_session_id`, wobei Didit den Wert aus dem neuesten Datensatz der Sitzung für den Eintragstyp der Liste liest und den Eintrag damit verknüpft; oder nach `value` mit einer `reference_object_uuid` und `metadata.reference_type`, die zurück auf eine Transaktion, einen Benutzer oder ein Unternehmen verweisen. Auf den System-Sperrlisten für Gesichter, Dokumente, Telefonnummern und E-Mails wird der aus der Sitzung gelesene Datensatz ebenfalls als auf der Sperrliste markiert, sodass neue übereinstimmende Sitzungen abgelehnt werden; auf den System-Sperrlisten für Benutzer und Unternehmen werden übereinstimmende Benutzer oder Unternehmen auf `BLOCKED` gesetzt. Sitzungen und Transaktionen, die bereits abgeschlossen sind, werden nicht geändert. Ein berechtigungsbeschränkter API-Schlüssel benötigt `workflows: write`. Siehe [Listeneintrag erstellen](https://docs.didit.me/de/management-api/lists/create-entry) für jeden Modus.",
        "operationId": "create_list_entry",
        "x-didit-sdk": {
          "resource": "lists.entries",
          "method": "create",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Lists"
        ],
        "parameters": [
          {
            "name": "list_uuid",
            "in": "path",
            "required": true,
            "description": "UUID der Liste, zu der hinzugefügt werden soll. Für ein Gesicht, das Sie nur als Bild vorliegen haben, verwenden Sie stattdessen Gesicht in eine Liste hochladen.",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "example": "11111111-2222-3333-4444-555555555555"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "description": "Senden Sie `value`, `reference_session_id` oder beides. Welche Felder gelten, hängt vom `entry_type` der Liste ab.",
                "properties": {
                  "value": {
                    "type": "string",
                    "description": "Der aufzulistende Wert, validiert anhand des `entry_type` der Liste: `email` eine gültige E-Mail-Adresse; `phone` eine gültige internationale Nummer, gespeichert in E.164; `ip_address` eine Adresse oder ein CIDR-Bereich (zum Beispiel `10.0.0.0/8`); `device_fingerprint` mindestens 8 Zeichen aus Buchstaben, Ziffern, `-`, `_`, `:` und `.` (eine Sperrliste lehnt einen Fingerprint ab, den mehrere verschiedene Geräte gemeldet haben); `country` ein ISO 3166-1 Alpha-2- oder Alpha-3-Code, gespeichert als Alpha-3; `user` und `business` die `vendor_data`; jeder andere Typ eine nicht-leere Zeichenkette. Gespeichert in Kleinbuchstaben mit Ausnahme von Telefonnummern und Ländercodes; eine Liste enthält jeden Wert nur einmal (ohne Berücksichtigung der Groß-/Kleinschreibung). Erforderlich, sofern nicht `reference_session_id` übermittelt wird; muss bei `face_image_source` mit Dokumentenerfassung leer gelassen werden."
                  },
                  "reference_session_id": {
                    "type": "string",
                    "format": "uuid",
                    "description": "Eine Benutzer- oder Unternehmensverifizierungssitzung Ihrer Anwendung, aus der der Wert übernommen werden soll. Didit liest den neuesten Datensatz der Sitzung für den Eintragstyp der Liste (`face`, `document`, `phone`, `email`, `ip_address` oder `device_fingerprint`), verknüpft den Eintrag mit der Sitzung sowie diesem Datensatz und füllt `display_label` und `metadata` für Dokumente aus. Bei einer `device_fingerprint`-Sperrliste wird eine Sitzung abgelehnt, die nur über einen Fingerabdruck der Geräteklasse verfügt oder auf mehr als einem Gerät abgeschlossen wurde: Senden Sie den exakten Fingerabdruck als `value`. Bei anderen Eintragstypen oder wenn die Sitzung keinen solchen Datensatz aufweist, senden Sie ebenfalls `value`; Ihr `value` wird dann gespeichert und der Eintrag bleibt weiterhin mit der Sitzung verknüpft."
                  },
                  "reference_object_uuid": {
                    "type": "string",
                    "format": "uuid",
                    "description": "UUID des Datensatzes, für den der Eintrag steht, wenn er nicht aus einer Sitzung stammt: eine Transaktions-UUID oder die `didit_internal_id` eines Benutzers oder Unternehmens. Kombinieren Sie dies mit `metadata.reference_type`. Wird durch den Datensatz der Sitzung ersetzt, wenn `reference_session_id` einen bereitstellt."
                  },
                  "face_image_source": {
                    "type": "string",
                    "enum": [
                      "liveness",
                      "front_image_camera_front",
                      "back_image_camera_front"
                    ],
                    "default": "liveness",
                    "description": "Gesichtslisten mit `reference_session_id`: Aus welchem der Bilder der Sitzung das Gesicht entnommen wird. `liveness` (Standard) ist das Liveness-Selfie. `front_image_camera_front` und `back_image_camera_front` sind die Selfies, die die Frontkamera aufgenommen hat, während der Benutzer die Vorder- oder Rückseite seines Dokuments fotografiert hat: werden nur für die systemweite Gesichtssperrliste akzeptiert, mit `reference_session_id` und einem leeren `value`. Jedes Selfie kann einmal hinzugefügt werden und muss ein einzelnes, deutliches Gesicht zeigen."
                  },
                  "reference_node_id": {
                    "type": "string",
                    "nullable": true,
                    "maxLength": 100,
                    "description": "Bei einer Dokumentenerfassung mit `face_image_source`: Der Knoten der Ausweisverifizierung, dessen Selfie verwendet werden soll, bei Workflows mit mehr als einem Knoten. Standardmäßig die jüngste Ausweisverifizierung, die dieses Bild enthält. Wird bei `liveness` abgelehnt."
                  },
                  "display_label": {
                    "type": "string",
                    "maxLength": 512,
                    "description": "Lesbare Bezeichnung. Wenn leer, leitet Didit nach Möglichkeit eine aus der Sitzung ab (beispielsweise Name und Dokumentennummer des Inhabers)."
                  },
                  "comment": {
                    "type": "string",
                    "description": "Freitext-Notiz, beispielsweise der Grund für die Listung."
                  },
                  "metadata": {
                    "type": "object",
                    "additionalProperties": true,
                    "description": "Freiform-JSON, das mit dem Eintrag gespeichert und unverändert zurückgegeben wird. Verwenden Sie `reference_type` und `reference_id`, damit die Konsole zurück zur Quelle verlinkt. `reference_image_url` und `front_image_url` werden ausschließlich von Didit festgelegt und verworfen, falls Sie sie senden. Bei einem aus einer Sitzung gelesenen Eintrag werden die Schlüssel von Didit mit Ihren zusammengeführt.",
                    "properties": {
                      "reference_type": {
                        "type": "string",
                        "enum": [
                          "transaction",
                          "vendor_user",
                          "vendor_business"
                        ],
                        "description": "Worauf `reference_object_uuid` verweist."
                      },
                      "reference_id": {
                        "type": "string",
                        "description": "Kennung des Quelldatensatzes."
                      }
                    }
                  }
                }
              },
              "examples": {
                "By value": {
                  "value": {
                    "value": "+14155552671",
                    "comment": "Reported fraud"
                  }
                },
                "From a session": {
                  "value": {
                    "reference_session_id": "33333333-4444-5555-6666-777777777777"
                  }
                },
                "Face from a document-capture selfie": {
                  "value": {
                    "reference_session_id": "33333333-4444-5555-6666-777777777777",
                    "face_image_source": "front_image_camera_front"
                  }
                },
                "From a transaction": {
                  "value": {
                    "value": "0x52908400098527886E0F7030069857D2E4169EE7",
                    "reference_object_uuid": "55555555-6666-7777-8888-999999999999",
                    "comment": "Linked to a chargeback",
                    "metadata": {
                      "reference_type": "transaction",
                      "reference_id": "55555555-6666-7777-8888-999999999999"
                    }
                  }
                },
                "Country": {
                  "value": {
                    "value": "PRK",
                    "comment": "Sanctioned jurisdiction"
                  }
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X POST 'https://verification.didit.me/v3/lists/11111111-2222-3333-4444-555555555555/entries/' \\\n  -H 'x-api-key: YOUR_API_KEY' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\"value\": \"+14155552671\", \"comment\": \"Reported fraud\"}'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.lists.entries.create(\n    \"11111111-2222-3333-4444-555555555555\",\n    value=\"+14155552671\",\n    comment=\"Reported fraud\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.lists.entries.create(\"11111111-2222-3333-4444-555555555555\", {\n  value: \"+14155552671\",\n  comment: \"Reported fraud\",\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Lists.Entries.Create(ctx, \"11111111-2222-3333-4444-555555555555\", didit.ListsEntriesCreateParams{\n\tValue:   didit.String(\"+14155552671\"),\n\tComment: didit.String(\"Reported fraud\"),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\nimport me.didit.types.ListsEntriesCreateParams;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.lists().entries().create(\"11111111-2222-3333-4444-555555555555\", ListsEntriesCreateParams.builder()\n        .value(\"+14155552671\")\n        .comment(\"Reported fraud\")\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->lists->entries->create('11111111-2222-3333-4444-555555555555', [\n    'value' => '+14155552671',\n    'comment' => 'Reported fraud',\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.lists.entries.create(\n  \"11111111-2222-3333-4444-555555555555\",\n  value: \"+14155552671\",\n  comment: \"Reported fraud\"\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Lists.Entries.CreateAsync(\"11111111-2222-3333-4444-555555555555\", new ListsEntriesCreateParams\n{\n    Value = \"+14155552671\",\n    Comment = \"Reported fraud\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "responses": {
          "201": {
            "description": "Der Eintrag wurde erstellt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ComplianceListEntry"
                },
                "examples": {
                  "By value": {
                    "value": {
                      "uuid": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee",
                      "value": "+14155552671",
                      "display_label": "",
                      "comment": "Reported fraud",
                      "added_by": "api",
                      "reference_session_id": null,
                      "reference_session_number": null,
                      "reference_session_type": null,
                      "reference_object_uuid": null,
                      "metadata": null,
                      "created_at": "2026-10-12T10:04:51.220391Z"
                    }
                  },
                  "Document from a session": {
                    "value": {
                      "uuid": "bbbbbbbb-cccc-dddd-eeee-ffffffffffff",
                      "value": "X1234567",
                      "display_label": "Jane Doe - X1234567",
                      "comment": "",
                      "added_by": "api",
                      "reference_session_id": "33333333-4444-5555-6666-777777777777",
                      "reference_session_number": 1042,
                      "reference_session_type": "kyc",
                      "reference_object_uuid": "66666666-7777-8888-9999-000000000000",
                      "metadata": {
                        "full_name": "Jane Doe",
                        "issuing_state": "ESP",
                        "document_type": "ID",
                        "region": "",
                        "document_number": "X1234567"
                      },
                      "created_at": "2026-10-12T10:06:12.774915Z"
                    }
                  },
                  "From a transaction": {
                    "value": {
                      "uuid": "dddddddd-eeee-ffff-0000-111111111111",
                      "value": "0x52908400098527886e0f7030069857d2e4169ee7",
                      "display_label": "",
                      "comment": "Linked to a chargeback",
                      "added_by": "api",
                      "reference_session_id": null,
                      "reference_session_number": null,
                      "reference_session_type": null,
                      "reference_object_uuid": "55555555-6666-7777-8888-999999999999",
                      "metadata": {
                        "reference_type": "transaction",
                        "reference_id": "55555555-6666-7777-8888-999999999999"
                      },
                      "created_at": "2026-10-12T10:20:40.117062Z"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Der Body ist ungültig, der Wert befindet sich bereits in der Liste oder die Sitzung kann den Wert nicht bereitstellen.",
            "content": {
              "application/json": {
                "examples": {
                  "Nothing to list": {
                    "value": {
                      "value": [
                        "Either 'value' or 'reference_session_id' must be provided."
                      ]
                    }
                  },
                  "Duplicate value": {
                    "value": {
                      "value": [
                        "An entry with this value already exists in this list."
                      ]
                    }
                  },
                  "Invalid phone": {
                    "value": {
                      "value": [
                        "Invalid phone number. Provide a valid international number (e.g. +1234567890)."
                      ]
                    }
                  },
                  "Invalid IP": {
                    "value": {
                      "value": [
                        "Invalid IP address or CIDR range (e.g. 192.168.1.1 or 10.0.0.0/24)."
                      ]
                    }
                  },
                  "Invalid country": {
                    "value": {
                      "value": [
                        "Invalid country code: XX. Provide a valid ISO 3166-1 alpha-2 or alpha-3 country code."
                      ]
                    }
                  },
                  "Device-class fingerprint": {
                    "value": {
                      "value": [
                        "This value is a device-class fingerprint: several distinct devices have reported it, so blocklisting it would decline unrelated people. Block the user by document, face, email or phone instead."
                      ]
                    }
                  },
                  "Unknown session": {
                    "value": {
                      "reference_session_id": [
                        "Session not found or does not belong to this application."
                      ]
                    }
                  },
                  "No data in session": {
                    "value": {
                      "value": [
                        "Either provide a 'value' or ensure the session contains data for this entry type."
                      ]
                    }
                  },
                  "Selfie on another list": {
                    "value": {
                      "face_image_source": [
                        "A document-capture selfie can only be added to the face blocklist."
                      ]
                    }
                  },
                  "No clear face in selfie": {
                    "value": {
                      "face_image_source": [
                        "No clear face was found in this selfie, so it cannot be blocklisted."
                      ]
                    }
                  },
                  "Selfie already listed": {
                    "value": {
                      "face_image_source": [
                        "This selfie is already in the blocklist."
                      ]
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Der API-Schlüssel mit eingeschränktem Geltungsbereich ist abgelaufen. Andere Authentifizierungsfehler geben `403` zurück.",
            "content": {
              "application/json": {
                "examples": {
                  "Expired API key": {
                    "value": {
                      "detail": "This API key has expired."
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Der `x-api-key`-Header fehlt (ein falscher, widerrufener oder abgelaufener Schlüssel erhält `401`), oder ein API-Schlüssel mit Berechtigungseinschränkungen verfügt nicht über `workflows: write` oder wird von einer IP-Adresse außerhalb seiner Zulassungsliste verwendet.",
            "content": {
              "application/json": {
                "examples": {
                  "Missing or invalid API key": {
                    "value": {
                      "detail": "You do not have permission to perform this action."
                    }
                  },
                  "Scoped key without workflows access": {
                    "value": {
                      "detail": "This API key has no write access to workflows."
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "In der Anwendung des API-Schlüssels existiert keine Liste mit dieser UUID, oder sie wurde gelöscht.",
            "content": {
              "application/json": {
                "examples": {
                  "Not found": {
                    "value": {
                      "detail": "List not found."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/RateLimitedWrite"
          },
          "503": {
            "description": "Die Gesichtsanalyse eines bei der Dokumentenerfassung aufgenommenen Selfies ist vorübergehend nicht verfügbar. Es wurde nichts hinzugefügt; versuchen Sie es später erneut.",
            "content": {
              "application/json": {
                "examples": {
                  "Unavailable": {
                    "value": {
                      "detail": "Service temporarily unavailable. Please try again later."
                    }
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/v3/lists/{list_uuid}/entries/{entry_uuid}/": {
      "delete": {
        "summary": "Einen Listeneintrag löschen",
        "description": "Löscht einen Eintrag aus einer Liste, einschließlich Systemlisten. Der Eintrag wird sofort nicht mehr abgeglichen, und die Löschung ist unwiderruflich: Um den Wert erneut aufzulisten, erstellen Sie einen neuen Eintrag. Auf einer System-Sperrliste für Gesichter, Dokumente, Telefonnummern oder E-Mails wird der Datensatz, für den der Eintrag steht, nicht mehr als auf der Sperrliste geführt gekennzeichnet; auf der System-Sperrliste für Benutzer oder Unternehmen werden Benutzer oder Unternehmen der Anwendung, deren `vendor_data` dem Wert des Eintrags entspricht (oder deren `didit_internal_id` gleich dessen `reference_object_uuid` ist) und die den Status `BLOCKED` haben, wieder auf `ACTIVE` gesetzt. Bereits abgeschlossene Sitzungen und Transaktionen behalten ihren Status. Ein eingeschränkter API-Schlüssel benötigt `workflows: write`.",
        "operationId": "delete_list_entry",
        "x-didit-sdk": {
          "resource": "lists.entries",
          "method": "delete",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Lists"
        ],
        "parameters": [
          {
            "name": "list_uuid",
            "in": "path",
            "required": true,
            "description": "UUID der Liste, die den Eintrag enthält.",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "example": "11111111-2222-3333-4444-555555555555"
          },
          {
            "name": "entry_uuid",
            "in": "path",
            "required": true,
            "description": "UUID des Eintrags, wie sie von „Listeneinträge auflisten“ oder „Listeneintrag erstellen“ zurückgegeben wird.",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "example": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee"
          }
        ],
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X DELETE 'https://verification.didit.me/v3/lists/11111111-2222-3333-4444-555555555555/entries/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/' \\\n  -H 'x-api-key: YOUR_API_KEY'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nclient.lists.entries.delete(\n    \"11111111-2222-3333-4444-555555555555\",\n    \"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\",\n)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nawait didit.lists.entries.delete(\n  \"11111111-2222-3333-4444-555555555555\",\n  \"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\",\n);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nif err := client.Lists.Entries.Delete(ctx, \"11111111-2222-3333-4444-555555555555\", \"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\"); err != nil {\n\tlog.Fatal(err)\n}"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nclient.lists().entries().delete(\"11111111-2222-3333-4444-555555555555\", \"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\");"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$didit->lists->entries->delete('11111111-2222-3333-4444-555555555555', 'aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee');"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\ndidit.lists.entries.delete(\n  \"11111111-2222-3333-4444-555555555555\",\n  \"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\"\n)"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nawait client.Lists.Entries.DeleteAsync(\"11111111-2222-3333-4444-555555555555\", \"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\");"
          }
        ],
        "responses": {
          "204": {
            "description": "Der Eintrag wurde gelöscht. Kein Body."
          },
          "401": {
            "description": "Der API-Schlüssel mit eingeschränktem Geltungsbereich ist abgelaufen. Andere Authentifizierungsfehler geben `403` zurück.",
            "content": {
              "application/json": {
                "examples": {
                  "Expired API key": {
                    "value": {
                      "detail": "This API key has expired."
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Der `x-api-key`-Header fehlt (ein falscher, widerrufener oder abgelaufener Schlüssel erhält `401`), oder ein API-Schlüssel mit Berechtigungseinschränkungen verfügt nicht über `workflows: write` oder wird von einer IP-Adresse außerhalb seiner Zulassungsliste verwendet.",
            "content": {
              "application/json": {
                "examples": {
                  "Missing or invalid API key": {
                    "value": {
                      "detail": "You do not have permission to perform this action."
                    }
                  },
                  "Scoped key without workflows access": {
                    "value": {
                      "detail": "This API key has no write access to workflows."
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "In dieser Liste existiert kein Eintrag mit dieser UUID, die Liste befindet sich nicht in der Anwendung des API-Schlüssels oder wurde gelöscht, oder der Eintrag wurde bereits gelöscht.",
            "content": {
              "application/json": {
                "examples": {
                  "Not found": {
                    "value": {
                      "detail": "No ListEntry matches the given query."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/RateLimitedWrite"
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/v3/lists/{list_uuid}/entries/face-upload/": {
      "post": {
        "summary": "Gesicht in eine Liste hochladen",
        "description": "Fügt ein Gesicht aus einem base64-kodierten JPEG- oder PNG-Bild zu einer Gesichts-Sperrliste oder Gesichts-Zulassungsliste hinzu, falls Sie keine Verifizierungssitzung als Referenz haben. Didit erkennt die Gesichter im Bild, verwendet das größte und erstellt einen Eintrag, dessen `value` und `reference_object_uuid` die UUID des neuen Gesichts sind. Ein Gesicht auf der Sperrliste lehnt neue Sitzungen ab, deren Gesicht übereinstimmt; ein Gesicht auf der Zulassungsliste überspringt die Aktion für duplizierte Gesichter und überschreibt niemals einen Sperrlistentreffer. In einer Sandbox-Anwendung wird das Bild nicht analysiert und der Eintrag stimmt mit nichts überein. Ein API-Schlüssel mit Berechtigungsbeschränkung erfordert `workflows: write`. Um ein Gesicht aus einer bestehenden Sitzung einer Liste hinzuzufügen, verwenden Sie stattdessen [Listeneintrag erstellen](https://docs.didit.me/de/management-api/lists/create-entry) mit `reference_session_id`.",
        "operationId": "upload_list_entry_face",
        "x-didit-sdk": {
          "resource": "lists.entries",
          "method": "upload_face",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Lists"
        ],
        "parameters": [
          {
            "name": "list_uuid",
            "in": "path",
            "required": true,
            "description": "UUID einer Liste mit `entry_type: face` und `list_type: blocklist` oder `allowlist`.",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "example": "11111111-2222-3333-4444-555555555555"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "image"
                ],
                "properties": {
                  "image": {
                    "type": "string",
                    "format": "byte",
                    "description": "Base64-kodiertes JPEG oder PNG, nach dem Dekodieren maximal 2 MB groß, das ein deutlich sichtbares Gesicht zeigt. Senden Sie die reine Base64-Zeichenfolge ohne das Präfix `data:image/...;base64,`."
                  },
                  "comment": {
                    "type": "string",
                    "default": "",
                    "description": "Optionale Freitextnotiz, wie beispielsweise der Grund für die Listung."
                  }
                }
              },
              "examples": {
                "Face image": {
                  "value": {
                    "image": "/9j/4AAQSkZJRgABAQAAAQABAAD...",
                    "comment": "Known fraud attempt"
                  }
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X POST 'https://verification.didit.me/v3/lists/11111111-2222-3333-4444-555555555555/entries/face-upload/' \\\n  -H 'x-api-key: YOUR_API_KEY' \\\n  -H 'Content-Type: application/json' \\\n  -d \"{\\\"image\\\": \\\"$(base64 < face.jpg | tr -d '\\n')\\\", \\\"comment\\\": \\\"Known fraud attempt\\\"}\""
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.lists.entries.upload_face(\n    \"11111111-2222-3333-4444-555555555555\",\n    image=\"/9j/4AAQSkZJRgABAQAAAQABAAD...\",\n    comment=\"Known fraud attempt\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.lists.entries.uploadFace(\"11111111-2222-3333-4444-555555555555\", {\n  image: \"/9j/4AAQSkZJRgABAQAAAQABAAD...\",\n  comment: \"Known fraud attempt\",\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Lists.Entries.UploadFace(ctx, \"11111111-2222-3333-4444-555555555555\", didit.ListsEntriesUploadFaceParams{\n\tImage:   \"/9j/4AAQSkZJRgABAQAAAQABAAD...\",\n\tComment: didit.String(\"Known fraud attempt\"),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\nimport me.didit.types.ListsEntriesUploadFaceParams;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.lists().entries().uploadFace(\"11111111-2222-3333-4444-555555555555\", ListsEntriesUploadFaceParams.builder()\n        .image(\"/9j/4AAQSkZJRgABAQAAAQABAAD...\")\n        .comment(\"Known fraud attempt\")\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->lists->entries->uploadFace('11111111-2222-3333-4444-555555555555', [\n    'image' => '/9j/4AAQSkZJRgABAQAAAQABAAD...',\n    'comment' => 'Known fraud attempt',\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.lists.entries.upload_face(\n  \"11111111-2222-3333-4444-555555555555\",\n  image: \"/9j/4AAQSkZJRgABAQAAAQABAAD...\",\n  comment: \"Known fraud attempt\"\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Lists.Entries.UploadFaceAsync(\"11111111-2222-3333-4444-555555555555\", new ListsEntriesUploadFaceParams\n{\n    Image = \"/9j/4AAQSkZJRgABAQAAAQABAAD...\",\n    Comment = \"Known fraud attempt\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "responses": {
          "201": {
            "description": "Der Gesichtseintrag wurde erstellt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ComplianceListEntry"
                },
                "examples": {
                  "Uploaded face": {
                    "value": {
                      "uuid": "cccccccc-dddd-eeee-ffff-000000000000",
                      "value": "44444444-5555-6666-7777-888888888888",
                      "display_label": "Manually uploaded face",
                      "comment": "Known fraud attempt",
                      "added_by": "api",
                      "reference_session_id": null,
                      "reference_session_number": null,
                      "reference_session_type": null,
                      "reference_object_uuid": "44444444-5555-6666-7777-888888888888",
                      "metadata": {
                        "reference_image_url": "https://media.example.com/faces/reference.jpg?expires=1760263938&signature=3f9a1c"
                      },
                      "created_at": "2026-10-12T10:12:18.904467Z"
                    }
                  },
                  "Sandbox application": {
                    "value": {
                      "uuid": "cccccccc-dddd-eeee-ffff-000000000000",
                      "value": "44444444-5555-6666-7777-888888888888",
                      "display_label": "Sandbox face entry",
                      "comment": "Known fraud attempt",
                      "added_by": "api",
                      "reference_session_id": null,
                      "reference_session_number": null,
                      "reference_session_type": null,
                      "reference_object_uuid": "44444444-5555-6666-7777-888888888888",
                      "metadata": {
                        "sandbox": true
                      },
                      "created_at": "2026-10-12T10:12:18.904467Z"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Die Liste akzeptiert keine Gesichtsuploads oder das Bild fehlt, ist ungültig, zu groß oder zeigt kein verwertbares Gesicht. Es wurde kein Eintrag erstellt.",
            "content": {
              "application/json": {
                "examples": {
                  "Not a face list": {
                    "value": {
                      "detail": "Face upload is only available for face-type lists."
                    }
                  },
                  "Custom face list": {
                    "value": {
                      "detail": "Face upload is only available for face blocklists and allowlists."
                    }
                  },
                  "Missing image": {
                    "value": {
                      "image": [
                        "This field is required."
                      ]
                    }
                  },
                  "Invalid base64": {
                    "value": {
                      "image": [
                        "Invalid base64 encoding."
                      ]
                    }
                  },
                  "Too large": {
                    "value": {
                      "image": [
                        "Image exceeds maximum size of 2 MB."
                      ]
                    }
                  },
                  "Unreadable image": {
                    "value": {
                      "image": "Invalid image. Provide a valid base64-encoded JPG or PNG."
                    }
                  },
                  "No face": {
                    "value": {
                      "image": "No face detected in the image. Please upload a clear photo with a visible face."
                    }
                  },
                  "No usable face": {
                    "value": {
                      "image": "Could not extract face embedding. Try a different image."
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Der API-Schlüssel mit eingeschränktem Geltungsbereich ist abgelaufen. Andere Authentifizierungsfehler geben `403` zurück.",
            "content": {
              "application/json": {
                "examples": {
                  "Expired API key": {
                    "value": {
                      "detail": "This API key has expired."
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Der `x-api-key`-Header fehlt (ein falscher, widerrufener oder abgelaufener Schlüssel erhält `401`), oder ein API-Schlüssel mit Berechtigungseinschränkungen verfügt nicht über `workflows: write` oder wird von einer IP-Adresse außerhalb seiner Zulassungsliste verwendet.",
            "content": {
              "application/json": {
                "examples": {
                  "Missing or invalid API key": {
                    "value": {
                      "detail": "You do not have permission to perform this action."
                    }
                  },
                  "Scoped key without workflows access": {
                    "value": {
                      "detail": "This API key has no write access to workflows."
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "In der Anwendung des API-Schlüssels existiert keine Liste mit dieser UUID, oder sie wurde gelöscht.",
            "content": {
              "application/json": {
                "examples": {
                  "Not found": {
                    "value": {
                      "detail": "List not found."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/RateLimitedWrite"
          },
          "503": {
            "description": "Die Gesichtsanalyse ist vorübergehend nicht verfügbar. Es wurde kein Eintrag erstellt; versuchen Sie es später erneut.",
            "content": {
              "application/json": {
                "examples": {
                  "Unavailable": {
                    "value": {
                      "detail": "Service temporarily unavailable. Please try again later."
                    }
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/v3/blocklist/": {
      "get": {
        "summary": "Einträge auf der Sperrliste auflisten",
        "description": "Gibt einen paginierten Feed der Gesichter, Ausweisdokumente, Telefonnummern und E-Mail-Adressen aus den Verifizierungssitzungen der Anwendung zurück, die derzeit auf der Sperrliste stehen, sortiert nach `blocklisted_at` in absteigender Reihenfolge; filtern Sie mit `item_type`. Elemente gelöschter Sitzungen sind nicht enthalten. Der Feed umfasst Datensätze, die aus einer Sitzung auf die Sperrliste gesetzt wurden (mit [Sitzungselemente zur Sperrliste hinzufügen](https://docs.didit.me/de/management-api/blocklist/add), über die Konsole oder durch einen aus einer Sitzung erstellten Listeneintrag); manuell zu einer Liste hinzugefügte Werte, hochgeladene Gesichter, Gesichter aus einem Selfie der Dokumentenerfassung und die anderen Eintragstypen werden mit [Listeneinträge auflisten](https://docs.didit.me/de/management-api/lists/list-entries) abgerufen. `face_image` und `front_image` sind kurzlebige signierte URLs, und ein API-Schlüssel mit eingeschränktem Berechtigungsumfang ohne `media: read` erhält `null`. Ein API-Schlüssel mit eingeschränktem Berechtigungsumfang benötigt `workflows: read`.",
        "operationId": "list_blocklist_items",
        "x-didit-sdk": {
          "resource": "blocklist",
          "method": "list",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Blocklist"
        ],
        "parameters": [
          {
            "name": "item_type",
            "in": "query",
            "required": false,
            "description": "Nur Elemente dieses Typs. Wenn weggelassen, werden alle Typen zurückgegeben.",
            "schema": {
              "type": "string",
              "enum": [
                "face",
                "document",
                "phone",
                "email"
              ]
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Seitengröße. Standardmäßig 50. Ein Wert über 1000000 gibt `400` zurück; 0, ein negativer oder ein nicht-numerischer Wert fällt auf 50 zurück.",
            "schema": {
              "type": "integer",
              "default": 50,
              "minimum": 1,
              "maximum": 1000000
            }
          },
          {
            "name": "offset",
            "in": "query",
            "required": false,
            "description": "Nullbasierter Index des ersten zurückzugebenden Elements. Folgen Sie vorzugsweise `next`. Ein Wert über 1000000 gibt `400` zurück; ein negativer oder nicht-numerischer Wert fällt auf 0 zurück.",
            "schema": {
              "type": "integer",
              "default": 0,
              "minimum": 0,
              "maximum": 1000000
            }
          }
        ],
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X GET 'https://verification.didit.me/v3/blocklist/?item_type=document' \\\n  -H 'x-api-key: YOUR_API_KEY'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nfor item in client.blocklist.list():\n    print(item)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nfor await (const item of didit.blocklist.list()) {\n  console.log(item);\n}"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\niter := client.Blocklist.ListAutoPaging(ctx, didit.BlocklistListParams{})\nfor iter.Next() {\n\tfmt.Printf(\"%+v\\n\", iter.Current())\n}\nif err := iter.Err(); err != nil {\n\tlog.Fatal(err)\n}"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nfor (var item : client.blocklist().list()) {\n    System.out.println(item);\n}"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\nforeach ($didit->blocklist->list() as $item) {\n    print_r($item->toArray());\n}"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\ndidit.blocklist.list.auto_paging_each do |item|\n  puts item.to_h\nend"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nawait foreach (var item in await client.Blocklist.ListAsync())\n{\n    Console.WriteLine(JsonSerializer.Serialize(item));\n}"
          }
        ],
        "responses": {
          "200": {
            "description": "Eine Seite mit Einträgen auf der Sperrliste, neueste zuerst.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "count",
                    "next",
                    "previous",
                    "results"
                  ],
                  "properties": {
                    "count": {
                      "type": "integer",
                      "minimum": 0,
                      "description": "Gesamtzahl der Einträge auf der Sperrliste, die den Filtern entsprechen."
                    },
                    "next": {
                      "type": "string",
                      "format": "uri",
                      "nullable": true,
                      "description": "Absolute URL der nächsten Seite oder `null` auf der letzten Seite."
                    },
                    "previous": {
                      "type": "string",
                      "format": "uri",
                      "nullable": true,
                      "description": "Absolute URL der vorherigen Seite oder `null` auf der ersten Seite."
                    },
                    "results": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/BlocklistedItem"
                      }
                    }
                  }
                },
                "examples": {
                  "Mixed feed": {
                    "value": {
                      "count": 2,
                      "next": null,
                      "previous": null,
                      "results": [
                        {
                          "type": "document",
                          "session_id": "33333333-4444-5555-6666-777777777777",
                          "session_number": 1042,
                          "blocklisted_at": "2026-10-12T10:06:12.701553Z",
                          "face_image": null,
                          "document_type": "ID",
                          "document_number": "X1234567",
                          "front_image": "https://media.example.com/documents/front.jpg?expires=1760263938&signature=8b2e47",
                          "phone_number": null,
                          "country_code": null,
                          "email": null
                        },
                        {
                          "type": "phone",
                          "session_id": "77777777-8888-9999-0000-111111111111",
                          "session_number": 1017,
                          "blocklisted_at": "2026-10-08T15:31:09.400127Z",
                          "face_image": null,
                          "document_type": null,
                          "document_number": null,
                          "front_image": null,
                          "phone_number": "+14155552671",
                          "country_code": "US",
                          "email": null
                        }
                      ]
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Ein Abfrageparameter ist ungültig.",
            "content": {
              "application/json": {
                "examples": {
                  "Unknown item type": {
                    "value": {
                      "item_type": [
                        "\"wallet\" is not a valid choice."
                      ]
                    }
                  },
                  "Limit too large": {
                    "value": [
                      "limit must not exceed 1000000."
                    ]
                  }
                }
              }
            }
          },
          "401": {
            "description": "Der API-Schlüssel mit eingeschränktem Geltungsbereich ist abgelaufen. Andere Authentifizierungsfehler geben `403` zurück.",
            "content": {
              "application/json": {
                "examples": {
                  "Expired API key": {
                    "value": {
                      "detail": "This API key has expired."
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Der `x-api-key`-Header fehlt (ein falscher, widerrufener oder abgelaufener Schlüssel erhält `401`), oder ein berechtigungseingeschränkter API-Schlüssel verfügt nicht über `workflows: read` oder wird von einer IP-Adresse außerhalb seiner Zulassungsliste verwendet.",
            "content": {
              "application/json": {
                "examples": {
                  "Missing or invalid API key": {
                    "value": {
                      "detail": "You do not have permission to perform this action."
                    }
                  },
                  "Scoped key without workflows access": {
                    "value": {
                      "detail": "This API key has no read access to workflows."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Das geteilte Leselimit von 600 Anfragen pro Minute pro API-Schlüssel wurde überschritten. Beachten Sie `Retry-After`, bevor Sie es erneut versuchen.",
            "content": {
              "application/json": {
                "examples": {
                  "Rate limited": {
                    "value": {
                      "detail": "GET request rate limit exceeded. You can make up to 600 requests per minute."
                    }
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/v3/blocklist/add/": {
      "post": {
        "summary": "Sitzungselemente zur Sperrliste hinzufügen",
        "description": "Setzt das Gesicht, das Ausweisdokument, die Telefonnummer oder die E-Mail-Adresse einer Personenverifizierungssitzung der Anwendung auf die Sperrliste. Für jeden ausgewählten Typ nimmt Didit den neuesten Datensatz der Sitzung, markiert ihn als gesperrt und fügt einen mit der Sitzung verknüpften Eintrag zur passenden Systemsperrliste hinzu (`added_by: \"api\"`), sodass neue Sitzungen mit einem übereinstimmenden Gesicht, einer Dokumentnummer, Telefonnummer oder E-Mail-Adresse abgelehnt werden. Jeder ausgewählte Eintrag wird zuerst geprüft: Fehlt ein Eintrag, wird nichts auf die Sperrliste gesetzt; wird der Aufruf für einen bereits aufgeführten Eintrag wiederholt, bleibt dessen einzelner Eintrag erhalten und `blocklisted_at` wird aktualisiert. Die Sitzung selbst und bereits abgeschlossene Sitzungen werden nicht geändert. Ein eingeschränkter API-Schlüssel benötigt `workflows: write`.",
        "operationId": "add_to_blocklist",
        "x-didit-sdk": {
          "resource": "blocklist",
          "method": "add",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Blocklist"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "session_id"
                ],
                "description": "Mindestens ein `blocklist_*`-Flag muss `true` sein.",
                "properties": {
                  "session_id": {
                    "type": "string",
                    "format": "uuid",
                    "description": "Eine Benutzerverifizierungssitzung Ihrer Anwendung. Gelöschte Sitzungen werden abgelehnt."
                  },
                  "blocklist_face": {
                    "type": "boolean",
                    "default": false,
                    "description": "Gesicht der Sitzung auf die Sperrliste setzen."
                  },
                  "blocklist_document": {
                    "type": "boolean",
                    "default": false,
                    "description": "Ausweisdokument der Sitzung auf die Sperrliste setzen. Das Dokument benötigt Ausstellungsstaat, Dokumenttyp, Dokumentnummer und vollständigen Namen."
                  },
                  "blocklist_phone": {
                    "type": "boolean",
                    "default": false,
                    "description": "Telefonnummer der Sitzung auf die Sperrliste setzen."
                  },
                  "blocklist_email": {
                    "type": "boolean",
                    "default": false,
                    "description": "E-Mail-Adresse der Sitzung auf die Sperrliste setzen."
                  }
                }
              },
              "examples": {
                "Face and document": {
                  "value": {
                    "session_id": "33333333-4444-5555-6666-777777777777",
                    "blocklist_face": true,
                    "blocklist_document": true
                  }
                },
                "Phone only": {
                  "value": {
                    "session_id": "33333333-4444-5555-6666-777777777777",
                    "blocklist_phone": true
                  }
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X POST 'https://verification.didit.me/v3/blocklist/add/' \\\n  -H 'x-api-key: YOUR_API_KEY' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\n    \"session_id\": \"33333333-4444-5555-6666-777777777777\",\n    \"blocklist_face\": true,\n    \"blocklist_document\": true\n  }'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.blocklist.add(\n    session_id=\"33333333-4444-5555-6666-777777777777\",\n    blocklist_face=True,\n    blocklist_document=True,\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.blocklist.add({\n  session_id: \"33333333-4444-5555-6666-777777777777\",\n  blocklist_face: true,\n  blocklist_document: true,\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Blocklist.Add(ctx, didit.BlocklistAddParams{\n\tSessionID:         \"33333333-4444-5555-6666-777777777777\",\n\tBlocklistFace:     didit.Bool(true),\n\tBlocklistDocument: didit.Bool(true),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\nimport me.didit.types.BlocklistAddParams;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.blocklist().add(BlocklistAddParams.builder()\n        .sessionId(\"33333333-4444-5555-6666-777777777777\")\n        .blocklistFace(true)\n        .blocklistDocument(true)\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->blocklist->add([\n    'session_id' => '33333333-4444-5555-6666-777777777777',\n    'blocklist_face' => true,\n    'blocklist_document' => true,\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.blocklist.add(\n  session_id: \"33333333-4444-5555-6666-777777777777\",\n  blocklist_face: true,\n  blocklist_document: true\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Blocklist.AddAsync(new BlocklistAddParams\n{\n    SessionId = \"33333333-4444-5555-6666-777777777777\",\n    BlocklistFace = true,\n    BlocklistDocument = true,\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "responses": {
          "200": {
            "description": "Die ausgewählten Elemente wurden auf die Sperrliste gesetzt.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "message"
                  ],
                  "properties": {
                    "message": {
                      "type": "string",
                      "description": "Immer `Successfully updated blocklist.`"
                    }
                  }
                },
                "examples": {
                  "Blocklisted": {
                    "value": {
                      "message": "Successfully updated blocklist."
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Der Body ist ungültig, die Sitzung ist keine Verifizierungssitzung dieser Anwendung oder sie enthält keinen Eintrag des ausgewählten Typs. Es wurde nichts auf die Sperrliste gesetzt.",
            "content": {
              "application/json": {
                "examples": {
                  "Unknown session": {
                    "value": {
                      "non_field_errors": [
                        "Session not found"
                      ]
                    }
                  },
                  "No item selected": {
                    "value": {
                      "non_field_errors": [
                        "Must specify at least one item to blocklist"
                      ]
                    }
                  },
                  "No face record": {
                    "value": {
                      "non_field_errors": [
                        "Session does not have a face record"
                      ]
                    }
                  },
                  "Incomplete document": {
                    "value": {
                      "non_field_errors": [
                        "To blocklist a document, the document must have an issuing state, document type, document number and full name"
                      ]
                    }
                  },
                  "Invalid session id": {
                    "value": {
                      "session_id": [
                        "Must be a valid UUID."
                      ]
                    }
                  },
                  "Missing session id": {
                    "value": {
                      "session_id": [
                        "This field is required."
                      ]
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Der API-Schlüssel mit eingeschränktem Geltungsbereich ist abgelaufen. Andere Authentifizierungsfehler geben `403` zurück.",
            "content": {
              "application/json": {
                "examples": {
                  "Expired API key": {
                    "value": {
                      "detail": "This API key has expired."
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Der `x-api-key`-Header fehlt (ein falscher, widerrufener oder abgelaufener Schlüssel erhält `401`), oder ein API-Schlüssel mit Berechtigungseinschränkungen verfügt nicht über `workflows: write` oder wird von einer IP-Adresse außerhalb seiner Zulassungsliste verwendet.",
            "content": {
              "application/json": {
                "examples": {
                  "Missing or invalid API key": {
                    "value": {
                      "detail": "You do not have permission to perform this action."
                    }
                  },
                  "Scoped key without workflows access": {
                    "value": {
                      "detail": "This API key has no write access to workflows."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/RateLimitedWrite"
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/v3/blocklist/remove/": {
      "post": {
        "summary": "Sitzungselemente von der Sperrliste entfernen",
        "description": "Hebt die Sperre für das Gesicht, das Ausweisdokument, die Telefonnummer oder die E-Mail-Adresse einer Personenverifizierungssitzung der Anwendung auf. Für jeden ausgewählten Typ nimmt Didit den neuesten Datensatz der Sitzung, entfernt dessen Sperrlisten-Flag und löscht die aus diesem Datensatz erstellten Einträge in der System-Sperrliste, sodass neue Sitzungen nicht mehr abgelehnt werden. Nach Wert zu einer Liste hinzugefügte Einträge bleiben unberührt: Finden Sie diese mit [Listeneinträge auflisten](https://docs.didit.me/de/management-api/lists/list-entries) und löschen Sie sie mit [Einen Listeneintrag löschen](https://docs.didit.me/de/management-api/lists/delete-entry). Das Aufheben einer Sperre für einen Datensatz, der nicht auf der Sperrliste steht, ist erfolgreich und ändert nichts, und bereits abgeschlossene Sitzungen werden nicht geändert. Ein berechtigungsbeschränkter API-Schlüssel benötigt `workflows: write`.",
        "operationId": "remove_from_blocklist",
        "x-didit-sdk": {
          "resource": "blocklist",
          "method": "remove",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Blocklist"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "session_id"
                ],
                "description": "Mindestens ein `unblock_*`-Flag muss `true` sein.",
                "properties": {
                  "session_id": {
                    "type": "string",
                    "format": "uuid",
                    "description": "Eine Benutzerverifizierungssitzung Ihrer Anwendung. Gelöschte Sitzungen werden abgelehnt."
                  },
                  "unblock_face": {
                    "type": "boolean",
                    "default": false,
                    "description": "Die Sperre für das Gesicht der Sitzung aufheben."
                  },
                  "unblock_document": {
                    "type": "boolean",
                    "default": false,
                    "description": "Die Sperre für das Ausweisdokument der Sitzung aufheben."
                  },
                  "unblock_phone": {
                    "type": "boolean",
                    "default": false,
                    "description": "Die Sperre für die Telefonnummer der Sitzung aufheben."
                  },
                  "unblock_email": {
                    "type": "boolean",
                    "default": false,
                    "description": "Die Sperre für die E-Mail-Adresse der Sitzung aufheben."
                  }
                }
              },
              "examples": {
                "Face and document": {
                  "value": {
                    "session_id": "33333333-4444-5555-6666-777777777777",
                    "unblock_face": true,
                    "unblock_document": true
                  }
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X POST 'https://verification.didit.me/v3/blocklist/remove/' \\\n  -H 'x-api-key: YOUR_API_KEY' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\n    \"session_id\": \"33333333-4444-5555-6666-777777777777\",\n    \"unblock_face\": true,\n    \"unblock_document\": true\n  }'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.blocklist.remove(\n    session_id=\"33333333-4444-5555-6666-777777777777\",\n    unblock_face=True,\n    unblock_document=True,\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.blocklist.remove({\n  session_id: \"33333333-4444-5555-6666-777777777777\",\n  unblock_face: true,\n  unblock_document: true,\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Blocklist.Remove(ctx, didit.BlocklistRemoveParams{\n\tSessionID:       \"33333333-4444-5555-6666-777777777777\",\n\tUnblockFace:     didit.Bool(true),\n\tUnblockDocument: didit.Bool(true),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\nimport me.didit.types.BlocklistRemoveParams;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.blocklist().remove(BlocklistRemoveParams.builder()\n        .sessionId(\"33333333-4444-5555-6666-777777777777\")\n        .unblockFace(true)\n        .unblockDocument(true)\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->blocklist->remove([\n    'session_id' => '33333333-4444-5555-6666-777777777777',\n    'unblock_face' => true,\n    'unblock_document' => true,\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.blocklist.remove(\n  session_id: \"33333333-4444-5555-6666-777777777777\",\n  unblock_face: true,\n  unblock_document: true\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Blocklist.RemoveAsync(new BlocklistRemoveParams\n{\n    SessionId = \"33333333-4444-5555-6666-777777777777\",\n    UnblockFace = true,\n    UnblockDocument = true,\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "responses": {
          "200": {
            "description": "Die Sperre für die ausgewählten Elemente wurde aufgehoben.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "message"
                  ],
                  "properties": {
                    "message": {
                      "type": "string",
                      "description": "Immer `Successfully removed from blocklist.`"
                    }
                  }
                },
                "examples": {
                  "Unblocked": {
                    "value": {
                      "message": "Successfully removed from blocklist."
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Der Body ist ungültig, die Sitzung ist keine Verifizierungssitzung dieser Anwendung oder sie enthält keinen Eintrag des ausgewählten Typs. Es wurde nichts geändert.",
            "content": {
              "application/json": {
                "examples": {
                  "Unknown session": {
                    "value": {
                      "non_field_errors": [
                        "Session not found"
                      ]
                    }
                  },
                  "No item selected": {
                    "value": {
                      "non_field_errors": [
                        "Must specify at least one item to unblock"
                      ]
                    }
                  },
                  "No email record": {
                    "value": {
                      "non_field_errors": [
                        "Session does not have an email record"
                      ]
                    }
                  },
                  "Invalid session id": {
                    "value": {
                      "session_id": [
                        "Must be a valid UUID."
                      ]
                    }
                  },
                  "Missing session id": {
                    "value": {
                      "session_id": [
                        "This field is required."
                      ]
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Der API-Schlüssel mit eingeschränktem Geltungsbereich ist abgelaufen. Andere Authentifizierungsfehler geben `403` zurück.",
            "content": {
              "application/json": {
                "examples": {
                  "Expired API key": {
                    "value": {
                      "detail": "This API key has expired."
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Der `x-api-key`-Header fehlt (ein falscher, widerrufener oder abgelaufener Schlüssel erhält `401`), oder ein API-Schlüssel mit Berechtigungseinschränkungen verfügt nicht über `workflows: write` oder wird von einer IP-Adresse außerhalb seiner Zulassungsliste verwendet.",
            "content": {
              "application/json": {
                "examples": {
                  "Missing or invalid API key": {
                    "value": {
                      "detail": "You do not have permission to perform this action."
                    }
                  },
                  "Scoped key without workflows access": {
                    "value": {
                      "detail": "This API key has no write access to workflows."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/RateLimitedWrite"
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/v3/webhook/": {
      "get": {
        "summary": "Webhook-Konfiguration abrufen",
        "description": "Gibt die Webhook-Einstellungen der Anwendung in einem einzigen Aufruf zurück: jedes [Webhook-Ziel](https://docs.didit.me/de/management-api/webhook/list-destinations) mit seinem Signatur-Geheimnis, die Ereignistypen, die ein Ziel abonnieren kann, die (Legacy-)Webhook-URL, Version und das Geheimnis auf Anwendungsebene, die Aufbewahrungsrichtlinie für Daten und biometrische Templates sowie die Return-Hosts der Digital ID Wallet. Didit stellt Webhooks an Ziele zu, die jeweils mit ihrem eigenen `secret_shared_key` signiert sind; die übergeordneten Felder `webhook_url`, `webhook_version` und `secret_shared_key` werden nur verwendet, solange kein Ziel aktiviert ist, und dann nur für `status.updated` und `data.updated`. Die Antwort enthält Signatur-Geheimnisse, halten Sie sie daher von Logs und clientseitigem Code fern. Ein API-Schlüssel mit eingeschränktem Geltungsbereich benötigt `webhooks: read`.",
        "operationId": "get_webhook_config",
        "x-didit-sdk": {
          "resource": "webhooks",
          "method": "retrieve_config",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Webhook"
        ],
        "parameters": [],
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X GET 'https://verification.didit.me/v3/webhook/' \\\n  -H 'x-api-key: YOUR_API_KEY'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.webhooks.retrieve_config()\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.webhooks.retrieveConfig();\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Webhooks.RetrieveConfig(ctx)\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.webhooks().retrieveConfig();\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->webhooks->retrieveConfig();\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.webhooks.retrieve_config\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Webhooks.RetrieveConfigAsync();\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "responses": {
          "200": {
            "description": "Die Webhook-Konfiguration.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WebhookConfig"
                },
                "examples": {
                  "One destination": {
                    "value": {
                      "webhook_url": "https://yourapp.com/webhooks/didit",
                      "webhook_version": "v3",
                      "secret_shared_key": "dGhpcy1pcy10aGUtYXBwLWxldmVsLXNlY3JldC0wMDA",
                      "capture_method": "MOBILE",
                      "data_retention_months": 24,
                      "face_retention_policy": "delete_with_session",
                      "face_retention_days": null,
                      "biometric_consent_mode": "auto",
                      "available_events": [
                        {
                          "value": "status.updated",
                          "label": "Session status updated"
                        },
                        {
                          "value": "data.updated",
                          "label": "Session data updated"
                        },
                        {
                          "value": "user.status.updated",
                          "label": "User status updated"
                        },
                        {
                          "value": "user.data.updated",
                          "label": "User data updated"
                        },
                        {
                          "value": "business.status.updated",
                          "label": "Business status updated"
                        },
                        {
                          "value": "business.data.updated",
                          "label": "Business data updated"
                        },
                        {
                          "value": "activity.created",
                          "label": "Activity created"
                        },
                        {
                          "value": "transaction.created",
                          "label": "Transaction created"
                        },
                        {
                          "value": "transaction.status.updated",
                          "label": "Transaction status updated"
                        },
                        {
                          "value": "travel_rule.status.updated",
                          "label": "Travel Rule Status Updated"
                        },
                        {
                          "value": "workflow.compliance_changed",
                          "label": "Workflow Compliance Changed"
                        }
                      ],
                      "allowed_return_hosts": [
                        "shop.example.com"
                      ],
                      "endpoints": [
                        {
                          "uuid": "11111111-2222-3333-4444-555555555555",
                          "label": "Production session webhooks",
                          "url": "https://yourapp.com/webhooks/didit",
                          "enabled": true,
                          "webhook_version": "v3",
                          "secret_shared_key": "dGhpcy1pcy1hbi1leGFtcGxlLXNlY3JldC0wMDAwMDA",
                          "subscribed_events": [
                            "status.updated",
                            "data.updated"
                          ],
                          "created_at": "2026-01-04T08:00:00.000000Z",
                          "updated_at": "2026-04-22T14:09:11.523671Z"
                        }
                      ]
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Der API-Schlüssel ist abgelaufen: Er wurde mit einem Ablaufdatum erstellt, das verstrichen ist. Ein falscher oder widerrufener Schlüssel erhält ebenfalls `401`; ein fehlender Schlüssel erhält `403`.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string",
                      "description": "Lesbare Fehlermeldung."
                    }
                  }
                },
                "examples": {
                  "Expired key": {
                    "value": {
                      "detail": "This API key has expired."
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Die Anfrage ist nicht zulässig. Bei einem fehlenden, ungültigen oder widerrufenen `x-api-key` erhalten Sie `You do not have permission to perform this action.` Ein berechtigungsbeschränkter Schlüssel ohne den für diesen Endpoint erforderlichen Zugriff erhält eine Meldung mit dem fehlenden Zugriff, und ein Schlüssel, der außerhalb seiner IP-Allowlist verwendet wird, erhält `This API key can't be used from this IP address.`",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string",
                      "description": "Lesbare Fehlermeldung."
                    }
                  }
                },
                "examples": {
                  "Missing or invalid key": {
                    "value": {
                      "detail": "You do not have permission to perform this action."
                    }
                  },
                  "Scoped key without webhooks read": {
                    "value": {
                      "detail": "This API key has no read access to webhooks."
                    }
                  },
                  "Outside the IP allowlist": {
                    "value": {
                      "detail": "This API key can't be used from this IP address."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate-Limit überschritten: Mehr als 600 GET-Anfragen im aktuellen Ein-Minuten-Fenster für diesen API-Schlüssel. Warten Sie `Retry-After` Sekunden vor einem Wiederholungsversuch.",
            "headers": {
              "Retry-After": {
                "description": "Sekunden, die vor einem Wiederholungsversuch gewartet werden müssen.",
                "schema": {
                  "type": "integer",
                  "minimum": 1,
                  "example": 30
                }
              },
              "X-RateLimit-Limit": {
                "description": "Im einminütigen Zeitfenster zulässige Anfragen (600).",
                "schema": {
                  "type": "integer",
                  "example": 600
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Im aktuellen Zeitfenster verbleibende Anfragen.",
                "schema": {
                  "type": "integer",
                  "example": 0
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix-Zeit (Sekunden), zu der das aktuelle Zeitfenster zurückgesetzt wird.",
                "schema": {
                  "type": "integer",
                  "example": 1792056120
                }
              },
              "X-RateLimit-Scope": {
                "description": "Name des Budgets, das überschritten wurde.",
                "schema": {
                  "type": "string",
                  "example": "generic-get"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string",
                      "description": "Lesbare Fehlermeldung."
                    }
                  }
                },
                "examples": {
                  "Throttled": {
                    "value": {
                      "detail": "GET request rate limit exceeded. You can make up to 600 requests per minute."
                    }
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      },
      "patch": {
        "summary": "Webhook-Konfiguration aktualisieren",
        "description": "Einstellungen auf Anwendungsebene teilweise aktualisieren: die Legacy-Webhook-URL, -Version und das Secret, die Aufbewahrungsrichtlinie für Daten und biometrische Templates sowie die Return-Hosts der Digital ID Wallet. Senden Sie nur die zu ändernden Felder; die Antwort ist die vollständige Konfiguration im selben Format wie `GET /v3/webhook/`. Webhook-Ziele werden hier nicht verwaltet: Erstellen, aktualisieren und löschen Sie diese über die Endpoints `/v3/webhook/destinations/`, und senden Sie kein `endpoints`-Feld an diesen Endpoint. Eine Änderung von `data_retention_months` gilt auch für bestehende Sitzungen, und Sitzungen, die dadurch gelöscht werden, können nicht wiederhergestellt werden; lesen Sie zuerst [Datenaufbewahrung](https://docs.didit.me/de/console/data-retention). Ein API-Schlüssel mit dem Scope `webhooks: write` ist erforderlich.",
        "operationId": "update_webhook_config",
        "x-didit-sdk": {
          "resource": "webhooks",
          "method": "update_config",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Webhook"
        ],
        "parameters": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "description": "Senden Sie nur die zu ändernden Felder. Webhook-Ziele werden hier nicht verwaltet.",
                "properties": {
                  "webhook_url": {
                    "type": "string",
                    "format": "uri",
                    "nullable": true,
                    "maxLength": 2000,
                    "description": "Veraltete Webhook-URL auf Anwendungsebene. Didit verwendet diese nur, solange die Anwendung über kein aktiviertes Ziel verfügt, und auch dann nur für `status.updated` und `data.updated`. Sie erstellt kein Ziel, und das nächste Erstellen, Aktualisieren oder Löschen eines Ziels ersetzt sie. Um Webhooks zu empfangen, erstellen Sie stattdessen ein Ziel mit `POST /v3/webhook/destinations/`."
                  },
                  "webhook_version": {
                    "type": "string",
                    "enum": [
                      "v1",
                      "v2",
                      "v3"
                    ],
                    "description": "Payload-Version der Legacy-`webhook_url`."
                  },
                  "rotate_secret_key": {
                    "type": "boolean",
                    "default": false,
                    "description": "`true` ersetzt den `secret_shared_key` auf Anwendungsebene sofort durch einen neuen Zufallswert; der neue Wert ist in der Antwort enthalten. Ziel-Geheimnisse werden nicht geändert. Jeder Aufruf mit `true` generiert ein neues Geheimnis und ist daher nicht idempotent."
                  },
                  "capture_method": {
                    "type": "string",
                    "enum": [
                      "MOBILE",
                      "MOBILE_AND_DESKTOP"
                    ],
                    "description": "Veraltete Anwendungseinstellung. Der Verifizierungsablauf liest diesen Wert nicht aus."
                  },
                  "data_retention_months": {
                    "type": "integer",
                    "nullable": true,
                    "minimum": 1,
                    "maximum": 120,
                    "description": "Automatisches Löschzeitfenster in Monaten (ein Monat zählt als 30 Tage) oder `null` für keine automatische Löschung. Eine Änderung gilt auch für bestehende Sitzungen: Jede Benutzerverifizierungssitzung, die älter als das neue Zeitfenster ist, wird automatisch gelöscht, und diese Löschung ist unwiderruflich."
                  },
                  "face_retention_policy": {
                    "type": "string",
                    "enum": [
                      "delete_with_session",
                      "retain_until_user_deleted"
                    ],
                    "description": "Was mit dem Gesichts-Embedding einer Sitzung passiert, wenn die Sitzung gelöscht wird. `retain_until_user_deleted` erfordert `face_retention_days` in derselben Anfrage oder dass der Wert bereits festgelegt ist. Eine Änderung gilt für Sitzungslöschungen ab diesem Zeitpunkt; sie erstellt oder bereinigt kein bestehendes biometrisches Template."
                  },
                  "face_retention_days": {
                    "type": "integer",
                    "nullable": true,
                    "minimum": 1,
                    "maximum": 3650,
                    "description": "Aufbewahrungsfrist in Tagen für biometrische Templates unter `retain_until_user_deleted`."
                  },
                  "biometric_consent_mode": {
                    "type": "string",
                    "enum": [
                      "auto",
                      "always",
                      "never"
                    ],
                    "description": "Wann der gehostete Ablauf und die nativen SDKs die Person vor einer Gesichtserfassung um eine ausdrückliche biometrische Einwilligung bitten. `auto` (Standard) fragt nur ab, wenn ein Auslöser zutrifft: Ein angegebener Bundesstaat, die IP-Adresse der Person oder der Aussteller des Ausweisdokuments liegt in Illinois, Texas oder Colorado, oder die Person scheint sich ohne bekannten Bundesstaat in den USA zu befinden. `always` fragt jede Person ab, deren Workflow ein Gesicht erfasst. `never` zeigt den Schritt nie an, und Sie holen die Einwilligung vor dem Selfie selbst ein. Jede Änderung wird im Audit-Log protokolliert. Siehe [Biometrische Einwilligung](https://docs.didit.me/de/getting-started/biometric-consent)."
                  },
                  "allowed_return_hosts": {
                    "type": "array",
                    "maxItems": 20,
                    "description": "Ersetzt die gesamte Liste der Rückkehr-Hosts für Digital-ID-Wallets. Nur reine Hostnamen wie `shop.example.com`: kein Schema, Port, Pfad oder Wildcard. Werte werden in Kleinbuchstaben umgewandelt und Duplikate entfernt. Senden Sie `[]`, um die Liste zu leeren.",
                    "items": {
                      "type": "string",
                      "maxLength": 253
                    }
                  },
                  "allowed_domains": {
                    "type": "array",
                    "maxItems": 50,
                    "items": {
                      "type": "string",
                      "maxLength": 300
                    },
                    "description": "Ersetzt die gesamte Liste der zulässigen Origins. Origins (z. B. `https://app.example.com`; `http` nur für `localhost`), in die der gehostete Verifizierungs-Workflow eingebettet werden darf und an die der Benutzer mit einem Sitzungs-Callback zurückgesendet werden darf. Server-zu-Server-Aufrufe sind nicht betroffen. Eine leere Liste bedeutet keine Einschränkung. Didit speichert jeden Origin in Kleinbuchstaben ohne Standard-Port. Ein ungültiger Eintrag schlägt mit `400` für `allowed_domains` fehl. Senden Sie `[]`, um die Einschränkung aufzuheben.",
                    "example": [
                      "https://app.example.com"
                    ]
                  }
                }
              },
              "examples": {
                "Enable biometric template retention": {
                  "value": {
                    "face_retention_policy": "retain_until_user_deleted",
                    "face_retention_days": 365,
                    "biometric_consent_mode": "auto"
                  }
                },
                "Rotate the legacy secret": {
                  "value": {
                    "rotate_secret_key": true
                  }
                },
                "Set data retention": {
                  "value": {
                    "data_retention_months": 24
                  }
                },
                "Register return hosts": {
                  "value": {
                    "allowed_return_hosts": [
                      "shop.example.com",
                      "app.example.com"
                    ]
                  }
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X PATCH 'https://verification.didit.me/v3/webhook/' \\\n  -H 'x-api-key: YOUR_API_KEY' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\"face_retention_policy\": \"retain_until_user_deleted\", \"face_retention_days\": 365}'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.webhooks.update_config(\n    face_retention_policy=\"retain_until_user_deleted\",\n    face_retention_days=365,\n    biometric_consent_mode=\"auto\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.webhooks.updateConfig({\n  face_retention_policy: \"retain_until_user_deleted\",\n  face_retention_days: 365,\n  biometric_consent_mode: \"auto\",\n});\nconsole.log(result);"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\nimport me.didit.types.WebhooksUpdateConfigParams;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.webhooks().updateConfig(WebhooksUpdateConfigParams.builder()\n        .faceRetentionPolicy(WebhooksUpdateConfigParams.FaceRetentionPolicy.of(\"retain_until_user_deleted\"))\n        .faceRetentionDays(365L)\n        .biometricConsentMode(WebhooksUpdateConfigParams.BiometricConsentMode.of(\"auto\"))\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->webhooks->updateConfig([\n    'face_retention_policy' => 'retain_until_user_deleted',\n    'face_retention_days' => 365,\n    'biometric_consent_mode' => 'auto',\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.webhooks.update_config(\n  face_retention_policy: \"retain_until_user_deleted\",\n  face_retention_days: 365,\n  biometric_consent_mode: \"auto\"\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Webhooks.UpdateConfigAsync(new WebhooksUpdateConfigParams\n{\n    FaceRetentionPolicy = new WebhooksUpdateConfigParamsFaceRetentionPolicy(\"retain_until_user_deleted\"),\n    FaceRetentionDays = 365,\n    BiometricConsentMode = new WebhooksUpdateConfigParamsBiometricConsentMode(\"auto\"),\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "responses": {
          "200": {
            "description": "Die vollständige Konfiguration nach der Aktualisierung, in derselben Struktur wie `GET /v3/webhook/`. Wenn Sie das Geheimnis rotiert haben, speichern Sie den neuen `secret_shared_key`, bevor Sie die Antwort verwerfen.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WebhookConfig"
                },
                "examples": {
                  "Retention enabled": {
                    "value": {
                      "webhook_url": "https://yourapp.com/webhooks/didit",
                      "webhook_version": "v3",
                      "secret_shared_key": "dGhpcy1pcy10aGUtYXBwLWxldmVsLXNlY3JldC0wMDA",
                      "capture_method": "MOBILE",
                      "data_retention_months": 24,
                      "face_retention_policy": "retain_until_user_deleted",
                      "face_retention_days": 365,
                      "biometric_consent_mode": "auto",
                      "available_events": [
                        {
                          "value": "status.updated",
                          "label": "Session status updated"
                        },
                        {
                          "value": "data.updated",
                          "label": "Session data updated"
                        },
                        {
                          "value": "user.status.updated",
                          "label": "User status updated"
                        },
                        {
                          "value": "user.data.updated",
                          "label": "User data updated"
                        },
                        {
                          "value": "business.status.updated",
                          "label": "Business status updated"
                        },
                        {
                          "value": "business.data.updated",
                          "label": "Business data updated"
                        },
                        {
                          "value": "activity.created",
                          "label": "Activity created"
                        },
                        {
                          "value": "transaction.created",
                          "label": "Transaction created"
                        },
                        {
                          "value": "transaction.status.updated",
                          "label": "Transaction status updated"
                        },
                        {
                          "value": "travel_rule.status.updated",
                          "label": "Travel Rule Status Updated"
                        },
                        {
                          "value": "workflow.compliance_changed",
                          "label": "Workflow Compliance Changed"
                        }
                      ],
                      "allowed_return_hosts": [
                        "shop.example.com"
                      ],
                      "endpoints": [
                        {
                          "uuid": "11111111-2222-3333-4444-555555555555",
                          "label": "Production session webhooks",
                          "url": "https://yourapp.com/webhooks/didit",
                          "enabled": true,
                          "webhook_version": "v3",
                          "secret_shared_key": "dGhpcy1pcy1hbi1leGFtcGxlLXNlY3JldC0wMDAwMDA",
                          "subscribed_events": [
                            "status.updated",
                            "data.updated"
                          ],
                          "created_at": "2026-01-04T08:00:00.000000Z",
                          "updated_at": "2026-04-22T14:09:11.523671Z"
                        }
                      ]
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Validierung fehlgeschlagen: Jedes ungültige Feld wird einer Liste von Meldungen zugeordnet, und es wird nichts geändert. Ein Body, der kein gültiges JSON ist, gibt `{\"detail\": \"JSON parse error - ...\"}` zurück.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "description": "Jedem ungültigen Feld ist eine Liste von Meldungen zugeordnet.",
                  "additionalProperties": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    }
                  }
                },
                "examples": {
                  "Retention days missing": {
                    "value": {
                      "face_retention_days": [
                        "A finite retention duration is required when face retention is enabled."
                      ],
                      "biometric_consent_mode": "auto"
                    }
                  },
                  "Retention window out of range": {
                    "value": {
                      "data_retention_months": [
                        "Ensure this value is less than or equal to 120."
                      ]
                    }
                  },
                  "Invalid return host": {
                    "value": {
                      "allowed_return_hosts": [
                        "'https://shop.example.com' is not a hostname. Register the bare host (e.g. shop.example.com): no scheme, port, path or wildcard."
                      ]
                    }
                  },
                  "Invalid choice": {
                    "value": {
                      "face_retention_policy": [
                        "\"forever\" is not a valid choice."
                      ]
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Der API-Schlüssel ist abgelaufen: Er wurde mit einem Ablaufdatum erstellt, das verstrichen ist. Ein falscher oder widerrufener Schlüssel erhält ebenfalls `401`; ein fehlender Schlüssel erhält `403`.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string",
                      "description": "Lesbare Fehlermeldung."
                    }
                  }
                },
                "examples": {
                  "Expired key": {
                    "value": {
                      "detail": "This API key has expired."
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Die Anfrage ist nicht zulässig. Bei einem fehlenden, ungültigen oder widerrufenen `x-api-key` erhalten Sie `You do not have permission to perform this action.` Ein berechtigungsbeschränkter Schlüssel ohne den für diesen Endpoint erforderlichen Zugriff erhält eine Meldung mit dem fehlenden Zugriff, und ein Schlüssel, der außerhalb seiner IP-Allowlist verwendet wird, erhält `This API key can't be used from this IP address.`",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string",
                      "description": "Lesbare Fehlermeldung."
                    }
                  }
                },
                "examples": {
                  "Missing or invalid key": {
                    "value": {
                      "detail": "You do not have permission to perform this action."
                    }
                  },
                  "Scoped key without webhooks write": {
                    "value": {
                      "detail": "This API key has no write access to webhooks."
                    }
                  },
                  "Outside the IP allowlist": {
                    "value": {
                      "detail": "This API key can't be used from this IP address."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate-Limit überschritten: Mehr als 300 Schreibanfragen (POST, PATCH, PUT, DELETE) im aktuellen Ein-Minuten-Fenster für diesen API-Schlüssel. Warten Sie `Retry-After` Sekunden vor einem Wiederholungsversuch.",
            "headers": {
              "Retry-After": {
                "description": "Sekunden, die vor einem Wiederholungsversuch gewartet werden müssen.",
                "schema": {
                  "type": "integer",
                  "minimum": 1,
                  "example": 30
                }
              },
              "X-RateLimit-Limit": {
                "description": "Im einminütigen Zeitfenster zulässige Anfragen (300).",
                "schema": {
                  "type": "integer",
                  "example": 300
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Im aktuellen Zeitfenster verbleibende Anfragen.",
                "schema": {
                  "type": "integer",
                  "example": 0
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix-Zeit (Sekunden), zu der das aktuelle Zeitfenster zurückgesetzt wird.",
                "schema": {
                  "type": "integer",
                  "example": 1792056120
                }
              },
              "X-RateLimit-Scope": {
                "description": "Name des Budgets, das überschritten wurde.",
                "schema": {
                  "type": "string",
                  "example": "generic-write"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string",
                      "description": "Lesbare Fehlermeldung."
                    }
                  }
                },
                "examples": {
                  "Throttled": {
                    "value": {
                      "detail": "Write request rate limit exceeded. You can make up to 300 requests per minute."
                    }
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/v3/webhook/destinations/{destination_uuid}/analytics/": {
      "get": {
        "summary": "Analysen des Webhook-Ziels abrufen",
        "description": "Zustellungsgesamtwerte, Fehlerrate und Antwortzeiten für ein Webhook-Ziel über den gesamten Zeitraum (`summary`) und pro UTC-Tag (`points`). Jeder Versuch zählt als Zustellung: das erste Senden eines Ereignisses, jeder automatische [Wiederholungsversuch](https://docs.didit.me/de/integration/webhooks#wiederholungsrichtlinie) und jedes erneute Senden. Eine Zustellung gilt als fehlgeschlagen, wenn ihr erfasster HTTP-Status 400 oder höher ist, sodass Timeouts (erfasst als `504`) und Verbindungsfehler (`503`) als fehlgeschlagen zählen; eine Zustellung, die sich noch in der Warteschlange befindet, zählt nur bei `total_deliveries`. Zustellungsaufzeichnungen sind für etwa 30 Tage verfügbar. Für einen API-Schlüssel mit Berechtigungsumfang ist `webhooks: read` erforderlich.",
        "operationId": "get_webhook_destination_analytics",
        "x-didit-sdk": {
          "resource": "webhooks.destinations",
          "method": "retrieve_analytics",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Webhook"
        ],
        "parameters": [
          {
            "name": "destination_uuid",
            "in": "path",
            "required": true,
            "description": "UUID des Ziels (die von `GET /v3/webhook/destinations/` zurückgegebene `uuid`).",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "example": "11111111-2222-3333-4444-555555555555"
          },
          {
            "name": "date_from",
            "in": "query",
            "required": false,
            "description": "Erster einzubeziehender UTC-Tag als `YYYY-MM-DD` (einschließlich). Weglassen, um mit der ältesten verfügbaren Zustellung zu beginnen. `dateFrom` wird als Alias akzeptiert.",
            "schema": {
              "type": "string",
              "format": "date"
            },
            "example": "2026-10-01"
          },
          {
            "name": "date_to",
            "in": "query",
            "required": false,
            "description": "Letzter einzubeziehender UTC-Tag im Format `YYYY-MM-DD` (einschließlich). Darf nicht vor `date_from` liegen. `dateTo` wird als Alias akzeptiert.",
            "schema": {
              "type": "string",
              "format": "date"
            },
            "example": "2026-10-16"
          }
        ],
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X GET 'https://verification.didit.me/v3/webhook/destinations/11111111-2222-3333-4444-555555555555/analytics/?date_from=2026-10-01&date_to=2026-10-16' \\\n  -H 'x-api-key: YOUR_API_KEY'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.webhooks.destinations.retrieve_analytics(\n    \"11111111-2222-3333-4444-555555555555\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.webhooks.destinations.retrieveAnalytics(\"11111111-2222-3333-4444-555555555555\");\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Webhooks.Destinations.RetrieveAnalytics(ctx, \"11111111-2222-3333-4444-555555555555\", didit.WebhooksDestinationsRetrieveAnalyticsParams{})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.webhooks().destinations().retrieveAnalytics(\"11111111-2222-3333-4444-555555555555\");\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->webhooks->destinations->retrieveAnalytics('11111111-2222-3333-4444-555555555555');\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.webhooks.destinations.retrieve_analytics(\"11111111-2222-3333-4444-555555555555\")\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Webhooks.Destinations.RetrieveAnalyticsAsync(\"11111111-2222-3333-4444-555555555555\");\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "responses": {
          "200": {
            "description": "Zustellungsstatistiken für das Ziel.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "summary",
                    "points"
                  ],
                  "properties": {
                    "summary": {
                      "type": "object",
                      "description": "Gesamtsummen über den angeforderten Bereich.",
                      "required": [
                        "total_deliveries",
                        "failed_deliveries",
                        "min_response_time_ms",
                        "avg_response_time_ms",
                        "max_response_time_ms",
                        "error_rate_percentage"
                      ],
                      "properties": {
                        "total_deliveries": {
                          "type": "integer",
                          "minimum": 0,
                          "description": "Zustellversuche, einschließlich derer in der Warteschlange."
                        },
                        "failed_deliveries": {
                          "type": "integer",
                          "minimum": 0,
                          "description": "Versuche, deren erfasster HTTP-Status 400 oder höher ist."
                        },
                        "min_response_time_ms": {
                          "type": "integer",
                          "nullable": true,
                          "description": "Schnellster Versuch in Millisekunden oder `null`, wenn für keinen Versuch eine Zeit erfasst wurde."
                        },
                        "avg_response_time_ms": {
                          "type": "integer",
                          "nullable": true,
                          "description": "Durchschnittliche Versuchsdauer in Millisekunden, gerundet, oder `null`, wenn für keinen Versuch eine Zeit erfasst wurde."
                        },
                        "max_response_time_ms": {
                          "type": "integer",
                          "nullable": true,
                          "description": "Langsamster Versuch in Millisekunden oder `null`, wenn für keinen Versuch eine Zeit erfasst wurde."
                        },
                        "error_rate_percentage": {
                          "type": "integer",
                          "minimum": 0,
                          "maximum": 100,
                          "description": "`failed_deliveries` / `total_deliveries` x 100, gerundet auf eine ganze Zahl. `0`, wenn keine Zustellungen vorliegen."
                        }
                      }
                    },
                    "points": {
                      "type": "array",
                      "description": "Ein Eintrag pro UTC-Tag, an dem Zustellungen stattfanden, älteste zuerst. Tage ohne Zustellungen werden ausgelassen; füllen Sie die Lücken daher mit Nullen, wenn Sie sie grafisch darstellen.",
                      "items": {
                        "type": "object",
                        "required": [
                          "date",
                          "total_deliveries",
                          "failed_deliveries",
                          "min_response_time_ms",
                          "avg_response_time_ms",
                          "max_response_time_ms"
                        ],
                        "properties": {
                          "date": {
                            "type": "string",
                            "format": "date",
                            "description": "UTC-Tag, `YYYY-MM-DD`."
                          },
                          "total_deliveries": {
                            "type": "integer",
                            "minimum": 0,
                            "description": "Zustellversuche, einschließlich derer in der Warteschlange."
                          },
                          "failed_deliveries": {
                            "type": "integer",
                            "minimum": 0,
                            "description": "Versuche, deren erfasster HTTP-Status 400 oder höher ist."
                          },
                          "min_response_time_ms": {
                            "type": "integer",
                            "nullable": true,
                            "description": "Schnellster Versuch in Millisekunden oder `null`, wenn für keinen Versuch eine Zeit erfasst wurde."
                          },
                          "avg_response_time_ms": {
                            "type": "integer",
                            "nullable": true,
                            "description": "Durchschnittliche Versuchsdauer in Millisekunden, gerundet, oder `null`, wenn für keinen Versuch eine Zeit erfasst wurde."
                          },
                          "max_response_time_ms": {
                            "type": "integer",
                            "nullable": true,
                            "description": "Langsamster Versuch in Millisekunden oder `null`, wenn für keinen Versuch eine Zeit erfasst wurde."
                          }
                        }
                      }
                    }
                  }
                },
                "examples": {
                  "Three days of deliveries": {
                    "value": {
                      "summary": {
                        "total_deliveries": 1250,
                        "failed_deliveries": 12,
                        "min_response_time_ms": 38,
                        "avg_response_time_ms": 164,
                        "max_response_time_ms": 5004,
                        "error_rate_percentage": 1
                      },
                      "points": [
                        {
                          "date": "2026-10-14",
                          "total_deliveries": 410,
                          "failed_deliveries": 0,
                          "min_response_time_ms": 38,
                          "avg_response_time_ms": 152,
                          "max_response_time_ms": 911
                        },
                        {
                          "date": "2026-10-15",
                          "total_deliveries": 395,
                          "failed_deliveries": 12,
                          "min_response_time_ms": 41,
                          "avg_response_time_ms": 190,
                          "max_response_time_ms": 5004
                        },
                        {
                          "date": "2026-10-16",
                          "total_deliveries": 445,
                          "failed_deliveries": 0,
                          "min_response_time_ms": 40,
                          "avg_response_time_ms": 151,
                          "max_response_time_ms": 1220
                        }
                      ]
                    }
                  },
                  "No deliveries in range": {
                    "value": {
                      "summary": {
                        "total_deliveries": 0,
                        "failed_deliveries": 0,
                        "min_response_time_ms": null,
                        "avg_response_time_ms": null,
                        "max_response_time_ms": null,
                        "error_rate_percentage": 0
                      },
                      "points": []
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "`date_from` oder `date_to` ist kein Datum im Format `YYYY-MM-DD`, oder `date_to` liegt vor `date_from`.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "description": "Jedem ungültigen Feld ist eine Liste von Meldungen zugeordnet.",
                  "additionalProperties": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    }
                  }
                },
                "examples": {
                  "Malformed date": {
                    "value": {
                      "date_from": [
                        "Date has wrong format. Use one of these formats instead: YYYY-MM-DD."
                      ]
                    }
                  },
                  "Reversed range": {
                    "value": {
                      "date_to": [
                        "date_to must be greater than or equal to date_from."
                      ]
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Der API-Schlüssel ist abgelaufen: Er wurde mit einem Ablaufdatum erstellt, das verstrichen ist. Ein falscher oder widerrufener Schlüssel erhält ebenfalls `401`; ein fehlender Schlüssel erhält `403`.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string",
                      "description": "Lesbare Fehlermeldung."
                    }
                  }
                },
                "examples": {
                  "Expired key": {
                    "value": {
                      "detail": "This API key has expired."
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Die Anfrage ist nicht zulässig. Bei einem fehlenden, ungültigen oder widerrufenen `x-api-key` erhalten Sie `You do not have permission to perform this action.` Ein berechtigungsbeschränkter Schlüssel ohne den für diesen Endpoint erforderlichen Zugriff erhält eine Meldung mit dem fehlenden Zugriff, und ein Schlüssel, der außerhalb seiner IP-Allowlist verwendet wird, erhält `This API key can't be used from this IP address.`",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string",
                      "description": "Lesbare Fehlermeldung."
                    }
                  }
                },
                "examples": {
                  "Missing or invalid key": {
                    "value": {
                      "detail": "You do not have permission to perform this action."
                    }
                  },
                  "Scoped key without webhooks read": {
                    "value": {
                      "detail": "This API key has no read access to webhooks."
                    }
                  },
                  "Outside the IP allowlist": {
                    "value": {
                      "detail": "This API key can't be used from this IP address."
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Für die Anwendung existiert kein Ziel mit dieser UUID, oder es wurde gelöscht.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string",
                      "description": "Lesbare Fehlermeldung."
                    }
                  }
                },
                "examples": {
                  "Destination not found": {
                    "value": {
                      "detail": "Webhook destination not found."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate-Limit überschritten: Mehr als 600 GET-Anfragen im aktuellen Ein-Minuten-Fenster für diesen API-Schlüssel. Warten Sie `Retry-After` Sekunden vor einem Wiederholungsversuch.",
            "headers": {
              "Retry-After": {
                "description": "Sekunden, die vor einem Wiederholungsversuch gewartet werden müssen.",
                "schema": {
                  "type": "integer",
                  "minimum": 1,
                  "example": 30
                }
              },
              "X-RateLimit-Limit": {
                "description": "Im einminütigen Zeitfenster zulässige Anfragen (600).",
                "schema": {
                  "type": "integer",
                  "example": 600
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Im aktuellen Zeitfenster verbleibende Anfragen.",
                "schema": {
                  "type": "integer",
                  "example": 0
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix-Zeit (Sekunden), zu der das aktuelle Zeitfenster zurückgesetzt wird.",
                "schema": {
                  "type": "integer",
                  "example": 1792056120
                }
              },
              "X-RateLimit-Scope": {
                "description": "Name des Budgets, das überschritten wurde.",
                "schema": {
                  "type": "string",
                  "example": "generic-get"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string",
                      "description": "Lesbare Fehlermeldung."
                    }
                  }
                },
                "examples": {
                  "Throttled": {
                    "value": {
                      "detail": "GET request rate limit exceeded. You can make up to 600 requests per minute."
                    }
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/v3/webhook/destinations/{destination_uuid}/deliveries/": {
      "get": {
        "summary": "Zustellungen an Webhook-Ziele auflisten",
        "description": "Blättern Sie durch jeden Zustellungsversuch an ein Webhook-Ziel, die neuesten zuerst. Das erste Senden jedes Ereignisses, jeder automatische [Wiederholungsversuch](https://docs.didit.me/de/integration/webhooks#wiederholungsrichtlinie) und jedes erneute Senden sind separate Einträge. Einträge enthalten den HTTP-Status und die Antwortzeit, aber nicht die Payload: Rufen Sie eine einzelne Zustellung ab, um deren Header und Body zu lesen. `count` ist bis 100 exakt und gibt darüber 100 an; folgen Sie daher `next`, bis es `null` ist. Zustellungsdatensätze sind für etwa 30 Tage verfügbar. Ein API-Schlüssel mit eingeschränktem Geltungsbereich benötigt `webhooks: read` und `decisions: read`; ein Schlüssel, der auf bestimmte Workflows oder genehmigte Sitzungen beschränkt ist, kann diesen Endpoint nicht verwenden.",
        "operationId": "list_webhook_destination_deliveries",
        "x-didit-sdk": {
          "resource": "webhooks.destinations",
          "method": "list_deliveries",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Webhook"
        ],
        "parameters": [
          {
            "name": "destination_uuid",
            "in": "path",
            "required": true,
            "description": "UUID des Ziels (die von `GET /v3/webhook/destinations/` zurückgegebene `uuid`).",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "example": "11111111-2222-3333-4444-555555555555"
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Maximale Anzahl an Zustellungen pro Seite. Standardmäßig 50. Ein Wert, der keine positive Ganzzahl ist, fällt auf 50 zurück; ein Wert über 1000000 gibt `400` zurück.",
            "schema": {
              "type": "integer",
              "default": 50,
              "minimum": 1,
              "maximum": 1000000
            },
            "example": 50
          },
          {
            "name": "offset",
            "in": "query",
            "required": false,
            "description": "Anzahl der zu überspringenden Zustellungen. Standardmäßig 0. Folgen Sie vorzugsweise den `next`- und `previous`-URLs aus der Antwort.",
            "schema": {
              "type": "integer",
              "default": 0,
              "minimum": 0,
              "maximum": 1000000
            },
            "example": 0
          },
          {
            "name": "date_from",
            "in": "query",
            "required": false,
            "description": "Erster einzubeziehender UTC-Tag als `YYYY-MM-DD` (einschließlich). Weglassen, um mit der ältesten verfügbaren Zustellung zu beginnen. `dateFrom` wird als Alias akzeptiert.",
            "schema": {
              "type": "string",
              "format": "date"
            },
            "example": "2026-10-01"
          },
          {
            "name": "date_to",
            "in": "query",
            "required": false,
            "description": "Letzter einzubeziehender UTC-Tag im Format `YYYY-MM-DD` (einschließlich). Darf nicht vor `date_from` liegen. `dateTo` wird als Alias akzeptiert.",
            "schema": {
              "type": "string",
              "format": "date"
            },
            "example": "2026-10-16"
          }
        ],
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X GET 'https://verification.didit.me/v3/webhook/destinations/11111111-2222-3333-4444-555555555555/deliveries/?limit=50&date_from=2026-10-01' \\\n  -H 'x-api-key: YOUR_API_KEY'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nfor item in client.webhooks.destinations.list_deliveries(\n    \"11111111-2222-3333-4444-555555555555\",\n):\n    print(item)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nfor await (const item of didit.webhooks.destinations.listDeliveries(\"11111111-2222-3333-4444-555555555555\")) {\n  console.log(item);\n}"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\niter := client.Webhooks.Destinations.ListDeliveriesAutoPaging(ctx, \"11111111-2222-3333-4444-555555555555\", didit.WebhooksDestinationsListDeliveriesParams{})\nfor iter.Next() {\n\tfmt.Printf(\"%+v\\n\", iter.Current())\n}\nif err := iter.Err(); err != nil {\n\tlog.Fatal(err)\n}"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nfor (var item : client.webhooks().destinations().listDeliveries(\"11111111-2222-3333-4444-555555555555\")) {\n    System.out.println(item);\n}"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\nforeach ($didit->webhooks->destinations->listDeliveries('11111111-2222-3333-4444-555555555555') as $item) {\n    print_r($item->toArray());\n}"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\ndidit.webhooks.destinations.list_deliveries(\"11111111-2222-3333-4444-555555555555\").auto_paging_each do |item|\n  puts item.to_h\nend"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nawait foreach (var item in await client.Webhooks.Destinations.ListDeliveriesAsync(\"11111111-2222-3333-4444-555555555555\"))\n{\n    Console.WriteLine(JsonSerializer.Serialize(item));\n}"
          }
        ],
        "responses": {
          "200": {
            "description": "Eine Seite mit Zustellungen, neueste zuerst.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "count",
                    "next",
                    "previous",
                    "results"
                  ],
                  "properties": {
                    "count": {
                      "type": "integer",
                      "minimum": 0,
                      "description": "Übereinstimmende Zustellungen, exakt bis 100 und darüber auf 100 begrenzt. Verwenden Sie `next`, um zu sehen, ob weitere Seiten vorhanden sind."
                    },
                    "next": {
                      "type": "string",
                      "format": "uri",
                      "nullable": true,
                      "description": "Absolute URL der nächsten Seite oder `null` auf der letzten Seite."
                    },
                    "previous": {
                      "type": "string",
                      "format": "uri",
                      "nullable": true,
                      "description": "Absolute URL der vorherigen Seite oder `null` auf der ersten Seite."
                    },
                    "results": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/WebhookDestinationDelivery"
                      }
                    }
                  }
                },
                "examples": {
                  "Failed delivery, its retry and a queued event": {
                    "value": {
                      "count": 3,
                      "next": null,
                      "previous": null,
                      "results": [
                        {
                          "uuid": "66666666-7777-8888-9999-000000000003",
                          "session_id": null,
                          "request_url": "https://yourapp.com/webhooks/didit",
                          "response_status": null,
                          "response_time_ms": null,
                          "status": "APPROVED",
                          "webhook_type": "transaction.created",
                          "created_at": "2026-10-15T09:23:02.871190Z"
                        },
                        {
                          "uuid": "66666666-7777-8888-9999-000000000002",
                          "session_id": "22222222-3333-4444-5555-666666666666",
                          "request_url": "https://yourapp.com/webhooks/didit",
                          "response_status": 200,
                          "response_time_ms": 143,
                          "status": "In Progress",
                          "webhook_type": "status.updated",
                          "created_at": "2026-10-15T09:22:19.104233Z"
                        },
                        {
                          "uuid": "66666666-7777-8888-9999-000000000001",
                          "session_id": "22222222-3333-4444-5555-666666666666",
                          "request_url": "https://yourapp.com/webhooks/didit",
                          "response_status": 503,
                          "response_time_ms": 412,
                          "status": "In Progress",
                          "webhook_type": "status.updated",
                          "created_at": "2026-10-15T09:21:18.412345Z"
                        }
                      ]
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "`date_from` oder `date_to` ist kein Datum im Format `YYYY-MM-DD`, `date_to` liegt vor `date_from`, oder `limit` bzw. `offset` liegt über 1000000 (dieser Fehler ist ein JSON-Array von Meldungen).",
            "content": {
              "application/json": {
                "examples": {
                  "Malformed date": {
                    "value": {
                      "date_from": [
                        "Date has wrong format. Use one of these formats instead: YYYY-MM-DD."
                      ]
                    }
                  },
                  "Reversed range": {
                    "value": {
                      "date_to": [
                        "date_to must be greater than or equal to date_from."
                      ]
                    }
                  },
                  "Limit too large": {
                    "value": [
                      "limit must not exceed 1000000."
                    ]
                  }
                }
              }
            }
          },
          "401": {
            "description": "Der API-Schlüssel ist abgelaufen: Er wurde mit einem Ablaufdatum erstellt, das verstrichen ist. Ein falscher oder widerrufener Schlüssel erhält ebenfalls `401`; ein fehlender Schlüssel erhält `403`.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string",
                      "description": "Lesbare Fehlermeldung."
                    }
                  }
                },
                "examples": {
                  "Expired key": {
                    "value": {
                      "detail": "This API key has expired."
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Die Anfrage ist nicht zulässig. Bei einem fehlenden, ungültigen oder widerrufenen `x-api-key` erhalten Sie `You do not have permission to perform this action.` Ein berechtigungsbeschränkter Schlüssel ohne den für diesen Endpoint erforderlichen Zugriff erhält eine Meldung mit dem fehlenden Zugriff, und ein Schlüssel, der außerhalb seiner IP-Allowlist verwendet wird, erhält `This API key can't be used from this IP address.` Ein Schlüssel, der auf bestimmte Workflows oder genehmigte Sitzungen beschränkt ist, erhält `This API key only reaches sessions inside its workflow or status limits, so it can't use this endpoint.`",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string",
                      "description": "Lesbare Fehlermeldung."
                    }
                  }
                },
                "examples": {
                  "Missing or invalid key": {
                    "value": {
                      "detail": "You do not have permission to perform this action."
                    }
                  },
                  "Scoped key without webhooks read": {
                    "value": {
                      "detail": "This API key has no read access to webhooks."
                    }
                  },
                  "Scoped key without decisions read": {
                    "value": {
                      "detail": "This API key has no read access to decisions."
                    }
                  },
                  "Key limited to workflows or approved sessions": {
                    "value": {
                      "detail": "This API key only reaches sessions inside its workflow or status limits, so it can't use this endpoint."
                    }
                  },
                  "Outside the IP allowlist": {
                    "value": {
                      "detail": "This API key can't be used from this IP address."
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Für die Anwendung existiert kein Ziel mit dieser UUID, oder es wurde gelöscht.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string",
                      "description": "Lesbare Fehlermeldung."
                    }
                  }
                },
                "examples": {
                  "Destination not found": {
                    "value": {
                      "detail": "Webhook destination not found."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate-Limit überschritten: Mehr als 600 GET-Anfragen im aktuellen Ein-Minuten-Fenster für diesen API-Schlüssel. Warten Sie `Retry-After` Sekunden vor einem Wiederholungsversuch.",
            "headers": {
              "Retry-After": {
                "description": "Sekunden, die vor einem Wiederholungsversuch gewartet werden müssen.",
                "schema": {
                  "type": "integer",
                  "minimum": 1,
                  "example": 30
                }
              },
              "X-RateLimit-Limit": {
                "description": "Im einminütigen Zeitfenster zulässige Anfragen (600).",
                "schema": {
                  "type": "integer",
                  "example": 600
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Im aktuellen Zeitfenster verbleibende Anfragen.",
                "schema": {
                  "type": "integer",
                  "example": 0
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix-Zeit (Sekunden), zu der das aktuelle Zeitfenster zurückgesetzt wird.",
                "schema": {
                  "type": "integer",
                  "example": 1792056120
                }
              },
              "X-RateLimit-Scope": {
                "description": "Name des Budgets, das überschritten wurde.",
                "schema": {
                  "type": "string",
                  "example": "generic-get"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string",
                      "description": "Lesbare Fehlermeldung."
                    }
                  }
                },
                "examples": {
                  "Throttled": {
                    "value": {
                      "detail": "GET request rate limit exceeded. You can make up to 600 requests per minute."
                    }
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/v3/webhook/destinations/{destination_uuid}/deliveries/{delivery_uuid}/": {
      "get": {
        "summary": "Zustellung des Webhook-Ziels abrufen",
        "description": "Rufen Sie einen Zustellungsversuch an ein Webhook-Ziel mit den exakten Anfrage-Headern und dem von Didit gesendeten JSON-Body, dem von Ihrem Endpoint zurückgegebenen HTTP-Status und der Antwortzeit ab. `request_header` und `request_body` sind JSON-Texte: Parsen Sie diese, um die Signatur-Header und die Payload zu lesen, beispielsweise um Ihre [Signaturprüfung](https://docs.didit.me/de/integration/webhooks#signaturprüfung) anhand des `secret_shared_key` des Ziels zu überprüfen. Eine Zustellung enthält niemals das Signaturgeheimnis, und Didit zeichnet den Antwort-Body Ihres Endpoints nicht auf. Ein berechtigungsbeschränkter API-Schlüssel benötigt `webhooks: read` und `decisions: read`; ein Schlüssel, der auf bestimmte Workflows oder genehmigte Sitzungen beschränkt ist, kann diesen Endpoint nicht verwenden.",
        "operationId": "get_webhook_destination_delivery",
        "x-didit-sdk": {
          "resource": "webhooks.destinations",
          "method": "retrieve_delivery",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Webhook"
        ],
        "parameters": [
          {
            "name": "destination_uuid",
            "in": "path",
            "required": true,
            "description": "UUID des Ziels, an das die Zustellung gesendet wurde.",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "example": "11111111-2222-3333-4444-555555555555"
          },
          {
            "name": "delivery_uuid",
            "in": "path",
            "required": true,
            "description": "UUID der Zustellung: die `uuid` eines von `GET /v3/webhook/destinations/{destination_uuid}/deliveries/` zurückgegebenen Eintrags.",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "example": "66666666-7777-8888-9999-000000000001"
          }
        ],
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X GET 'https://verification.didit.me/v3/webhook/destinations/11111111-2222-3333-4444-555555555555/deliveries/66666666-7777-8888-9999-000000000001/' \\\n  -H 'x-api-key: YOUR_API_KEY'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.webhooks.destinations.retrieve_delivery(\n    \"11111111-2222-3333-4444-555555555555\",\n    \"66666666-7777-8888-9999-000000000001\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.webhooks.destinations.retrieveDelivery(\n  \"11111111-2222-3333-4444-555555555555\",\n  \"66666666-7777-8888-9999-000000000001\",\n);\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Webhooks.Destinations.RetrieveDelivery(ctx, \"11111111-2222-3333-4444-555555555555\", \"66666666-7777-8888-9999-000000000001\")\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.webhooks().destinations().retrieveDelivery(\"11111111-2222-3333-4444-555555555555\", \"66666666-7777-8888-9999-000000000001\");\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->webhooks->destinations->retrieveDelivery('11111111-2222-3333-4444-555555555555', '66666666-7777-8888-9999-000000000001');\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.webhooks.destinations.retrieve_delivery(\n  \"11111111-2222-3333-4444-555555555555\",\n  \"66666666-7777-8888-9999-000000000001\"\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Webhooks.Destinations.RetrieveDeliveryAsync(\"11111111-2222-3333-4444-555555555555\", \"66666666-7777-8888-9999-000000000001\");\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "responses": {
          "200": {
            "description": "Die Zustellung mit ihren Anfrage-Headern und ihrem Body.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WebhookDestinationDeliveryDetail"
                },
                "examples": {
                  "Connection failure": {
                    "value": {
                      "uuid": "66666666-7777-8888-9999-000000000001",
                      "session_id": "22222222-3333-4444-5555-666666666666",
                      "request_url": "https://yourapp.com/webhooks/didit",
                      "response_status": 503,
                      "response_time_ms": 412,
                      "status": "In Progress",
                      "webhook_type": "status.updated",
                      "created_at": "2026-10-15T09:21:18.412345Z",
                      "request_header": "{\"Content-Type\": \"application/json\", \"X-Signature\": \"a5e02a03404e1337a0198e6be15d34abbd053c658a0e51e5d0e78554213ef29b\", \"X-Signature-V2\": \"927e7cb770c94ce745939bff73f04aa200015f3bc64795ba46c2aaf78a6cedc5\", \"X-Signature-Simple\": \"e37b0d4c716c72bb5ae7127b9cc455d28ab4686e9e22312b4ec2327409a73302\", \"X-Timestamp\": \"1792056078\", \"User-Agent\": \"DiditWebhook/2.0 +https://didit.me\"}",
                      "request_body": "{\"application_id\":\"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\",\"created_at\":1792056057,\"environment\":\"live\",\"event_id\":\"33333333-4444-5555-6666-777777777777\",\"sandbox_scenario\":null,\"session_id\":\"22222222-3333-4444-5555-666666666666\",\"status\":\"In Progress\",\"timestamp\":1792056078,\"vendor_data\":\"user-123\",\"webhook_type\":\"status.updated\",\"workflow_id\":\"44444444-5555-6666-7777-888888888888\",\"workflow_version\":3}"
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Der API-Schlüssel ist abgelaufen: Er wurde mit einem Ablaufdatum erstellt, das verstrichen ist. Ein falscher oder widerrufener Schlüssel erhält ebenfalls `401`; ein fehlender Schlüssel erhält `403`.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string",
                      "description": "Lesbare Fehlermeldung."
                    }
                  }
                },
                "examples": {
                  "Expired key": {
                    "value": {
                      "detail": "This API key has expired."
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Die Anfrage ist nicht zulässig. Bei einem fehlenden, ungültigen oder widerrufenen `x-api-key` erhalten Sie `You do not have permission to perform this action.` Ein berechtigungsbeschränkter Schlüssel ohne den für diesen Endpoint erforderlichen Zugriff erhält eine Meldung mit dem fehlenden Zugriff, und ein Schlüssel, der außerhalb seiner IP-Allowlist verwendet wird, erhält `This API key can't be used from this IP address.` Ein Schlüssel, der auf bestimmte Workflows oder genehmigte Sitzungen beschränkt ist, erhält `This API key only reaches sessions inside its workflow or status limits, so it can't use this endpoint.`",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string",
                      "description": "Lesbare Fehlermeldung."
                    }
                  }
                },
                "examples": {
                  "Missing or invalid key": {
                    "value": {
                      "detail": "You do not have permission to perform this action."
                    }
                  },
                  "Scoped key without webhooks read": {
                    "value": {
                      "detail": "This API key has no read access to webhooks."
                    }
                  },
                  "Scoped key without decisions read": {
                    "value": {
                      "detail": "This API key has no read access to decisions."
                    }
                  },
                  "Key limited to workflows or approved sessions": {
                    "value": {
                      "detail": "This API key only reaches sessions inside its workflow or status limits, so it can't use this endpoint."
                    }
                  },
                  "Outside the IP allowlist": {
                    "value": {
                      "detail": "This API key can't be used from this IP address."
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Das Ziel existiert für die Anwendung nicht oder wurde gelöscht, oder die Zustellung existiert nicht, gehört zu einem anderen Ziel oder ist nicht mehr verfügbar.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string",
                      "description": "Lesbare Fehlermeldung."
                    }
                  }
                },
                "examples": {
                  "Destination not found": {
                    "value": {
                      "detail": "Webhook destination not found."
                    }
                  },
                  "Delivery not found": {
                    "value": {
                      "detail": "Webhook delivery not found."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate-Limit überschritten: Mehr als 600 GET-Anfragen im aktuellen Ein-Minuten-Fenster für diesen API-Schlüssel. Warten Sie `Retry-After` Sekunden vor einem Wiederholungsversuch.",
            "headers": {
              "Retry-After": {
                "description": "Sekunden, die vor einem Wiederholungsversuch gewartet werden müssen.",
                "schema": {
                  "type": "integer",
                  "minimum": 1,
                  "example": 30
                }
              },
              "X-RateLimit-Limit": {
                "description": "Im einminütigen Zeitfenster zulässige Anfragen (600).",
                "schema": {
                  "type": "integer",
                  "example": 600
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Im aktuellen Zeitfenster verbleibende Anfragen.",
                "schema": {
                  "type": "integer",
                  "example": 0
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix-Zeit (Sekunden), zu der das aktuelle Zeitfenster zurückgesetzt wird.",
                "schema": {
                  "type": "integer",
                  "example": 1792056120
                }
              },
              "X-RateLimit-Scope": {
                "description": "Name des Budgets, das überschritten wurde.",
                "schema": {
                  "type": "string",
                  "example": "generic-get"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string",
                      "description": "Lesbare Fehlermeldung."
                    }
                  }
                },
                "examples": {
                  "Throttled": {
                    "value": {
                      "detail": "GET request rate limit exceeded. You can make up to 600 requests per minute."
                    }
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/v3/webhook/destinations/{destination_uuid}/deliveries/{delivery_uuid}/resend/": {
      "post": {
        "summary": "Webhook-Ziel-Zustellung erneut senden",
        "description": "Senden Sie eine frühere Zustellung erneut, zum Beispiel nachdem Ihr Endpoint ausgefallen war. Didit nimmt die gespeicherte Payload, setzt einen neuen `timestamp`, signiert sie erneut mit dem aktuellen `secret_shared_key` des Ziels (`X-Signature`, `X-Signature-V2`, `X-Signature-Simple` und `X-Timestamp`) und sendet sie per POST an die `request_url` der Zustellung, selbst wenn sich die URL des Ziels inzwischen geändert hat oder das Ziel deaktiviert ist. `event_id` und der Rest der Payload bleiben unverändert, führen Sie die Deduplizierung also anhand von `event_id` durch. Der Aufruf wartet bis zu 5 Sekunden auf Ihren Endpoint und gibt die neue Zustellung mit `200` zurück, unabhängig davon, was Ihr Endpoint geantwortet hat: Prüfen Sie `response_status`. Ein erneutes Senden wird nicht automatisch wiederholt, jeder Aufruf sendet erneut und erstellt eine neue Zustellung, und die Anfrage hat keinen Body. Ein berechtigungsbeschränkter API-Schlüssel benötigt `webhooks: write` und `decisions: read`; ein Schlüssel, der auf bestimmte Workflows oder genehmigte Sitzungen beschränkt ist, kann diesen Endpoint nicht verwenden.",
        "operationId": "resend_webhook_destination_delivery",
        "x-didit-sdk": {
          "resource": "webhooks.destinations",
          "method": "resend_delivery",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Webhook"
        ],
        "parameters": [
          {
            "name": "destination_uuid",
            "in": "path",
            "required": true,
            "description": "UUID des Ziels, an das die Zustellung gesendet wurde.",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "example": "11111111-2222-3333-4444-555555555555"
          },
          {
            "name": "delivery_uuid",
            "in": "path",
            "required": true,
            "description": "UUID der erneut zu sendenden Zustellung: die `uuid` eines von `GET /v3/webhook/destinations/{destination_uuid}/deliveries/` zurückgegebenen Eintrags.",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "example": "66666666-7777-8888-9999-000000000001"
          }
        ],
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X POST 'https://verification.didit.me/v3/webhook/destinations/11111111-2222-3333-4444-555555555555/deliveries/66666666-7777-8888-9999-000000000001/resend/' \\\n  -H 'x-api-key: YOUR_API_KEY'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.webhooks.destinations.resend_delivery(\n    \"11111111-2222-3333-4444-555555555555\",\n    \"66666666-7777-8888-9999-000000000001\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.webhooks.destinations.resendDelivery(\n  \"11111111-2222-3333-4444-555555555555\",\n  \"66666666-7777-8888-9999-000000000001\",\n);\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Webhooks.Destinations.ResendDelivery(ctx, \"11111111-2222-3333-4444-555555555555\", \"66666666-7777-8888-9999-000000000001\")\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.webhooks().destinations().resendDelivery(\"11111111-2222-3333-4444-555555555555\", \"66666666-7777-8888-9999-000000000001\");\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->webhooks->destinations->resendDelivery('11111111-2222-3333-4444-555555555555', '66666666-7777-8888-9999-000000000001');\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.webhooks.destinations.resend_delivery(\n  \"11111111-2222-3333-4444-555555555555\",\n  \"66666666-7777-8888-9999-000000000001\"\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Webhooks.Destinations.ResendDeliveryAsync(\"11111111-2222-3333-4444-555555555555\", \"66666666-7777-8888-9999-000000000001\");\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "responses": {
          "200": {
            "description": "Die neue Zustellung, bereits versucht. `response_status` ist das, was Ihr Endpoint diesmal geantwortet hat (`504` Zeitüberschreitung, `503` Verbindungsfehler). Die ursprüngliche Zustellung bleibt unverändert.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WebhookDestinationDeliveryDetail"
                },
                "examples": {
                  "Accepted on resend": {
                    "value": {
                      "uuid": "66666666-7777-8888-9999-000000000004",
                      "session_id": "22222222-3333-4444-5555-666666666666",
                      "request_url": "https://yourapp.com/webhooks/didit",
                      "response_status": 200,
                      "response_time_ms": 151,
                      "status": "In Progress",
                      "webhook_type": "status.updated",
                      "created_at": "2026-10-16T14:05:42.330981Z",
                      "request_header": "{\"Content-Type\": \"application/json\", \"X-Signature\": \"b8eb1e376517ee0cad8ba98ff7f8fd35fc72eca231000963a96a335f82328835\", \"X-Signature-V2\": \"9efd2ce9ed1303e1d05273ef9608a59363ed9789a05253db4748b3e8e50cb109\", \"X-Signature-Simple\": \"bf3a9dc04b2c20ab539203b0cd5cca2a10f630bf62d8feb6d68d82af80f64774\", \"X-Timestamp\": \"1792159542\", \"User-Agent\": \"DiditWebhook/2.0 +https://didit.me\"}",
                      "request_body": "{\"application_id\":\"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\",\"created_at\":1792056057,\"environment\":\"live\",\"event_id\":\"33333333-4444-5555-6666-777777777777\",\"sandbox_scenario\":null,\"session_id\":\"22222222-3333-4444-5555-666666666666\",\"status\":\"In Progress\",\"timestamp\":1792159542,\"vendor_data\":\"user-123\",\"webhook_type\":\"status.updated\",\"workflow_id\":\"44444444-5555-6666-7777-888888888888\",\"workflow_version\":3}"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Die gespeicherte Zustellung konnte nicht erneut signiert werden. Es wird nichts gesendet.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string",
                      "description": "Lesbare Fehlermeldung."
                    },
                    "code": {
                      "type": "string",
                      "description": "Stabiler maschinenlesbarer Fehlercode. Verzweigen Sie anhand dieses Codes, nicht anhand von `detail`."
                    }
                  }
                },
                "examples": {
                  "Unsignable delivery": {
                    "value": {
                      "detail": "Invalid webhook data format",
                      "code": "invalid_webhook_payload"
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Der API-Schlüssel ist abgelaufen: Er wurde mit einem Ablaufdatum erstellt, das verstrichen ist. Ein falscher oder widerrufener Schlüssel erhält ebenfalls `401`; ein fehlender Schlüssel erhält `403`.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string",
                      "description": "Lesbare Fehlermeldung."
                    }
                  }
                },
                "examples": {
                  "Expired key": {
                    "value": {
                      "detail": "This API key has expired."
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Die Anfrage ist nicht zulässig. Bei einem fehlenden, ungültigen oder widerrufenen `x-api-key` erhalten Sie `You do not have permission to perform this action.` Ein berechtigungsbeschränkter Schlüssel ohne den für diesen Endpoint erforderlichen Zugriff erhält eine Meldung mit dem fehlenden Zugriff, und ein Schlüssel, der außerhalb seiner IP-Allowlist verwendet wird, erhält `This API key can't be used from this IP address.` Ein Schlüssel, der auf bestimmte Workflows oder genehmigte Sitzungen beschränkt ist, erhält `This API key only reaches sessions inside its workflow or status limits, so it can't use this endpoint.`",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string",
                      "description": "Lesbare Fehlermeldung."
                    }
                  }
                },
                "examples": {
                  "Missing or invalid key": {
                    "value": {
                      "detail": "You do not have permission to perform this action."
                    }
                  },
                  "Scoped key without webhooks write": {
                    "value": {
                      "detail": "This API key has no write access to webhooks."
                    }
                  },
                  "Scoped key without decisions read": {
                    "value": {
                      "detail": "This API key has no read access to decisions."
                    }
                  },
                  "Key limited to workflows or approved sessions": {
                    "value": {
                      "detail": "This API key only reaches sessions inside its workflow or status limits, so it can't use this endpoint."
                    }
                  },
                  "Outside the IP allowlist": {
                    "value": {
                      "detail": "This API key can't be used from this IP address."
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Das Ziel existiert für die Anwendung nicht oder wurde gelöscht, oder die Zustellung existiert nicht, gehört zu einem anderen Ziel oder ist nicht mehr verfügbar.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string",
                      "description": "Lesbare Fehlermeldung."
                    }
                  }
                },
                "examples": {
                  "Destination not found": {
                    "value": {
                      "detail": "Webhook destination not found."
                    }
                  },
                  "Delivery not found": {
                    "value": {
                      "detail": "Webhook delivery not found."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate-Limit überschritten: Mehr als 300 Schreibanfragen (POST, PATCH, PUT, DELETE) im aktuellen Ein-Minuten-Fenster für diesen API-Schlüssel. Warten Sie `Retry-After` Sekunden vor einem Wiederholungsversuch.",
            "headers": {
              "Retry-After": {
                "description": "Sekunden, die vor einem Wiederholungsversuch gewartet werden müssen.",
                "schema": {
                  "type": "integer",
                  "minimum": 1,
                  "example": 30
                }
              },
              "X-RateLimit-Limit": {
                "description": "Im einminütigen Zeitfenster zulässige Anfragen (300).",
                "schema": {
                  "type": "integer",
                  "example": 300
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Im aktuellen Zeitfenster verbleibende Anfragen.",
                "schema": {
                  "type": "integer",
                  "example": 0
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix-Zeit (Sekunden), zu der das aktuelle Zeitfenster zurückgesetzt wird.",
                "schema": {
                  "type": "integer",
                  "example": 1792056120
                }
              },
              "X-RateLimit-Scope": {
                "description": "Name des Budgets, das überschritten wurde.",
                "schema": {
                  "type": "string",
                  "example": "generic-write"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string",
                      "description": "Lesbare Fehlermeldung."
                    }
                  }
                },
                "examples": {
                  "Throttled": {
                    "value": {
                      "detail": "Write request rate limit exceeded. You can make up to 300 requests per minute."
                    }
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/v3/events/": {
      "get": {
        "summary": "Überwachungsereignisse auflisten",
        "description": "Die für Ihre Anwendung gespeicherten Überwachungsereignisse auflisten, neuestes `occurred_at` zuerst, mit optionalen Filtern, die mit AND verknüpft werden. Mehrwertige Filter (`event_category`, `action_type`, `status`, `retention_class`) wiederholen den Parameter und stimmen mit jedem der Werte überein; die anderen Filter sind exakte Übereinstimmungen, und unbekannte Werte geben einfach keine Ereignisse zurück. Jedes Ergebnis ist eine Zusammenfassung: Rufen Sie `GET /v3/events/{event_uuid}/` für Payload, Gerätekontext, IP-Anreicherung und Regelbelege auf, und bevorzugen Sie `GET /v3/events/subjects/{vendor_data}/` für den Verlauf eines einzelnen Subjekts. Lesezugriffe funktionieren unabhängig davon, ob die Ereigniserfassung aktiviert ist. Ein berechtigungsbeschränkter API-Schlüssel erfordert `transactions: read`. Siehe [Ereigniserfassung](https://docs.didit.me/de/transaction-monitoring/events).",
        "operationId": "list_monitoring_events",
        "x-didit-sdk": {
          "resource": "monitoring_events",
          "method": "list",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Monitoring Events"
        ],
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Maximale Anzahl an Ereignissen pro Seite. Standardmäßig 50. Werte über 1000000 geben `400` zurück; ein nicht-numerischer, Null- oder negativer Wert fällt auf 50 zurück.",
            "schema": {
              "type": "integer",
              "default": 50,
              "minimum": 1,
              "maximum": 1000000
            },
            "example": 50
          },
          {
            "name": "offset",
            "in": "query",
            "required": false,
            "description": "Anzahl der zu überspringenden Ereignisse. Standardmäßig 0. Bevorzugen Sie das Folgen der `next`-URL aus der Antwort.",
            "schema": {
              "type": "integer",
              "default": 0,
              "minimum": 0,
              "maximum": 1000000
            },
            "example": 0
          },
          {
            "name": "event_category",
            "in": "query",
            "required": false,
            "description": "Nur Ereignisse in diesen Kategorien. Wiederholen Sie den Parameter für mehrere Werte (`?event_category=payment&event_category=dispute`); ein Ereignis, das auf einen davon zutrifft, wird zurückgegeben.",
            "style": "form",
            "explode": true,
            "schema": {
              "type": "array",
              "items": {
                "type": "string",
                "enum": [
                  "auth",
                  "session",
                  "gameplay",
                  "bonus",
                  "affiliate",
                  "payment",
                  "dispute",
                  "security",
                  "responsible_gambling",
                  "custom"
                ]
              }
            },
            "example": [
              "payment",
              "dispute"
            ]
          },
          {
            "name": "action_type",
            "in": "query",
            "required": false,
            "description": "Nur Ereignisse mit diesen Aktionstypen (exakt, unter Berücksichtigung der Groß-/Kleinschreibung). Für mehrere Werte wiederholen.",
            "style": "form",
            "explode": true,
            "schema": {
              "type": "array",
              "items": {
                "type": "string"
              }
            },
            "example": [
              "deposit_completed",
              "chargeback_opened"
            ]
          },
          {
            "name": "status",
            "in": "query",
            "required": false,
            "description": "Nur Ereignisse mit diesen Status. Für mehrere Werte wiederholen.",
            "style": "form",
            "explode": true,
            "schema": {
              "type": "array",
              "items": {
                "type": "string",
                "enum": [
                  "ACCEPTED",
                  "APPROVED",
                  "IN_REVIEW",
                  "DECLINED"
                ]
              }
            },
            "example": [
              "IN_REVIEW",
              "DECLINED"
            ]
          },
          {
            "name": "retention_class",
            "in": "query",
            "required": false,
            "description": "Nur Ereignisse in diesen Aufbewahrungsklassen. Für mehrere Werte wiederholen.",
            "style": "form",
            "explode": true,
            "schema": {
              "type": "array",
              "items": {
                "type": "string",
                "enum": [
                  "low_value",
                  "standard",
                  "risk_relevant",
                  "monetary_or_compliance"
                ]
              }
            },
            "example": [
              "risk_relevant"
            ]
          },
          {
            "name": "subject_vendor_data",
            "in": "query",
            "required": false,
            "description": "Exakte Übereinstimmung mit den `vendor_data` des Subjekts. Dieselbe ID kann eine Einzelperson und ein Unternehmen benennen; fügen Sie `subject_entity_type` hinzu, um eines auszuwählen, oder verwenden Sie `GET /v3/events/subjects/{vendor_data}/`.",
            "schema": {
              "type": "string"
            },
            "example": "user-42"
          },
          {
            "name": "subject_entity_type",
            "in": "query",
            "required": false,
            "description": "`company` gibt nur Ereignisse von Unternehmenssubjekten zurück; jeder andere nicht leere Wert (zum Beispiel `individual`) gibt nur Ereignisse von Einzelpersonen zurück. Weglassen, um beides zurückzugeben.",
            "schema": {
              "type": "string",
              "enum": [
                "individual",
                "company"
              ]
            },
            "example": "individual"
          },
          {
            "name": "business_vendor_data",
            "in": "query",
            "required": false,
            "description": "Exakte Übereinstimmung mit den mit dem Ereignis gesendeten `business.vendor_data`.",
            "schema": {
              "type": "string"
            },
            "example": "merchant-7"
          },
          {
            "name": "session_id",
            "in": "query",
            "required": false,
            "description": "Exakte Übereinstimmung mit `session.session_id`.",
            "schema": {
              "type": "string"
            },
            "example": "web-session-abc"
          },
          {
            "name": "device_fingerprint",
            "in": "query",
            "required": false,
            "description": "Exakte Übereinstimmung mit `device_context.fingerprint`.",
            "schema": {
              "type": "string"
            },
            "example": "fp-a8c1"
          },
          {
            "name": "ip_address",
            "in": "query",
            "required": false,
            "description": "Exakte Übereinstimmung mit der IP-Adresse des Ereignisses.",
            "schema": {
              "type": "string"
            },
            "example": "203.0.113.42"
          },
          {
            "name": "game_id",
            "in": "query",
            "required": false,
            "description": "Exakte Übereinstimmung mit der promoteten `game_id`.",
            "schema": {
              "type": "string"
            },
            "example": "poker-holdem-01"
          },
          {
            "name": "round_id",
            "in": "query",
            "required": false,
            "description": "Exakte Übereinstimmung mit der promoteten `round_id`.",
            "schema": {
              "type": "string"
            },
            "example": "round-88231"
          },
          {
            "name": "affiliate_code",
            "in": "query",
            "required": false,
            "description": "Exakte Übereinstimmung mit dem promoteten `affiliate_code`.",
            "schema": {
              "type": "string"
            },
            "example": "aff-summer"
          },
          {
            "name": "payment_reference_id",
            "in": "query",
            "required": false,
            "description": "Exakte Übereinstimmung mit der Zahlungsreferenz (aus `transaction_context.payment_reference_id` oder `payload.payment_reference_id`).",
            "schema": {
              "type": "string"
            },
            "example": "dep_735"
          },
          {
            "name": "counterparty_vendor_data",
            "in": "query",
            "required": false,
            "description": "Exakte Übereinstimmung mit den promoteten `counterparty_vendor_data`.",
            "schema": {
              "type": "string"
            },
            "example": "user-77"
          },
          {
            "name": "matched_only",
            "in": "query",
            "required": false,
            "description": "`true` (auch `1` oder `yes`, ohne Berücksichtigung der Groß-/Kleinschreibung) gibt nur Ereignisse zurück, bei denen mindestens eine Regel gegriffen hat (`rules_matched_count` größer als 0). Jeder andere Wert wird ignoriert.",
            "schema": {
              "type": "boolean",
              "default": false
            },
            "example": true
          },
          {
            "name": "occurred_from",
            "in": "query",
            "required": false,
            "description": "Nur Ereignisse mit `occurred_at` an oder nach diesem Zeitpunkt (einschließlich). Senden Sie einen ISO-8601-Wert: `2026-10-01T00:00:00Z`, einen expliziten Offset mit prozentkodiertem `+` (`2026-10-01T02:00:00%2B02:00`; ein unkodiertes `+` wird als Leerzeichen dekodiert und der Wert kann nicht mehr geparst werden) oder nur ein Datum (`2026-10-01`), was 00:00:00 UTC dieses Tages entspricht. Ein Wert ohne Offset wird als UTC interpretiert. Werte in einem anderen Format werden nicht akzeptiert.",
            "schema": {
              "type": "string",
              "format": "date-time"
            },
            "example": "2026-10-01T00:00:00Z"
          },
          {
            "name": "occurred_to",
            "in": "query",
            "required": false,
            "description": "Nur Ereignisse mit `occurred_at` an oder vor diesem Zeitpunkt (einschließlich). Ein reines Datum bedeutet den Beginn dieses Tages, daher schließt `occurred_to=2026-10-15` den Rest des 15. Oktobers aus; senden Sie `2026-10-15T23:59:59Z`, um ihn einzuschließen. Senden Sie einen ISO-8601-Wert: `2026-10-01T00:00:00Z`, einen expliziten Offset mit prozentkodiertem `+` (`2026-10-01T02:00:00%2B02:00`; ein unkodiertes `+` wird als Leerzeichen dekodiert und der Wert kann nicht mehr geparst werden) oder nur ein Datum (`2026-10-01`), was 00:00:00 UTC dieses Tages entspricht. Ein Wert ohne Offset wird als UTC interpretiert. Werte in einem anderen Format werden nicht akzeptiert.",
            "schema": {
              "type": "string",
              "format": "date-time"
            },
            "example": "2026-10-17T23:59:59Z"
          },
          {
            "name": "search",
            "in": "query",
            "required": false,
            "description": "Teilstring-Übereinstimmung ohne Berücksichtigung von Groß-/Kleinschreibung auf `event_id`, `action_type`, `subject_vendor_data` oder `counterparty_vendor_data`.",
            "schema": {
              "type": "string"
            },
            "example": "chargeback"
          }
        ],
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X GET 'https://verification.didit.me/v3/events/?event_category=payment&event_category=dispute&matched_only=true&occurred_from=2026-10-01T00:00:00Z&limit=50' \\\n  -H 'x-api-key: YOUR_API_KEY'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nfor item in client.monitoring_events.list():\n    print(item)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nfor await (const item of didit.monitoringEvents.list()) {\n  console.log(item);\n}"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\niter := client.MonitoringEvents.ListAutoPaging(ctx, didit.MonitoringEventsListParams{})\nfor iter.Next() {\n\tfmt.Printf(\"%+v\\n\", iter.Current())\n}\nif err := iter.Err(); err != nil {\n\tlog.Fatal(err)\n}"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nfor (var item : client.monitoringEvents().list()) {\n    System.out.println(item);\n}"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\nforeach ($didit->monitoringEvents->list() as $item) {\n    print_r($item->toArray());\n}"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\ndidit.monitoring_events.list.auto_paging_each do |item|\n  puts item.to_h\nend"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nawait foreach (var item in await client.MonitoringEvents.ListAsync())\n{\n    Console.WriteLine(JsonSerializer.Serialize(item));\n}"
          }
        ],
        "responses": {
          "200": {
            "description": "Eine Seite mit Ereigniszusammenfassungen.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MonitoringEventPage"
                },
                "examples": {
                  "Payment and dispute events": {
                    "value": {
                      "count": 2,
                      "next": null,
                      "previous": null,
                      "results": [
                        {
                          "event_uuid": "11111111-2222-3333-4444-555555555555",
                          "event_id": "chargeback-2026-10-16-000318",
                          "event_category": "dispute",
                          "action_type": "chargeback_opened",
                          "occurred_at": "2026-10-16T14:02:11Z",
                          "received_at": "2026-10-16T14:02:12.418230Z",
                          "status": "IN_REVIEW",
                          "score": 60,
                          "subject_vendor_data": "user-42",
                          "subject_entity_type": "individual",
                          "subject_uuid": "66666666-7777-8888-9999-000000000000",
                          "counterparty_vendor_data": null,
                          "session_id": null,
                          "device_fingerprint": null,
                          "ip_address": null,
                          "ip_country": null,
                          "amount": "250.000000000000000000",
                          "currency": "EUR",
                          "game_id": null,
                          "round_id": null,
                          "bonus_id": null,
                          "affiliate_code": null,
                          "payment_reference_id": "dep_735",
                          "retention_class": "monetary_or_compliance",
                          "rules_matched_count": 1,
                          "correlation_pending": false,
                          "is_droppable": false
                        },
                        {
                          "event_uuid": "22222222-3333-4444-5555-666666666666",
                          "event_id": "login-2026-10-15-000912",
                          "event_category": "auth",
                          "action_type": "login",
                          "occurred_at": "2026-10-15T08:30:00.120000Z",
                          "received_at": "2026-10-15T08:30:00.734512Z",
                          "status": "ACCEPTED",
                          "score": 0,
                          "subject_vendor_data": "user-42",
                          "subject_entity_type": "individual",
                          "subject_uuid": "66666666-7777-8888-9999-000000000000",
                          "counterparty_vendor_data": null,
                          "session_id": "web-session-abc",
                          "device_fingerprint": "fp-a8c1",
                          "ip_address": "203.0.113.42",
                          "ip_country": "ES",
                          "amount": null,
                          "currency": null,
                          "game_id": null,
                          "round_id": null,
                          "bonus_id": null,
                          "affiliate_code": null,
                          "payment_reference_id": null,
                          "retention_class": "standard",
                          "rules_matched_count": 0,
                          "correlation_pending": false,
                          "is_droppable": true
                        }
                      ]
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "`limit` oder `offset` ist größer als 1000000. Der Body ist ein JSON-Array mit einer Nachricht. Ein nicht-numerischer oder nicht-positiver `limit`-Wert fällt auf den Standardwert von 50 zurück, anstatt fehlzuschlagen.",
            "content": {
              "application/json": {
                "examples": {
                  "limit too large": {
                    "summary": "limit über 1000000",
                    "value": [
                      "limit must not exceed 1000000."
                    ]
                  },
                  "offset too large": {
                    "summary": "offset über 1000000",
                    "value": [
                      "offset must not exceed 1000000."
                    ]
                  }
                }
              }
            }
          },
          "401": {
            "description": "Der API-Schlüssel mit eingeschränktem Geltungsbereich ist abgelaufen. Nur ein abgelaufener Schlüssel erhält `401`; ein fehlender oder ungültiger Schlüssel erhält `403`.",
            "content": {
              "application/json": {
                "examples": {
                  "Expired key": {
                    "value": {
                      "detail": "This API key has expired."
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Ein fehlender `x-api-key` (ein falscher, widerrufener oder abgelaufener Schlüssel erhält `401`), ein berechtigungsbeschränkter Schlüssel ohne `transactions: read`, ein auf bestimmte Workflows oder genehmigte Sitzungen beschränkter Schlüssel (ein solcher Schlüssel erreicht Transaktionsüberwachungsdaten nie) oder eine Anfrage von außerhalb der IP-Allowlist des Schlüssels.",
            "content": {
              "application/json": {
                "examples": {
                  "Missing or invalid API key": {
                    "value": {
                      "detail": "You do not have permission to perform this action."
                    }
                  },
                  "Scoped key without access": {
                    "value": {
                      "detail": "This API key has no read access to transactions."
                    }
                  },
                  "Key limited to workflows or approved sessions": {
                    "value": {
                      "detail": "This API key only reaches sessions inside its workflow or status limits, so it can't use this endpoint."
                    }
                  },
                  "IP not allowed": {
                    "value": {
                      "detail": "This API key can't be used from this IP address."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate-Limit überschritten: `GET`-Anfragen teilen sich ein Kontingent von 600 Anfragen pro Minute pro API-Schlüssel. Warten Sie `Retry-After` Sekunden und versuchen Sie es dann erneut.",
            "headers": {
              "Retry-After": {
                "description": "Sekunden, die vor einem Wiederholungsversuch gewartet werden müssen.",
                "schema": {
                  "type": "integer",
                  "minimum": 1,
                  "example": 30
                }
              }
            },
            "content": {
              "application/json": {
                "examples": {
                  "Throttled": {
                    "value": {
                      "detail": "GET request rate limit exceeded. You can make up to 600 requests per minute."
                    }
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      },
      "post": {
        "summary": "Monitoring-Ereignis erstellen",
        "description": "Senden Sie ein nicht-monetäres Ereignis (Login, Sitzung, Gameplay, Bonus, Affiliate, Zahlung, Streitfall, Sicherheit, verantwortungsvolles Spielen oder benutzerdefiniert) von Ihrem Backend. Das Ereignis wird anhand seines Kategorievertrags validiert, gespeichert, für jede eindeutige öffentliche Adresse einmal mit IP-Daten angereichert und von Ihren Echtzeit-Ereignisregeln ausgewertet, bevor die Antwort zurückgegeben wird; subjektübergreifende Regeln und Regeln mit langem Zeitfenster laufen asynchron (`correlation_pending: true`), und in einer Sandbox-Anwendung werden keine Regeln ausgeführt. `event_id` ist der Idempotenzschlüssel: dieselbe `event_id` mit derselben `event_category`, demselben `action_type`, `occurred_at`, `subject.vendor_data` und `payload` gibt `200` mit `idempotent_replay: true` und dem gespeicherten Ergebnis zurück (andere Envelope-Felder werden nicht verglichen), während abweichende Werte `409` zurückgeben. Die Ereigniserfassung ist pro Anwendung optional (Opt-in): Bis sie aktiviert wird, gibt dieser Endpoint `403` mit `code: event_monitoring_disabled` zurück und speichert nichts. Ein bereichsbezogener API-Schlüssel erfordert `transactions: write`. Siehe [Ereigniserfassung](https://docs.didit.me/de/transaction-monitoring/events) und [Regeln für Ereignisse](https://docs.didit.me/de/transaction-monitoring/event-rules); um Ereignisse über einen Browser oder eine App zu senden, nutzen Sie die [SDK-Ereignisübermittlung](https://docs.didit.me/de/transaction-monitoring/sdk-event-submission).",
        "operationId": "create_monitoring_event",
        "x-didit-sdk": {
          "resource": "monitoring_events",
          "method": "create",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Monitoring Events"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/MonitoringEventCreateRequest"
              },
              "examples": {
                "Login": {
                  "value": {
                    "event_id": "login-2026-10-17-000001",
                    "event_category": "auth",
                    "action_type": "login",
                    "occurred_at": "2026-10-17T09:15:02.481Z",
                    "time_zone": "Europe/Madrid",
                    "subject": {
                      "vendor_data": "user-42",
                      "entity_type": "individual"
                    },
                    "session": {
                      "session_id": "web-session-abc",
                      "sequence": 142
                    },
                    "device_context": {
                      "fingerprint": "fp-a8c1",
                      "network_context": {
                        "ip_address": "203.0.113.42"
                      }
                    },
                    "payload": {
                      "method": "password"
                    },
                    "custom_values": {
                      "vip_tier": "gold"
                    }
                  }
                },
                "Deposit completed": {
                  "value": {
                    "event_id": "deposit-2026-10-17-000002",
                    "event_category": "payment",
                    "action_type": "deposit_completed",
                    "occurred_at": "2026-10-17T09:16:40Z",
                    "subject": {
                      "vendor_data": "user-42"
                    },
                    "transaction_context": {
                      "amount": "100.00",
                      "currency": "EUR",
                      "direction": "inbound",
                      "payment_reference_id": "dep_736"
                    },
                    "payload": {
                      "payment_method": "card",
                      "status": "completed"
                    }
                  }
                },
                "Chargeback opened": {
                  "value": {
                    "event_id": "chargeback-2026-10-16-000318",
                    "event_category": "dispute",
                    "action_type": "chargeback_opened",
                    "occurred_at": "2026-10-16T14:02:11Z",
                    "subject": {
                      "vendor_data": "user-42"
                    },
                    "payload": {
                      "payment_reference_id": "dep_735",
                      "chargeback_id": "cb_5521",
                      "amount": "250.00",
                      "currency": "EUR",
                      "reason_code": "fraud"
                    }
                  }
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X POST 'https://verification.didit.me/v3/events/' \\\n  -H 'x-api-key: YOUR_API_KEY' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\n    \"event_id\": \"login-2026-10-17-000001\",\n    \"event_category\": \"auth\",\n    \"action_type\": \"login\",\n    \"occurred_at\": \"2026-10-17T09:15:02.481Z\",\n    \"subject\": {\"vendor_data\": \"user-42\", \"entity_type\": \"individual\"},\n    \"session\": {\"session_id\": \"web-session-abc\", \"sequence\": 142},\n    \"device_context\": {\n      \"fingerprint\": \"fp-a8c1\",\n      \"network_context\": {\"ip_address\": \"203.0.113.42\"}\n    },\n    \"payload\": {\"method\": \"password\"}\n  }'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.monitoring_events.create(\n    event_id=\"login-2026-10-17-000001\",\n    event_category=\"auth\",\n    action_type=\"login\",\n    occurred_at=\"2026-10-17T09:15:02.481Z\",\n    time_zone=\"Europe/Madrid\",\n    subject={\n        \"vendor_data\": \"user-42\",\n        \"entity_type\": \"individual\",\n    },\n    session={\n        \"session_id\": \"web-session-abc\",\n        \"sequence\": 142,\n    },\n    device_context={\n        \"fingerprint\": \"fp-a8c1\",\n        \"network_context\": {\n            \"ip_address\": \"203.0.113.42\",\n        },\n    },\n    payload={\"method\": \"password\"},\n    custom_values={\"vip_tier\": \"gold\"},\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.monitoringEvents.create({\n  event_id: \"login-2026-10-17-000001\",\n  event_category: \"auth\",\n  action_type: \"login\",\n  occurred_at: \"2026-10-17T09:15:02.481Z\",\n  time_zone: \"Europe/Madrid\",\n  subject: {\n    vendor_data: \"user-42\",\n    entity_type: \"individual\",\n  },\n  session: {\n    session_id: \"web-session-abc\",\n    sequence: 142,\n  },\n  device_context: {\n    fingerprint: \"fp-a8c1\",\n    network_context: {\n      ip_address: \"203.0.113.42\",\n    },\n  },\n  payload: { method: \"password\" },\n  custom_values: { vip_tier: \"gold\" },\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.MonitoringEvents.Create(ctx, didit.MonitoringEventCreateRequest{\n\tEventID:       \"login-2026-10-17-000001\",\n\tEventCategory: \"auth\",\n\tActionType:    \"login\",\n\tOccurredAt:    time.Date(2026, 10, 17, 9, 15, 2, 0, time.UTC),\n\tTimeZone:      didit.String(\"Europe/Madrid\"),\n\tSubject: didit.MonitoringEventCreateRequestSubject{\n\t\tVendorData: \"user-42\",\n\t\tEntityType: didit.String(\"individual\"),\n\t},\n\tSession: didit.Some(didit.MonitoringEventCreateRequestSession{\n\t\tSessionID: didit.String(\"web-session-abc\"),\n\t\tSequence:  didit.Int(142),\n\t}),\n\tDeviceContext: didit.Some(didit.MonitoringEventCreateRequestDeviceContext{\n\t\tFingerprint: didit.String(\"fp-a8c1\"),\n\t\tNetworkContext: didit.Some(didit.MonitoringEventCreateRequestDeviceContextNetworkContext{\n\t\t\tIPAddress: didit.String(\"203.0.113.42\"),\n\t\t}),\n\t}),\n\tPayload:      didit.Some(map[string]any{\"method\": \"password\"}),\n\tCustomValues: didit.Some(map[string]any{\"vip_tier\": \"gold\"}),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import java.time.OffsetDateTime;\nimport java.util.Map;\nimport me.didit.Didit;\nimport me.didit.types.MonitoringEventCreateRequest;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.monitoringEvents().create(MonitoringEventCreateRequest.builder()\n        .eventId(\"login-2026-10-17-000001\")\n        .eventCategory(MonitoringEventCreateRequest.EventCategory.of(\"auth\"))\n        .actionType(\"login\")\n        .occurredAt(OffsetDateTime.parse(\"2026-10-17T09:15:02.481Z\"))\n        .timeZone(\"Europe/Madrid\")\n        .subject(MonitoringEventCreateRequest.Subject.builder()\n                .vendorData(\"user-42\")\n                .entityType(\"individual\")\n                .build())\n        .session(MonitoringEventCreateRequest.Session.builder()\n                .sessionId(\"web-session-abc\")\n                .sequence(142L)\n                .build())\n        .deviceContext(MonitoringEventCreateRequest.DeviceContext.builder()\n                .fingerprint(\"fp-a8c1\")\n                .networkContext(MonitoringEventCreateRequest.DeviceContext.NetworkContext.builder()\n                        .ipAddress(\"203.0.113.42\")\n                        .build())\n                .build())\n        .payload(Map.of(\"method\", \"password\"))\n        .customValues(Map.of(\"vip_tier\", MonitoringEventCreateRequest.CustomValuesValue.ofString(\"gold\")))\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->monitoringEvents->create([\n    'event_id' => 'login-2026-10-17-000001',\n    'event_category' => 'auth',\n    'action_type' => 'login',\n    'occurred_at' => '2026-10-17T09:15:02.481Z',\n    'time_zone' => 'Europe/Madrid',\n    'subject' => [\n        'vendor_data' => 'user-42',\n        'entity_type' => 'individual',\n    ],\n    'session' => [\n        'session_id' => 'web-session-abc',\n        'sequence' => 142,\n    ],\n    'device_context' => [\n        'fingerprint' => 'fp-a8c1',\n        'network_context' => [\n            'ip_address' => '203.0.113.42',\n        ],\n    ],\n    'payload' => ['method' => 'password'],\n    'custom_values' => ['vip_tier' => 'gold'],\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.monitoring_events.create(\n  event_id: \"login-2026-10-17-000001\",\n  event_category: \"auth\",\n  action_type: \"login\",\n  occurred_at: \"2026-10-17T09:15:02.481Z\",\n  time_zone: \"Europe/Madrid\",\n  subject: {\n    vendor_data: \"user-42\",\n    entity_type: \"individual\",\n  },\n  session: {\n    session_id: \"web-session-abc\",\n    sequence: 142,\n  },\n  device_context: {\n    fingerprint: \"fp-a8c1\",\n    network_context: {\n      ip_address: \"203.0.113.42\",\n    },\n  },\n  payload: { method: \"password\" },\n  custom_values: { vip_tier: \"gold\" }\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Collections.Generic;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.MonitoringEvents.CreateAsync(new MonitoringEventCreateRequest\n{\n    EventId = \"login-2026-10-17-000001\",\n    EventCategory = \"auth\",\n    ActionType = \"login\",\n    OccurredAt = DateTimeOffset.Parse(\"2026-10-17T09:15:02.481Z\"),\n    TimeZone = \"Europe/Madrid\",\n    Subject = new()\n    {\n        VendorData = \"user-42\",\n        EntityType = \"individual\",\n    },\n    Session = new MonitoringEventCreateRequestSession\n    {\n        SessionId = \"web-session-abc\",\n        Sequence = 142,\n    },\n    DeviceContext = new MonitoringEventCreateRequestDeviceContext\n    {\n        Fingerprint = \"fp-a8c1\",\n        NetworkContext = new MonitoringEventCreateRequestDeviceContextNetworkContext\n        {\n            IpAddress = \"203.0.113.42\",\n        },\n    },\n    Payload = new Dictionary<string, object> { [\"method\"] = \"password\" },\n    CustomValues = new Dictionary<string, object> { [\"vip_tier\"] = \"gold\" },\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "responses": {
          "201": {
            "description": "Das Ereignis wurde gespeichert und ausgewertet.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MonitoringEventIngestResult"
                },
                "examples": {
                  "Stored, no rule matched": {
                    "value": {
                      "event_uuid": "33333333-4444-5555-6666-777777777777",
                      "event_id": "login-2026-10-17-000001",
                      "status": "ACCEPTED",
                      "score": 0,
                      "rules_evaluated_count": 6,
                      "rules_matched_count": 0,
                      "correlation_pending": false,
                      "retention_class": "standard",
                      "expires_at": "2026-11-16T09:15:02.481000Z",
                      "idempotent_replay": false,
                      "rule_matches": []
                    }
                  },
                  "Rule matched, async rule pending": {
                    "value": {
                      "event_uuid": "33333333-4444-5555-6666-777777777777",
                      "event_id": "login-2026-10-17-000001",
                      "status": "IN_REVIEW",
                      "score": 40,
                      "rules_evaluated_count": 6,
                      "rules_matched_count": 1,
                      "correlation_pending": true,
                      "retention_class": "risk_relevant",
                      "expires_at": "2027-01-15T09:15:02.481000Z",
                      "idempotent_replay": false,
                      "rule_matches": [
                        {
                          "rule_id": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee",
                          "library_key": null,
                          "mode": "ACTIVE",
                          "is_async": false
                        }
                      ]
                    }
                  }
                }
              }
            }
          },
          "200": {
            "description": "Idempotente Wiederholung: Ein Ereignis mit dieser `event_id` und demselben Inhalt ist bereits gespeichert. Es wurde nichts erneut gespeichert oder ausgewertet; der Body beschreibt das gespeicherte Ereignis.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MonitoringEventIngestResult"
                },
                "examples": {
                  "Replay": {
                    "value": {
                      "event_uuid": "33333333-4444-5555-6666-777777777777",
                      "event_id": "login-2026-10-17-000001",
                      "status": "ACCEPTED",
                      "score": 0,
                      "rules_evaluated_count": 6,
                      "rules_matched_count": 0,
                      "correlation_pending": false,
                      "retention_class": "standard",
                      "expires_at": "2026-11-16T09:15:02.481000Z",
                      "idempotent_replay": true,
                      "rule_matches": []
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Validierung fehlgeschlagen. Der Body ist nach Feldern aufgeschlüsselt; verschachtelte Felder sind verschachtelte Objekte. Es wird nichts gespeichert.",
            "content": {
              "application/json": {
                "examples": {
                  "Missing fields": {
                    "value": {
                      "event_id": [
                        "This field is required."
                      ],
                      "subject": [
                        "This field is required."
                      ]
                    }
                  },
                  "Unknown category": {
                    "value": {
                      "event_category": [
                        "\"login\" is not a valid choice."
                      ]
                    }
                  },
                  "occurred_at too old": {
                    "value": {
                      "occurred_at": [
                        "occurred_at is more than 7 days in the past. Use the batch import lane for backfills."
                      ]
                    }
                  },
                  "occurred_at in the future": {
                    "value": {
                      "occurred_at": [
                        "occurred_at is more than 5 minutes in the future."
                      ]
                    }
                  },
                  "Missing subject vendor_data": {
                    "value": {
                      "subject": {
                        "vendor_data": [
                          "This field is required."
                        ]
                      }
                    }
                  },
                  "Missing required payload keys": {
                    "value": {
                      "payload": [
                        "payment.deposit_completed requires: payment_method, status."
                      ]
                    }
                  },
                  "Missing one-of payload key": {
                    "value": {
                      "payload": [
                        "dispute.chargeback_opened requires one of: dispute_id, chargeback_id."
                      ]
                    }
                  },
                  "Security change without changed_field": {
                    "value": {
                      "payload": [
                        "security.*_changed requires 'changed_field'."
                      ]
                    }
                  },
                  "Payload too large": {
                    "value": {
                      "payload": [
                        "payload exceeds 16384 bytes. Summarise telemetry client-side."
                      ]
                    }
                  },
                  "Too many custom_values": {
                    "value": {
                      "custom_values": [
                        "custom_values accepts at most 100 keys."
                      ]
                    }
                  },
                  "Nested custom value": {
                    "value": {
                      "custom_values": [
                        "custom_values['limits'] must be a scalar - rule conditions cannot address nested values."
                      ]
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Der API-Schlüssel mit eingeschränktem Geltungsbereich ist abgelaufen. Nur ein abgelaufener Schlüssel erhält `401`; ein fehlender oder ungültiger Schlüssel erhält `403`.",
            "content": {
              "application/json": {
                "examples": {
                  "Expired key": {
                    "value": {
                      "detail": "This API key has expired."
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Ein fehlender `x-api-key` (ein falscher, widerrufener oder abgelaufener Schlüssel erhält `401`), ein berechtigungsbeschränkter Schlüssel ohne `transactions: write`, ein auf bestimmte Workflows oder genehmigte Sitzungen beschränkter Schlüssel (ein solcher Schlüssel erreicht Transaktionsüberwachungsdaten nie) oder eine Anfrage von außerhalb der IP-Allowlist des Schlüssels. Wird auch mit `code: event_monitoring_disabled` zurückgegeben, solange die Ereigniserfassung für die Anwendung deaktiviert ist; in diesem Fall wird nichts gespeichert, und die Prüfung erfolgt vor der Validierung des Bodys.",
            "content": {
              "application/json": {
                "examples": {
                  "Event monitoring disabled": {
                    "value": {
                      "detail": "Event monitoring is not enabled for this application. Turn on event ingestion in the transaction monitoring settings before submitting events.",
                      "code": "event_monitoring_disabled"
                    }
                  },
                  "Missing or invalid API key": {
                    "value": {
                      "detail": "You do not have permission to perform this action."
                    }
                  },
                  "Scoped key without access": {
                    "value": {
                      "detail": "This API key has no write access to transactions."
                    }
                  },
                  "Key limited to workflows or approved sessions": {
                    "value": {
                      "detail": "This API key only reaches sessions inside its workflow or status limits, so it can't use this endpoint."
                    }
                  },
                  "IP not allowed": {
                    "value": {
                      "detail": "This API key can't be used from this IP address."
                    }
                  }
                }
              }
            }
          },
          "409": {
            "description": "`event_id` wurde bereits für ein Ereignis mit anderem Inhalt verwendet (Kategorie, Aktionstyp, `occurred_at`, `vendor_data` des Subjekts oder Payload). Senden Sie das Ereignis unter einer neuen `event_id`.",
            "content": {
              "application/json": {
                "examples": {
                  "event_id reused": {
                    "value": {
                      "event_id": "event_id 'login-2026-10-17-000001' already exists with a different payload."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate-Limit überschritten: Transaktionserstellungen und Ereignis-Ingestion (`POST /v3/transactions/`, `POST /v3/events/`, `POST /v3/events/batch/`) teilen sich ein Kontingent von 600 Anfragen pro Minute pro API-Schlüssel, getrennt von den 300, die sich alle anderen Schreibanfragen teilen. Warten Sie `Retry-After` Sekunden und versuchen Sie es dann erneut.",
            "headers": {
              "Retry-After": {
                "description": "Anzahl der Sekunden, die vor einem Wiederholungsversuch gewartet werden muss, aufgerundet, damit der Wiederholungsversuch im nächsten Zeitfenster liegt.",
                "schema": {
                  "type": "integer",
                  "minimum": 1,
                  "example": 30
                }
              }
            },
            "content": {
              "application/json": {
                "examples": {
                  "Throttled": {
                    "value": {
                      "detail": "Ingestion rate limit exceeded. You can make up to 600 requests per minute."
                    }
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/v3/events/batch/": {
      "post": {
        "summary": "Monitoring-Ereignisse im Batch erstellen",
        "description": "Übermitteln Sie 1 bis 500 Ereignisse in einer Anfrage, jeweils im selben Envelope wie `POST /v3/events/`. Jedes Element wird einzeln validiert, gespeichert und ausgewertet und erhält ein eigenes Ergebnis (`accepted`, `replayed` oder `rejected`), sodass ein fehlerhaftes Ereignis niemals die anderen zurückrollt: Die Antwort ist `201`, wenn kein Element abgelehnt wurde, und `207`, wenn mindestens eines abgelehnt wurde; beides bedeutet, dass die Anfrage verarbeitet wurde. Senden Sie `{\"events\": [...]}`; ein einfaches JSON-Array von Ereignissen wird ebenfalls akzeptiert. Die Ereigniserfassung muss für die Anwendung aktiviert sein, andernfalls gibt die gesamte Anfrage `403` mit `code: event_monitoring_disabled` zurück und es wird nichts gespeichert. Ein berechtigter API-Schlüssel erfordert `transactions: write`. Siehe [Batches](https://docs.didit.me/de/transaction-monitoring/events#batches).",
        "operationId": "create_monitoring_events_batch",
        "x-didit-sdk": {
          "resource": "monitoring_events",
          "method": "create_batch",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Monitoring Events"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "events"
                ],
                "properties": {
                  "events": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 500,
                    "description": "1 bis 500 Ereignisse. Jeder Eintrag entspricht `MonitoringEventCreateRequest`, einschließlich des Fensters von 7 Tagen in der Vergangenheit und 5 Minuten in der Zukunft für `occurred_at`.",
                    "items": {
                      "$ref": "#/components/schemas/MonitoringEventCreateRequest"
                    }
                  }
                }
              },
              "example": {
                "events": [
                  {
                    "event_id": "login-2026-10-17-000001",
                    "event_category": "auth",
                    "action_type": "login",
                    "occurred_at": "2026-10-17T09:15:02.481Z",
                    "subject": {
                      "vendor_data": "user-42"
                    }
                  },
                  {
                    "event_id": "deposit-2026-10-17-000002",
                    "event_category": "payment",
                    "action_type": "deposit_completed",
                    "occurred_at": "2026-10-17T09:16:40Z",
                    "subject": {
                      "vendor_data": "user-42"
                    },
                    "transaction_context": {
                      "amount": "100.00",
                      "currency": "EUR",
                      "payment_reference_id": "dep_736"
                    },
                    "payload": {
                      "payment_method": "card",
                      "status": "completed"
                    }
                  }
                ]
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X POST 'https://verification.didit.me/v3/events/batch/' \\\n  -H 'x-api-key: YOUR_API_KEY' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\n    \"events\": [\n      {\"event_id\": \"login-2026-10-17-000001\", \"event_category\": \"auth\", \"action_type\": \"login\",\n       \"occurred_at\": \"2026-10-17T09:15:02.481Z\", \"subject\": {\"vendor_data\": \"user-42\"}},\n      {\"event_id\": \"deposit-2026-10-17-000002\", \"event_category\": \"payment\", \"action_type\": \"deposit_completed\",\n       \"occurred_at\": \"2026-10-17T09:16:40.000Z\", \"subject\": {\"vendor_data\": \"user-42\"},\n       \"transaction_context\": {\"amount\": \"100.00\", \"currency\": \"EUR\", \"payment_reference_id\": \"dep_736\"},\n       \"payload\": {\"payment_method\": \"card\", \"status\": \"completed\"}}\n    ]\n  }'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.monitoring_events.create_batch(\n    events=[{\n        \"event_id\": \"login-2026-10-17-000001\",\n        \"event_category\": \"auth\",\n        \"action_type\": \"login\",\n        \"occurred_at\": \"2026-10-17T09:15:02.481Z\",\n        \"subject\": {\n            \"vendor_data\": \"user-42\",\n        },\n    }, {\n        \"event_id\": \"deposit-2026-10-17-000002\",\n        \"event_category\": \"payment\",\n        \"action_type\": \"deposit_completed\",\n        \"occurred_at\": \"2026-10-17T09:16:40Z\",\n        \"subject\": {\n            \"vendor_data\": \"user-42\",\n        },\n        \"transaction_context\": {\n            \"amount\": \"100.00\",\n            \"currency\": \"EUR\",\n            \"payment_reference_id\": \"dep_736\",\n        },\n        \"payload\": {\"payment_method\": \"card\", \"status\": \"completed\"},\n    }],\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.monitoringEvents.createBatch({\n  events: [{\n    event_id: \"login-2026-10-17-000001\",\n    event_category: \"auth\",\n    action_type: \"login\",\n    occurred_at: \"2026-10-17T09:15:02.481Z\",\n    subject: {\n      vendor_data: \"user-42\",\n    },\n  }, {\n    event_id: \"deposit-2026-10-17-000002\",\n    event_category: \"payment\",\n    action_type: \"deposit_completed\",\n    occurred_at: \"2026-10-17T09:16:40Z\",\n    subject: {\n      vendor_data: \"user-42\",\n    },\n    transaction_context: {\n      amount: \"100.00\",\n      currency: \"EUR\",\n      payment_reference_id: \"dep_736\",\n    },\n    payload: { payment_method: \"card\", status: \"completed\" },\n  }],\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.MonitoringEvents.CreateBatch(ctx, didit.MonitoringEventsCreateBatchParams{\n\tEvents: []didit.MonitoringEventCreateRequest{{\n\t\tEventID:       \"login-2026-10-17-000001\",\n\t\tEventCategory: \"auth\",\n\t\tActionType:    \"login\",\n\t\tOccurredAt:    time.Date(2026, 10, 17, 9, 15, 2, 0, time.UTC),\n\t\tSubject: didit.MonitoringEventCreateRequestSubject{\n\t\t\tVendorData: \"user-42\",\n\t\t},\n\t}, {\n\t\tEventID:       \"deposit-2026-10-17-000002\",\n\t\tEventCategory: \"payment\",\n\t\tActionType:    \"deposit_completed\",\n\t\tOccurredAt:    time.Date(2026, 10, 17, 9, 16, 40, 0, time.UTC),\n\t\tSubject: didit.MonitoringEventCreateRequestSubject{\n\t\t\tVendorData: \"user-42\",\n\t\t},\n\t\tTransactionContext: didit.Some(didit.MonitoringEventCreateRequestTransactionContext{\n\t\t\tAmount:             didit.String(\"100.00\"),\n\t\t\tCurrency:           didit.String(\"EUR\"),\n\t\t\tPaymentReferenceID: didit.String(\"dep_736\"),\n\t\t}),\n\t\tPayload: didit.Some(map[string]any{\"payment_method\": \"card\", \"status\": \"completed\"}),\n\t}},\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import java.time.OffsetDateTime;\nimport java.util.List;\nimport java.util.Map;\nimport me.didit.Didit;\nimport me.didit.types.MonitoringEventCreateRequest;\nimport me.didit.types.MonitoringEventsCreateBatchParams;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.monitoringEvents().createBatch(MonitoringEventsCreateBatchParams.builder()\n        .events(List.of(\n                MonitoringEventCreateRequest.builder()\n                        .eventId(\"login-2026-10-17-000001\")\n                        .eventCategory(MonitoringEventCreateRequest.EventCategory.of(\"auth\"))\n                        .actionType(\"login\")\n                        .occurredAt(OffsetDateTime.parse(\"2026-10-17T09:15:02.481Z\"))\n                        .subject(MonitoringEventCreateRequest.Subject.builder()\n                                .vendorData(\"user-42\")\n                                .build())\n                        .build(),\n                MonitoringEventCreateRequest.builder()\n                        .eventId(\"deposit-2026-10-17-000002\")\n                        .eventCategory(MonitoringEventCreateRequest.EventCategory.of(\"payment\"))\n                        .actionType(\"deposit_completed\")\n                        .occurredAt(OffsetDateTime.parse(\"2026-10-17T09:16:40Z\"))\n                        .subject(MonitoringEventCreateRequest.Subject.builder()\n                                .vendorData(\"user-42\")\n                                .build())\n                        .transactionContext(MonitoringEventCreateRequest.TransactionContext.builder()\n                                .amount(\"100.00\")\n                                .currency(\"EUR\")\n                                .paymentReferenceId(\"dep_736\")\n                                .build())\n                        .payload(Map.of(\"payment_method\", \"card\", \"status\", \"completed\"))\n                        .build()))\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->monitoringEvents->createBatch([\n    'events' => [[\n        'event_id' => 'login-2026-10-17-000001',\n        'event_category' => 'auth',\n        'action_type' => 'login',\n        'occurred_at' => '2026-10-17T09:15:02.481Z',\n        'subject' => [\n            'vendor_data' => 'user-42',\n        ],\n    ], [\n        'event_id' => 'deposit-2026-10-17-000002',\n        'event_category' => 'payment',\n        'action_type' => 'deposit_completed',\n        'occurred_at' => '2026-10-17T09:16:40Z',\n        'subject' => [\n            'vendor_data' => 'user-42',\n        ],\n        'transaction_context' => [\n            'amount' => '100.00',\n            'currency' => 'EUR',\n            'payment_reference_id' => 'dep_736',\n        ],\n        'payload' => ['payment_method' => 'card', 'status' => 'completed'],\n    ]],\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.monitoring_events.create_batch(\n  events: [{\n    event_id: \"login-2026-10-17-000001\",\n    event_category: \"auth\",\n    action_type: \"login\",\n    occurred_at: \"2026-10-17T09:15:02.481Z\",\n    subject: {\n      vendor_data: \"user-42\",\n    },\n  }, {\n    event_id: \"deposit-2026-10-17-000002\",\n    event_category: \"payment\",\n    action_type: \"deposit_completed\",\n    occurred_at: \"2026-10-17T09:16:40Z\",\n    subject: {\n      vendor_data: \"user-42\",\n    },\n    transaction_context: {\n      amount: \"100.00\",\n      currency: \"EUR\",\n      payment_reference_id: \"dep_736\",\n    },\n    payload: { payment_method: \"card\", status: \"completed\" },\n  }]\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Collections.Generic;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.MonitoringEvents.CreateBatchAsync(new MonitoringEventsCreateBatchParams\n{\n    Events = new MonitoringEventCreateRequest[]\n    {\n        new()\n        {\n            EventId = \"login-2026-10-17-000001\",\n            EventCategory = \"auth\",\n            ActionType = \"login\",\n            OccurredAt = DateTimeOffset.Parse(\"2026-10-17T09:15:02.481Z\"),\n            Subject = new()\n            {\n                VendorData = \"user-42\",\n            },\n        },\n        new()\n        {\n            EventId = \"deposit-2026-10-17-000002\",\n            EventCategory = \"payment\",\n            ActionType = \"deposit_completed\",\n            OccurredAt = DateTimeOffset.Parse(\"2026-10-17T09:16:40Z\"),\n            Subject = new()\n            {\n                VendorData = \"user-42\",\n            },\n            TransactionContext = new MonitoringEventCreateRequestTransactionContext\n            {\n                Amount = \"100.00\",\n                Currency = \"EUR\",\n                PaymentReferenceId = \"dep_736\",\n            },\n            Payload = new Dictionary<string, object> { [\"payment_method\"] = \"card\", [\"status\"] = \"completed\" },\n        },\n    },\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "responses": {
          "201": {
            "description": "Kein Element wurde abgelehnt: Jedes Element ist `accepted` oder `replayed`.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "accepted_count",
                    "replayed_count",
                    "rejected_count",
                    "results"
                  ],
                  "properties": {
                    "accepted_count": {
                      "type": "integer",
                      "minimum": 0,
                      "description": "Elemente gespeichert und ausgewertet."
                    },
                    "replayed_count": {
                      "type": "integer",
                      "minimum": 0,
                      "description": "Elemente, die bereits mit demselben Inhalt gespeichert sind."
                    },
                    "rejected_count": {
                      "type": "integer",
                      "minimum": 0,
                      "description": "Elemente nicht gespeichert."
                    },
                    "results": {
                      "type": "array",
                      "description": "Ein Eintrag pro Element in der Reihenfolge der Anfrage.",
                      "items": {
                        "type": "object",
                        "description": "Ergebnis eines Eintrags. Akzeptierte und wiederholte Einträge enthalten außerdem jedes Feld von `MonitoringEventIngestResult`; abgelehnte Einträge enthalten stattdessen `event_id` und `errors`.",
                        "required": [
                          "index",
                          "outcome"
                        ],
                        "properties": {
                          "index": {
                            "type": "integer",
                            "minimum": 0,
                            "description": "Position des Eintrags in Ihrem `events`-Array."
                          },
                          "outcome": {
                            "type": "string",
                            "enum": [
                              "accepted",
                              "replayed",
                              "rejected"
                            ],
                            "description": "`accepted`: gespeichert und ausgewertet. `replayed`: bereits mit demselben Inhalt gespeichert. `rejected`: nicht gespeichert; siehe `errors`."
                          },
                          "event_id": {
                            "type": "string",
                            "nullable": true,
                            "description": "Ihre `event_id`. Bei Elementen, die durch die Validierung abgelehnt wurden, wird sie aus dem snake_case-Schlüssel `event_id` des Elements gelesen; sie ist daher null, wenn das Element sie weggelassen oder den Alias `eventId` gesendet hat."
                          },
                          "errors": {
                            "type": "object",
                            "additionalProperties": true,
                            "description": "Nur abgelehnte Elemente. Validierungsfehler nach Feld aufgeschlüsselt, in derselben Struktur wie die `400`-Antwort von `POST /v3/events/`; eine wiederverwendete `event_id` mit abweichendem Inhalt wird als String unter `errors.event_id` gemeldet."
                          },
                          "event_uuid": {
                            "type": "string",
                            "format": "uuid",
                            "description": "Nur akzeptierte und erneut abgespielte Elemente."
                          },
                          "status": {
                            "type": "string",
                            "enum": [
                              "ACCEPTED",
                              "APPROVED",
                              "IN_REVIEW",
                              "DECLINED"
                            ],
                            "description": "Nur akzeptierte und erneut abgespielte Elemente."
                          },
                          "score": {
                            "type": "integer",
                            "description": "Nur akzeptierte und erneut abgespielte Elemente."
                          },
                          "rules_evaluated_count": {
                            "type": "integer",
                            "description": "Nur akzeptierte und erneut abgespielte Elemente."
                          },
                          "rules_matched_count": {
                            "type": "integer",
                            "description": "Nur akzeptierte und erneut abgespielte Elemente."
                          },
                          "correlation_pending": {
                            "type": "boolean",
                            "description": "Nur akzeptierte und erneut abgespielte Elemente."
                          },
                          "retention_class": {
                            "type": "string",
                            "enum": [
                              "low_value",
                              "standard",
                              "risk_relevant",
                              "monetary_or_compliance"
                            ],
                            "description": "Nur akzeptierte und erneut abgespielte Elemente."
                          },
                          "expires_at": {
                            "type": "string",
                            "format": "date-time",
                            "nullable": true,
                            "description": "Nur akzeptierte und erneut abgespielte Elemente."
                          },
                          "idempotent_replay": {
                            "type": "boolean",
                            "description": "Nur akzeptierte und erneut abgespielte Elemente."
                          },
                          "rule_matches": {
                            "type": "array",
                            "description": "Nur akzeptierte und erneut abgespielte Elemente.",
                            "items": {
                              "type": "object",
                              "required": [
                                "rule_id",
                                "library_key",
                                "mode",
                                "is_async"
                              ],
                              "properties": {
                                "rule_id": {
                                  "type": "string",
                                  "format": "uuid",
                                  "description": "UUID der Regel."
                                },
                                "library_key": {
                                  "type": "string",
                                  "nullable": true,
                                  "description": "Bibliotheksschlüssel, wenn die Regel aus der Regelbibliothek installiert wurde, andernfalls null."
                                },
                                "mode": {
                                  "type": "string",
                                  "enum": [
                                    "ACTIVE",
                                    "TEST"
                                  ],
                                  "description": "`TEST`-Regeln erfassen die Übereinstimmung, wenden aber keine Aktionen an."
                                },
                                "is_async": {
                                  "type": "boolean",
                                  "description": "`true`, wenn die Übereinstimmung aus dem asynchronen Durchlauf stammt."
                                }
                              }
                            }
                          }
                        }
                      }
                    }
                  }
                },
                "examples": {
                  "All landed": {
                    "value": {
                      "accepted_count": 1,
                      "replayed_count": 1,
                      "rejected_count": 0,
                      "results": [
                        {
                          "index": 0,
                          "outcome": "accepted",
                          "event_uuid": "33333333-4444-5555-6666-777777777777",
                          "event_id": "login-2026-10-17-000001",
                          "status": "ACCEPTED",
                          "score": 0,
                          "rules_evaluated_count": 6,
                          "rules_matched_count": 0,
                          "correlation_pending": false,
                          "retention_class": "standard",
                          "expires_at": "2026-11-16T09:15:02.481000Z",
                          "idempotent_replay": false,
                          "rule_matches": []
                        },
                        {
                          "index": 1,
                          "outcome": "replayed",
                          "event_uuid": "11111111-2222-3333-4444-555555555555",
                          "event_id": "deposit-2026-10-17-000002",
                          "status": "ACCEPTED",
                          "score": 0,
                          "rules_evaluated_count": 6,
                          "rules_matched_count": 0,
                          "correlation_pending": false,
                          "retention_class": "monetary_or_compliance",
                          "expires_at": null,
                          "idempotent_replay": true,
                          "rule_matches": []
                        }
                      ]
                    }
                  }
                }
              }
            }
          },
          "207": {
            "description": "Mindestens ein Element wurde abgelehnt. Die anderen Elemente wurden gespeichert; korrigieren und senden Sie nur die abgelehnten erneut (das erneute Senden eines akzeptierten Elements ist sicher, es wird als `replayed` zurückgegeben).",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "accepted_count",
                    "replayed_count",
                    "rejected_count",
                    "results"
                  ],
                  "properties": {
                    "accepted_count": {
                      "type": "integer",
                      "minimum": 0,
                      "description": "Elemente gespeichert und ausgewertet."
                    },
                    "replayed_count": {
                      "type": "integer",
                      "minimum": 0,
                      "description": "Elemente, die bereits mit demselben Inhalt gespeichert sind."
                    },
                    "rejected_count": {
                      "type": "integer",
                      "minimum": 0,
                      "description": "Elemente nicht gespeichert."
                    },
                    "results": {
                      "type": "array",
                      "description": "Ein Eintrag pro Element in der Reihenfolge der Anfrage.",
                      "items": {
                        "type": "object",
                        "description": "Ergebnis eines Eintrags. Akzeptierte und wiederholte Einträge enthalten außerdem jedes Feld von `MonitoringEventIngestResult`; abgelehnte Einträge enthalten stattdessen `event_id` und `errors`.",
                        "required": [
                          "index",
                          "outcome"
                        ],
                        "properties": {
                          "index": {
                            "type": "integer",
                            "minimum": 0,
                            "description": "Position des Eintrags in Ihrem `events`-Array."
                          },
                          "outcome": {
                            "type": "string",
                            "enum": [
                              "accepted",
                              "replayed",
                              "rejected"
                            ],
                            "description": "`accepted`: gespeichert und ausgewertet. `replayed`: bereits mit demselben Inhalt gespeichert. `rejected`: nicht gespeichert; siehe `errors`."
                          },
                          "event_id": {
                            "type": "string",
                            "nullable": true,
                            "description": "Ihre `event_id`. Bei Elementen, die durch die Validierung abgelehnt wurden, wird sie aus dem snake_case-Schlüssel `event_id` des Elements gelesen; sie ist daher null, wenn das Element sie weggelassen oder den Alias `eventId` gesendet hat."
                          },
                          "errors": {
                            "type": "object",
                            "additionalProperties": true,
                            "description": "Nur abgelehnte Elemente. Validierungsfehler nach Feld aufgeschlüsselt, in derselben Struktur wie die `400`-Antwort von `POST /v3/events/`; eine wiederverwendete `event_id` mit abweichendem Inhalt wird als String unter `errors.event_id` gemeldet."
                          },
                          "event_uuid": {
                            "type": "string",
                            "format": "uuid",
                            "description": "Nur akzeptierte und erneut abgespielte Elemente."
                          },
                          "status": {
                            "type": "string",
                            "enum": [
                              "ACCEPTED",
                              "APPROVED",
                              "IN_REVIEW",
                              "DECLINED"
                            ],
                            "description": "Nur akzeptierte und erneut abgespielte Elemente."
                          },
                          "score": {
                            "type": "integer",
                            "description": "Nur akzeptierte und erneut abgespielte Elemente."
                          },
                          "rules_evaluated_count": {
                            "type": "integer",
                            "description": "Nur akzeptierte und erneut abgespielte Elemente."
                          },
                          "rules_matched_count": {
                            "type": "integer",
                            "description": "Nur akzeptierte und erneut abgespielte Elemente."
                          },
                          "correlation_pending": {
                            "type": "boolean",
                            "description": "Nur akzeptierte und erneut abgespielte Elemente."
                          },
                          "retention_class": {
                            "type": "string",
                            "enum": [
                              "low_value",
                              "standard",
                              "risk_relevant",
                              "monetary_or_compliance"
                            ],
                            "description": "Nur akzeptierte und erneut abgespielte Elemente."
                          },
                          "expires_at": {
                            "type": "string",
                            "format": "date-time",
                            "nullable": true,
                            "description": "Nur akzeptierte und erneut abgespielte Elemente."
                          },
                          "idempotent_replay": {
                            "type": "boolean",
                            "description": "Nur akzeptierte und erneut abgespielte Elemente."
                          },
                          "rule_matches": {
                            "type": "array",
                            "description": "Nur akzeptierte und erneut abgespielte Elemente.",
                            "items": {
                              "type": "object",
                              "required": [
                                "rule_id",
                                "library_key",
                                "mode",
                                "is_async"
                              ],
                              "properties": {
                                "rule_id": {
                                  "type": "string",
                                  "format": "uuid",
                                  "description": "UUID der Regel."
                                },
                                "library_key": {
                                  "type": "string",
                                  "nullable": true,
                                  "description": "Bibliotheksschlüssel, wenn die Regel aus der Regelbibliothek installiert wurde, andernfalls null."
                                },
                                "mode": {
                                  "type": "string",
                                  "enum": [
                                    "ACTIVE",
                                    "TEST"
                                  ],
                                  "description": "`TEST`-Regeln erfassen die Übereinstimmung, wenden aber keine Aktionen an."
                                },
                                "is_async": {
                                  "type": "boolean",
                                  "description": "`true`, wenn die Übereinstimmung aus dem asynchronen Durchlauf stammt."
                                }
                              }
                            }
                          }
                        }
                      }
                    }
                  }
                },
                "examples": {
                  "Partial success": {
                    "value": {
                      "accepted_count": 1,
                      "replayed_count": 0,
                      "rejected_count": 2,
                      "results": [
                        {
                          "index": 0,
                          "outcome": "accepted",
                          "event_uuid": "33333333-4444-5555-6666-777777777777",
                          "event_id": "login-2026-10-17-000001",
                          "status": "ACCEPTED",
                          "score": 0,
                          "rules_evaluated_count": 6,
                          "rules_matched_count": 0,
                          "correlation_pending": false,
                          "retention_class": "standard",
                          "expires_at": "2026-11-16T09:15:02.481000Z",
                          "idempotent_replay": false,
                          "rule_matches": []
                        },
                        {
                          "index": 1,
                          "event_id": "deposit-2026-10-17-000002",
                          "outcome": "rejected",
                          "errors": {
                            "payload": [
                              "payment.deposit_completed requires: payment_method, status."
                            ]
                          }
                        },
                        {
                          "index": 2,
                          "event_id": "login-2026-10-16-000777",
                          "outcome": "rejected",
                          "errors": {
                            "event_id": "event_id 'login-2026-10-16-000777' already exists with a different payload."
                          }
                        }
                      ]
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Der Batch selbst ist fehlerhaft: `events` fehlt, ist kein Array, ist leer oder enthält mehr als 500 Elemente. Es wird nichts gespeichert; teilen Sie große Batches auf.",
            "content": {
              "application/json": {
                "examples": {
                  "Not a list": {
                    "value": {
                      "events": "Expected a list of events."
                    }
                  },
                  "Empty": {
                    "value": {
                      "events": "At least one event is required."
                    }
                  },
                  "Too many": {
                    "value": {
                      "events": "A batch accepts at most 500 events; received 612."
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Der API-Schlüssel mit eingeschränktem Geltungsbereich ist abgelaufen. Nur ein abgelaufener Schlüssel erhält `401`; ein fehlender oder ungültiger Schlüssel erhält `403`.",
            "content": {
              "application/json": {
                "examples": {
                  "Expired key": {
                    "value": {
                      "detail": "This API key has expired."
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Ein fehlender `x-api-key` (ein falscher, widerrufener oder abgelaufener Schlüssel erhält `401`), ein berechtigungsbeschränkter Schlüssel ohne `transactions: write`, ein auf bestimmte Workflows oder genehmigte Sitzungen beschränkter Schlüssel (ein solcher Schlüssel erreicht Transaktionsüberwachungsdaten nie) oder eine Anfrage von außerhalb der IP-Allowlist des Schlüssels. Wird auch mit `code: event_monitoring_disabled` zurückgegeben, solange die Ereigniserfassung für die Anwendung deaktiviert ist; in diesem Fall wird nichts gespeichert, und die Prüfung erfolgt vor der Validierung des Bodys.",
            "content": {
              "application/json": {
                "examples": {
                  "Event monitoring disabled": {
                    "value": {
                      "detail": "Event monitoring is not enabled for this application. Turn on event ingestion in the transaction monitoring settings before submitting events.",
                      "code": "event_monitoring_disabled"
                    }
                  },
                  "Missing or invalid API key": {
                    "value": {
                      "detail": "You do not have permission to perform this action."
                    }
                  },
                  "Scoped key without access": {
                    "value": {
                      "detail": "This API key has no write access to transactions."
                    }
                  },
                  "Key limited to workflows or approved sessions": {
                    "value": {
                      "detail": "This API key only reaches sessions inside its workflow or status limits, so it can't use this endpoint."
                    }
                  },
                  "IP not allowed": {
                    "value": {
                      "detail": "This API key can't be used from this IP address."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate-Limit überschritten: Transaktionserstellungen und Ereignis-Ingestion (`POST /v3/transactions/`, `POST /v3/events/`, `POST /v3/events/batch/`) teilen sich ein Kontingent von 600 Anfragen pro Minute pro API-Schlüssel, getrennt von den 300, die sich alle anderen Schreibanfragen teilen. Warten Sie `Retry-After` Sekunden und versuchen Sie es dann erneut.",
            "headers": {
              "Retry-After": {
                "description": "Anzahl der Sekunden, die vor einem Wiederholungsversuch gewartet werden muss, aufgerundet, damit der Wiederholungsversuch im nächsten Zeitfenster liegt.",
                "schema": {
                  "type": "integer",
                  "minimum": 1,
                  "example": 30
                }
              }
            },
            "content": {
              "application/json": {
                "examples": {
                  "Throttled": {
                    "value": {
                      "detail": "Ingestion rate limit exceeded. You can make up to 600 requests per minute."
                    }
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/v3/events/sdk-token/": {
      "post": {
        "summary": "Monitoring-SDK-Token erstellen",
        "description": "Erstellen Sie ein kurzlebiges, an ein bestimmtes Subjekt gebundenes Geräte-Credential, damit Ihre Web- oder mobile App die Ereignisse dieses Benutzers ohne API-Schlüssel direkt an Didit senden kann. Die App sendet das zurückgegebene `monitoring_token` im Header `X-Monitoring-Token` an die Geräte-Lane (`POST /v1/events/` und `POST /v1/events/batch/`), wo das Subjekt stets mit diesem `vendor_data` überschrieben wird, Ereignisse außerhalb von `allowed_event_categories` abgelehnt werden, jedes übermittelte Ereignis eine Nutzung verbraucht und eine Anfrage verweigert wird, deren `Origin` nicht mit `bind_to_origin` übereinstimmt. Rufen Sie diesen Endpoint ausschließlich über Ihr Backend auf; das Erstellen erzeugt lediglich das Credential und sonst nichts (es wird kein Benutzer angelegt). Die Ereigniserfassung muss für die Anwendung aktiviert sein, andernfalls gibt dieser Endpoint `403` mit `code: event_monitoring_disabled` zurück, anstatt ein Credential zu erstellen, das niemals Schreibvorgänge ausführen könnte. Ein API-Schlüssel mit Gültigkeitsbereich benötigt `transactions: write`. Siehe [SDK-Ereignisübermittlung](https://docs.didit.me/de/transaction-monitoring/sdk-event-submission).",
        "operationId": "create_monitoring_event_sdk_token",
        "x-didit-sdk": {
          "resource": "monitoring_events",
          "method": "create_sdk_token",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Monitoring Events"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "description": "camelCase-Aliase werden akzeptiert: `vendorData`, `entityType`, `allowedEventCategories`, `ttlSeconds`, `maxUses`, `bindToOrigin`.",
                "required": [
                  "vendor_data"
                ],
                "properties": {
                  "vendor_data": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 255,
                    "description": "Ihre ID für das Subjekt, zu dem jedes mit diesem Berechtigungsnachweis übermittelte Ereignis gehört."
                  },
                  "entity_type": {
                    "type": "string",
                    "maxLength": 32,
                    "default": "individual",
                    "description": "`company` bindet ein Unternehmenssubjekt; jeder andere Wert (Standard `individual`) bindet eine Einzelperson."
                  },
                  "allowed_event_categories": {
                    "type": "array",
                    "items": {
                      "type": "string",
                      "enum": [
                        "auth",
                        "session",
                        "gameplay",
                        "bonus",
                        "affiliate",
                        "payment",
                        "dispute",
                        "security",
                        "responsible_gambling",
                        "custom"
                      ]
                    },
                    "description": "Kategorien, die der Berechtigungsnachweis übermitteln darf. Weglassen oder `[]` senden, um jede Kategorie zuzulassen."
                  },
                  "ttl_seconds": {
                    "type": "integer",
                    "minimum": 60,
                    "maximum": 86400,
                    "default": 900,
                    "description": "Gültigkeitsdauer der Anmeldedaten in Sekunden."
                  },
                  "max_uses": {
                    "type": "integer",
                    "minimum": 1,
                    "nullable": true,
                    "default": 1000,
                    "description": "Anzahl der Ereignisse, die die Anmeldedaten übermitteln dürfen (ein Batch verbraucht eine Nutzung pro Ereignis). Senden Sie `null` für keine Obergrenze innerhalb der Gültigkeitsdauer."
                  },
                  "bind_to_origin": {
                    "type": "string",
                    "maxLength": 255,
                    "nullable": true,
                    "description": "Wenn festgelegt, muss der Browser-`Origin`-Header jeder Geräteanfrage genau diesem Wert entsprechen; eine Anfrage ohne `Origin` wird abgewiesen."
                  }
                }
              },
              "example": {
                "vendor_data": "user-42",
                "allowed_event_categories": [
                  "auth",
                  "session",
                  "gameplay"
                ],
                "ttl_seconds": 900,
                "max_uses": 1000,
                "bind_to_origin": "https://app.example.com"
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X POST 'https://verification.didit.me/v3/events/sdk-token/' \\\n  -H 'x-api-key: YOUR_API_KEY' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\n    \"vendor_data\": \"user-42\",\n    \"allowed_event_categories\": [\"auth\", \"session\", \"gameplay\"],\n    \"ttl_seconds\": 900,\n    \"max_uses\": 1000,\n    \"bind_to_origin\": \"https://app.example.com\"\n  }'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.monitoring_events.create_sdk_token(\n    vendor_data=\"user-42\",\n    allowed_event_categories=[\"auth\", \"session\", \"gameplay\"],\n    ttl_seconds=900,\n    max_uses=1000,\n    bind_to_origin=\"https://app.example.com\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.monitoringEvents.createSdkToken({\n  vendor_data: \"user-42\",\n  allowed_event_categories: [\"auth\", \"session\", \"gameplay\"],\n  ttl_seconds: 900,\n  max_uses: 1000,\n  bind_to_origin: \"https://app.example.com\",\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.MonitoringEvents.CreateSDKToken(ctx, didit.MonitoringEventsCreateSDKTokenParams{\n\tVendorData:             \"user-42\",\n\tAllowedEventCategories: didit.Some([]didit.MonitoringEventsCreateSDKTokenParamsAllowedEventCategories{\"auth\", \"session\", \"gameplay\"}),\n\tTTLSeconds:             didit.Int(900),\n\tMaxUses:                didit.Int(1000),\n\tBindToOrigin:           didit.String(\"https://app.example.com\"),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import java.util.List;\nimport me.didit.Didit;\nimport me.didit.types.MonitoringEventsCreateSdkTokenParams;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.monitoringEvents().createSdkToken(MonitoringEventsCreateSdkTokenParams.builder()\n        .vendorData(\"user-42\")\n        .allowedEventCategories(List.of(MonitoringEventsCreateSdkTokenParams.AllowedEventCategories.of(\"auth\"), MonitoringEventsCreateSdkTokenParams.AllowedEventCategories.of(\"session\"), MonitoringEventsCreateSdkTokenParams.AllowedEventCategories.of(\"gameplay\")))\n        .ttlSeconds(900L)\n        .maxUses(1000L)\n        .bindToOrigin(\"https://app.example.com\")\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->monitoringEvents->createSdkToken([\n    'vendor_data' => 'user-42',\n    'allowed_event_categories' => ['auth', 'session', 'gameplay'],\n    'ttl_seconds' => 900,\n    'max_uses' => 1000,\n    'bind_to_origin' => 'https://app.example.com',\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.monitoring_events.create_sdk_token(\n  vendor_data: \"user-42\",\n  allowed_event_categories: [\"auth\", \"session\", \"gameplay\"],\n  ttl_seconds: 900,\n  max_uses: 1000,\n  bind_to_origin: \"https://app.example.com\"\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.MonitoringEvents.CreateSdkTokenAsync(new MonitoringEventsCreateSdkTokenParams\n{\n    VendorData = \"user-42\",\n    AllowedEventCategories = new MonitoringEventsCreateSdkTokenParamsAllowedEventCategories[] { \"auth\", \"session\", \"gameplay\" },\n    TtlSeconds = 900,\n    MaxUses = 1000,\n    BindToOrigin = \"https://app.example.com\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "responses": {
          "201": {
            "description": "Der Berechtigungsnachweis wurde ausgestellt. Übergeben Sie `monitoring_token` an die App und behandeln Sie ihn bis `expires_at` als Geheimnis.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "monitoring_token",
                    "expires_at",
                    "allowed_event_categories",
                    "max_uses",
                    "bind_to_origin"
                  ],
                  "properties": {
                    "monitoring_token": {
                      "type": "string",
                      "description": "Das Geräte-Credential (ein 43 Zeichen langes, URL-sicheres Token). Senden Sie es im `X-Monitoring-Token`-Header."
                    },
                    "expires_at": {
                      "type": "string",
                      "format": "date-time",
                      "description": "Wann die Zugangsdaten nicht mehr akzeptiert werden."
                    },
                    "allowed_event_categories": {
                      "type": "array",
                      "items": {
                        "type": "string",
                        "enum": [
                          "auth",
                          "session",
                          "gameplay",
                          "bonus",
                          "affiliate",
                          "payment",
                          "dispute",
                          "security",
                          "responsible_gambling",
                          "custom"
                        ]
                      },
                      "description": "Kategorien, die der Berechtigungsnachweis übermitteln darf; `[]` bedeutet jede Kategorie."
                    },
                    "max_uses": {
                      "type": "integer",
                      "nullable": true,
                      "description": "Ereignisbudget der Anmeldedaten; null bedeutet keine Begrenzung."
                    },
                    "bind_to_origin": {
                      "type": "string",
                      "nullable": true,
                      "description": "Origin, an den das Credential gebunden ist, oder null."
                    }
                  }
                },
                "example": {
                  "monitoring_token": "q7ZtR2xKp9VbN4mWc8LdH1sYfJ3gT6uEaQ0oPiXzBkC",
                  "expires_at": "2026-10-17T09:30:02.481000Z",
                  "allowed_event_categories": [
                    "auth",
                    "session",
                    "gameplay"
                  ],
                  "max_uses": 1000,
                  "bind_to_origin": "https://app.example.com"
                }
              }
            }
          },
          "400": {
            "description": "Validierung fehlgeschlagen: fehlende `vendor_data`, `ttl_seconds` außerhalb von 60 bis 86400, `max_uses` unter 1 oder eine unbekannte Kategorie (gekennzeichnet durch ihre Position im Array).",
            "content": {
              "application/json": {
                "examples": {
                  "Missing vendor_data": {
                    "value": {
                      "vendor_data": [
                        "This field is required."
                      ]
                    }
                  },
                  "ttl_seconds too short": {
                    "value": {
                      "ttl_seconds": [
                        "Ensure this value is greater than or equal to 60."
                      ]
                    }
                  },
                  "Unknown category": {
                    "value": {
                      "allowed_event_categories": {
                        "1": [
                          "\"login\" is not a valid choice."
                        ]
                      }
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Der API-Schlüssel mit eingeschränktem Geltungsbereich ist abgelaufen. Nur ein abgelaufener Schlüssel erhält `401`; ein fehlender oder ungültiger Schlüssel erhält `403`.",
            "content": {
              "application/json": {
                "examples": {
                  "Expired key": {
                    "value": {
                      "detail": "This API key has expired."
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Ein fehlender `x-api-key` (ein falscher, widerrufener oder abgelaufener Schlüssel erhält `401`), ein berechtigungsbeschränkter Schlüssel ohne `transactions: write`, ein auf bestimmte Workflows oder genehmigte Sitzungen beschränkter Schlüssel (ein solcher Schlüssel erreicht Transaktionsüberwachungsdaten nie) oder eine Anfrage von außerhalb der IP-Allowlist des Schlüssels. Wird auch mit `code: event_monitoring_disabled` zurückgegeben, solange die Ereigniserfassung für die Anwendung deaktiviert ist; in diesem Fall wird nichts gespeichert, und die Prüfung erfolgt vor der Validierung des Bodys.",
            "content": {
              "application/json": {
                "examples": {
                  "Event monitoring disabled": {
                    "value": {
                      "detail": "Event monitoring is not enabled for this application. Turn on event ingestion in the transaction monitoring settings before submitting events.",
                      "code": "event_monitoring_disabled"
                    }
                  },
                  "Missing or invalid API key": {
                    "value": {
                      "detail": "You do not have permission to perform this action."
                    }
                  },
                  "Scoped key without access": {
                    "value": {
                      "detail": "This API key has no write access to transactions."
                    }
                  },
                  "Key limited to workflows or approved sessions": {
                    "value": {
                      "detail": "This API key only reaches sessions inside its workflow or status limits, so it can't use this endpoint."
                    }
                  },
                  "IP not allowed": {
                    "value": {
                      "detail": "This API key can't be used from this IP address."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate-Limit überschritten: Schreibanfragen (`POST`, `PATCH`, `DELETE`) teilen sich ein Kontingent von 300 Anfragen pro Minute pro API-Schlüssel. Warten Sie `Retry-After` Sekunden und versuchen Sie es dann erneut.",
            "headers": {
              "Retry-After": {
                "description": "Sekunden, die vor einem Wiederholungsversuch gewartet werden müssen.",
                "schema": {
                  "type": "integer",
                  "minimum": 1,
                  "example": 30
                }
              }
            },
            "content": {
              "application/json": {
                "examples": {
                  "Throttled": {
                    "value": {
                      "detail": "Write request rate limit exceeded. You can make up to 300 requests per minute."
                    }
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/v3/events/{event_uuid}/": {
      "get": {
        "summary": "Überwachungsereignis abrufen",
        "description": "Rufen Sie ein Überwachungsereignis mit allen Daten ab, die die Liste zurückgibt, zuzüglich der Payload, benutzerdefinierten Werten, Gerätekontext, Feldherkunft (`field_sources`), den hochgestuften Domänenfeldern, `expires_at`, jedem übereinstimmenden Regellauf samt dessen Nachweisen, der IP-Anreicherung und den von Regeln zugewiesenen Tags. Solange `correlation_pending` `true` ist, muss eine asynchrone Regel noch ausgeführt werden; rufen Sie das Ereignis einige Minuten später erneut ab, um den endgültigen `status`, `score` und die `rule_runs` zu erhalten. Abrufe funktionieren unabhängig davon, ob die Ereigniserfassung aktiviert ist. Ein berechtigungsbeschränkter API-Schlüssel benötigt `transactions: read`. Siehe [Nachweise](https://docs.didit.me/de/transaction-monitoring/event-rules#belege) und [IP-Anreicherung](https://docs.didit.me/de/transaction-monitoring/ip-enrichment).",
        "operationId": "get_monitoring_event",
        "x-didit-sdk": {
          "resource": "monitoring_events",
          "method": "retrieve",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Monitoring Events"
        ],
        "parameters": [
          {
            "name": "event_uuid",
            "in": "path",
            "required": true,
            "description": "Didit-Kennung des Ereignisses (`event_uuid` aus der Create-, Batch-, List- oder Timeline-Antwort), nicht Ihre eigene `event_id`.",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "example": "11111111-2222-3333-4444-555555555555"
          }
        ],
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X GET 'https://verification.didit.me/v3/events/11111111-2222-3333-4444-555555555555/' \\\n  -H 'x-api-key: YOUR_API_KEY'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.monitoring_events.retrieve(\n    \"11111111-2222-3333-4444-555555555555\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.monitoringEvents.retrieve(\"11111111-2222-3333-4444-555555555555\");\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.MonitoringEvents.Retrieve(ctx, \"11111111-2222-3333-4444-555555555555\")\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.monitoringEvents().retrieve(\"11111111-2222-3333-4444-555555555555\");\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->monitoringEvents->retrieve('11111111-2222-3333-4444-555555555555');\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.monitoring_events.retrieve(\"11111111-2222-3333-4444-555555555555\")\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.MonitoringEvents.RetrieveAsync(\"11111111-2222-3333-4444-555555555555\");\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "responses": {
          "200": {
            "description": "Das Ereignis mit seinen Nachweisen.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MonitoringEventDetail"
                },
                "examples": {
                  "Login from a VPN, in review": {
                    "value": {
                      "event_uuid": "33333333-4444-5555-6666-777777777777",
                      "event_id": "login-2026-10-17-000001",
                      "event_category": "auth",
                      "action_type": "login",
                      "occurred_at": "2026-10-17T09:15:02.481000Z",
                      "received_at": "2026-10-17T09:15:02.903114Z",
                      "status": "IN_REVIEW",
                      "score": 40,
                      "subject_vendor_data": "user-42",
                      "subject_entity_type": "individual",
                      "subject_uuid": "66666666-7777-8888-9999-000000000000",
                      "counterparty_vendor_data": null,
                      "session_id": "web-session-abc",
                      "device_fingerprint": "fp-a8c1",
                      "ip_address": "203.0.113.42",
                      "ip_country": "ES",
                      "amount": null,
                      "currency": null,
                      "game_id": null,
                      "round_id": null,
                      "bonus_id": null,
                      "affiliate_code": null,
                      "payment_reference_id": null,
                      "retention_class": "risk_relevant",
                      "rules_matched_count": 1,
                      "correlation_pending": false,
                      "is_droppable": true,
                      "payload": {
                        "method": "password"
                      },
                      "custom_values": {
                        "vip_tier": "gold",
                        "vpn_or_proxy_detected": true
                      },
                      "device_context": {
                        "fingerprint": "fp-a8c1",
                        "network_context": {
                          "ip_address": "203.0.113.42",
                          "ip_country": "Spain",
                          "ip_country_code": "ES",
                          "ip_city": "Madrid",
                          "asn_number": 64500,
                          "asn_organization": "Example Networks",
                          "is_vpn_or_tor": true,
                          "is_data_center": false
                        }
                      },
                      "field_sources": {
                        "subject.vendor_data": "customer",
                        "event_category": "customer",
                        "action_type": "customer",
                        "occurred_at": "customer",
                        "received_at": "server",
                        "payload.method": "customer",
                        "session.session_id": "customer",
                        "session.sequence": "customer",
                        "device_context.fingerprint": "customer",
                        "device_context.network_context.ip_address": "customer",
                        "device_context.network_context.ip_country": "server",
                        "device_context.network_context.ip_country_code": "server",
                        "device_context.network_context.ip_city": "server",
                        "device_context.network_context.asn_number": "server",
                        "device_context.network_context.asn_organization": "server",
                        "device_context.network_context.is_vpn_or_tor": "server",
                        "device_context.network_context.is_data_center": "server"
                      },
                      "session_sequence": 142,
                      "table_id": null,
                      "hand_id": null,
                      "match_id": null,
                      "market_id": null,
                      "side": null,
                      "role": null,
                      "net_result_amount": null,
                      "payment_fingerprint": null,
                      "instrument_reference_hash": null,
                      "withdrawal_address_hash": null,
                      "dispute_id": null,
                      "chargeback_id": null,
                      "changed_field": null,
                      "identity_match_ref": null,
                      "schema_version": 1,
                      "expires_at": "2027-01-15T09:15:02.481000Z",
                      "rules_evaluated_count": 6,
                      "rule_runs": [
                        {
                          "rule_uuid": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee",
                          "rule_title": "Login from VPN or Tor",
                          "library_key": null,
                          "matched": true,
                          "mode": "ACTIVE",
                          "is_async": false,
                          "severity": "MEDIUM",
                          "score_delta": 40,
                          "action_summary": "score +40; add_tag:VPN_LOGIN",
                          "matched_payload": [
                            {
                              "field": "event.ip.is_vpn_or_tor",
                              "operator": "eq",
                              "expected_value": true,
                              "current_value": true,
                              "matched": true,
                              "group_index": null,
                              "group_logic": "AND",
                              "field_source": "server"
                            }
                          ],
                          "created_at": "2026-10-17T09:15:02.951207Z"
                        }
                      ],
                      "ip_enrichment": {
                        "ip_country_code": "ES",
                        "ip_city": "Madrid",
                        "asn_number": 64500,
                        "asn_organization": "Example Networks",
                        "is_vpn_or_tor": true,
                        "is_data_center": false,
                        "proxy_type": null,
                        "last_enriched_at": "2026-10-17T09:15:02.910442Z"
                      },
                      "subject_profile": null,
                      "tags": [
                        "VPN_LOGIN"
                      ]
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Der API-Schlüssel mit eingeschränktem Geltungsbereich ist abgelaufen. Nur ein abgelaufener Schlüssel erhält `401`; ein fehlender oder ungültiger Schlüssel erhält `403`.",
            "content": {
              "application/json": {
                "examples": {
                  "Expired key": {
                    "value": {
                      "detail": "This API key has expired."
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Ein fehlender `x-api-key` (ein falscher, widerrufener oder abgelaufener Schlüssel erhält `401`), ein berechtigungsbeschränkter Schlüssel ohne `transactions: read`, ein auf bestimmte Workflows oder genehmigte Sitzungen beschränkter Schlüssel (ein solcher Schlüssel erreicht Transaktionsüberwachungsdaten nie) oder eine Anfrage von außerhalb der IP-Allowlist des Schlüssels.",
            "content": {
              "application/json": {
                "examples": {
                  "Missing or invalid API key": {
                    "value": {
                      "detail": "You do not have permission to perform this action."
                    }
                  },
                  "Scoped key without access": {
                    "value": {
                      "detail": "This API key has no read access to transactions."
                    }
                  },
                  "Key limited to workflows or approved sessions": {
                    "value": {
                      "detail": "This API key only reaches sessions inside its workflow or status limits, so it can't use this endpoint."
                    }
                  },
                  "IP not allowed": {
                    "value": {
                      "detail": "This API key can't be used from this IP address."
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "In der Anwendung existiert kein Ereignis mit dieser `event_uuid`: Es wurde nie gespeichert, es wurde gelöscht oder es gehört zu einer anderen Anwendung. Ein Pfadsegment, das keine UUID ist, stimmt nicht mit der Route überein und gibt ebenfalls `404` zurück.",
            "content": {
              "application/json": {
                "examples": {
                  "Not found": {
                    "value": {
                      "detail": "No MonitoringEvent matches the given query."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate-Limit überschritten: `GET`-Anfragen teilen sich ein Kontingent von 600 Anfragen pro Minute pro API-Schlüssel. Warten Sie `Retry-After` Sekunden und versuchen Sie es dann erneut.",
            "headers": {
              "Retry-After": {
                "description": "Sekunden, die vor einem Wiederholungsversuch gewartet werden müssen.",
                "schema": {
                  "type": "integer",
                  "minimum": 1,
                  "example": 30
                }
              }
            },
            "content": {
              "application/json": {
                "examples": {
                  "Throttled": {
                    "value": {
                      "detail": "GET request rate limit exceeded. You can make up to 600 requests per minute."
                    }
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/v3/events/subjects/{vendor_data}/": {
      "get": {
        "summary": "Ereignis-Timeline des Subjekts abrufen",
        "description": "Jedes Überwachungsereignis eines Subjekts auflisten, neuestes `occurred_at` zuerst. Ein `vendor_data`-Wert ist nur innerhalb eines Entitätstyps eindeutig, daher kann dieselbe ID eine Einzelperson und ein Unternehmen bezeichnen: `entity_type` wählt die Zeitleiste aus und ist standardmäßig auf `individual` gesetzt, sodass für Ereignisse eines Unternehmens `entity_type=company` erforderlich ist. Die Filter von `GET /v3/events/` greifen zusätzlich, und ein `vendor_data`-Wert ohne Ereignisse gibt eine leere Seite statt `404` zurück. Ein berechtigungsbeschränkter API-Schlüssel erfordert `transactions: read`. Siehe [Ereignisse abrufen](https://docs.didit.me/de/transaction-monitoring/events#ereignisse-auslesen).",
        "operationId": "get_monitoring_event_subject_timeline",
        "x-didit-sdk": {
          "resource": "monitoring_events",
          "method": "retrieve_subject_timeline",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Monitoring Events"
        ],
        "parameters": [
          {
            "name": "vendor_data",
            "in": "path",
            "required": true,
            "description": "Ihre ID für das Subjekt (`subject.vendor_data` seiner Ereignisse). URL-kodieren Sie sie; ein Wert, der `/` enthält, kann von diesem Endpoint nicht adressiert werden.",
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 255
            },
            "example": "user-42"
          },
          {
            "name": "entity_type",
            "in": "query",
            "required": false,
            "description": "`company` gibt das Unternehmen mit diesen `vendor_data` zurück; jeder andere Wert oder kein Wert gibt die Einzelperson zurück. `subject_entity_type` wird als Alias akzeptiert, wenn `entity_type` fehlt.",
            "schema": {
              "type": "string",
              "enum": [
                "individual",
                "company"
              ],
              "default": "individual"
            },
            "example": "individual"
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Maximale Anzahl an Ereignissen pro Seite. Standardmäßig 50. Werte über 1000000 geben `400` zurück; ein nicht-numerischer, Null- oder negativer Wert fällt auf 50 zurück.",
            "schema": {
              "type": "integer",
              "default": 50,
              "minimum": 1,
              "maximum": 1000000
            },
            "example": 50
          },
          {
            "name": "offset",
            "in": "query",
            "required": false,
            "description": "Anzahl der zu überspringenden Ereignisse. Standardmäßig 0. Bevorzugen Sie das Folgen der `next`-URL aus der Antwort.",
            "schema": {
              "type": "integer",
              "default": 0,
              "minimum": 0,
              "maximum": 1000000
            },
            "example": 0
          },
          {
            "name": "event_category",
            "in": "query",
            "required": false,
            "description": "Nur Ereignisse in diesen Kategorien. Wiederholen Sie den Parameter für mehrere Werte (`?event_category=payment&event_category=dispute`); ein Ereignis, das auf einen davon zutrifft, wird zurückgegeben.",
            "style": "form",
            "explode": true,
            "schema": {
              "type": "array",
              "items": {
                "type": "string",
                "enum": [
                  "auth",
                  "session",
                  "gameplay",
                  "bonus",
                  "affiliate",
                  "payment",
                  "dispute",
                  "security",
                  "responsible_gambling",
                  "custom"
                ]
              }
            },
            "example": [
              "payment",
              "dispute"
            ]
          },
          {
            "name": "action_type",
            "in": "query",
            "required": false,
            "description": "Nur Ereignisse mit diesen Aktionstypen (exakt, unter Berücksichtigung der Groß-/Kleinschreibung). Für mehrere Werte wiederholen.",
            "style": "form",
            "explode": true,
            "schema": {
              "type": "array",
              "items": {
                "type": "string"
              }
            },
            "example": [
              "deposit_completed",
              "chargeback_opened"
            ]
          },
          {
            "name": "status",
            "in": "query",
            "required": false,
            "description": "Nur Ereignisse mit diesen Status. Für mehrere Werte wiederholen.",
            "style": "form",
            "explode": true,
            "schema": {
              "type": "array",
              "items": {
                "type": "string",
                "enum": [
                  "ACCEPTED",
                  "APPROVED",
                  "IN_REVIEW",
                  "DECLINED"
                ]
              }
            },
            "example": [
              "IN_REVIEW",
              "DECLINED"
            ]
          },
          {
            "name": "retention_class",
            "in": "query",
            "required": false,
            "description": "Nur Ereignisse in diesen Aufbewahrungsklassen. Für mehrere Werte wiederholen.",
            "style": "form",
            "explode": true,
            "schema": {
              "type": "array",
              "items": {
                "type": "string",
                "enum": [
                  "low_value",
                  "standard",
                  "risk_relevant",
                  "monetary_or_compliance"
                ]
              }
            },
            "example": [
              "risk_relevant"
            ]
          },
          {
            "name": "business_vendor_data",
            "in": "query",
            "required": false,
            "description": "Exakte Übereinstimmung mit den mit dem Ereignis gesendeten `business.vendor_data`.",
            "schema": {
              "type": "string"
            },
            "example": "merchant-7"
          },
          {
            "name": "session_id",
            "in": "query",
            "required": false,
            "description": "Exakte Übereinstimmung mit `session.session_id`.",
            "schema": {
              "type": "string"
            },
            "example": "web-session-abc"
          },
          {
            "name": "device_fingerprint",
            "in": "query",
            "required": false,
            "description": "Exakte Übereinstimmung mit `device_context.fingerprint`.",
            "schema": {
              "type": "string"
            },
            "example": "fp-a8c1"
          },
          {
            "name": "ip_address",
            "in": "query",
            "required": false,
            "description": "Exakte Übereinstimmung mit der IP-Adresse des Ereignisses.",
            "schema": {
              "type": "string"
            },
            "example": "203.0.113.42"
          },
          {
            "name": "game_id",
            "in": "query",
            "required": false,
            "description": "Exakte Übereinstimmung mit der promoteten `game_id`.",
            "schema": {
              "type": "string"
            },
            "example": "poker-holdem-01"
          },
          {
            "name": "round_id",
            "in": "query",
            "required": false,
            "description": "Exakte Übereinstimmung mit der promoteten `round_id`.",
            "schema": {
              "type": "string"
            },
            "example": "round-88231"
          },
          {
            "name": "affiliate_code",
            "in": "query",
            "required": false,
            "description": "Exakte Übereinstimmung mit dem promoteten `affiliate_code`.",
            "schema": {
              "type": "string"
            },
            "example": "aff-summer"
          },
          {
            "name": "payment_reference_id",
            "in": "query",
            "required": false,
            "description": "Exakte Übereinstimmung mit der Zahlungsreferenz (aus `transaction_context.payment_reference_id` oder `payload.payment_reference_id`).",
            "schema": {
              "type": "string"
            },
            "example": "dep_735"
          },
          {
            "name": "counterparty_vendor_data",
            "in": "query",
            "required": false,
            "description": "Exakte Übereinstimmung mit den promoteten `counterparty_vendor_data`.",
            "schema": {
              "type": "string"
            },
            "example": "user-77"
          },
          {
            "name": "matched_only",
            "in": "query",
            "required": false,
            "description": "`true` (auch `1` oder `yes`, ohne Berücksichtigung der Groß-/Kleinschreibung) gibt nur Ereignisse zurück, bei denen mindestens eine Regel gegriffen hat (`rules_matched_count` größer als 0). Jeder andere Wert wird ignoriert.",
            "schema": {
              "type": "boolean",
              "default": false
            },
            "example": true
          },
          {
            "name": "occurred_from",
            "in": "query",
            "required": false,
            "description": "Nur Ereignisse mit `occurred_at` an oder nach diesem Zeitpunkt (einschließlich). Senden Sie einen ISO-8601-Wert: `2026-10-01T00:00:00Z`, einen expliziten Offset mit prozentkodiertem `+` (`2026-10-01T02:00:00%2B02:00`; ein unkodiertes `+` wird als Leerzeichen dekodiert und der Wert kann nicht mehr geparst werden) oder nur ein Datum (`2026-10-01`), was 00:00:00 UTC dieses Tages entspricht. Ein Wert ohne Offset wird als UTC interpretiert. Werte in einem anderen Format werden nicht akzeptiert.",
            "schema": {
              "type": "string",
              "format": "date-time"
            },
            "example": "2026-10-01T00:00:00Z"
          },
          {
            "name": "occurred_to",
            "in": "query",
            "required": false,
            "description": "Nur Ereignisse mit `occurred_at` an oder vor diesem Zeitpunkt (einschließlich). Ein reines Datum bedeutet den Beginn dieses Tages, daher schließt `occurred_to=2026-10-15` den Rest des 15. Oktobers aus; senden Sie `2026-10-15T23:59:59Z`, um ihn einzuschließen. Senden Sie einen ISO-8601-Wert: `2026-10-01T00:00:00Z`, einen expliziten Offset mit prozentkodiertem `+` (`2026-10-01T02:00:00%2B02:00`; ein unkodiertes `+` wird als Leerzeichen dekodiert und der Wert kann nicht mehr geparst werden) oder nur ein Datum (`2026-10-01`), was 00:00:00 UTC dieses Tages entspricht. Ein Wert ohne Offset wird als UTC interpretiert. Werte in einem anderen Format werden nicht akzeptiert.",
            "schema": {
              "type": "string",
              "format": "date-time"
            },
            "example": "2026-10-17T23:59:59Z"
          },
          {
            "name": "search",
            "in": "query",
            "required": false,
            "description": "Teilstring-Übereinstimmung ohne Berücksichtigung von Groß-/Kleinschreibung auf `event_id`, `action_type`, `subject_vendor_data` oder `counterparty_vendor_data`.",
            "schema": {
              "type": "string"
            },
            "example": "chargeback"
          }
        ],
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X GET 'https://verification.didit.me/v3/events/subjects/user-42/?entity_type=individual&limit=50' \\\n  -H 'x-api-key: YOUR_API_KEY'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nfor item in client.monitoring_events.retrieve_subject_timeline(\n    \"user-42\",\n):\n    print(item)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nfor await (const item of didit.monitoringEvents.retrieveSubjectTimeline(\"user-42\")) {\n  console.log(item);\n}"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\niter := client.MonitoringEvents.RetrieveSubjectTimelineAutoPaging(ctx, \"user-42\", didit.MonitoringEventsRetrieveSubjectTimelineParams{})\nfor iter.Next() {\n\tfmt.Printf(\"%+v\\n\", iter.Current())\n}\nif err := iter.Err(); err != nil {\n\tlog.Fatal(err)\n}"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nfor (var item : client.monitoringEvents().retrieveSubjectTimeline(\"user-42\")) {\n    System.out.println(item);\n}"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\nforeach ($didit->monitoringEvents->retrieveSubjectTimeline('user-42') as $item) {\n    print_r($item->toArray());\n}"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\ndidit.monitoring_events.retrieve_subject_timeline(\"user-42\").auto_paging_each do |item|\n  puts item.to_h\nend"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nawait foreach (var item in await client.MonitoringEvents.RetrieveSubjectTimelineAsync(\"user-42\"))\n{\n    Console.WriteLine(JsonSerializer.Serialize(item));\n}"
          }
        ],
        "responses": {
          "200": {
            "description": "Eine Seite mit den Ereignissen des Subjekts.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MonitoringEventPage"
                },
                "examples": {
                  "Individual timeline": {
                    "value": {
                      "count": 2,
                      "next": null,
                      "previous": null,
                      "results": [
                        {
                          "event_uuid": "11111111-2222-3333-4444-555555555555",
                          "event_id": "chargeback-2026-10-16-000318",
                          "event_category": "dispute",
                          "action_type": "chargeback_opened",
                          "occurred_at": "2026-10-16T14:02:11Z",
                          "received_at": "2026-10-16T14:02:12.418230Z",
                          "status": "IN_REVIEW",
                          "score": 60,
                          "subject_vendor_data": "user-42",
                          "subject_entity_type": "individual",
                          "subject_uuid": "66666666-7777-8888-9999-000000000000",
                          "counterparty_vendor_data": null,
                          "session_id": null,
                          "device_fingerprint": null,
                          "ip_address": null,
                          "ip_country": null,
                          "amount": "250.000000000000000000",
                          "currency": "EUR",
                          "game_id": null,
                          "round_id": null,
                          "bonus_id": null,
                          "affiliate_code": null,
                          "payment_reference_id": "dep_735",
                          "retention_class": "monetary_or_compliance",
                          "rules_matched_count": 1,
                          "correlation_pending": false,
                          "is_droppable": false
                        },
                        {
                          "event_uuid": "22222222-3333-4444-5555-666666666666",
                          "event_id": "login-2026-10-15-000912",
                          "event_category": "auth",
                          "action_type": "login",
                          "occurred_at": "2026-10-15T08:30:00.120000Z",
                          "received_at": "2026-10-15T08:30:00.734512Z",
                          "status": "ACCEPTED",
                          "score": 0,
                          "subject_vendor_data": "user-42",
                          "subject_entity_type": "individual",
                          "subject_uuid": "66666666-7777-8888-9999-000000000000",
                          "counterparty_vendor_data": null,
                          "session_id": "web-session-abc",
                          "device_fingerprint": "fp-a8c1",
                          "ip_address": "203.0.113.42",
                          "ip_country": "ES",
                          "amount": null,
                          "currency": null,
                          "game_id": null,
                          "round_id": null,
                          "bonus_id": null,
                          "affiliate_code": null,
                          "payment_reference_id": null,
                          "retention_class": "standard",
                          "rules_matched_count": 0,
                          "correlation_pending": false,
                          "is_droppable": true
                        }
                      ]
                    }
                  },
                  "No events": {
                    "value": {
                      "count": 0,
                      "next": null,
                      "previous": null,
                      "results": []
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "`limit` oder `offset` ist größer als 1000000. Der Body ist ein JSON-Array mit einer Nachricht. Ein nicht-numerischer oder nicht-positiver `limit`-Wert fällt auf den Standardwert von 50 zurück, anstatt fehlzuschlagen.",
            "content": {
              "application/json": {
                "examples": {
                  "limit too large": {
                    "summary": "limit über 1000000",
                    "value": [
                      "limit must not exceed 1000000."
                    ]
                  },
                  "offset too large": {
                    "summary": "offset über 1000000",
                    "value": [
                      "offset must not exceed 1000000."
                    ]
                  }
                }
              }
            }
          },
          "401": {
            "description": "Der API-Schlüssel mit eingeschränktem Geltungsbereich ist abgelaufen. Nur ein abgelaufener Schlüssel erhält `401`; ein fehlender oder ungültiger Schlüssel erhält `403`.",
            "content": {
              "application/json": {
                "examples": {
                  "Expired key": {
                    "value": {
                      "detail": "This API key has expired."
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Ein fehlender `x-api-key` (ein falscher, widerrufener oder abgelaufener Schlüssel erhält `401`), ein berechtigungsbeschränkter Schlüssel ohne `transactions: read`, ein auf bestimmte Workflows oder genehmigte Sitzungen beschränkter Schlüssel (ein solcher Schlüssel erreicht Transaktionsüberwachungsdaten nie) oder eine Anfrage von außerhalb der IP-Allowlist des Schlüssels.",
            "content": {
              "application/json": {
                "examples": {
                  "Missing or invalid API key": {
                    "value": {
                      "detail": "You do not have permission to perform this action."
                    }
                  },
                  "Scoped key without access": {
                    "value": {
                      "detail": "This API key has no read access to transactions."
                    }
                  },
                  "Key limited to workflows or approved sessions": {
                    "value": {
                      "detail": "This API key only reaches sessions inside its workflow or status limits, so it can't use this endpoint."
                    }
                  },
                  "IP not allowed": {
                    "value": {
                      "detail": "This API key can't be used from this IP address."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate-Limit überschritten: `GET`-Anfragen teilen sich ein Kontingent von 600 Anfragen pro Minute pro API-Schlüssel. Warten Sie `Retry-After` Sekunden und versuchen Sie es dann erneut.",
            "headers": {
              "Retry-After": {
                "description": "Sekunden, die vor einem Wiederholungsversuch gewartet werden müssen.",
                "schema": {
                  "type": "integer",
                  "minimum": 1,
                  "example": 30
                }
              }
            },
            "content": {
              "application/json": {
                "examples": {
                  "Throttled": {
                    "value": {
                      "detail": "GET request rate limit exceeded. You can make up to 600 requests per minute."
                    }
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/v3/events/enrichment-metrics/": {
      "get": {
        "summary": "Metriken zur Ereignisanreicherung abrufen",
        "description": "Gibt die Zähler für Ereignis-Ingestion und IP-Anreicherung Ihrer Anwendung für einen Zeitraum zurück, summiert über alle Verarbeitungskanäle (Server, Batch und Gerät), damit Sie das Ereignisvolumen überwachen und bestätigen können, dass die Anreicherung einmal pro eindeutiger Adresse und nicht einmal pro Ereignis aufgelöst wird. Der Zeitraum umfasst den heutigen Tag plus die vorherigen `days` Tage, gezählt nach UTC-Kalenderdatum. Die drei Verhältnisse sind null, wenn ihr Nenner null ist. Ein API-Schlüssel mit eingeschränktem Geltungsbereich benötigt `transactions: read`. Siehe [IP-Anreicherung](https://docs.didit.me/de/transaction-monitoring/events#ip-anreicherung).",
        "operationId": "get_monitoring_event_enrichment_metrics",
        "x-didit-sdk": {
          "resource": "monitoring_events",
          "method": "retrieve_enrichment_metrics",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Monitoring Events"
        ],
        "parameters": [
          {
            "name": "days",
            "in": "query",
            "required": false,
            "description": "Länge des Zeitraums in Tagen. Standardmäßig 30; Werte werden auf 1 bis 365 begrenzt, und ein nicht-ganzzahliger Wert fällt auf 30 zurück. Der angewendete Wert wird als `period_days` zurückgegeben.",
            "schema": {
              "type": "integer",
              "default": 30,
              "minimum": 1,
              "maximum": 365
            },
            "example": 30
          }
        ],
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X GET 'https://verification.didit.me/v3/events/enrichment-metrics/?days=30' \\\n  -H 'x-api-key: YOUR_API_KEY'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.monitoring_events.retrieve_enrichment_metrics()\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.monitoringEvents.retrieveEnrichmentMetrics();\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.MonitoringEvents.RetrieveEnrichmentMetrics(ctx, didit.MonitoringEventsRetrieveEnrichmentMetricsParams{})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.monitoringEvents().retrieveEnrichmentMetrics();\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->monitoringEvents->retrieveEnrichmentMetrics();\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.monitoring_events.retrieve_enrichment_metrics\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.MonitoringEvents.RetrieveEnrichmentMetricsAsync();\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "responses": {
          "200": {
            "description": "Zähler und Verhältnisse für den Zeitraum.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "events_ingested",
                    "events_rejected",
                    "enrichment_lookups",
                    "enrichment_cache_hits",
                    "enrichment_provider_calls",
                    "enrichment_skipped_low_value",
                    "unique_ips_seen",
                    "period_days",
                    "cache_hit_rate",
                    "unique_ip_ratio",
                    "provider_calls_per_1k_events"
                  ],
                  "properties": {
                    "events_ingested": {
                      "type": "integer",
                      "description": "Neue Ereignisse gespeichert. Idempotente Wiederholungen werden nicht gezählt."
                    },
                    "events_rejected": {
                      "type": "integer",
                      "description": "In Batch-Anfragen abgelehnte Elemente (Server- und Gerätepfade). Eine abgelehnte Einzelereignis-Anfrage wird nicht gezählt."
                    },
                    "enrichment_lookups": {
                      "type": "integer",
                      "description": "Ereignisse, deren öffentliche IP-Adresse aufgelöst wurde, aus dem Cache oder gerade erst aufgelöst."
                    },
                    "enrichment_cache_hits": {
                      "type": "integer",
                      "description": "Abfragen, die aus dem Cache beantwortet wurden."
                    },
                    "enrichment_provider_calls": {
                      "type": "integer",
                      "description": "Abfragen, die eine neue Auflösung der Adresse erforderten."
                    },
                    "enrichment_skipped_low_value": {
                      "type": "integer",
                      "description": "Telemetrie-Ereignisse mit geringem Wert, deren Adresse noch nicht bekannt war. Sie lösen niemals von sich aus eine neue Auflösung aus."
                    },
                    "unique_ips_seen": {
                      "type": "integer",
                      "description": "Adressen, die eine erneute Auflösung erforderten."
                    },
                    "period_days": {
                      "type": "integer",
                      "description": "Der nach der Begrenzung angewendete `days`-Wert."
                    },
                    "cache_hit_rate": {
                      "type": "number",
                      "nullable": true,
                      "description": "`enrichment_cache_hits / enrichment_lookups`, auf 4 Dezimalstellen gerundet. Null, wenn keine Abfragen stattgefunden haben."
                    },
                    "unique_ip_ratio": {
                      "type": "number",
                      "nullable": true,
                      "description": "`unique_ips_seen / events_ingested`, auf 4 Dezimalstellen gerundet. Null, wenn keine Ereignisse erfasst wurden."
                    },
                    "provider_calls_per_1k_events": {
                      "type": "number",
                      "nullable": true,
                      "description": "Neue Auflösungen pro 1000 erfasste Ereignisse, gerundet auf 2 Dezimalstellen. Null, wenn keine Ereignisse erfasst wurden."
                    }
                  }
                },
                "examples": {
                  "Last 30 days": {
                    "value": {
                      "events_ingested": 128450,
                      "events_rejected": 214,
                      "enrichment_lookups": 41230,
                      "enrichment_cache_hits": 40118,
                      "enrichment_provider_calls": 1112,
                      "enrichment_skipped_low_value": 74320,
                      "unique_ips_seen": 1112,
                      "period_days": 30,
                      "cache_hit_rate": 0.973,
                      "unique_ip_ratio": 0.0087,
                      "provider_calls_per_1k_events": 8.66
                    }
                  },
                  "No events yet": {
                    "value": {
                      "events_ingested": 0,
                      "events_rejected": 0,
                      "enrichment_lookups": 0,
                      "enrichment_cache_hits": 0,
                      "enrichment_provider_calls": 0,
                      "enrichment_skipped_low_value": 0,
                      "unique_ips_seen": 0,
                      "period_days": 30,
                      "cache_hit_rate": null,
                      "unique_ip_ratio": null,
                      "provider_calls_per_1k_events": null
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Der API-Schlüssel mit eingeschränktem Geltungsbereich ist abgelaufen. Nur ein abgelaufener Schlüssel erhält `401`; ein fehlender oder ungültiger Schlüssel erhält `403`.",
            "content": {
              "application/json": {
                "examples": {
                  "Expired key": {
                    "value": {
                      "detail": "This API key has expired."
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Ein fehlender `x-api-key` (ein falscher, widerrufener oder abgelaufener Schlüssel erhält `401`), ein berechtigungsbeschränkter Schlüssel ohne `transactions: read`, ein auf bestimmte Workflows oder genehmigte Sitzungen beschränkter Schlüssel (ein solcher Schlüssel erreicht Transaktionsüberwachungsdaten nie) oder eine Anfrage von außerhalb der IP-Allowlist des Schlüssels.",
            "content": {
              "application/json": {
                "examples": {
                  "Missing or invalid API key": {
                    "value": {
                      "detail": "You do not have permission to perform this action."
                    }
                  },
                  "Scoped key without access": {
                    "value": {
                      "detail": "This API key has no read access to transactions."
                    }
                  },
                  "Key limited to workflows or approved sessions": {
                    "value": {
                      "detail": "This API key only reaches sessions inside its workflow or status limits, so it can't use this endpoint."
                    }
                  },
                  "IP not allowed": {
                    "value": {
                      "detail": "This API key can't be used from this IP address."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate-Limit überschritten: `GET`-Anfragen teilen sich ein Kontingent von 600 Anfragen pro Minute pro API-Schlüssel. Warten Sie `Retry-After` Sekunden und versuchen Sie es dann erneut.",
            "headers": {
              "Retry-After": {
                "description": "Sekunden, die vor einem Wiederholungsversuch gewartet werden müssen.",
                "schema": {
                  "type": "integer",
                  "minimum": 1,
                  "example": 30
                }
              }
            },
            "content": {
              "application/json": {
                "examples": {
                  "Throttled": {
                    "value": {
                      "detail": "GET request rate limit exceeded. You can make up to 600 requests per minute."
                    }
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/v3/events/{event_uuid}/delete/": {
      "delete": {
        "summary": "Monitoring-Ereignis löschen",
        "description": "Ein Überwachungsereignis zusammen mit seinen Regelläufen, Notizen und Tag-Verknüpfungen dauerhaft löschen, beispielsweise ein versehentlich gesendetes Ereignis. Nach dem `204` ist das Ereignis bei jedem Lesevorgang nicht mehr vorhanden (Abrufen gibt `404` zurück und es erscheint nicht mehr in der Liste oder der Betreff-Timeline), die Löschung ist unwiderruflich und seine `event_id` kann wieder für ein neues Ereignis verwendet werden. Nicht betroffen: der Benutzer oder das Unternehmen, dem das Ereignis zugeordnet war, von einer Regel eröffnete Fälle, von einer Regel hinzugefügte Listeneinträge sowie die bereits auf andere Ereignisse angewendeten Scores und Status. Um alle Daten zu einer Person oder einem Unternehmen zu löschen, löschen Sie stattdessen den Benutzer oder das Unternehmen, wodurch auch deren Ereignisse gelöscht werden. Ein API-Schlüssel mit Scopes erfordert `transactions: write`.",
        "operationId": "delete_monitoring_event",
        "x-didit-sdk": {
          "resource": "monitoring_events",
          "method": "delete",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Monitoring Events"
        ],
        "parameters": [
          {
            "name": "event_uuid",
            "in": "path",
            "required": true,
            "description": "Didit-Kennung des Ereignisses (`event_uuid` aus der Create-, Batch-, List- oder Timeline-Antwort), nicht Ihre eigene `event_id`.",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "example": "11111111-2222-3333-4444-555555555555"
          }
        ],
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X DELETE 'https://verification.didit.me/v3/events/11111111-2222-3333-4444-555555555555/delete/' \\\n  -H 'x-api-key: YOUR_API_KEY'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nclient.monitoring_events.delete(\n    \"11111111-2222-3333-4444-555555555555\",\n)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nawait didit.monitoringEvents.delete(\"11111111-2222-3333-4444-555555555555\");"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nif err := client.MonitoringEvents.Delete(ctx, \"11111111-2222-3333-4444-555555555555\"); err != nil {\n\tlog.Fatal(err)\n}"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nclient.monitoringEvents().delete(\"11111111-2222-3333-4444-555555555555\");"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$didit->monitoringEvents->delete('11111111-2222-3333-4444-555555555555');"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\ndidit.monitoring_events.delete(\"11111111-2222-3333-4444-555555555555\")"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nawait client.MonitoringEvents.DeleteAsync(\"11111111-2222-3333-4444-555555555555\");"
          }
        ],
        "responses": {
          "204": {
            "description": "Das Ereignis wurde gelöscht. Kein Inhalt."
          },
          "401": {
            "description": "Der API-Schlüssel mit eingeschränktem Geltungsbereich ist abgelaufen. Nur ein abgelaufener Schlüssel erhält `401`; ein fehlender oder ungültiger Schlüssel erhält `403`.",
            "content": {
              "application/json": {
                "examples": {
                  "Expired key": {
                    "value": {
                      "detail": "This API key has expired."
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Ein fehlender `x-api-key` (ein falscher, widerrufener oder abgelaufener Schlüssel erhält `401`), ein berechtigungsbeschränkter Schlüssel ohne `transactions: write`, ein auf bestimmte Workflows oder genehmigte Sitzungen beschränkter Schlüssel (ein solcher Schlüssel erreicht Transaktionsüberwachungsdaten nie) oder eine Anfrage von außerhalb der IP-Allowlist des Schlüssels.",
            "content": {
              "application/json": {
                "examples": {
                  "Missing or invalid API key": {
                    "value": {
                      "detail": "You do not have permission to perform this action."
                    }
                  },
                  "Scoped key without access": {
                    "value": {
                      "detail": "This API key has no write access to transactions."
                    }
                  },
                  "Key limited to workflows or approved sessions": {
                    "value": {
                      "detail": "This API key only reaches sessions inside its workflow or status limits, so it can't use this endpoint."
                    }
                  },
                  "IP not allowed": {
                    "value": {
                      "detail": "This API key can't be used from this IP address."
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "In der Anwendung existiert kein Ereignis mit dieser `event_uuid`: Es wurde nie gespeichert, es wurde gelöscht oder es gehört zu einer anderen Anwendung. Ein Pfadsegment, das keine UUID ist, stimmt nicht mit der Route überein und gibt ebenfalls `404` zurück.",
            "content": {
              "application/json": {
                "examples": {
                  "Not found": {
                    "value": {
                      "detail": "No MonitoringEvent matches the given query."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate-Limit überschritten: Schreibanfragen (`POST`, `PATCH`, `DELETE`) teilen sich ein Kontingent von 300 Anfragen pro Minute pro API-Schlüssel. Warten Sie `Retry-After` Sekunden und versuchen Sie es dann erneut.",
            "headers": {
              "Retry-After": {
                "description": "Sekunden, die vor einem Wiederholungsversuch gewartet werden müssen.",
                "schema": {
                  "type": "integer",
                  "minimum": 1,
                  "example": 30
                }
              }
            },
            "content": {
              "application/json": {
                "examples": {
                  "Throttled": {
                    "value": {
                      "detail": "Write request rate limit exceeded. You can make up to 300 requests per minute."
                    }
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/v3/session/{sessionId}/kyb/parties/{partyUuid}/regenerate/": {
      "post": {
        "summary": "KYC-Sitzung einer Schlüsselperson (Key People) neu generieren",
        "description": "Erstellen Sie für eine Schlüsselpersonen-Partei einer Unternehmensverifizierungs-Sitzung (KYB) eine neue individuelle KYC-Sitzung, nachdem deren vorherige gelöscht wurde oder abgelaufen ist, bevor die Person sie gestartet hat, damit die Schlüsselpersonen-Prüfung erneut abgeschlossen werden kann; senden Sie keinen Anfrage-Body. Dies funktioniert, wenn die KYC-Sitzung der Partei gelöscht wurde (`kyc_session_deleted: true`) oder abgelaufen ist, bevor die Person sie gestartet hat (`Expired`, nie gestartet). Eine noch laufende Sitzung oder eine, die in einem anderen Status geendet hat (`Approved`, `Declined`, `In Review`, `Abandoned`, ...), gibt `409` zurück, es sei denn, sie wurde gelöscht. Eine Partei, die nie eine Sitzung hatte, oder eine Unternehmenspartei gibt immer `409` zurück. Didit erstellt eine neue gehostete KYC-Sitzung mit dem Workflow, mit dem die Partei verifiziert wurde (seine neueste veröffentlichte Version), oder, wenn dieser nicht mehr bekannt ist, mit dem Workflow, den Ihre Schlüsselpersonen-Einstellungen der Rolle der Partei zuweisen, sodass der Link für die Dauer der Sitzungsablaufzeit dieses KYC-Workflows gültig ist; Didit sendet den Link per E-Mail an die Partei, wenn eine E-Mail-Adresse hinterlegt ist, setzt `is_skipped` zurück und berechnet die Schlüsselpersonen-Prüfung sowie den Status der Unternehmenssitzung neu. Anschließend wird ein `data.updated`-[Webhook](https://docs.didit.me/de/integration/webhooks) für die Unternehmenssitzung mit dem Auslöser `console_key_people_regenerate` gesendet; um die Partei stattdessen auszunehmen, verwenden Sie `PATCH /v3/session/{sessionId}/kyb/parties/{partyUuid}/`. Ein berechtigungsbeschränkter API-Schlüssel erfordert `decisions: write`, und ohne `sessions: write` erhält er `kyc_session_url` als `null`. Gelöschte Sitzungen sind auch dann berechtigt, wenn die Person die Verifizierung bereits gestartet oder abgeschlossen hatte. Importierte Sitzungen gelten nicht aufgrund ihres Ablaufs als geeignet; sie müssen gelöscht worden sein.",
        "operationId": "post_v3_session_kyb_party_regenerate",
        "x-didit-sdk": {
          "resource": "sessions",
          "method": "regenerate_kyb_party",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Sessions"
        ],
        "parameters": [
          {
            "name": "sessionId",
            "in": "path",
            "required": true,
            "description": "UUID der übergeordneten Sitzung zur Unternehmensverifizierung (KYB).",
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "33333333-4444-5555-6666-777777777777"
            }
          },
          {
            "name": "partyUuid",
            "in": "path",
            "required": true,
            "description": "UUID der Partei der Schlüsselpersonen (`key_people_checks[].submitted.parties[].uuid` in der Entscheidung der Unternehmenssitzung). Muss zu der durch `sessionId` referenzierten Sitzung gehören.",
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "0a3f1e2c-7c2f-4a1b-9d55-2f8d2a5d6b41"
            }
          }
        ],
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X POST 'https://verification.didit.me/v3/session/33333333-4444-5555-6666-777777777777/kyb/parties/0a3f1e2c-7c2f-4a1b-9d55-2f8d2a5d6b41/regenerate/' \\\n  -H 'x-api-key: YOUR_API_KEY'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.sessions.regenerate_kyb_party(\n    \"33333333-4444-5555-6666-777777777777\",\n    \"0a3f1e2c-7c2f-4a1b-9d55-2f8d2a5d6b41\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.sessions.regenerateKybParty(\n  \"33333333-4444-5555-6666-777777777777\",\n  \"0a3f1e2c-7c2f-4a1b-9d55-2f8d2a5d6b41\",\n);\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Sessions.RegenerateKYBParty(ctx, \"33333333-4444-5555-6666-777777777777\", \"0a3f1e2c-7c2f-4a1b-9d55-2f8d2a5d6b41\")\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.sessions().regenerateKybParty(\"33333333-4444-5555-6666-777777777777\", \"0a3f1e2c-7c2f-4a1b-9d55-2f8d2a5d6b41\");\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->sessions->regenerateKybParty('33333333-4444-5555-6666-777777777777', '0a3f1e2c-7c2f-4a1b-9d55-2f8d2a5d6b41');\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.sessions.regenerate_kyb_party(\n  \"33333333-4444-5555-6666-777777777777\",\n  \"0a3f1e2c-7c2f-4a1b-9d55-2f8d2a5d6b41\"\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Sessions.RegenerateKybPartyAsync(\"33333333-4444-5555-6666-777777777777\", \"0a3f1e2c-7c2f-4a1b-9d55-2f8d2a5d6b41\");\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "responses": {
          "200": {
            "description": "Neue KYC-Sitzung erstellt. Gibt die aktualisierte Partei mit ihrer neuen untergeordneten Sitzung zurück, die nach Ablauf der Sitzungsdauer ihres KYC-Workflows abläuft.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/KYBKeyPeopleParty"
                },
                "example": {
                  "uuid": "0a3f1e2c-7c2f-4a1b-9d55-2f8d2a5d6b41",
                  "entity_type": "person",
                  "source": "USER",
                  "name": "Jane Smith",
                  "first_name": "Jane",
                  "last_name": "Smith",
                  "company_name": null,
                  "registration_number": null,
                  "email": "user@example.com",
                  "nationality": "GB",
                  "phone_number": null,
                  "date_of_birth": "1980-05-04",
                  "position": "Director",
                  "custom_fields": {},
                  "is_active": true,
                  "is_skipped": false,
                  "requires_verification": true,
                  "roles": [
                    {
                      "role": "director",
                      "ownership_percent": null,
                      "voting_percent": null
                    }
                  ],
                  "kyc_session_id": "55555555-6666-7777-8888-999999999999",
                  "kyc_session_status": "Not Started",
                  "kyc_session_url": "https://verify.didit.me/session/abc123def456",
                  "kyc_session_deleted": false,
                  "kyb_sub_session_id": null,
                  "kyb_sub_session_status": null,
                  "kyb_sub_session_url": null,
                  "kyb_sub_session_deleted": false,
                  "verification_workflow_type": "kyc",
                  "verification_workflow_id": "12121212-3434-5656-7878-909090909090",
                  "verification_workflow_label": "Key People KYC",
                  "verification_workflow_features": [
                    {
                      "feature": "ID_VERIFICATION",
                      "status": "Not Finished"
                    },
                    {
                      "feature": "LIVENESS",
                      "status": "Not Finished"
                    },
                    {
                      "feature": "AML",
                      "status": "Not Finished"
                    }
                  ],
                  "didit_internal_id": null
                }
              }
            }
          },
          "401": {
            "description": "Der API-Schlüssel mit eingeschränktem Geltungsbereich ist abgelaufen. Dies ist der einzige Fall, der `401` zurückgibt: Ein fehlender, ungültiger oder widerrufener Schlüssel gibt `403` zurück.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string",
                      "description": "Lesbare Fehlermeldung."
                    }
                  }
                },
                "examples": {
                  "Expired key": {
                    "summary": "Das Ablaufdatum des Schlüssels ist überschritten",
                    "value": {
                      "detail": "This API key has expired."
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Authentifizierungs- oder Autorisierungsfehler. Ein fehlender Schlüssel gibt `403` zurück, ebenso wie der Schlüssel einer anderen Anwendung, ein berechtigungsbeschränkter Schlüssel ohne die für diesen Endpoint erforderliche Berechtigung sowie eine Anfrage von außerhalb der IP-Allowlist des Schlüssels; ein falscher, widerrufener oder abgelaufener Schlüssel gibt `401` zurück. Unterscheiden Sie diese anhand von `detail`.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string",
                      "description": "Lesbare Fehlermeldung."
                    }
                  }
                },
                "examples": {
                  "Missing or invalid credentials": {
                    "summary": "Kein x-api-key-Header vorhanden oder die Validierung des Schlüssels ist fehlgeschlagen",
                    "value": {
                      "detail": "Authentication credentials were not provided or are invalid."
                    }
                  },
                  "Other application": {
                    "summary": "Ein gültiger Schlüssel, der zu einer anderen Anwendung als die Sitzung gehört",
                    "value": {
                      "detail": "You do not have permission to perform this action."
                    }
                  },
                  "Scoped key without decisions write": {
                    "summary": "Dem Schlüssel mit eingeschränktem Berechtigungsumfang fehlt decisions: write",
                    "value": {
                      "detail": "This API key has no write access to decisions."
                    }
                  },
                  "IP not allowed": {
                    "summary": "Anfrage von außerhalb der IP-Allowlist des Schlüssels",
                    "value": {
                      "detail": "This API key can't be used from this IP address."
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Die Sitzung existiert nicht, wurde gelöscht oder liegt außerhalb der Beschränkungen eines Scoped Keys; in Ihrer Anwendung existiert keine Partei mit dieser UUID; oder die Partei gehört zu einer anderen Sitzung. Jeder Fall hat ein eigenes `detail`. Die Sitzungssuche erfolgt vor der Prüfung der Anmeldedaten, sodass eine unbekannte `sessionId` auch ohne gültigen Schlüssel `404` zurückgibt.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string",
                      "description": "Lesbare Fehlermeldung."
                    }
                  }
                },
                "examples": {
                  "Unknown session": {
                    "summary": "Es existiert keine Sitzung mit dieser ID oder sie wurde gelöscht",
                    "value": {
                      "detail": "Not found."
                    }
                  },
                  "Outside key limits": {
                    "summary": "Die Sitzung liegt außerhalb der Beschränkungen eines Scoped Keys hinsichtlich des Workflows oder der Beschränkung auf genehmigte Sitzungen",
                    "value": {
                      "detail": "Session not found."
                    }
                  },
                  "Unknown party": {
                    "summary": "Keine Partei mit dieser UUID in Ihrer Anwendung",
                    "value": {
                      "detail": "No BusinessParty matches the given query."
                    }
                  },
                  "Party of another session": {
                    "summary": "partyUuid existiert, gehört aber zu einer anderen Sitzung",
                    "value": {
                      "detail": "Party does not belong to the given session."
                    }
                  }
                }
              }
            }
          },
          "409": {
            "description": "Die Partei verfügt über keine berechtigte KYC-Sitzung, die ersetzt werden könnte. Sofern sie nicht gelöscht wurde, kann eine noch laufende Sitzung oder eine Sitzung, die in einem anderen Status (`Approved`, `Declined`, `In Review`, `Abandoned`, ...) geendet hat, nicht neu generiert werden. Eine Partei, die nie eine hatte, oder eine Unternehmenspartei gibt ebenfalls `409` zurück. Eine berechtigte Sitzung wurde gelöscht oder ist abgelaufen, bevor die Person sie gestartet hat. Gelöschte Sitzungen qualifizieren sich selbst dann, wenn die Person die Verifizierung bereits gestartet oder abgeschlossen hatte. Importierte Sitzungen qualifizieren sich nicht durch Ablauf; sie müssen gelöscht worden sein. Verzweigen Sie nach `code`.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "detail",
                    "code"
                  ],
                  "properties": {
                    "detail": {
                      "type": "string",
                      "description": "Lesbare Fehlermeldung."
                    },
                    "code": {
                      "type": "string",
                      "enum": [
                        "kyb_party_kyc_session_not_deleted"
                      ],
                      "description": "Stabiler maschinenlesbarer Fehlercode."
                    }
                  }
                },
                "example": {
                  "detail": "This party's KYC session is still live (it has neither been deleted nor expired without starting), so it cannot be regenerated.",
                  "code": "kyb_party_kyc_session_not_deleted"
                }
              }
            }
          },
          "429": {
            "description": "Rate-Limit überschritten: 300 Schreibanfragen (POST, PATCH, DELETE) pro Minute pro API-Schlüssel. Warten Sie `Retry-After` Sekunden vor einem Wiederholungsversuch; die `X-RateLimit-*`-Header zeigen das Budget an.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string",
                      "description": "Lesbare Fehlermeldung."
                    }
                  }
                },
                "examples": {
                  "Rate limited": {
                    "summary": "Budget für die aktuelle Minute erschöpft",
                    "value": {
                      "detail": "Write request rate limit exceeded. You can make up to 300 requests per minute."
                    }
                  }
                }
              }
            },
            "headers": {
              "Retry-After": {
                "description": "Sekunden, die vor einem Wiederholungsversuch gewartet werden müssen.",
                "schema": {
                  "type": "integer",
                  "minimum": 1,
                  "example": 30
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/v3/transactions/{transaction_id}/notes/": {
      "get": {
        "summary": "Transaktionsnotizen auflisten",
        "description": "Notizen zu einer überwachten Transaktion auflisten, die neuesten zuerst (`created_at` absteigend): Notizen, die Sie über die API hinzufügen, Notizen und Statusänderungen, die Prüfer in der Console vornehmen, und Notizen, die Didit automatisch hinzufügt (die Aktion `add_note` einer Regel oder ein Problem beim Erstellen der Verifizierungssitzung für Benutzeraktionen), die `actor_name` `Rule Engine` tragen. `metadata` unterscheidet die Notiztypen.\n\nPaginiert mit `limit` und `offset`. `count` ist bis 100 exakt und darüber auf 100 begrenzt; folgen Sie daher `next`, bis es `null` ist, anstatt Seiten aus `count` zu berechnen. Dies ist ein Lesezugriff ohne Nebeneffekte.\n\nEin berechtigungsbeschränkter API-Schlüssel benötigt `transactions: read`; ein Schlüssel, der auf bestimmte Workflows oder genehmigte Sitzungen beschränkt ist, kann diesen Endpoint nicht aufrufen. Prüfer sehen dieselbe Liste unter **Notes** in den [Transaktionsdetails](https://docs.didit.me/de/transaction-monitoring/console#transaktionsdetails).",
        "operationId": "list_transaction_notes",
        "x-didit-sdk": {
          "resource": "transactions.notes",
          "method": "list",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Transactions"
        ],
        "parameters": [
          {
            "name": "transaction_id",
            "in": "path",
            "required": true,
            "description": "Didit-Transaktions-UUID: die von `POST /v3/transactions/` und `GET /v3/transactions/` zurückgegebene `uuid`. Ihre eigene `txn_id` wird nicht akzeptiert.",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "example": "abcdef12-3456-7890-abcd-ef1234567890"
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "default": 50,
              "minimum": 1,
              "maximum": 1000000
            },
            "description": "Anzahl der Notizen pro Seite. Standardmäßig 50. Ein Wert, der keine positive Ganzzahl ist, fällt auf 50 zurück; ein Wert über 1000000 gibt `400` zurück."
          },
          {
            "name": "offset",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "default": 0,
              "minimum": 0,
              "maximum": 1000000
            },
            "description": "Nullbasierte Position der ersten zurückzugebenden Notiz. Folgen Sie vorzugsweise `next`. Ein Wert, der keine ganze Zahl ist, fällt auf 0 zurück; ein Wert über 1000000 gibt `400` zurück."
          }
        ],
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X GET 'https://verification.didit.me/v3/transactions/abcdef12-3456-7890-abcd-ef1234567890/notes/?limit=50' \\\n  -H 'x-api-key: YOUR_API_KEY'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nfor item in client.transactions.notes.list(\n    \"abcdef12-3456-7890-abcd-ef1234567890\",\n):\n    print(item)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nfor await (const item of didit.transactions.notes.list(\"abcdef12-3456-7890-abcd-ef1234567890\")) {\n  console.log(item);\n}"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\niter := client.Transactions.Notes.ListAutoPaging(ctx, \"abcdef12-3456-7890-abcd-ef1234567890\", didit.TransactionsNotesListParams{})\nfor iter.Next() {\n\tfmt.Printf(\"%+v\\n\", iter.Current())\n}\nif err := iter.Err(); err != nil {\n\tlog.Fatal(err)\n}"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nfor (var item : client.transactions().notes().list(\"abcdef12-3456-7890-abcd-ef1234567890\")) {\n    System.out.println(item);\n}"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\nforeach ($didit->transactions->notes->list('abcdef12-3456-7890-abcd-ef1234567890') as $item) {\n    print_r($item->toArray());\n}"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\ndidit.transactions.notes.list(\"abcdef12-3456-7890-abcd-ef1234567890\").auto_paging_each do |item|\n  puts item.to_h\nend"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nawait foreach (var item in await client.Transactions.Notes.ListAsync(\"abcdef12-3456-7890-abcd-ef1234567890\"))\n{\n    Console.WriteLine(JsonSerializer.Serialize(item));\n}"
          }
        ],
        "responses": {
          "200": {
            "description": "Eine Seite mit Notizen, neueste zuerst.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "count",
                    "next",
                    "previous",
                    "results"
                  ],
                  "properties": {
                    "count": {
                      "type": "integer",
                      "description": "Anzahl der Notizen zur Transaktion: exakt bis 100, darüber auf 100 begrenzt. Folgen Sie `next`, anstatt daraus Seiten zu berechnen."
                    },
                    "next": {
                      "type": "string",
                      "format": "uri",
                      "nullable": true,
                      "description": "Absolute URL der nächsten Seite oder `null` auf der letzten Seite."
                    },
                    "previous": {
                      "type": "string",
                      "format": "uri",
                      "nullable": true,
                      "description": "Absolute URL der vorherigen Seite oder `null` auf der ersten Seite."
                    },
                    "results": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/TransactionNote"
                      }
                    }
                  }
                },
                "examples": {
                  "API, Console and rule notes": {
                    "value": {
                      "count": 3,
                      "next": null,
                      "previous": null,
                      "results": [
                        {
                          "uuid": "c1111111-2222-4333-8444-555555555555",
                          "note": "Customer confirmed the withdrawal by phone.",
                          "actor_email": null,
                          "actor_name": null,
                          "metadata": {
                            "mentioned_emails": [
                              "analyst@example.com"
                            ]
                          },
                          "created_at": "2026-10-16T10:05:12.481203Z"
                        },
                        {
                          "uuid": "c2222222-3333-4444-8555-666666666666",
                          "note": "Status changed from IN_REVIEW to APPROVED. Reason: Source of funds verified",
                          "actor_email": "reviewer@example.com",
                          "actor_name": "Alex Reviewer",
                          "metadata": {
                            "type": "status_change",
                            "previous_status": "IN_REVIEW",
                            "new_status": "APPROVED",
                            "reason_code": "SOF_VERIFIED",
                            "reason_label": "Source of funds verified"
                          },
                          "created_at": "2026-10-15T17:22:40.103911Z"
                        },
                        {
                          "uuid": "c3333333-4444-4555-8666-777777777777",
                          "note": "Large withdrawal to a new wallet: check the source of funds.",
                          "actor_email": null,
                          "actor_name": "Rule Engine",
                          "metadata": {
                            "rule_uuid": "d1111111-2222-4333-8444-555555555555",
                            "source": "rule_action"
                          },
                          "created_at": "2026-10-15T08:42:12.004518Z"
                        }
                      ]
                    }
                  },
                  "No notes yet": {
                    "value": {
                      "count": 0,
                      "next": null,
                      "previous": null,
                      "results": []
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "`limit` oder `offset` liegt über 1000000. Der Body ist ein JSON-Array von Nachrichten, kein Objekt.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  }
                },
                "examples": {
                  "Limit too large": {
                    "value": [
                      "limit must not exceed 1000000."
                    ]
                  },
                  "Offset too large": {
                    "value": [
                      "offset must not exceed 1000000."
                    ]
                  }
                }
              }
            }
          },
          "401": {
            "description": "Der API-Schlüssel ist abgelaufen. Nur ein Schlüssel, der mit einem Ablaufdatum erstellt wurde, kann ablaufen; nach diesem Datum antwortet jede Anfrage damit mit `401`.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string"
                    }
                  }
                },
                "examples": {
                  "Expired key": {
                    "value": {
                      "detail": "This API key has expired."
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Die Anfrage ist nicht zulässig. Bei einem fehlenden Schlüssel wird die generische Nachricht zurückgegeben; ein falscher, widerrufener oder abgelaufener Schlüssel erhält `401`.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string"
                    }
                  }
                },
                "examples": {
                  "Missing or invalid key": {
                    "value": {
                      "detail": "You do not have permission to perform this action."
                    }
                  },
                  "Scoped key without transactions read": {
                    "value": {
                      "detail": "This API key has no read access to transactions."
                    }
                  },
                  "Key limited to workflows or approved sessions": {
                    "value": {
                      "detail": "This API key only reaches sessions inside its workflow or status limits, so it can't use this endpoint."
                    }
                  },
                  "Outside the key's IP list": {
                    "value": {
                      "detail": "This API key can't be used from this IP address."
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "In der Anwendung existiert keine Transaktion mit dieser UUID (nie erstellt, gelöscht oder gehört einer anderen Anwendung). Eine `transaction_id`, die keine UUID ist, erreicht die API nicht: Sie gibt stattdessen eine `404`-HTML-Seite anstelle dieses JSON-Bodys zurück.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string"
                    }
                  }
                },
                "examples": {
                  "Not found": {
                    "value": {
                      "detail": "No Transaction matches the given query."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Mehr als 600 GET-Anfragen pro Minute mit diesem API-Schlüssel. Warten Sie die Anzahl der Sekunden in `Retry-After` ab und führen Sie dann einen Wiederholungsversuch durch.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string"
                    }
                  }
                },
                "examples": {
                  "Throttled": {
                    "value": {
                      "detail": "GET request rate limit exceeded. You can make up to 600 requests per minute."
                    }
                  }
                }
              }
            },
            "headers": {
              "Retry-After": {
                "description": "Sekunden bis zum Zurücksetzen des aktuellen Ein-Minuten-Fensters.",
                "schema": {
                  "type": "integer",
                  "example": 23
                }
              },
              "X-RateLimit-Limit": {
                "description": "Pro Minute in diesem Budget zulässige Anfragen.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Im aktuellen Zeitfenster verbleibende Anfragen.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix-Zeit, zu der das Zeitfenster zurückgesetzt wird.",
                "schema": {
                  "type": "integer"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      },
      "post": {
        "summary": "Transaktionsnotiz erstellen",
        "description": "Fügen Sie der Prüfungs-Timeline einer überwachten Transaktion eine Nur-Text-Notiz hinzu, wo Prüfer in der Console sie sehen. Eine Notiz liefert Kontext und stellt keine Entscheidung dar: `status`, `score` und Alerts der Transaktion ändern sich nicht, es wird kein Webhook gesendet und es wird nichts in Rechnung gestellt. Die `activities` der Transaktion erhalten einen `TRANSACTION_NOTE_ADDED`-Eintrag.\n\nMit einem API-Schlüssel erstellte Notizen haben keinen Autor: `actor_email` und `actor_name` sind `null`, tragen Sie den Autor bei Bedarf also in den Text ein. Jede Adresse in `mentioned_emails` muss zu einem Mitglied Ihrer Organisation gehören, andernfalls schlägt die gesamte Anfrage mit `400` fehl; Erwähnungen werden in Kleinbuchstaben und dedupliziert gespeichert, und dieser Endpoint benachrichtigt die erwähnten Mitglieder nicht.\n\nJeder Aufruf erstellt eine neue Notiz, sodass der Wiederholungsversuch einer Anfrage nach einem Timeout sie doppelt hinzufügen kann: Listen Sie die Notizen vor einem erneuten Versuch auf. Es gibt keinen API-Endpoint zum Bearbeiten oder Entfernen einer Notiz. Ein berechtigungsbeschränkter API-Schlüssel benötigt `transactions: write`; ein Schlüssel, der auf bestimmte Workflows oder genehmigte Sitzungen beschränkt ist, kann diesen Endpoint nicht aufrufen.",
        "operationId": "create_transaction_note",
        "x-didit-sdk": {
          "resource": "transactions.notes",
          "method": "create",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Transactions"
        ],
        "parameters": [
          {
            "name": "transaction_id",
            "in": "path",
            "required": true,
            "description": "Didit-Transaktions-UUID: die von `POST /v3/transactions/` und `GET /v3/transactions/` zurückgegebene `uuid`. Ihre eigene `txn_id` wird nicht akzeptiert.",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "example": "abcdef12-3456-7890-abcd-ef1234567890"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "note"
                ],
                "properties": {
                  "note": {
                    "type": "string",
                    "minLength": 1,
                    "description": "Klartext-Notiz. Führende und nachgestellte Leerzeichen werden entfernt, und eine leere Notiz wird abgelehnt. Keine Längenbegrenzung."
                  },
                  "mentioned_emails": {
                    "type": "array",
                    "items": {
                      "type": "string",
                      "format": "email"
                    },
                    "default": [],
                    "description": "E-Mail-Adressen von Mitgliedern Ihrer Organisation, die erwähnt werden sollen. Jede muss eine gültige E-Mail-Adresse eines Organisationsmitglieds sein."
                  }
                }
              },
              "examples": {
                "Note with a mention": {
                  "value": {
                    "note": "Customer confirmed the withdrawal by phone.",
                    "mentioned_emails": [
                      "analyst@example.com"
                    ]
                  }
                },
                "Plain note": {
                  "value": {
                    "note": "Source of funds document requested by email."
                  }
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X POST 'https://verification.didit.me/v3/transactions/abcdef12-3456-7890-abcd-ef1234567890/notes/' \\\n  -H 'x-api-key: YOUR_API_KEY' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\"note\": \"Customer confirmed the withdrawal by phone.\", \"mentioned_emails\": [\"analyst@example.com\"]}'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.transactions.notes.create(\n    \"abcdef12-3456-7890-abcd-ef1234567890\",\n    note=\"Customer confirmed the withdrawal by phone.\",\n    mentioned_emails=[\"analyst@example.com\"],\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.transactions.notes.create(\"abcdef12-3456-7890-abcd-ef1234567890\", {\n  note: \"Customer confirmed the withdrawal by phone.\",\n  mentioned_emails: [\"analyst@example.com\"],\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Transactions.Notes.Create(ctx, \"abcdef12-3456-7890-abcd-ef1234567890\", didit.TransactionsNotesCreateParams{\n\tNote:            \"Customer confirmed the withdrawal by phone.\",\n\tMentionedEmails: didit.Some([]string{\"analyst@example.com\"}),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import java.util.List;\nimport me.didit.Didit;\nimport me.didit.types.TransactionsNotesCreateParams;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.transactions().notes().create(\"abcdef12-3456-7890-abcd-ef1234567890\", TransactionsNotesCreateParams.builder()\n        .note(\"Customer confirmed the withdrawal by phone.\")\n        .mentionedEmails(List.of(\"analyst@example.com\"))\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->transactions->notes->create('abcdef12-3456-7890-abcd-ef1234567890', [\n    'note' => 'Customer confirmed the withdrawal by phone.',\n    'mentioned_emails' => ['analyst@example.com'],\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.transactions.notes.create(\n  \"abcdef12-3456-7890-abcd-ef1234567890\",\n  note: \"Customer confirmed the withdrawal by phone.\",\n  mentioned_emails: [\"analyst@example.com\"]\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Transactions.Notes.CreateAsync(\"abcdef12-3456-7890-abcd-ef1234567890\", new TransactionsNotesCreateParams\n{\n    Note = \"Customer confirmed the withdrawal by phone.\",\n    MentionedEmails = new string[] { \"analyst@example.com\" },\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "responses": {
          "201": {
            "description": "Die Notiz wurde erstellt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TransactionNote"
                },
                "examples": {
                  "Created": {
                    "value": {
                      "uuid": "c1111111-2222-4333-8444-555555555555",
                      "note": "Customer confirmed the withdrawal by phone.",
                      "actor_email": null,
                      "actor_name": null,
                      "metadata": {
                        "mentioned_emails": [
                          "analyst@example.com"
                        ]
                      },
                      "created_at": "2026-10-16T10:05:12.481203Z"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Der Body ist ungültig: `note` fehlt, ist null oder leer, eine ungültige Adresse in `mentioned_emails` (Fehler nach Listenposition zugeordnet) oder eine erwähnte Adresse, die kein Mitglied Ihrer Organisation ist. Es wird nichts erstellt.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "description": "Feldfehler, indiziert nach Feldname.",
                  "additionalProperties": {}
                },
                "examples": {
                  "Missing note": {
                    "value": {
                      "note": [
                        "This field is required."
                      ]
                    }
                  },
                  "Blank note": {
                    "value": {
                      "note": [
                        "This field may not be blank."
                      ]
                    }
                  },
                  "Invalid email": {
                    "value": {
                      "mentioned_emails": {
                        "0": [
                          "Enter a valid email address."
                        ]
                      }
                    }
                  },
                  "Not an organization member": {
                    "value": {
                      "mentioned_emails": [
                        "Mentioned users must belong to this organization and have access to this application."
                      ]
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Der API-Schlüssel ist abgelaufen. Nur ein Schlüssel, der mit einem Ablaufdatum erstellt wurde, kann ablaufen; nach diesem Datum antwortet jede Anfrage damit mit `401`.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string"
                    }
                  }
                },
                "examples": {
                  "Expired key": {
                    "value": {
                      "detail": "This API key has expired."
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Die Anfrage ist nicht zulässig. Bei einem fehlenden Schlüssel wird die generische Nachricht zurückgegeben; ein falscher, widerrufener oder abgelaufener Schlüssel erhält `401`.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string"
                    }
                  }
                },
                "examples": {
                  "Missing or invalid key": {
                    "value": {
                      "detail": "You do not have permission to perform this action."
                    }
                  },
                  "Scoped key without transactions write": {
                    "value": {
                      "detail": "This API key has no write access to transactions."
                    }
                  },
                  "Key limited to workflows or approved sessions": {
                    "value": {
                      "detail": "This API key only reaches sessions inside its workflow or status limits, so it can't use this endpoint."
                    }
                  },
                  "Outside the key's IP list": {
                    "value": {
                      "detail": "This API key can't be used from this IP address."
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "In der Anwendung existiert keine Transaktion mit dieser UUID (nie erstellt, gelöscht oder gehört einer anderen Anwendung). Eine `transaction_id`, die keine UUID ist, erreicht die API nicht: Sie gibt stattdessen eine `404`-HTML-Seite anstelle dieses JSON-Bodys zurück.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string"
                    }
                  }
                },
                "examples": {
                  "Not found": {
                    "value": {
                      "detail": "No Transaction matches the given query."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Mehr als 300 Schreibanfragen pro Minute mit diesem API-Schlüssel. Warten Sie die Anzahl der Sekunden in `Retry-After` ab und führen Sie dann einen Wiederholungsversuch durch.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string"
                    }
                  }
                },
                "examples": {
                  "Throttled": {
                    "value": {
                      "detail": "Write request rate limit exceeded. You can make up to 300 requests per minute."
                    }
                  }
                }
              }
            },
            "headers": {
              "Retry-After": {
                "description": "Sekunden bis zum Zurücksetzen des aktuellen Ein-Minuten-Fensters.",
                "schema": {
                  "type": "integer",
                  "example": 23
                }
              },
              "X-RateLimit-Limit": {
                "description": "Pro Minute in diesem Budget zulässige Anfragen.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Im aktuellen Zeitfenster verbleibende Anfragen.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix-Zeit, zu der das Zeitfenster zurückgesetzt wird.",
                "schema": {
                  "type": "integer"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/v3/transactions/{transaction_id}/related/": {
      "get": {
        "summary": "Zugehörige Transaktionen auflisten",
        "description": "Listet die anderen Transaktionen in Ihrer Anwendung auf, an denen dieselben Personen oder Unternehmen wie an dieser beteiligt sind. Eine Transaktion gilt als verwandt, wenn eine ihrer Parteien, in beliebiger Rolle, denselben `vendor_data`-Wert wie eine der Parteien dieser Transaktion aufweist. Die Transaktion selbst wird nie zurückgegeben, und Parteien ohne `vendor_data` werden ignoriert: Wenn keine der Parteien dieser Transaktion einen solchen Wert hat, ist das Ergebnis immer leer.\n\nDie Ergebnisse verwenden die Übersichtsstruktur von `GET /v3/transactions/`, die neuesten zuerst (`txn_date`, dann `created_at`). Paginierung über `limit` und `offset`; `count` ist bis 100 exakt und darüber auf 100 begrenzt, folgen Sie also `next`, bis der Wert `null` ist.\n\nEin bereichsgebundener API-Schlüssel benötigt `transactions: read`; ein Schlüssel, der auf bestimmte Workflows oder genehmigte Sitzungen beschränkt ist, kann diesen Endpoint nicht aufrufen. Senden Sie bei jeder [Transaktion](https://docs.didit.me/de/transaction-monitoring/transactions#subjekt-und-gegenpartei) denselben `vendor_data`-Wert für dieselbe Person oder dasselbe Unternehmen, um diese Liste vollständig zu halten.",
        "operationId": "list_related_transactions",
        "x-didit-sdk": {
          "resource": "transactions",
          "method": "list_related",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Transactions"
        ],
        "parameters": [
          {
            "name": "transaction_id",
            "in": "path",
            "required": true,
            "description": "Didit-Transaktions-UUID: die von `POST /v3/transactions/` und `GET /v3/transactions/` zurückgegebene `uuid`. Ihre eigene `txn_id` wird nicht akzeptiert.",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "example": "abcdef12-3456-7890-abcd-ef1234567890"
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "default": 50,
              "minimum": 1,
              "maximum": 1000000
            },
            "description": "Anzahl der Transaktionen pro Seite. Standardmäßig 50. Ein Wert, der keine positive Ganzzahl ist, fällt auf 50 zurück; ein Wert über 1000000 gibt `400` zurück."
          },
          {
            "name": "offset",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "default": 0,
              "minimum": 0,
              "maximum": 1000000
            },
            "description": "Nullbasierte Position der ersten zurückzugebenden Transaktion. Folgen Sie vorzugsweise `next`. Ein Wert, der keine ganze Zahl ist, fällt auf 0 zurück; ein Wert über 1000000 gibt `400` zurück."
          }
        ],
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X GET 'https://verification.didit.me/v3/transactions/abcdef12-3456-7890-abcd-ef1234567890/related/?limit=50' \\\n  -H 'x-api-key: YOUR_API_KEY'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nfor item in client.transactions.list_related(\n    \"abcdef12-3456-7890-abcd-ef1234567890\",\n):\n    print(item)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nfor await (const item of didit.transactions.listRelated(\"abcdef12-3456-7890-abcd-ef1234567890\")) {\n  console.log(item);\n}"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\niter := client.Transactions.ListRelatedAutoPaging(ctx, \"abcdef12-3456-7890-abcd-ef1234567890\", didit.TransactionsListRelatedParams{})\nfor iter.Next() {\n\tfmt.Printf(\"%+v\\n\", iter.Current())\n}\nif err := iter.Err(); err != nil {\n\tlog.Fatal(err)\n}"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nfor (var item : client.transactions().listRelated(\"abcdef12-3456-7890-abcd-ef1234567890\")) {\n    System.out.println(item);\n}"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\nforeach ($didit->transactions->listRelated('abcdef12-3456-7890-abcd-ef1234567890') as $item) {\n    print_r($item->toArray());\n}"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\ndidit.transactions.list_related(\"abcdef12-3456-7890-abcd-ef1234567890\").auto_paging_each do |item|\n  puts item.to_h\nend"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nawait foreach (var item in await client.Transactions.ListRelatedAsync(\"abcdef12-3456-7890-abcd-ef1234567890\"))\n{\n    Console.WriteLine(JsonSerializer.Serialize(item));\n}"
          }
        ],
        "responses": {
          "200": {
            "description": "Eine Seite mit verknüpften Transaktionen, neueste zuerst.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "count",
                    "next",
                    "previous",
                    "results"
                  ],
                  "properties": {
                    "count": {
                      "type": "integer",
                      "description": "Anzahl zugehöriger Transaktionen: exakt bis 100, darüber auf 100 begrenzt. Folgen Sie `next`, anstatt daraus Seiten zu berechnen."
                    },
                    "next": {
                      "type": "string",
                      "format": "uri",
                      "nullable": true,
                      "description": "Absolute URL der nächsten Seite oder `null` auf der letzten Seite."
                    },
                    "previous": {
                      "type": "string",
                      "format": "uri",
                      "nullable": true,
                      "description": "Absolute URL der vorherigen Seite oder `null` auf der ersten Seite."
                    },
                    "results": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/TransactionSummary"
                      }
                    }
                  }
                },
                "examples": {
                  "One related transaction": {
                    "value": {
                      "count": 1,
                      "next": null,
                      "previous": null,
                      "results": [
                        {
                          "uuid": "abcdef99-3456-4890-abcd-ef1234567890",
                          "transaction_number": 4087,
                          "txn_id": "your-txn-2026-10-02-017",
                          "transaction_type": "finance",
                          "action_type": "deposit",
                          "status": "APPROVED",
                          "source": "LIVE",
                          "direction": "INBOUND",
                          "amount": "250",
                          "currency": "EUR",
                          "currency_type": "fiat",
                          "preferred_currency_amount": "270.08",
                          "preferred_currency_code": "USD",
                          "payment_details": "Card top-up",
                          "txn_date": "2026-10-02T14:10:00Z",
                          "created_at": "2026-10-02T14:10:03.512244Z",
                          "score": 12,
                          "severity": "LOW",
                          "decision_reason_code": null,
                          "decision_reason_label": null,
                          "tags": [],
                          "subject_name": "Maria Garcia",
                          "subject_vendor_data": "user-12345",
                          "subject_type": "user",
                          "subject_uuid": "e1111111-2222-4333-8444-555555555555",
                          "counterparty_name": null,
                          "counterparty_vendor_data": null,
                          "counterparty_country": null,
                          "subject_country": "ESP",
                          "assigned_to_name": null,
                          "travel_rule_status": null,
                          "application_id": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee",
                          "application_name": "Production app",
                          "organization_id": "11111111-2222-3333-4444-555555555555",
                          "organization_name": "Example Org"
                        }
                      ]
                    }
                  },
                  "No party has vendor_data": {
                    "value": {
                      "count": 0,
                      "next": null,
                      "previous": null,
                      "results": []
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "`limit` oder `offset` liegt über 1000000. Der Body ist ein JSON-Array von Nachrichten, kein Objekt.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  }
                },
                "examples": {
                  "Limit too large": {
                    "value": [
                      "limit must not exceed 1000000."
                    ]
                  },
                  "Offset too large": {
                    "value": [
                      "offset must not exceed 1000000."
                    ]
                  }
                }
              }
            }
          },
          "401": {
            "description": "Der API-Schlüssel ist abgelaufen. Nur ein Schlüssel, der mit einem Ablaufdatum erstellt wurde, kann ablaufen; nach diesem Datum antwortet jede Anfrage damit mit `401`.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string"
                    }
                  }
                },
                "examples": {
                  "Expired key": {
                    "value": {
                      "detail": "This API key has expired."
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Die Anfrage ist nicht zulässig. Bei einem fehlenden Schlüssel wird die generische Nachricht zurückgegeben; ein falscher, widerrufener oder abgelaufener Schlüssel erhält `401`.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string"
                    }
                  }
                },
                "examples": {
                  "Missing or invalid key": {
                    "value": {
                      "detail": "You do not have permission to perform this action."
                    }
                  },
                  "Scoped key without transactions read": {
                    "value": {
                      "detail": "This API key has no read access to transactions."
                    }
                  },
                  "Key limited to workflows or approved sessions": {
                    "value": {
                      "detail": "This API key only reaches sessions inside its workflow or status limits, so it can't use this endpoint."
                    }
                  },
                  "Outside the key's IP list": {
                    "value": {
                      "detail": "This API key can't be used from this IP address."
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "In der Anwendung existiert keine Transaktion mit dieser UUID (nie erstellt, gelöscht oder gehört einer anderen Anwendung). Eine `transaction_id`, die keine UUID ist, erreicht die API nicht: Sie gibt stattdessen eine `404`-HTML-Seite anstelle dieses JSON-Bodys zurück.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string"
                    }
                  }
                },
                "examples": {
                  "Not found": {
                    "value": {
                      "detail": "No Transaction matches the given query."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Mehr als 600 GET-Anfragen pro Minute mit diesem API-Schlüssel. Warten Sie die Anzahl der Sekunden in `Retry-After` ab und führen Sie dann einen Wiederholungsversuch durch.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string"
                    }
                  }
                },
                "examples": {
                  "Throttled": {
                    "value": {
                      "detail": "GET request rate limit exceeded. You can make up to 600 requests per minute."
                    }
                  }
                }
              }
            },
            "headers": {
              "Retry-After": {
                "description": "Sekunden bis zum Zurücksetzen des aktuellen Ein-Minuten-Fensters.",
                "schema": {
                  "type": "integer",
                  "example": 23
                }
              },
              "X-RateLimit-Limit": {
                "description": "Pro Minute in diesem Budget zulässige Anfragen.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Im aktuellen Zeitfenster verbleibende Anfragen.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix-Zeit, zu der das Zeitfenster zurückgesetzt wird.",
                "schema": {
                  "type": "integer"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/v3/organization/{organization_id}/application/{application_id}/businesses/{business_session_id}/pdf/": {
      "get": {
        "summary": "Einen PDF-Bericht für eine Unternehmenssitzung herunterladen",
        "description": "Rendern Sie den PDF-Bericht einer Sitzung zur Unternehmensverifizierung (KYB): Daten aus dem Unternehmensregister, Schlüsselpersonen und wirtschaftlich Berechtigte, Dokumente, AML-Ergebnisse und die weiteren Workflow-Funktionen sowie die Tags und Prüfungsaktivitäten der Sitzung. Bei aktivierter White-Label-Anpassung enthält der Bericht Ihr Logo und die URL Ihrer Datenschutzerklärung. Der Body ist das PDF selbst (`application/pdf`), kein JSON.\n\nDie Sitzung muss den Status `Approved`, `Declined` oder `In Review` haben; jeder andere Status gibt `403` zurück, warten Sie daher zuerst auf den [Webhook](https://docs.didit.me/de/integration/webhooks) `status.updated`. Der Bericht wird bei jedem Aufruf neu gerendert und es wird nichts in Rechnung gestellt; speichern Sie die Datei daher, anstatt sie wiederholt abzurufen. `GET /v3/session/{sessionId}/generate-pdf/` rendert dieselbe Art von Bericht allein anhand der Sitzungs-ID.\n\nEin PDF-Bericht gilt als Medium: Ein berechtigungsbeschränkter API-Schlüssel benötigt `businesses: read` und `media: read`, und ein Schlüssel, der auf bestimmte Workflows oder genehmigte Sitzungen beschränkt ist, kann ihn nicht aufrufen.",
        "operationId": "get_business_session_pdf",
        "x-didit-sdk": {
          "resource": "businesses",
          "method": "generate_session_pdf",
          "auth": "api_key",
          "server": true,
          "scope": "application"
        },
        "tags": [
          "Businesses"
        ],
        "parameters": [
          {
            "name": "organization_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "UUID der Organisation.",
            "example": "11111111-2222-3333-4444-555555555555"
          },
          {
            "name": "application_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Anwendungs-UUID. Muss die Anwendung sein, zu der der API-Schlüssel gehört: Ein für eine andere Anwendung verwendeter Schlüssel erhält `403`.",
            "example": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee"
          },
          {
            "name": "business_session_id",
            "in": "path",
            "required": true,
            "description": "`session_id` der Sitzung zur Unternehmensverifizierung (KYB), wie bei der Erstellung der Sitzung zurückgegeben. Eine Sitzung einer anderen Anwendung gibt `404` zurück.",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "example": "22222222-3333-4444-5555-666666666666"
          }
        ],
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl --fail -X GET 'https://verification.didit.me/v3/organization/11111111-2222-3333-4444-555555555555/application/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/businesses/22222222-3333-4444-5555-666666666666/pdf/' \\\n  -H 'x-api-key: YOUR_API_KEY' \\\n  --output business_report.pdf"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\ncontent = client.businesses.generate_session_pdf(\n    \"22222222-3333-4444-5555-666666666666\",\n)\nwith open(\"download.pdf\", \"wb\") as file:\n    file.write(content)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import { writeFile } from \"node:fs/promises\";\nimport Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst content = await didit.businesses.generateSessionPdf(\"22222222-3333-4444-5555-666666666666\");\nawait writeFile(\"download.pdf\", Buffer.from(await content.arrayBuffer()));"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresp, err := client.Businesses.GenerateSessionPDF(ctx, \"22222222-3333-4444-5555-666666666666\")\nif err != nil {\n\tlog.Fatal(err)\n}\ndefer resp.Body.Close()\nfile, err := os.Create(\"download.pdf\")\nif err != nil {\n\tlog.Fatal(err)\n}\ndefer file.Close()\nif _, err := io.Copy(file, resp.Body); err != nil {\n\tlog.Fatal(err)\n}"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import java.nio.file.Path;\nimport me.didit.Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nclient.businesses().generateSessionPdf(\"22222222-3333-4444-5555-666666666666\")\n        .writeTo(Path.of(\"download.pdf\"));"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\n$didit = new DiditClient();\n\n$content = $didit->businesses->generateSessionPdf('22222222-3333-4444-5555-666666666666');\n$content->saveTo('download.pdf');"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\ncontent = didit.businesses.generate_session_pdf(\"22222222-3333-4444-5555-666666666666\")\nFile.binwrite(\"download.pdf\", content)"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar content = await client.Businesses.GenerateSessionPdfAsync(\"22222222-3333-4444-5555-666666666666\");\nawait content.SaveToAsync(\"download.pdf\");"
          }
        ],
        "responses": {
          "200": {
            "description": "Das gerenderte PDF, direkt als binäres `application/pdf` zurückgegeben.",
            "headers": {
              "Content-Disposition": {
                "description": "Immer `attachment; filename=business_{business_session_id}.pdf`.",
                "schema": {
                  "type": "string",
                  "example": "attachment; filename=business_22222222-3333-4444-5555-666666666666.pdf"
                }
              }
            },
            "content": {
              "application/pdf": {
                "schema": {
                  "type": "string",
                  "format": "binary"
                }
              }
            }
          },
          "401": {
            "description": "Der API-Schlüssel ist abgelaufen. Nur ein Schlüssel, der mit einem Ablaufdatum erstellt wurde, kann ablaufen; nach diesem Datum antwortet jede Anfrage damit mit `401`.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string"
                    }
                  }
                },
                "examples": {
                  "Expired key": {
                    "value": {
                      "detail": "This API key has expired."
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Die Anfrage ist nicht zulässig oder die Sitzung ist nicht abgeschlossen. Lesen Sie `detail`: eine Sitzung, die nicht `Approved`, `Declined` oder `In Review` ist, ein fehlender API-Schlüssel (ein falscher, widerrufener oder abgelaufener Schlüssel erhält `401`), eine `application_id`, die nicht zur Anwendung des Schlüssels gehört, ein berechtigungseingeschränkter Schlüssel ohne `media: read` oder `businesses: read`, ein auf Workflows oder genehmigte Sitzungen beschränkter Schlüssel oder eine Anfrage außerhalb der IP-Liste des Schlüssels.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string"
                    }
                  }
                },
                "examples": {
                  "Session not finished": {
                    "value": {
                      "detail": "You can only generate a PDF for sessions in review, declined or approved."
                    }
                  },
                  "Missing or invalid key": {
                    "value": {
                      "detail": "Authentication credentials were not provided or are invalid."
                    }
                  },
                  "Another application": {
                    "value": {
                      "detail": "You do not have permission to perform this action."
                    }
                  },
                  "Scoped key without media read": {
                    "value": {
                      "detail": "This API key has no read access to media."
                    }
                  },
                  "Scoped key without businesses read": {
                    "value": {
                      "detail": "This API key has no read access to companies."
                    }
                  },
                  "Key limited to workflows or approved sessions": {
                    "value": {
                      "detail": "This API key only reaches sessions inside its workflow or status limits, so it can't use this endpoint."
                    }
                  },
                  "Outside the key's IP list": {
                    "value": {
                      "detail": "This API key can't be used from this IP address."
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "In der Anwendung existiert keine Unternehmenssitzung mit dieser ID (wurde nie erstellt, gelöscht oder gehört zu einer anderen Anwendung). Ein Wert, der keine UUID ist, gibt anstelle dieses JSON-Bodys eine `404`-HTML-Seite zurück.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string"
                    }
                  }
                },
                "examples": {
                  "Not found": {
                    "value": {
                      "detail": "Business session not found."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Mehr als 600 GET-Anfragen pro Minute mit diesem API-Schlüssel. Warten Sie die Anzahl der Sekunden in `Retry-After` ab und führen Sie dann einen Wiederholungsversuch durch.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string"
                    }
                  }
                },
                "examples": {
                  "Throttled": {
                    "value": {
                      "detail": "GET request rate limit exceeded. You can make up to 600 requests per minute."
                    }
                  }
                }
              }
            },
            "headers": {
              "Retry-After": {
                "description": "Sekunden bis zum Zurücksetzen des aktuellen Ein-Minuten-Fensters.",
                "schema": {
                  "type": "integer",
                  "example": 23
                }
              },
              "X-RateLimit-Limit": {
                "description": "Pro Minute in diesem Budget zulässige Anfragen.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Im aktuellen Zeitfenster verbleibende Anfragen.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix-Zeit, zu der das Zeitfenster zurückgesetzt wird.",
                "schema": {
                  "type": "integer"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/v3/organization/{organization_id}/application/{application_id}/transactions/{transaction_uuid}/pdf/": {
      "get": {
        "summary": "Einen Transaktions-PDF-Bericht herunterladen",
        "description": "Rendern Sie eine überwachte Transaktion als PDF-Bericht: Übersicht und Beurteilung, Parteien und Zahlungsmethoden, benutzerdefinierte Eigenschaften, Alerts und Regelausführungen, Screening- und Travel-Rule-Ergebnisse, die Netzwerkzusammenfassung, die Kostenaufschlüsselung, bis zu 50 zugehörige Transaktionen und die 20 neuesten Aktivitätseinträge. Der Body ist das PDF selbst (`application/pdf`), kein JSON.\n\nDer Bericht wird bei jedem Aufruf aus den aktuellen Daten der Transaktion gerendert; rufen Sie ihn nach einer Statusänderung also erneut ab. Es wird nichts gespeichert und nichts abgerechnet. Das Rendern kann einige Sekunden dauern, verwenden Sie daher ein großzügiges Client-Timeout.\n\nDieser Endpoint befindet sich auf einem anwendungsbezogenen Pfad: Fügen Sie Ihre Organisations-ID und die ID der Anwendung, zu der Ihr API-Schlüssel gehört, in die URL ein ([finden Sie Ihre Organisations-ID](https://docs.didit.me/de/getting-started/api-authentication#organisations-id-finden)). Ein PDF-Bericht zählt als Medium: Ein berechtigungsbeschränkter API-Schlüssel benötigt `media: read` und `transactions: read`, und ein Schlüssel, der auf bestimmte Workflows oder auf genehmigte Sitzungen beschränkt ist, kann ihn nicht aufrufen.",
        "operationId": "get_transaction_pdf",
        "x-didit-sdk": {
          "resource": "transactions",
          "method": "generate_pdf",
          "auth": "api_key",
          "server": true,
          "scope": "application"
        },
        "tags": [
          "Transactions"
        ],
        "parameters": [
          {
            "name": "organization_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "UUID der Organisation.",
            "example": "11111111-2222-3333-4444-555555555555"
          },
          {
            "name": "application_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Anwendungs-UUID. Muss die Anwendung sein, zu der der API-Schlüssel gehört: Ein für eine andere Anwendung verwendeter Schlüssel erhält `403`.",
            "example": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee"
          },
          {
            "name": "transaction_uuid",
            "in": "path",
            "required": true,
            "description": "Didit-Transaktions-UUID: die von `POST /v3/transactions/` und `GET /v3/transactions/` zurückgegebene `uuid`. Ihre eigene `txn_id` wird nicht akzeptiert.",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "example": "abcdef12-3456-7890-abcd-ef1234567890"
          }
        ],
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl --fail -X GET 'https://verification.didit.me/v3/organization/11111111-2222-3333-4444-555555555555/application/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/transactions/abcdef12-3456-7890-abcd-ef1234567890/pdf/' \\\n  -H 'x-api-key: YOUR_API_KEY' \\\n  --output transaction_report.pdf"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\ncontent = client.transactions.generate_pdf(\n    \"abcdef12-3456-7890-abcd-ef1234567890\",\n)\nwith open(\"download.pdf\", \"wb\") as file:\n    file.write(content)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import { writeFile } from \"node:fs/promises\";\nimport Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst content = await didit.transactions.generatePdf(\"abcdef12-3456-7890-abcd-ef1234567890\");\nawait writeFile(\"download.pdf\", Buffer.from(await content.arrayBuffer()));"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresp, err := client.Transactions.GeneratePDF(ctx, \"abcdef12-3456-7890-abcd-ef1234567890\")\nif err != nil {\n\tlog.Fatal(err)\n}\ndefer resp.Body.Close()\nfile, err := os.Create(\"download.pdf\")\nif err != nil {\n\tlog.Fatal(err)\n}\ndefer file.Close()\nif _, err := io.Copy(file, resp.Body); err != nil {\n\tlog.Fatal(err)\n}"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import java.nio.file.Path;\nimport me.didit.Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nclient.transactions().generatePdf(\"abcdef12-3456-7890-abcd-ef1234567890\")\n        .writeTo(Path.of(\"download.pdf\"));"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\n$didit = new DiditClient();\n\n$content = $didit->transactions->generatePdf('abcdef12-3456-7890-abcd-ef1234567890');\n$content->saveTo('download.pdf');"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\ncontent = didit.transactions.generate_pdf(\"abcdef12-3456-7890-abcd-ef1234567890\")\nFile.binwrite(\"download.pdf\", content)"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar content = await client.Transactions.GeneratePdfAsync(\"abcdef12-3456-7890-abcd-ef1234567890\");\nawait content.SaveToAsync(\"download.pdf\");"
          }
        ],
        "responses": {
          "200": {
            "description": "Das gerenderte PDF, direkt als binäres `application/pdf` zurückgegeben.",
            "headers": {
              "Content-Disposition": {
                "description": "Immer `attachment; filename=transaction_{transaction_uuid}.pdf`.",
                "schema": {
                  "type": "string",
                  "example": "attachment; filename=transaction_abcdef12-3456-7890-abcd-ef1234567890.pdf"
                }
              }
            },
            "content": {
              "application/pdf": {
                "schema": {
                  "type": "string",
                  "format": "binary"
                }
              }
            }
          },
          "401": {
            "description": "Der API-Schlüssel ist abgelaufen. Nur ein Schlüssel, der mit einem Ablaufdatum erstellt wurde, kann ablaufen; nach diesem Datum antwortet jede Anfrage damit mit `401`.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string"
                    }
                  }
                },
                "examples": {
                  "Expired key": {
                    "value": {
                      "detail": "This API key has expired."
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Die Anfrage ist nicht zulässig. Prüfen Sie `detail`: ein fehlender API-Schlüssel (ein falscher, widerrufener oder abgelaufener Schlüssel erhält `401`), eine `application_id`, die nicht zur Anwendung des Schlüssels gehört, ein berechtigungsbeschränkter Schlüssel ohne `media: read` oder `transactions: read`, ein auf Workflows oder genehmigte Sitzungen beschränkter Schlüssel oder eine Anfrage von außerhalb der IP-Liste des Schlüssels.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string"
                    }
                  }
                },
                "examples": {
                  "Missing or invalid key": {
                    "value": {
                      "detail": "Authentication credentials were not provided or are invalid."
                    }
                  },
                  "Another application": {
                    "value": {
                      "detail": "You do not have permission to perform this action."
                    }
                  },
                  "Scoped key without media read": {
                    "value": {
                      "detail": "This API key has no read access to media."
                    }
                  },
                  "Scoped key without transactions read": {
                    "value": {
                      "detail": "This API key has no read access to transactions."
                    }
                  },
                  "Key limited to workflows or approved sessions": {
                    "value": {
                      "detail": "This API key only reaches sessions inside its workflow or status limits, so it can't use this endpoint."
                    }
                  },
                  "Outside the key's IP list": {
                    "value": {
                      "detail": "This API key can't be used from this IP address."
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "In der Anwendung existiert keine Transaktion mit dieser UUID (nie erstellt, gelöscht oder gehört einer anderen Anwendung). Eine `transaction_uuid`, die keine UUID ist, erreicht die API nicht: Sie gibt stattdessen eine `404`-HTML-Seite anstelle dieses JSON-Bodys zurück.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string"
                    }
                  }
                },
                "examples": {
                  "Not found": {
                    "value": {
                      "detail": "No Transaction matches the given query."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Mehr als 600 GET-Anfragen pro Minute mit diesem API-Schlüssel. Warten Sie die Anzahl der Sekunden in `Retry-After` ab und führen Sie dann einen Wiederholungsversuch durch.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string"
                    }
                  }
                },
                "examples": {
                  "Throttled": {
                    "value": {
                      "detail": "GET request rate limit exceeded. You can make up to 600 requests per minute."
                    }
                  }
                }
              }
            },
            "headers": {
              "Retry-After": {
                "description": "Sekunden bis zum Zurücksetzen des aktuellen Ein-Minuten-Fensters.",
                "schema": {
                  "type": "integer",
                  "example": 23
                }
              },
              "X-RateLimit-Limit": {
                "description": "Pro Minute in diesem Budget zulässige Anfragen.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Im aktuellen Zeitfenster verbleibende Anfragen.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix-Zeit, zu der das Zeitfenster zurückgesetzt wird.",
                "schema": {
                  "type": "integer"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/v3/organization/{organization_id}/application/{application_id}/analytics/": {
      "get": {
        "summary": "Anwendungsanalysen abrufen",
        "description": "Lesen Sie die Zahlen hinter dem [Analytics-Dashboard](https://docs.didit.me/de/console/analytics) der Business Console für einen Datumsbereich aus. Ohne `scope` und `widget_keys` ist die Antwort die Zusammenfassung der Benutzerverifizierung (KYC) (`ApplicationAnalyticsSummary`): tägliche Sitzungsanzahlen, Statussummen, Konversionsrate, dieselben Kennzahlen für den vorherigen Zeitraum gleicher Länge, Standorte, Demografie, Geräte, Workflow-Funnel, aktive Verifizierungszeit, erneute Einreichungen, Warnungen und Zeitreihen. Mit `scope` oder `widget_keys` enthält sie die Widgets eines Dashboard-Tabs (`ApplicationAnalyticsWidgetResponse`): `kyc`, `kyb`, `transactions` oder `home`.\n\nSitzungsanzahlen basieren auf dem Sitzungserstellungsdatum (UTC) und spiegeln den aktuellen Status jeder Sitzung wider. Sie stammen aus täglichen Rollups, die im Hintergrund aktualisiert werden, sodass die neueste Aktivität einen kurzen Moment benötigen kann, um angezeigt zu werden. Ungültige Workflow-IDs und -Versionen werden ignoriert statt abgewiesen. Es wird nichts in Rechnung gestellt.\n\nNur ein API-Schlüssel mit Vollzugriff kann diesen Endpoint aufrufen: Jeder berechtigungsbeschränkte Schlüssel erhält den Status `403`, unabhängig von seinen Berechtigungen, ebenso wie der Schlüssel einer anderen Anwendung. Siehe [API-Schlüssel](https://docs.didit.me/de/console/api-keys).",
        "operationId": "get_application_analytics",
        "x-didit-sdk": {
          "resource": "analytics",
          "method": "retrieve",
          "auth": "api_key",
          "server": true,
          "scope": "application"
        },
        "tags": [
          "Analytics"
        ],
        "parameters": [
          {
            "name": "organization_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "UUID der Organisation.",
            "example": "11111111-2222-3333-4444-555555555555"
          },
          {
            "name": "application_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Anwendungs-UUID. Muss die Anwendung sein, zu der der API-Schlüssel gehört: Ein für eine andere Anwendung verwendeter Schlüssel erhält `403`.",
            "example": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee"
          },
          {
            "name": "start_date",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "date",
              "example": "2026-10-01"
            },
            "description": "Erster Tag des Zeitraums, `YYYY-MM-DD`, einschließlich (UTC). Zusammen mit `end_date` senden: Wenn einer von beiden fehlt, werden beide ignoriert und der Zeitraum reicht von 30 Tagen vor heute bis heute."
          },
          {
            "name": "end_date",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "date",
              "example": "2026-10-15"
            },
            "description": "Letzter Tag des Zeitraums, `YYYY-MM-DD`, einschließlich (UTC). Ein Datum in der Zukunft zählt als heute. Der Zeitraum darf 730 Tage nicht überschreiten."
          },
          {
            "name": "scope",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "home",
                "kyc",
                "kyb",
                "transactions"
              ]
            },
            "description": "Dashboard-Tab, für den Widgets zurückgegeben werden sollen (Groß-/Kleinschreibung wird nicht beachtet). Lassen Sie ihn zusammen mit `widget_keys` weg, um die KYC-Zusammenfassung zu erhalten. Das Senden von nur `widget_keys` impliziert `kyc`. `home` akzeptiert jedes KYC-, KYB- oder Transaktions-Widget und verwendet standardmäßig das gespeicherte Start-Layout der Anwendung."
          },
          {
            "name": "widget_keys",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "example": "tx_count_total,tx_count_daily"
            },
            "description": "Kommagetrennte Widget-Schlüssel, in dieser Reihenfolge zurückgegeben. Schlüssel, die der Scope nicht akzeptiert, werden verworfen; wenn keine übrig bleiben, erhalten Sie die Standardwerte des Scopes. KYC: `kyc_sessions_volume`, `kyc_warning_insights`, `kyc_id_locations`, `kyc_ip_locations`, `kyc_workflow_funnel`, `kyc_average_verification_time`, `kyc_conversion_rate`, `kyc_conversion_by_country`, `kyc_resubmission_insights`, `kyc_original_status_distribution`, `kyc_database_validation_coverage`, `kyc_database_validation_latency`, `kyc_demographics`, `kyc_device_details`. KYB: `kyb_sessions_volume`, `kyb_workflow_funnel`, `kyb_average_verification_time`, `kyb_ip_locations`, `kyb_business_country_distribution`, `kyb_warning_insights`, `kyb_conversion_rate`, `kyb_conversion_by_country`, `kyb_industry_breakdown`, `kyb_resubmission_insights`, `kyb_original_status_distribution`, `kyb_registry_coverage`, `kyb_registry_data_completeness`, `kyb_device_details`. Transaktionen: `tx_count_total`, `tx_count_daily`, `tx_volume_total_preferred_currency`, `tx_volume_daily_preferred_currency`, `tx_average_amount`, `tx_average_amount_daily`, `tx_transaction_category_breakdown`, `tx_action_type_breakdown`, `tx_status_volume_trend`, `tx_user_ip_or_country_distribution`, `tx_tag_breakdown`, `tx_top_rules_triggered`, `tx_team_member_performance`, `tx_score_histogram`."
          },
          {
            "name": "workflow_ids",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "example": "33333333-4444-5555-6666-777777777777"
            },
            "description": "Kommagetrennte Workflow-IDs. Beschränkt die KYC-Zusammenfassung sowie die KYC- und KYB-Widgets auf diese Workflows. Werte, die keine UUIDs sind, werden ignoriert; wenn keiner gültig ist, wird der Filter verworfen. Die Zusammenfassung akzeptiert auch `workflow_id`."
          },
          {
            "name": "versions",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "example": "3,4"
            },
            "description": "Kommagetrennte Workflow-Versionsnummern. Gilt nur zusammen mit `workflow_ids`; Werte, die keine ganzen Zahlen sind, werden ignoriert. `version` wird als Alias akzeptiert."
          },
          {
            "name": "branch_path_ids",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "example": "default"
            },
            "description": "Kommagetrennte Verzweigungspfad-IDs. Gilt nur zusammen mit `workflow_ids` und nur für KYC-Zahlen. Zahlen werden derzeit nur für `default` (alle Pfade kombiniert) erfasst, sodass jeder andere Wert leere Zahlen zurückgibt. `branch_path_id` wird als Alias akzeptiert."
          },
          {
            "name": "tag",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "Nur Transaktions-Widgets: kommagetrennte Tag-UUIDs oder Tag-Namen."
          },
          {
            "name": "transaction_type",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "example": "finance"
            },
            "description": "Nur Transaktions-Widgets: kommagetrennte Transaktionskategorien."
          },
          {
            "name": "action_type",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "example": "withdrawal"
            },
            "description": "Nur Transaktions-Widgets: kommagetrennte Aktionstypen (Groß-/Kleinschreibung wird nicht berücksichtigt)."
          }
        ],
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X GET 'https://verification.didit.me/v3/organization/11111111-2222-3333-4444-555555555555/application/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/analytics/?start_date=2026-10-01&end_date=2026-10-15' \\\n  -H 'x-api-key: YOUR_API_KEY'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.analytics.retrieve()\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.analytics.retrieve();\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.Analytics.Retrieve(ctx, didit.AnalyticsRetrieveParams{})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.analytics().retrieve();\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\n$didit = new DiditClient();\n\n$result = $didit->analytics->retrieve();\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.analytics.retrieve\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.Analytics.RetrieveAsync();\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "responses": {
          "200": {
            "description": "Die KYC-Zusammenfassung oder die angeforderten Widgets, wenn `scope` oder `widget_keys` gesendet wird.",
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "$ref": "#/components/schemas/ApplicationAnalyticsSummary"
                    },
                    {
                      "$ref": "#/components/schemas/ApplicationAnalyticsWidgetResponse"
                    }
                  ]
                },
                "examples": {
                  "KYC summary": {
                    "value": {
                      "grouping_mode": "day",
                      "data_points": [
                        {
                          "rounded_date": "2026-10-14",
                          "total": 12,
                          "approved": 8,
                          "declined": 1,
                          "canceled": 1,
                          "pending": 2,
                          "in_review": 1,
                          "expired": 1,
                          "abandoned": 0,
                          "in_progress": 1,
                          "not_started": 0,
                          "manually_approved": 1,
                          "manually_declined": 0
                        },
                        {
                          "rounded_date": "2026-10-15",
                          "total": 10,
                          "approved": 6,
                          "declined": 2,
                          "canceled": 0,
                          "pending": 2,
                          "in_review": 2,
                          "expired": 0,
                          "abandoned": 0,
                          "in_progress": 0,
                          "not_started": 0,
                          "manually_approved": 0,
                          "manually_declined": 1
                        }
                      ],
                      "request_breakdown": {
                        "total_approved": 14,
                        "total_in_review": 3,
                        "total_declined": 3,
                        "total_canceled": 1,
                        "total_pending": 4,
                        "total_expired": 1,
                        "total_abandoned": 0,
                        "total_in_progress": 1,
                        "total_not_started": 0,
                        "total_manually_approved": 1,
                        "total_manually_declined": 1
                      },
                      "conversion_rate": 70.0,
                      "location_stats": {
                        "countries": [
                          {
                            "session_count": 15,
                            "country": "Spain",
                            "country_code": "ES"
                          },
                          {
                            "session_count": 7,
                            "country": "Portugal",
                            "country_code": "PT"
                          }
                        ],
                        "ip_countries": [
                          {
                            "session_count": 15,
                            "country": "Spain",
                            "country_code": "ES"
                          },
                          {
                            "session_count": 7,
                            "country": "Portugal",
                            "country_code": "PT"
                          }
                        ],
                        "id_countries": [
                          {
                            "country": "Spain",
                            "country_code": "ES",
                            "session_count": 14
                          },
                          {
                            "country": "Portugal",
                            "country_code": "PT",
                            "session_count": 6
                          }
                        ],
                        "conversion_by_country": [
                          {
                            "country": "Spain",
                            "country_code": "ES",
                            "finished": 13,
                            "approved": 10
                          },
                          {
                            "country": "Portugal",
                            "country_code": "PT",
                            "finished": 6,
                            "approved": 4
                          }
                        ],
                        "cities": [
                          {
                            "session_count": 9,
                            "location": "Madrid, Spain",
                            "latitude": 40.4168,
                            "longitude": -3.7038
                          }
                        ]
                      },
                      "demographic_stats": {
                        "age_distribution": {
                          "under_18": 0,
                          "18_24": 5,
                          "25_34": 8,
                          "35_44": 4,
                          "45_64": 2,
                          "65_plus": 1
                        },
                        "gender_distribution": {
                          "M": 11,
                          "F": 9
                        }
                      },
                      "device_details": {
                        "device_models": [
                          {
                            "device": "Apple",
                            "count": 12
                          },
                          {
                            "device": "Android",
                            "count": 10
                          }
                        ],
                        "browsers": [
                          {
                            "browser": "Safari",
                            "count": 12
                          },
                          {
                            "browser": "Chrome",
                            "count": 10
                          }
                        ],
                        "operating_systems": [
                          {
                            "os": "iOS",
                            "count": 12
                          },
                          {
                            "os": "Android",
                            "count": 10
                          }
                        ]
                      },
                      "workflow_funnel_stats": {
                        "33333333-4444-5555-6666-777777777777": {
                          "total": 22,
                          "steps": {
                            "OCR": {
                              "reached": 21
                            },
                            "LIVENESS": {
                              "reached": 19
                            },
                            "FACE_MATCH": {
                              "reached": 19
                            },
                            "AML": {
                              "reached": 18
                            }
                          }
                        }
                      },
                      "verification_time_stats": {
                        "overall_avg_seconds": 64.0,
                        "overall_count": 18,
                        "per_feature": {
                          "OCR": {
                            "avg_seconds": 41.2,
                            "total_seconds": 741.6,
                            "count": 18
                          },
                          "LIVENESS": {
                            "avg_seconds": 22.8,
                            "total_seconds": 410.4,
                            "count": 18
                          }
                        },
                        "per_sub_step": {
                          "OCR": {
                            "front_id_photo": {
                              "avg_seconds": 18.3,
                              "total_seconds": 329.4,
                              "count": 18
                            }
                          }
                        }
                      },
                      "resubmission_stats": {
                        "first_pass": 17,
                        "second": 2,
                        "third_plus": 1,
                        "abandoned": 0
                      },
                      "warning_stats": {
                        "ID_VERIFICATION": {
                          "total": 21,
                          "risks": {
                            "DOCUMENT_EXPIRED": {
                              "error": 1,
                              "warning": 0,
                              "information": 0
                            }
                          }
                        },
                        "LIVENESS": {
                          "total": 19,
                          "risks": {
                            "LOW_LIVENESS_SCORE": {
                              "error": 0,
                              "warning": 2,
                              "information": 0
                            }
                          }
                        }
                      },
                      "original_status_stats": {
                        "approved": 13,
                        "in_review": 5,
                        "declined": 2
                      },
                      "demographic_time_series": [
                        {
                          "date": "2026-10-14",
                          "age_distribution": {
                            "under_18": 0,
                            "18_24": 3,
                            "25_34": 4,
                            "35_44": 2,
                            "45_64": 1,
                            "65_plus": 0
                          },
                          "gender_distribution": {
                            "M": 6,
                            "F": 4
                          }
                        },
                        {
                          "date": "2026-10-15",
                          "age_distribution": {
                            "under_18": 0,
                            "18_24": 2,
                            "25_34": 4,
                            "35_44": 2,
                            "45_64": 1,
                            "65_plus": 1
                          },
                          "gender_distribution": {
                            "M": 5,
                            "F": 5
                          }
                        }
                      ],
                      "device_time_series": [
                        {
                          "date": "2026-10-14",
                          "devices": {
                            "Apple": 7,
                            "Android": 5
                          },
                          "browsers": {
                            "Safari": 7,
                            "Chrome": 5
                          },
                          "operating_systems": {
                            "iOS": 7,
                            "Android": 5
                          }
                        },
                        {
                          "date": "2026-10-15",
                          "devices": {
                            "Apple": 5,
                            "Android": 5
                          },
                          "browsers": {
                            "Safari": 5,
                            "Chrome": 5
                          },
                          "operating_systems": {
                            "iOS": 5,
                            "Android": 5
                          }
                        }
                      ],
                      "verification_time_time_series": [
                        {
                          "date": "2026-10-14",
                          "overall_avg": 66.1,
                          "per_feature": {
                            "OCR": 42.0,
                            "LIVENESS": 24.1
                          }
                        },
                        {
                          "date": "2026-10-15",
                          "overall_avg": 61.5,
                          "per_feature": {
                            "OCR": 40.2,
                            "LIVENESS": 21.3
                          }
                        }
                      ],
                      "resubmission_time_series": [
                        {
                          "date": "2026-10-14",
                          "first_pass": 9,
                          "second": 1,
                          "third_plus": 0,
                          "abandoned": 0
                        },
                        {
                          "date": "2026-10-15",
                          "first_pass": 8,
                          "second": 1,
                          "third_plus": 1,
                          "abandoned": 0
                        }
                      ],
                      "original_status_time_series": [
                        {
                          "date": "2026-10-14",
                          "approved": 7,
                          "in_review": 3,
                          "declined": 1
                        },
                        {
                          "date": "2026-10-15",
                          "approved": 6,
                          "in_review": 2,
                          "declined": 1
                        }
                      ],
                      "previous_data_points": [
                        {
                          "rounded_date": "2026-10-12",
                          "total": 9,
                          "approved": 6,
                          "declined": 1,
                          "canceled": 1,
                          "pending": 1
                        },
                        {
                          "rounded_date": "2026-10-13",
                          "total": 11,
                          "approved": 7,
                          "declined": 2,
                          "canceled": 0,
                          "pending": 2
                        }
                      ],
                      "previous_request_breakdown": {
                        "total_approved": 13,
                        "total_in_review": 2,
                        "total_declined": 3,
                        "total_canceled": 1,
                        "total_pending": 3
                      }
                    }
                  },
                  "Transaction widgets": {
                    "value": {
                      "scope": "transactions",
                      "available_widget_keys": [
                        "tx_count_total",
                        "tx_count_daily",
                        "tx_volume_total_preferred_currency",
                        "tx_volume_daily_preferred_currency",
                        "tx_average_amount",
                        "tx_average_amount_daily",
                        "tx_transaction_category_breakdown",
                        "tx_action_type_breakdown",
                        "tx_status_volume_trend",
                        "tx_user_ip_or_country_distribution",
                        "tx_tag_breakdown",
                        "tx_top_rules_triggered",
                        "tx_team_member_performance",
                        "tx_score_histogram"
                      ],
                      "requested_widget_keys": [
                        "tx_count_total",
                        "tx_count_daily"
                      ],
                      "widgets": {
                        "tx_count_total": {
                          "kind": "metric",
                          "title": "Transaction count",
                          "value": 42
                        },
                        "tx_count_daily": {
                          "kind": "time_series",
                          "title": "Transaction count",
                          "items": [
                            {
                              "date": "2026-10-14",
                              "value": 20
                            },
                            {
                              "date": "2026-10-15",
                              "value": 22
                            }
                          ],
                          "previous_items": [
                            {
                              "date": "2026-10-12",
                              "value": 18
                            },
                            {
                              "date": "2026-10-13",
                              "value": 15
                            }
                          ]
                        }
                      }
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Ungültiger Datumsbereich oder Scope. Der Body ist ein Objekt mit dem fehlerhaften Parameter als Schlüssel und einer Zeichenfolgennachricht.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": {
                    "type": "string"
                  }
                },
                "examples": {
                  "Bad date format": {
                    "value": {
                      "start_date": "Invalid date format. Use YYYY-MM-DD (e.g., 2024-01-15)."
                    }
                  },
                  "Start after end": {
                    "value": {
                      "start_date": "Start date must be before or equal to end date."
                    }
                  },
                  "Range too long": {
                    "value": {
                      "date_range": "Date range cannot exceed 730 days (2 years)."
                    }
                  },
                  "Unknown scope": {
                    "value": {
                      "scope": "Unsupported analytics scope."
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Der API-Schlüssel ist abgelaufen. Nur ein Schlüssel, der mit einem Ablaufdatum erstellt wurde, kann ablaufen; nach diesem Datum antwortet jede Anfrage damit mit `401`.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string"
                    }
                  }
                },
                "examples": {
                  "Expired key": {
                    "value": {
                      "detail": "This API key has expired."
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Die Anfrage ist nicht zulässig. Prüfen Sie `detail`: ein fehlender API-Schlüssel (ein falscher, widerrufener oder abgelaufener Schlüssel erhält `401`), ein Schlüssel einer anderen Anwendung, ein beliebiger berechtigungsbeschränkter Schlüssel oder eine Anfrage von außerhalb der IP-Liste des Schlüssels.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string"
                    }
                  }
                },
                "examples": {
                  "Missing or invalid key": {
                    "value": {
                      "detail": "Authentication credentials were not provided or are invalid."
                    }
                  },
                  "Another application": {
                    "value": {
                      "detail": "You do not have permission to perform this action."
                    }
                  },
                  "Scoped key": {
                    "value": {
                      "detail": "This API key has no access to this endpoint."
                    }
                  },
                  "Outside the key's IP list": {
                    "value": {
                      "detail": "This API key can't be used from this IP address."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Mehr als 600 GET-Anfragen pro Minute mit diesem API-Schlüssel. Warten Sie die Anzahl der Sekunden in `Retry-After` ab und führen Sie dann einen Wiederholungsversuch durch.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string"
                    }
                  }
                },
                "examples": {
                  "Throttled": {
                    "value": {
                      "detail": "GET request rate limit exceeded. You can make up to 600 requests per minute."
                    }
                  }
                }
              }
            },
            "headers": {
              "Retry-After": {
                "description": "Sekunden bis zum Zurücksetzen des aktuellen Ein-Minuten-Fensters.",
                "schema": {
                  "type": "integer",
                  "example": 23
                }
              },
              "X-RateLimit-Limit": {
                "description": "Pro Minute in diesem Budget zulässige Anfragen.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Im aktuellen Zeitfenster verbleibende Anfragen.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix-Zeit, zu der das Zeitfenster zurückgesetzt wird.",
                "schema": {
                  "type": "integer"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/v3/organization/{organization_id}/application/{application_id}/analytics/today/": {
      "get": {
        "summary": "Heutige Verifizierungen nach Stunde abrufen",
        "operationId": "get_application_analytics_today",
        "x-didit-sdk": {
          "resource": "analytics",
          "method": "retrieve_today",
          "auth": "api_key",
          "server": true,
          "scope": "application"
        },
        "tags": [
          "Analytics"
        ],
        "description": "Die heutigen Benutzerverifizierungs-Sitzungen (KYC) ab lokaler Mitternacht in `tz`, gezählt pro lokaler Stunde, in der sie erstellt wurden, gegenübergestellt mit denselben Stunden desselben Wochentags eine Woche zuvor und aufgeschlüsselt nach dem aktuellen Ergebnis: genehmigt, in Prüfung oder abgelehnt. Dies ist die Volumen-Kachel auf der Startseite der Business Console.\n\n`total` ist der heutige Stand bis jetzt. `previous_total_so_far` zählt den Vergleichstag nur bis zur gleichen Ortszeit, sodass eine Veränderung denselben Teil beider Tage vergleicht. Die noch ausstehenden Stunden von heute sind `0`. Ein Tag mit Zeitumstellung hat 23 oder 25 Stunden: Die fehlende Stunde bleibt `0` und die doppelte Stunde enthält beide.",
        "parameters": [
          {
            "name": "organization_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "UUID der Organisation.",
            "example": "11111111-2222-3333-4444-555555555555"
          },
          {
            "name": "application_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Anwendungs-UUID. Muss die Anwendung sein, zu der der API-Schlüssel gehört: Ein für eine andere Anwendung verwendeter Schlüssel erhält `403`.",
            "example": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee"
          },
          {
            "name": "tz",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "default": "UTC",
              "example": "Europe/Madrid"
            },
            "description": "IANA-Zeitzone, deren Mitternacht den heutigen Tag beginnt, zum Beispiel `Europe/Madrid` oder `America/Mexico_City`. Für UTC weglassen."
          }
        ],
        "responses": {
          "200": {
            "description": "Heutige Verifizierungen nach lokaler Stunde, die des Vergleichstags und die heutigen Ergebnisse.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApplicationAnalyticsToday"
                },
                "examples": {
                  "Madrid, 14:00": {
                    "value": {
                      "time_zone": "Europe/Madrid",
                      "date": "2026-10-30",
                      "current_hour": 14,
                      "previous_date": "2026-10-23",
                      "hours": [
                        3,
                        1,
                        0,
                        0,
                        1,
                        2,
                        4,
                        9,
                        14,
                        18,
                        21,
                        19,
                        22,
                        24,
                        27,
                        0,
                        0,
                        0,
                        0,
                        0,
                        0,
                        0,
                        0,
                        0
                      ],
                      "previous_hours": [
                        2,
                        1,
                        1,
                        0,
                        1,
                        3,
                        5,
                        8,
                        12,
                        16,
                        19,
                        18,
                        20,
                        22,
                        24,
                        26,
                        23,
                        19,
                        15,
                        12,
                        9,
                        7,
                        5,
                        3
                      ],
                      "total": 165,
                      "previous_total_so_far": 151,
                      "outcomes": {
                        "approved": 139,
                        "in_review": 6,
                        "declined": 18
                      }
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Unbekannte Zeitzone. Der Body ist nach dem Parameter gegliedert und enthält eine Liste von Nachrichten.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    }
                  }
                },
                "examples": {
                  "Unknown time zone": {
                    "value": {
                      "tz": [
                        "Unknown time zone: Europe/Atlantis."
                      ]
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Der API-Schlüssel ist abgelaufen. Nur ein Schlüssel, der mit einem Ablaufdatum erstellt wurde, kann ablaufen; nach diesem Datum antwortet jede Anfrage damit mit `401`.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string"
                    }
                  }
                },
                "examples": {
                  "Expired key": {
                    "value": {
                      "detail": "This API key has expired."
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Die Anfrage ist nicht zulässig. Prüfen Sie `detail`: ein fehlender oder ungültiger API-Schlüssel (niemals `401`), ein Schlüssel einer anderen Anwendung, ein beliebiger berechtigungsbeschränkter Schlüssel oder eine Anfrage von außerhalb der IP-Liste des Schlüssels.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string"
                    }
                  }
                },
                "examples": {
                  "Missing or invalid key": {
                    "value": {
                      "detail": "Authentication credentials were not provided or are invalid."
                    }
                  },
                  "Another application": {
                    "value": {
                      "detail": "You do not have permission to perform this action."
                    }
                  },
                  "Scoped key": {
                    "value": {
                      "detail": "This API key has no access to this endpoint."
                    }
                  },
                  "Outside the key's IP list": {
                    "value": {
                      "detail": "This API key can't be used from this IP address."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Mehr als 600 GET-Anfragen pro Minute mit diesem API-Schlüssel. Warten Sie die Anzahl der Sekunden in `Retry-After` ab und führen Sie dann einen Wiederholungsversuch durch.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string"
                    }
                  }
                },
                "examples": {
                  "Throttled": {
                    "value": {
                      "detail": "GET request rate limit exceeded. You can make up to 600 requests per minute."
                    }
                  }
                }
              }
            },
            "headers": {
              "Retry-After": {
                "description": "Sekunden bis zum Zurücksetzen des aktuellen Ein-Minuten-Fensters.",
                "schema": {
                  "type": "integer",
                  "example": 23
                }
              },
              "X-RateLimit-Limit": {
                "description": "Pro Minute in diesem Budget zulässige Anfragen.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Im aktuellen Zeitfenster verbleibende Anfragen.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix-Zeit, zu der das Zeitfenster zurückgesetzt wird.",
                "schema": {
                  "type": "integer"
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X GET 'https://verification.didit.me/v3/organization/11111111-2222-3333-4444-555555555555/application/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/analytics/today/?tz=Europe%2FMadrid' \\\n  -H 'x-api-key: YOUR_API_KEY'"
          }
        ],
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/v3/session/{sessionId}/webhooks/": {
      "get": {
        "summary": "Sitzungs-Webhook-Zustellungen auflisten",
        "description": "Jede von Didit für eine Verifizierungssitzung, einen Benutzer (KYC) oder ein Unternehmen (KYB) erfasste Webhook-Zustellung auflisten, neueste zuerst, als einfaches JSON-Array (nicht paginiert). Jeder Eintrag stellt einen Versuch an ein Ziel dar: der erste Versand, jeder automatische [Wiederholungsversuch](https://docs.didit.me/de/integration/webhooks#wiederholungsrichtlinie) und jeder Neuversand sind separate Einträge mit eigener `uuid`, wobei Wiederholungsversuche und Neuversände die `event_id` der Payload beibehalten. `request_header` und `request_body` sind JSON-Text; parsen Sie diese, um die Signaturen und die Payload auszulesen. Zustellungsprotokolle sind etwa 30 Tage lang verfügbar; ein leeres Array bedeutet daher, dass für die Sitzung noch kein Webhook gesendet wurde oder jede Zustellung älter ist. Ein berechtigungsbeschränkter API-Schlüssel erfordert `sessions: read` und `decisions: read`.",
        "operationId": "get_v3_session_webhooks",
        "x-didit-sdk": {
          "resource": "sessions.webhooks",
          "method": "list",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Sessions"
        ],
        "parameters": [
          {
            "name": "sessionId",
            "in": "path",
            "required": true,
            "description": "UUID der Verifizierungssitzung, Benutzer (KYC) oder Unternehmen (KYB): die von `POST /v3/session/` zurückgegebene `session_id`. Der Server löst sie für beide Sitzungstypen auf.\n\n**Muss eine gültige UUID sein.** Die Route stimmt nur mit wohlgeformten UUIDs überein, sodass ein fehlerhafter Wert vom URL-Router abgelehnt wird, bevor Anwendungscode ausgeführt wird, und die Antwort eine `404`-**HTML**-Seite anstelle des unten gezeigten JSON-Antwortobjekts `{\"detail\": ...}` ist.",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "example": "22222222-3333-4444-5555-666666666666"
          }
        ],
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X GET 'https://verification.didit.me/v3/session/22222222-3333-4444-5555-666666666666/webhooks/' \\\n  -H 'x-api-key: YOUR_API_KEY'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.sessions.webhooks.list(\n    \"22222222-3333-4444-5555-666666666666\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.sessions.webhooks.list(\"22222222-3333-4444-5555-666666666666\");\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Sessions.Webhooks.List(ctx, \"22222222-3333-4444-5555-666666666666\")\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.sessions().webhooks().list(\"22222222-3333-4444-5555-666666666666\");\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->sessions->webhooks->list('22222222-3333-4444-5555-666666666666');\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\ndidit.sessions.webhooks.list(\"22222222-3333-4444-5555-666666666666\").each do |item|\n  puts item.to_h\nend"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Sessions.Webhooks.ListAsync(\"22222222-3333-4444-5555-666666666666\");\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "responses": {
          "200": {
            "description": "Jede für die Sitzung erfasste Zustellung, die neueste zuerst.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/SessionWebhookDelivery"
                  }
                },
                "examples": {
                  "Failed delivery and its successful retry": {
                    "value": [
                      {
                        "uuid": "66666666-7777-8888-9999-000000000002",
                        "session_id": "22222222-3333-4444-5555-666666666666",
                        "request_url": "https://yourapp.com/webhooks/didit",
                        "response_status": 200,
                        "status": "In Progress",
                        "webhook_type": "status.updated",
                        "request_header": "{\"Content-Type\": \"application/json\", \"X-Signature\": \"9188851d160b5b3aacfc946e4dde1f061b7e568662518942c927ddaf507f533d\", \"X-Signature-V2\": \"381236af514d3fb538579365ac5a24f2464ce1b8224c6e770c60d8201c43ecc5\", \"X-Signature-Simple\": \"4740131dc38f29e78a8508371979be74967d5307464494bd3148a03b4d6c8716\", \"X-Timestamp\": \"1792056139\", \"User-Agent\": \"DiditWebhook/2.0 +https://didit.me\"}",
                        "request_body": "{\"application_id\":\"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\",\"created_at\":1792056057,\"environment\":\"live\",\"event_id\":\"33333333-4444-5555-6666-777777777777\",\"sandbox_scenario\":null,\"session_id\":\"22222222-3333-4444-5555-666666666666\",\"status\":\"In Progress\",\"timestamp\":1792056139,\"vendor_data\":\"user-123\",\"webhook_type\":\"status.updated\",\"workflow_id\":\"44444444-5555-6666-7777-888888888888\",\"workflow_version\":3}",
                        "created_at": "2026-10-15T09:22:19.104233Z"
                      },
                      {
                        "uuid": "66666666-7777-8888-9999-000000000001",
                        "session_id": "22222222-3333-4444-5555-666666666666",
                        "request_url": "https://yourapp.com/webhooks/didit",
                        "response_status": 503,
                        "status": "In Progress",
                        "webhook_type": "status.updated",
                        "request_header": "{\"Content-Type\": \"application/json\", \"X-Signature\": \"a5e02a03404e1337a0198e6be15d34abbd053c658a0e51e5d0e78554213ef29b\", \"X-Signature-V2\": \"927e7cb770c94ce745939bff73f04aa200015f3bc64795ba46c2aaf78a6cedc5\", \"X-Signature-Simple\": \"e37b0d4c716c72bb5ae7127b9cc455d28ab4686e9e22312b4ec2327409a73302\", \"X-Timestamp\": \"1792056078\", \"User-Agent\": \"DiditWebhook/2.0 +https://didit.me\"}",
                        "request_body": "{\"application_id\":\"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\",\"created_at\":1792056057,\"environment\":\"live\",\"event_id\":\"33333333-4444-5555-6666-777777777777\",\"sandbox_scenario\":null,\"session_id\":\"22222222-3333-4444-5555-666666666666\",\"status\":\"In Progress\",\"timestamp\":1792056078,\"vendor_data\":\"user-123\",\"webhook_type\":\"status.updated\",\"workflow_id\":\"44444444-5555-6666-7777-888888888888\",\"workflow_version\":3}",
                        "created_at": "2026-10-15T09:21:18.412345Z"
                      }
                    ]
                  },
                  "No webhook sent yet": {
                    "value": []
                  }
                }
              }
            }
          },
          "401": {
            "description": "Der API-Schlüssel ist abgelaufen: Er wurde mit einem Ablaufdatum erstellt, das verstrichen ist. Ein falscher oder widerrufener Schlüssel erhält ebenfalls `401`; ein fehlender Schlüssel erhält `403`.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string",
                      "description": "Lesbare Fehlermeldung."
                    }
                  }
                },
                "examples": {
                  "Expired key": {
                    "value": {
                      "detail": "This API key has expired."
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Die Anfrage ist nicht zulässig. Wenn kein `x-api-key` angegeben ist oder der Schlüssel ungültig oder widerrufen wurde, erhalten Sie `Authentication credentials were not provided or are invalid.` Ein Schlüssel einer anderen Anwendung erhält `You do not have permission to perform this action.` Ein berechtigungsbeschränkter Schlüssel ohne den für diesen Endpoint erforderlichen Zugriff erhält eine Meldung mit dem fehlenden Zugriff, und ein Schlüssel, der außerhalb seiner IP-Allowlist verwendet wird, erhält `This API key can't be used from this IP address.` Eine unbekannte `sessionId` gibt `404` zurück, bevor die Anmeldedaten überprüft werden.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string",
                      "description": "Lesbare Fehlermeldung."
                    }
                  }
                },
                "examples": {
                  "Missing or invalid key": {
                    "value": {
                      "detail": "Authentication credentials were not provided or are invalid."
                    }
                  },
                  "Key of another application": {
                    "value": {
                      "detail": "You do not have permission to perform this action."
                    }
                  },
                  "Scoped key without sessions read": {
                    "value": {
                      "detail": "This API key has no read access to sessions."
                    }
                  },
                  "Scoped key without decisions read": {
                    "value": {
                      "detail": "This API key has no read access to decisions."
                    }
                  },
                  "Outside the IP allowlist": {
                    "value": {
                      "detail": "This API key can't be used from this IP address."
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Die Sitzung existiert nicht oder wurde gelöscht (`Not found.`, Rückgabe vor Prüfung der Anmeldedaten), oder sie liegt außerhalb der Workflow- oder Statusbeschränkungen eines Scoped Keys (`Session not found.`).",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string",
                      "description": "Lesbare Fehlermeldung."
                    }
                  }
                },
                "examples": {
                  "Unknown session": {
                    "value": {
                      "detail": "Not found."
                    }
                  },
                  "Outside the key's limits": {
                    "value": {
                      "detail": "Session not found."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate-Limit überschritten: Mehr als 600 GET-Anfragen im aktuellen Ein-Minuten-Fenster für diesen API-Schlüssel. Warten Sie `Retry-After` Sekunden vor einem Wiederholungsversuch.",
            "headers": {
              "Retry-After": {
                "description": "Sekunden, die vor einem Wiederholungsversuch gewartet werden müssen.",
                "schema": {
                  "type": "integer",
                  "minimum": 1,
                  "example": 30
                }
              },
              "X-RateLimit-Limit": {
                "description": "Im einminütigen Zeitfenster zulässige Anfragen (600).",
                "schema": {
                  "type": "integer",
                  "example": 600
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Im aktuellen Zeitfenster verbleibende Anfragen.",
                "schema": {
                  "type": "integer",
                  "example": 0
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix-Zeit (Sekunden), zu der das aktuelle Zeitfenster zurückgesetzt wird.",
                "schema": {
                  "type": "integer",
                  "example": 1792056120
                }
              },
              "X-RateLimit-Scope": {
                "description": "Name des Budgets, das überschritten wurde.",
                "schema": {
                  "type": "string",
                  "example": "generic-get"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string",
                      "description": "Lesbare Fehlermeldung."
                    }
                  }
                },
                "examples": {
                  "Throttled": {
                    "value": {
                      "detail": "GET request rate limit exceeded. You can make up to 600 requests per minute."
                    }
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/v3/session/{sessionId}/webhook/{webhook_uuid}": {
      "get": {
        "summary": "Zustellung des Sitzungs-Webhooks abrufen",
        "description": "Rufen Sie eine Webhook-Zustellung einer Verifizierungssitzung ab: die URL, an die sie ging, den von Ihrem Endpoint zurückgegebenen HTTP-Status sowie die exakten Header und den JSON-Body, die Didit gesendet hat. `request_header` und `request_body` sind JSON-Texte; um Ihre [Signaturprüfung](https://docs.didit.me/de/integration/webhooks#signaturprüfung) zu testen, berechnen Sie `X-Signature-V2` aus dem geparsten Body mit dem gemeinsamen Geheimnis des Ziel-Webhooks neu (oder dem Geheimnis auf Anwendungsebene bei einer Zustellung an die alte Webhook-URL). Der Pfad hat keinen abschließenden Schrägstrich: mit einem solchen wird `404` zurückgegeben. Ein berechtigungsbeschränkter API-Schlüssel benötigt `sessions: read` und `decisions: read`.",
        "operationId": "get_v3_session_webhook",
        "x-didit-sdk": {
          "resource": "sessions.webhooks",
          "method": "retrieve",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Sessions"
        ],
        "parameters": [
          {
            "name": "sessionId",
            "in": "path",
            "required": true,
            "description": "UUID der Verifizierungssitzung, Benutzer (KYC) oder Unternehmen (KYB): die von `POST /v3/session/` zurückgegebene `session_id`. Der Server löst sie für beide Sitzungstypen auf.\n\n**Muss eine gültige UUID sein.** Die Route stimmt nur mit wohlgeformten UUIDs überein, sodass ein fehlerhafter Wert vom URL-Router abgelehnt wird, bevor Anwendungscode ausgeführt wird, und die Antwort eine `404`-**HTML**-Seite anstelle des unten gezeigten JSON-Antwortobjekts `{\"detail\": ...}` ist.",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "example": "22222222-3333-4444-5555-666666666666"
          },
          {
            "name": "webhook_uuid",
            "in": "path",
            "required": true,
            "description": "UUID der Zustellung: die `uuid` eines von `GET /v3/session/{sessionId}/webhooks/` zurückgegebenen Eintrags. Sie muss zu der Sitzung im Pfad gehören.",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "example": "66666666-7777-8888-9999-000000000001"
          }
        ],
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X GET 'https://verification.didit.me/v3/session/22222222-3333-4444-5555-666666666666/webhook/66666666-7777-8888-9999-000000000001' \\\n  -H 'x-api-key: YOUR_API_KEY'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.sessions.webhooks.retrieve(\n    \"22222222-3333-4444-5555-666666666666\",\n    \"66666666-7777-8888-9999-000000000001\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.sessions.webhooks.retrieve(\n  \"22222222-3333-4444-5555-666666666666\",\n  \"66666666-7777-8888-9999-000000000001\",\n);\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Sessions.Webhooks.Retrieve(ctx, \"22222222-3333-4444-5555-666666666666\", \"66666666-7777-8888-9999-000000000001\")\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.sessions().webhooks().retrieve(\"22222222-3333-4444-5555-666666666666\", \"66666666-7777-8888-9999-000000000001\");\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->sessions->webhooks->retrieve('22222222-3333-4444-5555-666666666666', '66666666-7777-8888-9999-000000000001');\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.sessions.webhooks.retrieve(\n  \"22222222-3333-4444-5555-666666666666\",\n  \"66666666-7777-8888-9999-000000000001\"\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Sessions.Webhooks.RetrieveAsync(\"22222222-3333-4444-5555-666666666666\", \"66666666-7777-8888-9999-000000000001\");\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "responses": {
          "200": {
            "description": "Die Zustellung mit ihren Anfrage-Headern und ihrem Body.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SessionWebhookDelivery"
                },
                "examples": {
                  "Connection failure": {
                    "value": {
                      "uuid": "66666666-7777-8888-9999-000000000001",
                      "session_id": "22222222-3333-4444-5555-666666666666",
                      "request_url": "https://yourapp.com/webhooks/didit",
                      "response_status": 503,
                      "status": "In Progress",
                      "webhook_type": "status.updated",
                      "request_header": "{\"Content-Type\": \"application/json\", \"X-Signature\": \"a5e02a03404e1337a0198e6be15d34abbd053c658a0e51e5d0e78554213ef29b\", \"X-Signature-V2\": \"927e7cb770c94ce745939bff73f04aa200015f3bc64795ba46c2aaf78a6cedc5\", \"X-Signature-Simple\": \"e37b0d4c716c72bb5ae7127b9cc455d28ab4686e9e22312b4ec2327409a73302\", \"X-Timestamp\": \"1792056078\", \"User-Agent\": \"DiditWebhook/2.0 +https://didit.me\"}",
                      "request_body": "{\"application_id\":\"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\",\"created_at\":1792056057,\"environment\":\"live\",\"event_id\":\"33333333-4444-5555-6666-777777777777\",\"sandbox_scenario\":null,\"session_id\":\"22222222-3333-4444-5555-666666666666\",\"status\":\"In Progress\",\"timestamp\":1792056078,\"vendor_data\":\"user-123\",\"webhook_type\":\"status.updated\",\"workflow_id\":\"44444444-5555-6666-7777-888888888888\",\"workflow_version\":3}",
                      "created_at": "2026-10-15T09:21:18.412345Z"
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Der API-Schlüssel ist abgelaufen: Er wurde mit einem Ablaufdatum erstellt, das verstrichen ist. Ein falscher oder widerrufener Schlüssel erhält ebenfalls `401`; ein fehlender Schlüssel erhält `403`.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string",
                      "description": "Lesbare Fehlermeldung."
                    }
                  }
                },
                "examples": {
                  "Expired key": {
                    "value": {
                      "detail": "This API key has expired."
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Die Anfrage ist nicht zulässig. Wenn kein `x-api-key` angegeben ist oder der Schlüssel ungültig oder widerrufen wurde, erhalten Sie `Authentication credentials were not provided or are invalid.` Ein Schlüssel einer anderen Anwendung erhält `You do not have permission to perform this action.` Ein berechtigungsbeschränkter Schlüssel ohne den für diesen Endpoint erforderlichen Zugriff erhält eine Meldung mit dem fehlenden Zugriff, und ein Schlüssel, der außerhalb seiner IP-Allowlist verwendet wird, erhält `This API key can't be used from this IP address.` Eine unbekannte `sessionId` gibt `404` zurück, bevor die Anmeldedaten überprüft werden.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string",
                      "description": "Lesbare Fehlermeldung."
                    }
                  }
                },
                "examples": {
                  "Missing or invalid key": {
                    "value": {
                      "detail": "Authentication credentials were not provided or are invalid."
                    }
                  },
                  "Key of another application": {
                    "value": {
                      "detail": "You do not have permission to perform this action."
                    }
                  },
                  "Scoped key without sessions read": {
                    "value": {
                      "detail": "This API key has no read access to sessions."
                    }
                  },
                  "Scoped key without decisions read": {
                    "value": {
                      "detail": "This API key has no read access to decisions."
                    }
                  },
                  "Outside the IP allowlist": {
                    "value": {
                      "detail": "This API key can't be used from this IP address."
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Die Sitzung existiert nicht oder wurde gelöscht (`Not found.`, Rückgabe vor Prüfung der Anmeldedaten), oder sie liegt außerhalb der Workflow- oder Statusbeschränkungen eines Scoped Keys (`Session not found.`). Eine Zustellung, die nicht existiert, zu einer anderen Sitzung gehört oder nicht mehr verfügbar ist, gibt `No WebhookLog matches the given query.` zurück.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string",
                      "description": "Lesbare Fehlermeldung."
                    }
                  }
                },
                "examples": {
                  "Unknown session": {
                    "value": {
                      "detail": "Not found."
                    }
                  },
                  "Outside the key's limits": {
                    "value": {
                      "detail": "Session not found."
                    }
                  },
                  "Delivery not in this session": {
                    "value": {
                      "detail": "No WebhookLog matches the given query."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate-Limit überschritten: Mehr als 600 GET-Anfragen im aktuellen Ein-Minuten-Fenster für diesen API-Schlüssel. Warten Sie `Retry-After` Sekunden vor einem Wiederholungsversuch.",
            "headers": {
              "Retry-After": {
                "description": "Sekunden, die vor einem Wiederholungsversuch gewartet werden müssen.",
                "schema": {
                  "type": "integer",
                  "minimum": 1,
                  "example": 30
                }
              },
              "X-RateLimit-Limit": {
                "description": "Im einminütigen Zeitfenster zulässige Anfragen (600).",
                "schema": {
                  "type": "integer",
                  "example": 600
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Im aktuellen Zeitfenster verbleibende Anfragen.",
                "schema": {
                  "type": "integer",
                  "example": 0
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix-Zeit (Sekunden), zu der das aktuelle Zeitfenster zurückgesetzt wird.",
                "schema": {
                  "type": "integer",
                  "example": 1792056120
                }
              },
              "X-RateLimit-Scope": {
                "description": "Name des Budgets, das überschritten wurde.",
                "schema": {
                  "type": "string",
                  "example": "generic-get"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string",
                      "description": "Lesbare Fehlermeldung."
                    }
                  }
                },
                "examples": {
                  "Throttled": {
                    "value": {
                      "detail": "GET request rate limit exceeded. You can make up to 600 requests per minute."
                    }
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/v3/session/{sessionId}/webhook/{webhook_uuid}/resend": {
      "post": {
        "summary": "Sitzungs-Webhook-Zustellung erneut senden",
        "description": "Senden Sie einen aufgezeichneten Sitzungs-Webhook erneut an die URL, an die er ursprünglich gesendet wurde – mit demselben Payload und derselben `event_id`, aber einem neuen `timestamp`, `X-Timestamp`-Header und neuen Signaturen. Didit signiert ihn mit dem aktuellen gemeinsamen Geheimnis des Webhook-Ziels, zu dem die Zustellung gehört (oder dem gemeinsamen Geheimnis auf Anwendungsebene für eine Zustellung an die veraltete Webhook-URL), wartet bis zu 5 Sekunden auf Ihren Endpoint, zeichnet den Versuch als neue Zustellung auf und gibt ihn mit `200` zurück, unabhängig davon, was Ihr Endpoint geantwortet hat: Prüfen Sie `response_status`. Ein erneuter Versand wird nicht automatisch wiederholt, und jeder Aufruf sendet erneut. Stellen Sie daher sicher, dass Ihr Endpoint bezüglich `event_id` idempotent ist. Der Pfad enthält keinen abschließenden Schrägstrich und die Anfrage hat keinen Body. Ein bereichsbezogener API-Schlüssel erfordert `webhooks: write` und `decisions: read`.",
        "operationId": "post_v3_session_webhook_resend",
        "x-didit-sdk": {
          "resource": "sessions.webhooks",
          "method": "resend",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Sessions"
        ],
        "parameters": [
          {
            "name": "sessionId",
            "in": "path",
            "required": true,
            "description": "UUID der Verifizierungssitzung, Benutzer (KYC) oder Unternehmen (KYB): die von `POST /v3/session/` zurückgegebene `session_id`. Der Server löst sie für beide Sitzungstypen auf.\n\n**Muss eine gültige UUID sein.** Die Route stimmt nur mit wohlgeformten UUIDs überein, sodass ein fehlerhafter Wert vom URL-Router abgelehnt wird, bevor Anwendungscode ausgeführt wird, und die Antwort eine `404`-**HTML**-Seite anstelle des unten gezeigten JSON-Antwortobjekts `{\"detail\": ...}` ist.",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "example": "22222222-3333-4444-5555-666666666666"
          },
          {
            "name": "webhook_uuid",
            "in": "path",
            "required": true,
            "description": "UUID der erneut zu sendenden Zustellung: die `uuid` eines von `GET /v3/session/{sessionId}/webhooks/` zurückgegebenen Eintrags. Sie muss zu der Sitzung im Pfad gehören.",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "example": "66666666-7777-8888-9999-000000000001"
          }
        ],
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X POST 'https://verification.didit.me/v3/session/22222222-3333-4444-5555-666666666666/webhook/66666666-7777-8888-9999-000000000001/resend' \\\n  -H 'x-api-key: YOUR_API_KEY'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.sessions.webhooks.resend(\n    \"22222222-3333-4444-5555-666666666666\",\n    \"66666666-7777-8888-9999-000000000001\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.sessions.webhooks.resend(\n  \"22222222-3333-4444-5555-666666666666\",\n  \"66666666-7777-8888-9999-000000000001\",\n);\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Sessions.Webhooks.Resend(ctx, \"22222222-3333-4444-5555-666666666666\", \"66666666-7777-8888-9999-000000000001\")\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.sessions().webhooks().resend(\"22222222-3333-4444-5555-666666666666\", \"66666666-7777-8888-9999-000000000001\");\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->sessions->webhooks->resend('22222222-3333-4444-5555-666666666666', '66666666-7777-8888-9999-000000000001');\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.sessions.webhooks.resend(\n  \"22222222-3333-4444-5555-666666666666\",\n  \"66666666-7777-8888-9999-000000000001\"\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Sessions.Webhooks.ResendAsync(\"22222222-3333-4444-5555-666666666666\", \"66666666-7777-8888-9999-000000000001\");\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "responses": {
          "200": {
            "description": "Die neue Zustellung, bereits versucht. `response_status` ist das, was Ihr Endpoint diesmal geantwortet hat. Die ursprüngliche Zustellung bleibt unverändert.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SessionWebhookDelivery"
                },
                "examples": {
                  "Accepted on resend": {
                    "value": {
                      "uuid": "66666666-7777-8888-9999-000000000004",
                      "session_id": "22222222-3333-4444-5555-666666666666",
                      "request_url": "https://yourapp.com/webhooks/didit",
                      "response_status": 200,
                      "status": "In Progress",
                      "webhook_type": "status.updated",
                      "request_header": "{\"Content-Type\": \"application/json\", \"X-Signature\": \"b8eb1e376517ee0cad8ba98ff7f8fd35fc72eca231000963a96a335f82328835\", \"X-Signature-V2\": \"9efd2ce9ed1303e1d05273ef9608a59363ed9789a05253db4748b3e8e50cb109\", \"X-Signature-Simple\": \"bf3a9dc04b2c20ab539203b0cd5cca2a10f630bf62d8feb6d68d82af80f64774\", \"X-Timestamp\": \"1792159542\", \"User-Agent\": \"DiditWebhook/2.0 +https://didit.me\"}",
                      "request_body": "{\"application_id\":\"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\",\"created_at\":1792056057,\"environment\":\"live\",\"event_id\":\"33333333-4444-5555-6666-777777777777\",\"sandbox_scenario\":null,\"session_id\":\"22222222-3333-4444-5555-666666666666\",\"status\":\"In Progress\",\"timestamp\":1792159542,\"vendor_data\":\"user-123\",\"webhook_type\":\"status.updated\",\"workflow_id\":\"44444444-5555-6666-7777-888888888888\",\"workflow_version\":3}",
                      "created_at": "2026-10-16T14:05:42.330981Z"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Die Zustellung konnte nicht erneut gesendet werden. Verzweigen Sie nach `code`: `webhook_url_missing` bedeutet, dass für die Zustellung keine URL hinterlegt ist und nichts gesendet wird; `webhook_resend_error` bedeutet, dass die gespeicherte Zustellung nicht erneut signiert oder der Versuch nicht abgeschlossen werden konnte. Nach `webhook_resend_error` beginnt `detail` mit `Error processing webhook resend:`, gefolgt von einem Diagnosetext, der sich ändern kann.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string",
                      "description": "Lesbare Fehlermeldung."
                    },
                    "code": {
                      "type": "string",
                      "description": "Stabiler maschinenlesbarer Fehlercode. Verzweigen Sie anhand dieses Codes, nicht anhand von `detail`."
                    }
                  }
                },
                "examples": {
                  "No recorded URL": {
                    "value": {
                      "detail": "The webhook delivery does not have a request URL configured",
                      "code": "webhook_url_missing"
                    }
                  },
                  "Resend failed": {
                    "value": {
                      "detail": "Error processing webhook resend: Invalid webhook data format",
                      "code": "webhook_resend_error"
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Der API-Schlüssel ist abgelaufen: Er wurde mit einem Ablaufdatum erstellt, das verstrichen ist. Ein falscher oder widerrufener Schlüssel erhält ebenfalls `401`; ein fehlender Schlüssel erhält `403`.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string",
                      "description": "Lesbare Fehlermeldung."
                    }
                  }
                },
                "examples": {
                  "Expired key": {
                    "value": {
                      "detail": "This API key has expired."
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Die Anfrage ist nicht zulässig. Wenn kein `x-api-key` angegeben ist oder der Schlüssel ungültig oder widerrufen wurde, erhalten Sie `Authentication credentials were not provided or are invalid.` Ein Schlüssel einer anderen Anwendung erhält `You do not have permission to perform this action.` Ein berechtigungsbeschränkter Schlüssel ohne den für diesen Endpoint erforderlichen Zugriff erhält eine Meldung mit dem fehlenden Zugriff, und ein Schlüssel, der außerhalb seiner IP-Allowlist verwendet wird, erhält `This API key can't be used from this IP address.` Eine unbekannte `sessionId` gibt `404` zurück, bevor die Anmeldedaten überprüft werden.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string",
                      "description": "Lesbare Fehlermeldung."
                    }
                  }
                },
                "examples": {
                  "Missing or invalid key": {
                    "value": {
                      "detail": "Authentication credentials were not provided or are invalid."
                    }
                  },
                  "Key of another application": {
                    "value": {
                      "detail": "You do not have permission to perform this action."
                    }
                  },
                  "Scoped key without webhooks write": {
                    "value": {
                      "detail": "This API key has no write access to webhooks."
                    }
                  },
                  "Scoped key without decisions read": {
                    "value": {
                      "detail": "This API key has no read access to decisions."
                    }
                  },
                  "Outside the IP allowlist": {
                    "value": {
                      "detail": "This API key can't be used from this IP address."
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Die Sitzung existiert nicht oder wurde gelöscht (`Not found.`, Rückgabe vor Prüfung der Anmeldedaten), oder sie liegt außerhalb der Workflow- oder Statusbeschränkungen eines Scoped Keys (`Session not found.`). Eine Zustellung, die nicht existiert, zu einer anderen Sitzung gehört oder nicht mehr verfügbar ist, gibt `Webhook log not found` zurück.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string",
                      "description": "Lesbare Fehlermeldung."
                    }
                  }
                },
                "examples": {
                  "Unknown session": {
                    "value": {
                      "detail": "Not found."
                    }
                  },
                  "Outside the key's limits": {
                    "value": {
                      "detail": "Session not found."
                    }
                  },
                  "Delivery not in this session": {
                    "value": {
                      "detail": "Webhook log not found"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate-Limit überschritten: Mehr als 300 Schreibanfragen (POST, PATCH, PUT, DELETE) im aktuellen Ein-Minuten-Fenster für diesen API-Schlüssel. Warten Sie `Retry-After` Sekunden vor einem Wiederholungsversuch.",
            "headers": {
              "Retry-After": {
                "description": "Sekunden, die vor einem Wiederholungsversuch gewartet werden müssen.",
                "schema": {
                  "type": "integer",
                  "minimum": 1,
                  "example": 30
                }
              },
              "X-RateLimit-Limit": {
                "description": "Im einminütigen Zeitfenster zulässige Anfragen (300).",
                "schema": {
                  "type": "integer",
                  "example": 300
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Im aktuellen Zeitfenster verbleibende Anfragen.",
                "schema": {
                  "type": "integer",
                  "example": 0
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix-Zeit (Sekunden), zu der das aktuelle Zeitfenster zurückgesetzt wird.",
                "schema": {
                  "type": "integer",
                  "example": 1792056120
                }
              },
              "X-RateLimit-Scope": {
                "description": "Name des Budgets, das überschritten wurde.",
                "schema": {
                  "type": "string",
                  "example": "generic-write"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string",
                      "description": "Lesbare Fehlermeldung."
                    }
                  }
                },
                "examples": {
                  "Throttled": {
                    "value": {
                      "detail": "Write request rate limit exceeded. You can make up to 300 requests per minute."
                    }
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/v3/session/{sessionId}/events/": {
      "get": {
        "summary": "Sitzungsereignisse auflisten",
        "description": "Lesen Sie die Ereignis-Zeitleiste einer einzelnen Verifizierungssitzung aus, sortiert nach `sent_at` (neueste zuerst): die Bildschirme, die der Benutzer gesehen hat, Schaltflächen und Uploads, fehlgeschlagene Versuche, Status- und Funktionsschritt-Änderungen sowie das Workflow-Routing-Protokoll. Funktioniert für Sitzungs-IDs der Benutzerverifizierung (KYC) und Unternehmensverifizierung (KYB). Ereignisse werden asynchron gespeichert, sodass ein neues Ereignis einige Sekunden benötigen kann, um zu erscheinen. Die Ergebnisse sind mit `limit` und `offset` paginiert; folgen Sie `next`, bis dieser `null` ist. Ein berechtigungsbeschränkter API-Schlüssel erfordert `sessions: read` und `decisions: read`; ohne `media: read` wird `file_url` als `null` zurückgegeben. Die Routing-Ereignisse sind in [Sitzung abrufen](https://docs.didit.me/de/sessions-api/retrieve-session) beschrieben.",
        "operationId": "get_v3_session_events",
        "x-didit-sdk": {
          "resource": "sessions",
          "method": "list_events",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Sessions"
        ],
        "parameters": [
          {
            "name": "sessionId",
            "in": "path",
            "required": true,
            "description": "UUID der Verifizierungssitzung (die von `POST /v3/session/` zurückgegebene `session_id`). Akzeptiert Sitzungs-IDs sowohl für die Benutzerverifizierung (KYC) als auch für die Unternehmensverifizierung (KYB): Der Server löst die ID über beide Sitzungstypen hinweg auf. Muss eine wohlgeformte UUID sein; ein fehlerhafter Wert entspricht nicht der Route und gibt ein HTML-`404` zurück.",
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "11111111-2222-3333-4444-555555555555"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Maximale Anzahl an Ereignissen pro Seite. Standardmäßig 50. Ein Wert unter 1 oder ein nicht-numerischer Wert fällt auf 50 zurück; ein Wert über 1.000.000 gibt `400` zurück.",
            "schema": {
              "type": "integer",
              "default": 50,
              "minimum": 1,
              "maximum": 1000000,
              "example": 50
            }
          },
          {
            "name": "offset",
            "in": "query",
            "required": false,
            "description": "Anzahl der vor dem ersten zurückgegebenen Ergebnis zu überspringenden Ergebnisse. Standardmäßig 0; ein negativer oder nicht-numerischer Wert fällt auf 0 zurück, ein Wert über 1.000.000 gibt `400` zurück. Folgen Sie vorzugsweise den `next`- und `previous`-URLs.",
            "schema": {
              "type": "integer",
              "default": 0,
              "minimum": 0,
              "maximum": 1000000,
              "example": 0
            }
          },
          {
            "name": "ordering",
            "in": "query",
            "required": false,
            "description": "Optionale Überschreibung der Sortierung. Die Standardreihenfolge ist `-sent_at`. Übergeben Sie den Namen eines Ergebnisfelds (z. B. `sent_at`, `created_at`, `event_type`, `feature_step` oder `step`), um aufsteigend zu sortieren, stellen Sie ein `-` voran, um absteigend zu sortieren, und trennen Sie mehrere Felder durch Kommas. Unbekannte Felder werden ignoriert.",
            "schema": {
              "type": "string",
              "example": "sent_at"
            }
          }
        ],
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X GET 'https://verification.didit.me/v3/session/11111111-2222-3333-4444-555555555555/events/?limit=50' \\\n  -H 'x-api-key: YOUR_API_KEY'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nfor item in client.sessions.list_events(\n    \"11111111-2222-3333-4444-555555555555\",\n):\n    print(item)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nfor await (const item of didit.sessions.listEvents(\"11111111-2222-3333-4444-555555555555\")) {\n  console.log(item);\n}"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\niter := client.Sessions.ListEventsAutoPaging(ctx, \"11111111-2222-3333-4444-555555555555\", didit.SessionsListEventsParams{})\nfor iter.Next() {\n\tfmt.Printf(\"%+v\\n\", iter.Current())\n}\nif err := iter.Err(); err != nil {\n\tlog.Fatal(err)\n}"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nfor (var item : client.sessions().listEvents(\"11111111-2222-3333-4444-555555555555\")) {\n    System.out.println(item);\n}"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\nforeach ($didit->sessions->listEvents('11111111-2222-3333-4444-555555555555') as $item) {\n    print_r($item->toArray());\n}"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\ndidit.sessions.list_events(\"11111111-2222-3333-4444-555555555555\").auto_paging_each do |item|\n  puts item.to_h\nend"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nawait foreach (var item in await client.Sessions.ListEventsAsync(\"11111111-2222-3333-4444-555555555555\"))\n{\n    Console.WriteLine(JsonSerializer.Serialize(item));\n}"
          }
        ],
        "responses": {
          "200": {
            "description": "Eine Seite mit den Ereignissen der Sitzung, neueste zuerst.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "count",
                    "next",
                    "previous",
                    "results"
                  ],
                  "properties": {
                    "count": {
                      "type": "integer",
                      "description": "Gesamtzahl der Ereignisse der Sitzung."
                    },
                    "next": {
                      "type": "string",
                      "format": "uri",
                      "nullable": true,
                      "description": "URL der nächsten Seite oder `null` auf der letzten Seite."
                    },
                    "previous": {
                      "type": "string",
                      "format": "uri",
                      "nullable": true,
                      "description": "URL der vorherigen Seite oder `null` auf der ersten Seite."
                    },
                    "results": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/SessionEvent"
                      }
                    }
                  }
                },
                "examples": {
                  "Completed session": {
                    "value": {
                      "count": 3,
                      "next": null,
                      "previous": null,
                      "results": [
                        {
                          "uuid": "aaaaaaaa-1111-2222-3333-444444444444",
                          "event_type": "SESSION_STATUS_CHANGED",
                          "created_at": "2026-09-14T10:02:13.904512Z",
                          "component": null,
                          "feature_step": null,
                          "step": null,
                          "details": {
                            "old_status": "In Progress",
                            "current_status": "Approved"
                          },
                          "ip_address": null,
                          "user_agent": null,
                          "device_info": null,
                          "file_url": null,
                          "sent_at": 1789380131482
                        },
                        {
                          "uuid": "bbbbbbbb-1111-2222-3333-444444444444",
                          "event_type": "FEATURE_STEP_CHANGED",
                          "created_at": "2026-09-14T10:01:49.210377Z",
                          "component": null,
                          "feature_step": null,
                          "step": null,
                          "details": {
                            "old_feature_step": "OCR",
                            "current_feature_step": "LIVENESS"
                          },
                          "ip_address": null,
                          "user_agent": null,
                          "device_info": null,
                          "file_url": null,
                          "sent_at": 1789380107103
                        },
                        {
                          "uuid": "cccccccc-1111-2222-3333-444444444444",
                          "event_type": "STEP_RENDERED",
                          "created_at": "2026-09-14T10:01:00.581930Z",
                          "component": "DocumentCapture",
                          "feature_step": "OCR",
                          "step": "DOCUMENT_CAPTURE_FRONT",
                          "details": {},
                          "ip_address": "203.0.113.24",
                          "user_agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 18_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.5 Mobile/15E148 Safari/604.1",
                          "device_info": {
                            "device_model": "iPhone"
                          },
                          "file_url": null,
                          "sent_at": 1789380058776
                        }
                      ]
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "`limit` oder `offset` liegt über 1,000,000. Der Body ist ein JSON-Array mit einer Nachricht.",
            "content": {
              "application/json": {
                "examples": {
                  "Limit too large": {
                    "summary": "limit=2000000",
                    "value": [
                      "limit must not exceed 1000000."
                    ]
                  },
                  "Offset too large": {
                    "summary": "offset=2000000",
                    "value": [
                      "offset must not exceed 1000000."
                    ]
                  }
                },
                "schema": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  }
                }
              }
            }
          },
          "401": {
            "description": "Der API-Schlüssel mit eingeschränktem Geltungsbereich ist abgelaufen. Dies ist der einzige Fall, der `401` zurückgibt: Ein fehlender, ungültiger oder widerrufener Schlüssel gibt `403` zurück.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string",
                      "description": "Lesbare Fehlermeldung."
                    }
                  }
                },
                "examples": {
                  "Expired key": {
                    "summary": "Das Ablaufdatum des Schlüssels ist überschritten",
                    "value": {
                      "detail": "This API key has expired."
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Authentifizierungs- oder Autorisierungsfehler. Ein fehlender Schlüssel gibt `403` zurück, ebenso wie der Schlüssel einer anderen Anwendung, ein berechtigungsbeschränkter Schlüssel ohne die für diesen Endpoint erforderliche Berechtigung sowie eine Anfrage von außerhalb der IP-Allowlist des Schlüssels; ein falscher, widerrufener oder abgelaufener Schlüssel gibt `401` zurück. Unterscheiden Sie diese anhand von `detail`.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string",
                      "description": "Lesbare Fehlermeldung."
                    }
                  }
                },
                "examples": {
                  "Missing or invalid credentials": {
                    "summary": "Kein x-api-key-Header vorhanden oder die Validierung des Schlüssels ist fehlgeschlagen",
                    "value": {
                      "detail": "Authentication credentials were not provided or are invalid."
                    }
                  },
                  "Other application": {
                    "summary": "Ein gültiger Schlüssel, der zu einer anderen Anwendung als die Sitzung gehört",
                    "value": {
                      "detail": "You do not have permission to perform this action."
                    }
                  },
                  "Scoped key without sessions read": {
                    "summary": "Dem Schlüssel mit eingeschränktem Berechtigungsumfang fehlt sessions: read",
                    "value": {
                      "detail": "This API key has no read access to sessions."
                    }
                  },
                  "Scoped key without decisions read": {
                    "summary": "Dem Schlüssel mit eingeschränktem Berechtigungsumfang fehlt decisions: read",
                    "value": {
                      "detail": "This API key has no read access to decisions."
                    }
                  },
                  "IP not allowed": {
                    "summary": "Anfrage von außerhalb der IP-Allowlist des Schlüssels",
                    "value": {
                      "detail": "This API key can't be used from this IP address."
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Die Sitzung existiert nicht, wurde gelöscht oder liegt außerhalb der Beschränkungen eines Scoped Keys hinsichtlich des Workflows oder der Beschränkung auf genehmigte Sitzungen. Die Sitzungssuche erfolgt vor der Prüfung der Anmeldedaten, sodass eine unbekannte `sessionId` auch ohne gültigen Schlüssel `404` zurückgibt.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string",
                      "description": "Lesbare Fehlermeldung."
                    }
                  }
                },
                "examples": {
                  "Unknown session": {
                    "summary": "Es existiert keine Sitzung mit dieser ID oder sie wurde gelöscht",
                    "value": {
                      "detail": "Not found."
                    }
                  },
                  "Outside key limits": {
                    "summary": "Die Sitzung liegt außerhalb der Beschränkungen eines Scoped Keys hinsichtlich des Workflows oder der Beschränkung auf genehmigte Sitzungen",
                    "value": {
                      "detail": "Session not found."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate-Limit überschritten: 600 GET-Anfragen pro Minute pro API-Schlüssel. Warten Sie `Retry-After` Sekunden vor einem Wiederholungsversuch; die `X-RateLimit-*`-Header zeigen das Kontingent an.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string",
                      "description": "Lesbare Fehlermeldung."
                    }
                  }
                },
                "examples": {
                  "Rate limited": {
                    "summary": "Budget für die aktuelle Minute erschöpft",
                    "value": {
                      "detail": "GET request rate limit exceeded. You can make up to 600 requests per minute."
                    }
                  }
                }
              }
            },
            "headers": {
              "Retry-After": {
                "description": "Sekunden, die vor einem Wiederholungsversuch gewartet werden müssen.",
                "schema": {
                  "type": "integer",
                  "minimum": 1,
                  "example": 30
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/v3/session/{sessionId}/aml-screening-history/": {
      "get": {
        "summary": "AML-Screening-Historie auflisten",
        "description": "Jedes abgeschlossene Re-Screening der laufenden Überwachung für die AML-Prüfung einer Sitzung auflisten, neueste zuerst nach `completed_at`, einschließlich der Durchläufe ohne Änderungen: Alerts, Aktivitätseinträge und Webhooks werden nur ausgelöst, wenn sich ein Ergebnis ändert; dieser Verlauf dient daher als Nachweis, dass eine unauffällige Entität weiterhin einem Screening unterzogen wurde. Funktioniert für KYC- und KYB-Sitzungs-IDs; übergeben Sie `node_id`, wenn die Sitzung mehr als einen AML-Schritt ausgeführt hat. Es werden nur Re-Screenings der laufenden Überwachung aufgeführt (das erste Screening ist Teil der Sitzungsentscheidung) und Durchläufe vor der Einführung dieses Verlaufs werden nicht rekonstruiert; eine Sitzung ohne laufende Überwachung gibt daher eine leere Liste zurück. `count` ist bis 100 exakt und darüber auf 100 begrenzt, folgen Sie also `next`, bis der Wert `null` ist. Übergeben Sie `month`, um jeweils einen Kalendermonat auszulesen. Ein berechtigungsbeschränkter API-Schlüssel erfordert `decisions: read`; siehe [Laufende AML-Überwachung](https://docs.didit.me/de/core-technology/aml-screening/continuous-monitoring-aml-screening).",
        "operationId": "get_v3_session_aml_screening_history",
        "x-didit-sdk": {
          "resource": "sessions",
          "method": "list_aml_screening_history",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Sessions"
        ],
        "parameters": [
          {
            "name": "sessionId",
            "in": "path",
            "required": true,
            "description": "UUID der Verifizierungssitzung (die von `POST /v3/session/` zurückgegebene `session_id`). Akzeptiert Sitzungs-IDs sowohl für die Benutzerverifizierung (KYC) als auch für die Unternehmensverifizierung (KYB): Der Server löst die ID über beide Sitzungstypen hinweg auf. Muss eine wohlgeformte UUID sein; ein fehlerhafter Wert entspricht nicht der Route und gibt ein HTML-`404` zurück.",
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "11111111-2222-3333-4444-555555555555"
            }
          },
          {
            "name": "node_id",
            "in": "query",
            "required": false,
            "description": "Workflow-Graph-Knoten-ID der AML-Prüfung. Nur erforderlich, wenn die Sitzung mehr als einen AML-Schritt durchlaufen hat; ohne diese Angabe wird die jüngste AML-Prüfung verwendet. Ein unbekannter Knoten gibt `404` zurück.",
            "schema": {
              "type": "string",
              "example": "feature_aml_1"
            }
          },
          {
            "name": "month",
            "in": "query",
            "required": false,
            "description": "Ein UTC-Kalendermonat im Format `YYYY-MM`. Nur in diesem Monat abgeschlossene Screenings werden zurückgegeben; ohne diese Angabe wird jeder Monat zurückgegeben. Ein fehlerhafter Monat gibt `400` zurück.",
            "schema": {
              "type": "string",
              "pattern": "^\\d{4}-(0[1-9]|1[0-2])$",
              "example": "2026-09"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Maximale Anzahl an Screening-Durchläufen pro Seite. Standardmäßig 50. Ein Wert unter 1 oder ein nicht-numerischer Wert fällt auf 50 zurück; ein Wert über 1.000.000 gibt `400` zurück.",
            "schema": {
              "type": "integer",
              "default": 50,
              "minimum": 1,
              "maximum": 1000000,
              "example": 50
            }
          },
          {
            "name": "offset",
            "in": "query",
            "required": false,
            "description": "Anzahl der vor dem ersten zurückgegebenen Ergebnis zu überspringenden Ergebnisse. Standardmäßig 0; ein negativer oder nicht-numerischer Wert fällt auf 0 zurück, ein Wert über 1.000.000 gibt `400` zurück. Folgen Sie vorzugsweise den `next`- und `previous`-URLs.",
            "schema": {
              "type": "integer",
              "default": 0,
              "minimum": 0,
              "maximum": 1000000,
              "example": 0
            }
          },
          {
            "name": "ordering",
            "in": "query",
            "required": false,
            "description": "Optionale Überschreibung der Sortierung. Die Standardreihenfolge ist `-completed_at`. Übergeben Sie den Namen eines Ergebnisfelds (z. B. `completed_at`, `started_at`, `outcome` oder `score`), um aufsteigend zu sortieren, stellen Sie ein `-` voran, um absteigend zu sortieren, und trennen Sie mehrere Felder durch Kommas. Unbekannte Felder werden ignoriert.",
            "schema": {
              "type": "string",
              "example": "completed_at"
            }
          }
        ],
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X GET 'https://verification.didit.me/v3/session/11111111-2222-3333-4444-555555555555/aml-screening-history/' \\\n  -H 'x-api-key: YOUR_API_KEY'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nfor item in client.sessions.list_aml_screening_history(\n    \"11111111-2222-3333-4444-555555555555\",\n):\n    print(item)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nfor await (const item of didit.sessions.listAmlScreeningHistory(\"11111111-2222-3333-4444-555555555555\")) {\n  console.log(item);\n}"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\niter := client.Sessions.ListAMLScreeningHistoryAutoPaging(ctx, \"11111111-2222-3333-4444-555555555555\", didit.SessionsListAMLScreeningHistoryParams{})\nfor iter.Next() {\n\tfmt.Printf(\"%+v\\n\", iter.Current())\n}\nif err := iter.Err(); err != nil {\n\tlog.Fatal(err)\n}"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nfor (var item : client.sessions().listAmlScreeningHistory(\"11111111-2222-3333-4444-555555555555\")) {\n    System.out.println(item);\n}"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\nforeach ($didit->sessions->listAmlScreeningHistory('11111111-2222-3333-4444-555555555555') as $item) {\n    print_r($item->toArray());\n}"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\ndidit.sessions.list_aml_screening_history(\"11111111-2222-3333-4444-555555555555\").auto_paging_each do |item|\n  puts item.to_h\nend"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nawait foreach (var item in await client.Sessions.ListAmlScreeningHistoryAsync(\"11111111-2222-3333-4444-555555555555\"))\n{\n    Console.WriteLine(JsonSerializer.Serialize(item));\n}"
          }
        ],
        "responses": {
          "200": {
            "description": "Eine Seite mit Screening-Durchläufen, neueste zuerst.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "count",
                    "next",
                    "previous",
                    "results"
                  ],
                  "properties": {
                    "count": {
                      "type": "integer",
                      "maximum": 100,
                      "description": "Anzahl der Durchläufe, exakt bis 100 und darüber auf 100 begrenzt."
                    },
                    "next": {
                      "type": "string",
                      "format": "uri",
                      "nullable": true,
                      "description": "URL der nächsten Seite oder `null` auf der letzten Seite."
                    },
                    "previous": {
                      "type": "string",
                      "format": "uri",
                      "nullable": true,
                      "description": "URL der vorherigen Seite oder `null` auf der ersten Seite."
                    },
                    "results": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/AMLScreeningRun"
                      }
                    }
                  }
                },
                "examples": {
                  "Monitored subject": {
                    "value": {
                      "count": 2,
                      "next": null,
                      "previous": null,
                      "results": [
                        {
                          "uuid": "dddddddd-1111-2222-3333-444444444444",
                          "run_id": "aaaaaaaa-1111-2222-3333-444444444444",
                          "completed_at": "2026-09-14T04:12:33.481207Z",
                          "started_at": "2026-09-14T04:00:01.002311Z",
                          "outcome": "NO_CHANGE",
                          "trigger": "ONGOING_MONITORING",
                          "provider": "aml_data_source",
                          "status": "Approved",
                          "score": 0.0,
                          "total_hits": 0,
                          "new_hits": 0,
                          "entities_screened": 1,
                          "dataset_freshness": {
                            "captured_at": "2026-09-14T03:58:02.114820+00:00",
                            "provider": "aml_data_source",
                            "catalog_version": "2026-09-13",
                            "sources": {
                              "sanctions": {
                                "last_updated_at": "2026-09-13T21:10:00+00:00",
                                "oldest_updated_at": "2026-09-11T06:00:00+00:00",
                                "dataset_count": 120,
                                "dated_dataset_count": 120
                              },
                              "pep": {
                                "last_updated_at": "2026-09-13T08:00:00+00:00",
                                "oldest_updated_at": null,
                                "dataset_count": 45,
                                "dated_dataset_count": 44
                              },
                              "warnings": {
                                "last_updated_at": "2026-09-12T18:45:00+00:00",
                                "oldest_updated_at": "2026-09-01T00:00:00+00:00",
                                "dataset_count": 30,
                                "dated_dataset_count": 30
                              }
                            }
                          }
                        },
                        {
                          "uuid": "eeeeeeee-1111-2222-3333-444444444444",
                          "run_id": "bbbbbbbb-1111-2222-3333-444444444444",
                          "completed_at": "2026-09-13T04:11:58.020914Z",
                          "started_at": "2026-09-13T04:00:00.871022Z",
                          "outcome": "FAILED",
                          "trigger": "ONGOING_MONITORING",
                          "provider": "aml_data_source",
                          "status": "Approved",
                          "score": 0.0,
                          "total_hits": 0,
                          "new_hits": null,
                          "entities_screened": 0,
                          "dataset_freshness": null
                        }
                      ]
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "`limit` oder `offset` liegt über 1,000,000 (ein JSON-Array mit einer Nachricht), oder `month` ist kein `YYYY-MM`-Kalendermonat (ein Objekt mit dem Schlüssel `month`).",
            "content": {
              "application/json": {
                "examples": {
                  "Limit too large": {
                    "summary": "limit=2000000",
                    "value": [
                      "limit must not exceed 1000000."
                    ]
                  },
                  "Offset too large": {
                    "summary": "offset=2000000",
                    "value": [
                      "offset must not exceed 1000000."
                    ]
                  },
                  "Malformed month": {
                    "summary": "month=2026-13",
                    "value": {
                      "month": [
                        "Not a calendar month. Use YYYY-MM."
                      ]
                    }
                  }
                },
                "schema": {
                  "oneOf": [
                    {
                      "type": "array",
                      "items": {
                        "type": "string"
                      }
                    },
                    {
                      "type": "object",
                      "properties": {
                        "month": {
                          "type": "array",
                          "items": {
                            "type": "string"
                          }
                        }
                      }
                    }
                  ]
                }
              }
            }
          },
          "401": {
            "description": "Der API-Schlüssel mit eingeschränktem Geltungsbereich ist abgelaufen. Dies ist der einzige Fall, der `401` zurückgibt: Ein fehlender, ungültiger oder widerrufener Schlüssel gibt `403` zurück.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string",
                      "description": "Lesbare Fehlermeldung."
                    }
                  }
                },
                "examples": {
                  "Expired key": {
                    "summary": "Das Ablaufdatum des Schlüssels ist überschritten",
                    "value": {
                      "detail": "This API key has expired."
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Authentifizierungs- oder Autorisierungsfehler. Ein fehlender Schlüssel gibt `403` zurück, ebenso wie der Schlüssel einer anderen Anwendung, ein berechtigungsbeschränkter Schlüssel ohne die für diesen Endpoint erforderliche Berechtigung sowie eine Anfrage von außerhalb der IP-Allowlist des Schlüssels; ein falscher, widerrufener oder abgelaufener Schlüssel gibt `401` zurück. Unterscheiden Sie diese anhand von `detail`.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string",
                      "description": "Lesbare Fehlermeldung."
                    }
                  }
                },
                "examples": {
                  "Missing or invalid credentials": {
                    "summary": "Kein x-api-key-Header vorhanden oder die Validierung des Schlüssels ist fehlgeschlagen",
                    "value": {
                      "detail": "Authentication credentials were not provided or are invalid."
                    }
                  },
                  "Other application": {
                    "summary": "Ein gültiger Schlüssel, der zu einer anderen Anwendung als die Sitzung gehört",
                    "value": {
                      "detail": "You do not have permission to perform this action."
                    }
                  },
                  "Scoped key without decisions read": {
                    "summary": "Dem Schlüssel mit eingeschränktem Berechtigungsumfang fehlt decisions: read",
                    "value": {
                      "detail": "This API key has no read access to decisions."
                    }
                  },
                  "IP not allowed": {
                    "summary": "Anfrage von außerhalb der IP-Allowlist des Schlüssels",
                    "value": {
                      "detail": "This API key can't be used from this IP address."
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Die Sitzung existiert nicht, wurde gelöscht oder liegt außerhalb der Beschränkungen eines Scoped Keys, oder sie verfügt über keine AML-Prüfung (für die angegebene `node_id`). Die Sitzungssuche erfolgt vor der Prüfung der Anmeldedaten, sodass eine unbekannte `sessionId` auch ohne gültigen Schlüssel `404` zurückgibt.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string",
                      "description": "Lesbare Fehlermeldung."
                    }
                  }
                },
                "examples": {
                  "Unknown session": {
                    "summary": "Es existiert keine Sitzung mit dieser ID oder sie wurde gelöscht",
                    "value": {
                      "detail": "Not found."
                    }
                  },
                  "Outside key limits": {
                    "summary": "Die Sitzung liegt außerhalb der Beschränkungen eines Scoped Keys (wird auch für eine vor Kurzem gelöschte Sitzung zurückgegeben)",
                    "value": {
                      "detail": "Session not found."
                    }
                  },
                  "No AML check": {
                    "summary": "Die Sitzung hat nie einen AML-Schritt ausgeführt",
                    "value": {
                      "detail": "The session does not have an AML check."
                    }
                  },
                  "No AML check for node": {
                    "summary": "node_id stimmt mit keiner AML-Prüfung der Sitzung überein",
                    "value": {
                      "detail": "The session does not have an AML check for node 'feature_aml_2'."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate-Limit überschritten: 600 GET-Anfragen pro Minute pro API-Schlüssel. Warten Sie `Retry-After` Sekunden vor einem Wiederholungsversuch; die `X-RateLimit-*`-Header zeigen das Kontingent an.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string",
                      "description": "Lesbare Fehlermeldung."
                    }
                  }
                },
                "examples": {
                  "Rate limited": {
                    "summary": "Budget für die aktuelle Minute erschöpft",
                    "value": {
                      "detail": "GET request rate limit exceeded. You can make up to 600 requests per minute."
                    }
                  }
                }
              }
            },
            "headers": {
              "Retry-After": {
                "description": "Sekunden, die vor einem Wiederholungsversuch gewartet werden müssen.",
                "schema": {
                  "type": "integer",
                  "minimum": 1,
                  "example": 30
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/v3/session/{sessionId}/aml-screening-history/export/": {
      "get": {
        "summary": "AML-Screening-Verlauf als CSV exportieren",
        "description": "Laden Sie denselben Verlauf der laufenden AML-Überwachung wie bei `GET /v3/session/{sessionId}/aml-screening-history/` als CSV-Datei herunter, eine Zeile pro abgeschlossenem Re-Screening, die neuesten zuerst, bereit zur Übergabe an einen Prüfer. Die Datei wird vollständig gestreamt (keine Paginierung) und beginnt mit einer Kopfzeile; eine leere Zelle bedeutet unbekannt, Datumsangaben im Datensatz werden niemals geschätzt, und ein Wert, der eine Tabellenkalkulationsformel starten würde, wird mit einem Apostroph versehen. Funktioniert für KYC- und KYB-Sitzungs-IDs; übergeben Sie `node_id`, wenn die Sitzung mehr als einen AML-Schritt ausgeführt hat. Übergeben Sie `month`, um einen Kalendermonat zu exportieren. Fehler werden als JSON zurückgegeben, nicht als CSV. Ein eingeschränkter API-Schlüssel benötigt `decisions: read` und `media: read`: Die Antwort ist eine Datei, daher erhält ein Schlüssel ohne `media: read` den Code `403`.",
        "operationId": "get_v3_session_aml_screening_history_export",
        "x-didit-sdk": {
          "resource": "sessions",
          "method": "export_aml_screening_history",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Sessions"
        ],
        "parameters": [
          {
            "name": "sessionId",
            "in": "path",
            "required": true,
            "description": "UUID der Verifizierungssitzung (die von `POST /v3/session/` zurückgegebene `session_id`). Akzeptiert Sitzungs-IDs sowohl für die Benutzerverifizierung (KYC) als auch für die Unternehmensverifizierung (KYB): Der Server löst die ID über beide Sitzungstypen hinweg auf. Muss eine wohlgeformte UUID sein; ein fehlerhafter Wert entspricht nicht der Route und gibt ein HTML-`404` zurück.",
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "11111111-2222-3333-4444-555555555555"
            }
          },
          {
            "name": "node_id",
            "in": "query",
            "required": false,
            "description": "Workflow-Graph-Knoten-ID der AML-Prüfung. Nur erforderlich, wenn die Sitzung mehr als einen AML-Schritt durchlaufen hat; ohne diese Angabe wird die jüngste AML-Prüfung verwendet. Ein unbekannter Knoten gibt `404` zurück.",
            "schema": {
              "type": "string",
              "example": "feature_aml_1"
            }
          },
          {
            "name": "month",
            "in": "query",
            "required": false,
            "description": "Ein UTC-Kalendermonat im Format `YYYY-MM`. Nur in diesem Monat abgeschlossene Screenings werden zurückgegeben; ohne diese Angabe wird jeder Monat zurückgegeben. Ein fehlerhafter Monat gibt `400` zurück.",
            "schema": {
              "type": "string",
              "pattern": "^\\d{4}-(0[1-9]|1[0-2])$",
              "example": "2026-09"
            }
          }
        ],
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X GET 'https://verification.didit.me/v3/session/11111111-2222-3333-4444-555555555555/aml-screening-history/export/' \\\n  -H 'x-api-key: YOUR_API_KEY' \\\n  -o aml-screening-history.csv"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\ncontent = client.sessions.export_aml_screening_history(\n    \"11111111-2222-3333-4444-555555555555\",\n)\nwith open(\"download.csv\", \"wb\") as file:\n    file.write(content)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import { writeFile } from \"node:fs/promises\";\nimport Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst content = await didit.sessions.exportAmlScreeningHistory(\"11111111-2222-3333-4444-555555555555\");\nawait writeFile(\"download.csv\", Buffer.from(await content.arrayBuffer()));"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresp, err := client.Sessions.ExportAMLScreeningHistory(ctx, \"11111111-2222-3333-4444-555555555555\", didit.SessionsExportAMLScreeningHistoryParams{})\nif err != nil {\n\tlog.Fatal(err)\n}\ndefer resp.Body.Close()\nfile, err := os.Create(\"download.csv\")\nif err != nil {\n\tlog.Fatal(err)\n}\ndefer file.Close()\nif _, err := io.Copy(file, resp.Body); err != nil {\n\tlog.Fatal(err)\n}"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import java.nio.file.Path;\nimport me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nclient.sessions().exportAmlScreeningHistory(\"11111111-2222-3333-4444-555555555555\")\n        .writeTo(Path.of(\"download.csv\"));"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$content = $didit->sessions->exportAmlScreeningHistory('11111111-2222-3333-4444-555555555555');\n$content->saveTo('download.csv');"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\ncontent = didit.sessions.export_aml_screening_history(\"11111111-2222-3333-4444-555555555555\")\nFile.binwrite(\"download.csv\", content)"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar content = await client.Sessions.ExportAmlScreeningHistoryAsync(\"11111111-2222-3333-4444-555555555555\");\nawait content.SaveToAsync(\"download.csv\");"
          }
        ],
        "responses": {
          "200": {
            "description": "Die CSV-Datei, gestreamt als `text/csv` mit CRLF-Zeilenenden. Spalten in dieser Reihenfolge: `screened_at` (wann das erneute Screening abgeschlossen wurde), `outcome` (`NO_CHANGE`, `CHANGED` oder `FAILED`), `provider` (opaker Bezeichner der AML-Datenquelle; nicht danach verzweigen), `aml_status`, `aml_score`, `total_hits`, `datasets_captured_at`, `datasets_sanctions_last_updated_at`, `datasets_pep_last_updated_at`, `datasets_warnings_last_updated_at`, `datasets_adverse_media_last_updated_at`, `datasets_catalog_version`, `run_id` (der Überwachungslauf), `entities_screened` (`1` oder `0` bei einem fehlgeschlagenen Lauf) und `new_hits` (leer, falls unbekannt). Datumsangaben entsprechen ISO 8601 mit UTC-Offset. Eine Sitzung ohne bisherige erneute Screenings gibt nur die Kopfzeile zurück.",
            "headers": {
              "Content-Disposition": {
                "description": "`attachment; filename=\"aml-screening-history-{sessionId}.csv\"` oder `aml-screening-history-{sessionId}-{month}.csv`, wenn `month` übergeben wird.",
                "schema": {
                  "type": "string",
                  "example": "attachment; filename=\"aml-screening-history-11111111-2222-3333-4444-555555555555.csv\""
                }
              }
            },
            "content": {
              "text/csv": {
                "schema": {
                  "type": "string",
                  "format": "binary"
                },
                "example": "screened_at,outcome,provider,aml_status,aml_score,total_hits,datasets_captured_at,datasets_sanctions_last_updated_at,datasets_pep_last_updated_at,datasets_warnings_last_updated_at,datasets_adverse_media_last_updated_at,datasets_catalog_version,run_id,entities_screened,new_hits\r\n2026-09-14T04:12:33.481207+00:00,NO_CHANGE,aml_data_source,Approved,0.0,0,2026-09-14T03:58:02.114820+00:00,2026-09-13T21:10:00+00:00,2026-09-13T08:00:00+00:00,2026-09-12T18:45:00+00:00,,2026-09-13,aaaaaaaa-1111-2222-3333-444444444444,1,0\r\n2026-09-13T04:11:58.020914+00:00,FAILED,aml_data_source,Approved,0.0,0,,,,,,,bbbbbbbb-1111-2222-3333-444444444444,0,\r\n"
              }
            }
          },
          "400": {
            "description": "`month` ist kein `YYYY-MM`-Kalendermonat.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "month": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      }
                    }
                  }
                },
                "examples": {
                  "Malformed month": {
                    "summary": "month=2026-13",
                    "value": {
                      "month": [
                        "Not a calendar month. Use YYYY-MM."
                      ]
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Der API-Schlüssel mit eingeschränktem Geltungsbereich ist abgelaufen. Dies ist der einzige Fall, der `401` zurückgibt: Ein fehlender, ungültiger oder widerrufener Schlüssel gibt `403` zurück.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string",
                      "description": "Lesbare Fehlermeldung."
                    }
                  }
                },
                "examples": {
                  "Expired key": {
                    "summary": "Das Ablaufdatum des Schlüssels ist überschritten",
                    "value": {
                      "detail": "This API key has expired."
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Authentifizierungs- oder Autorisierungsfehler. Ein fehlender Schlüssel gibt `403` zurück, ebenso wie der Schlüssel einer anderen Anwendung, ein berechtigungsbeschränkter Schlüssel ohne die für diesen Endpoint erforderliche Berechtigung sowie eine Anfrage von außerhalb der IP-Allowlist des Schlüssels; ein falscher, widerrufener oder abgelaufener Schlüssel gibt `401` zurück. Unterscheiden Sie diese anhand von `detail`.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string",
                      "description": "Lesbare Fehlermeldung."
                    }
                  }
                },
                "examples": {
                  "Missing or invalid credentials": {
                    "summary": "Kein x-api-key-Header vorhanden oder die Validierung des Schlüssels ist fehlgeschlagen",
                    "value": {
                      "detail": "Authentication credentials were not provided or are invalid."
                    }
                  },
                  "Other application": {
                    "summary": "Ein gültiger Schlüssel, der zu einer anderen Anwendung als die Sitzung gehört",
                    "value": {
                      "detail": "You do not have permission to perform this action."
                    }
                  },
                  "Scoped key without decisions read": {
                    "summary": "Dem Schlüssel mit eingeschränktem Berechtigungsumfang fehlt decisions: read",
                    "value": {
                      "detail": "This API key has no read access to decisions."
                    }
                  },
                  "Scoped key without media read": {
                    "summary": "Dem Schlüssel mit eingeschränktem Berechtigungsumfang fehlt media: read (die Antwort ist eine Datei)",
                    "value": {
                      "detail": "This API key has no read access to media."
                    }
                  },
                  "IP not allowed": {
                    "summary": "Anfrage von außerhalb der IP-Allowlist des Schlüssels",
                    "value": {
                      "detail": "This API key can't be used from this IP address."
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Die Sitzung existiert nicht, wurde gelöscht oder liegt außerhalb der Beschränkungen eines Scoped Keys, oder sie verfügt über keine AML-Prüfung (für die angegebene `node_id`). Die Sitzungssuche erfolgt vor der Prüfung der Anmeldedaten, sodass eine unbekannte `sessionId` auch ohne gültigen Schlüssel `404` zurückgibt.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string",
                      "description": "Lesbare Fehlermeldung."
                    }
                  }
                },
                "examples": {
                  "Unknown session": {
                    "summary": "Es existiert keine Sitzung mit dieser ID oder sie wurde gelöscht",
                    "value": {
                      "detail": "Not found."
                    }
                  },
                  "Outside key limits": {
                    "summary": "Die Sitzung liegt außerhalb der Beschränkungen eines Scoped Keys (wird auch für eine vor Kurzem gelöschte Sitzung zurückgegeben)",
                    "value": {
                      "detail": "Session not found."
                    }
                  },
                  "No AML check": {
                    "summary": "Die Sitzung hat nie einen AML-Schritt ausgeführt",
                    "value": {
                      "detail": "The session does not have an AML check."
                    }
                  },
                  "No AML check for node": {
                    "summary": "node_id stimmt mit keiner AML-Prüfung der Sitzung überein",
                    "value": {
                      "detail": "The session does not have an AML check for node 'feature_aml_2'."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate-Limit überschritten: 600 GET-Anfragen pro Minute pro API-Schlüssel. Warten Sie `Retry-After` Sekunden vor einem Wiederholungsversuch; die `X-RateLimit-*`-Header zeigen das Kontingent an.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string",
                      "description": "Lesbare Fehlermeldung."
                    }
                  }
                },
                "examples": {
                  "Rate limited": {
                    "summary": "Budget für die aktuelle Minute erschöpft",
                    "value": {
                      "detail": "GET request rate limit exceeded. You can make up to 600 requests per minute."
                    }
                  }
                }
              }
            },
            "headers": {
              "Retry-After": {
                "description": "Sekunden, die vor einem Wiederholungsversuch gewartet werden müssen.",
                "schema": {
                  "type": "integer",
                  "minimum": 1,
                  "example": 30
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/v3/session/{sessionId}/add-images/": {
      "patch": {
        "summary": "Bild zu einer Sitzung hinzufügen",
        "description": "Hängen Sie ein zusätzliches Bild oder eine PDF-Datei an das Ergebnis der Ausweisverifizierung (`model_type=kyc`) oder des Adressnachweises (`model_type=poa`) einer abgeschlossenen Benutzerverifizierungs-Sitzung (KYC) an, beispielsweise außerhalb des Ablaufs erfasste Nachweise. Die Sitzung muss den Status `Approved`, `Declined`, `In Review` oder `Kyc Expired` haben und das unter `model_type` benannte Ergebnis enthalten; Unternehmensverifizierungs-Sitzungen (KYB) werden nicht unterstützt. Jeder Aufruf hängt eine Datei an (an das neueste Ergebnis, wenn der Schritt mehr als einmal ausgeführt wurde), behält die vorhandenen Dateien bei und erfasst einen `FILE_ADDED`-Eintrag im Sitzungsaktivitätsprotokoll; der Upload sendet keinen Webhook und ändert den Sitzungsstatus nicht. Die Datei wird beim Upload komprimiert und in `extra_files` der Sitzungsentscheidung zurückgegeben. Dieser Endpoint ist auf 10 Anfragen pro Minute und API-Schlüssel begrenzt. Ein berechtigungsbeschränkter API-Schlüssel erfordert `sessions: write`, und ohne `media: read` erhält er die `extra_files`-Links als `null`.",
        "operationId": "patch_v3_session_add_images",
        "x-didit-sdk": {
          "resource": "sessions",
          "method": "add_images",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Sessions"
        ],
        "parameters": [
          {
            "name": "sessionId",
            "in": "path",
            "required": true,
            "description": "UUID der Sitzung zur Benutzerverifizierung (KYC), zu der die Datei hinzugefügt werden soll (die von `POST /v3/session/` zurückgegebene `session_id`). Eine Sitzungs-ID der Unternehmensverifizierung (KYB) gibt `404` zurück.",
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "11111111-2222-3333-4444-555555555555"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "required": [
                  "file",
                  "model_type"
                ],
                "properties": {
                  "file": {
                    "type": "string",
                    "format": "binary",
                    "description": "Das Bild oder PDF. Zulässige Dateiendungen: `jpg`, `jpeg`, `png`, `webp`, `tiff`, `pdf`. Maximal 15 MB beim Hochladen; die Datei wird anschließend komprimiert und mit `400` abgelehnt, falls sie weiterhin größer als 2 MB (2.097.152 Bytes) ist. Leere Dateien werden abgelehnt."
                  },
                  "model_type": {
                    "type": "string",
                    "enum": [
                      "kyc",
                      "poa"
                    ],
                    "description": "`kyc` fügt die Datei dem Ergebnis der Ausweisverifizierung hinzu, `poa` dem Ergebnis des Adressnachweises.",
                    "example": "kyc"
                  },
                  "file_password": {
                    "type": "string",
                    "description": "Passwort einer verschlüsselten PDF-Datei. Ohne dieses oder mit einem falschen Passwort gibt eine verschlüsselte PDF-Datei `400` zurück."
                  }
                }
              },
              "example": {
                "file": "(binary)",
                "model_type": "kyc"
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X PATCH 'https://verification.didit.me/v3/session/11111111-2222-3333-4444-555555555555/add-images/' \\\n  -H 'x-api-key: YOUR_API_KEY' \\\n  -F 'file=@./back-of-id.jpg' \\\n  -F 'model_type=kyc'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.sessions.add_images(\n    \"11111111-2222-3333-4444-555555555555\",\n    file=open(\"image.jpg\", \"rb\"),\n    model_type=\"kyc\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit, { fileFromPath } from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.sessions.addImages(\"11111111-2222-3333-4444-555555555555\", {\n  file: await fileFromPath(\"image.jpg\"),\n  model_type: \"kyc\",\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Sessions.AddImages(ctx, \"11111111-2222-3333-4444-555555555555\", didit.SessionsAddImagesParams{\n\tFile:      didit.FileFromPath(\"image.jpg\"),\n\tModelType: \"kyc\",\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import java.nio.file.Path;\nimport me.didit.Didit;\nimport me.didit.types.SessionsAddImagesParams;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.sessions().addImages(\"11111111-2222-3333-4444-555555555555\", SessionsAddImagesParams.builder()\n        .file(Path.of(\"image.jpg\"))\n        .modelType(SessionsAddImagesParams.ModelType.of(\"kyc\"))\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\nuse Didit\\File;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->sessions->addImages('11111111-2222-3333-4444-555555555555', [\n    'file' => File::fromPath('image.jpg'),\n    'model_type' => 'kyc',\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.sessions.add_images(\n  \"11111111-2222-3333-4444-555555555555\",\n  file: Pathname(\"image.jpg\"),\n  model_type: \"kyc\"\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Sessions.AddImagesAsync(\"11111111-2222-3333-4444-555555555555\", new SessionsAddImagesParams\n{\n    File = FileUpload.FromPath(\"image.jpg\"),\n    ModelType = \"kyc\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "responses": {
          "200": {
            "description": "Datei hinzugefügt. Gibt jede zusätzliche Datei dieses Ergebnisses zurück, einschließlich der neuen.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "extra_files"
                  ],
                  "properties": {
                    "extra_files": {
                      "type": "array",
                      "description": "Kurzlebige vorsignierte Links zu allen zusätzlichen Dateien des durch `model_type` benannten Ergebnisses, älteste zuerst. Jeder Link ist `null` für einen berechtigungseingeschränkten API-Schlüssel ohne `media: read`. Rufen Sie frische Links später aus der Sitzungsentscheidung ab.",
                      "items": {
                        "type": "string",
                        "format": "uri",
                        "nullable": true
                      }
                    }
                  }
                },
                "example": {
                  "extra_files": [
                    "https://media.example.com/session/11111111-2222-3333-4444-555555555555/kyc-extra-files/66666666-7777-8888-9999-000000000000.jpg?expires=1789383731&signature=abc123"
                  ]
                }
              }
            }
          },
          "400": {
            "description": "Validierungsfehler. Feldfehler werden als `{\"<field>\": [\"<message>\"]}` zurückgegeben; Fehler bei verschlüsselten PDFs als `{\"detail\": \"...\"}`.",
            "content": {
              "application/json": {
                "examples": {
                  "Missing file": {
                    "summary": "Kein Dateiteil im Formular",
                    "value": {
                      "file": [
                        "No file was submitted."
                      ]
                    }
                  },
                  "Missing model_type": {
                    "summary": "model_type weggelassen",
                    "value": {
                      "model_type": [
                        "This field is required."
                      ]
                    }
                  },
                  "Invalid model_type": {
                    "summary": "model_type ist nicht kyc oder poa",
                    "value": {
                      "model_type": [
                        "\"passport\" is not a valid choice."
                      ]
                    }
                  },
                  "File too large": {
                    "summary": "Upload mit mehr als 15 MB",
                    "value": {
                      "file": [
                        "File size should not exceed 15 MB"
                      ]
                    }
                  },
                  "Too large after compression": {
                    "summary": "Nach Komprimierung immer noch über 2 MB",
                    "value": {
                      "file": [
                        "File size is too big. Max allowed size is 2097152 bytes."
                      ]
                    }
                  },
                  "Encrypted PDF": {
                    "summary": "Verschlüsseltes PDF ohne file_password",
                    "value": {
                      "detail": "The PDF is encrypted. Please upload a decrypted PDF or a photo instead."
                    }
                  },
                  "Wrong PDF password": {
                    "summary": "file_password öffnet das PDF nicht",
                    "value": {
                      "detail": "The PDF password is incorrect. Please provide the correct password."
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Der API-Schlüssel mit eingeschränktem Geltungsbereich ist abgelaufen. Dies ist der einzige Fall, der `401` zurückgibt: Ein fehlender, ungültiger oder widerrufener Schlüssel gibt `403` zurück.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string",
                      "description": "Lesbare Fehlermeldung."
                    }
                  }
                },
                "examples": {
                  "Expired key": {
                    "summary": "Das Ablaufdatum des Schlüssels ist überschritten",
                    "value": {
                      "detail": "This API key has expired."
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Authentifizierungs- oder Autorisierungsfehler. Ein fehlender Schlüssel gibt `403` zurück, ebenso wie der Schlüssel einer anderen Anwendung, ein berechtigungsbeschränkter Schlüssel ohne die für diesen Endpoint erforderliche Berechtigung sowie eine Anfrage von außerhalb der IP-Allowlist des Schlüssels; ein falscher, widerrufener oder abgelaufener Schlüssel gibt `401` zurück. Unterscheiden Sie diese anhand von `detail`.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string",
                      "description": "Lesbare Fehlermeldung."
                    }
                  }
                },
                "examples": {
                  "Missing or invalid credentials": {
                    "summary": "Kein x-api-key-Header vorhanden oder die Validierung des Schlüssels ist fehlgeschlagen",
                    "value": {
                      "detail": "Authentication credentials were not provided or are invalid."
                    }
                  },
                  "Other application": {
                    "summary": "Ein gültiger Schlüssel, der zu einer anderen Anwendung als die Sitzung gehört",
                    "value": {
                      "detail": "You do not have permission to perform this action."
                    }
                  },
                  "Scoped key without sessions write": {
                    "summary": "Dem Schlüssel mit eingeschränktem Berechtigungsumfang fehlt sessions: write",
                    "value": {
                      "detail": "This API key has no write access to sessions."
                    }
                  },
                  "IP not allowed": {
                    "summary": "Anfrage von außerhalb der IP-Allowlist des Schlüssels",
                    "value": {
                      "detail": "This API key can't be used from this IP address."
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Die Sitzung existiert nicht, wurde gelöscht oder liegt außerhalb der Beschränkungen eines Scoped Keys; sie ist eine KYB-Sitzung oder nicht im Status `Approved`, `Declined`, `In Review` oder `Kyc Expired`; oder sie enthält kein Ergebnis für den angeforderten `model_type` (wird vor der Validierung der Datei geprüft). Die Sitzungssuche erfolgt vor der Prüfung der Anmeldedaten, sodass eine unbekannte `sessionId` auch ohne gültigen Schlüssel `404` zurückgibt.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string",
                      "description": "Lesbare Fehlermeldung."
                    }
                  }
                },
                "examples": {
                  "Unknown session": {
                    "summary": "Es existiert keine Sitzung mit dieser ID oder sie wurde gelöscht",
                    "value": {
                      "detail": "Not found."
                    }
                  },
                  "Outside key limits": {
                    "summary": "Die Sitzung liegt außerhalb der Beschränkungen eines Scoped Keys hinsichtlich des Workflows oder der Beschränkung auf genehmigte Sitzungen",
                    "value": {
                      "detail": "Session not found."
                    }
                  },
                  "Not eligible": {
                    "summary": "Sitzung noch nicht abgeschlossen oder eine KYB-Sitzungs-ID",
                    "value": {
                      "detail": "No Session matches the given query."
                    }
                  },
                  "No ID verification": {
                    "summary": "model_type=kyc bei einer Sitzung ohne Ausweisverifizierung",
                    "value": {
                      "detail": "The session does not have KYC data."
                    }
                  },
                  "No Proof of Address": {
                    "summary": "model_type=poa bei einer Sitzung ohne Adressnachweis",
                    "value": {
                      "detail": "The session does not have POA data."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate-Limit überschritten: 10 Anfragen zum Hinzufügen von Bildern pro Minute pro API-Schlüssel (abgelehnte Anfragen zählen ebenfalls). Das gemeinsame Budget von 300 Schreibanfragen pro Minute gilt ebenfalls. Warten Sie `Retry-After` Sekunden vor einem Wiederholungsversuch; die `X-RateLimit-*`-Header zeigen das Budget an.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string",
                      "description": "Lesbare Fehlermeldung."
                    }
                  }
                },
                "examples": {
                  "Rate limited": {
                    "summary": "Budget für die aktuelle Minute erschöpft",
                    "value": {
                      "detail": "Session add-images rate limit exceeded. You can make up to 10 requests per minute."
                    }
                  }
                }
              }
            },
            "headers": {
              "Retry-After": {
                "description": "Sekunden, die vor einem Wiederholungsversuch gewartet werden müssen.",
                "schema": {
                  "type": "integer",
                  "minimum": 1,
                  "example": 30
                }
              }
            }
          },
          "503": {
            "$ref": "#/components/responses/DocumentProcessingBusy"
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/v3/session/{sessionId}/update-aml-status/": {
      "patch": {
        "summary": "Status einer AML-Prüfung aktualisieren",
        "description": "Legen Sie den Status der AML-Screening-Prüfung einer Sitzung als Ganzes fest (den `status` eines `aml_screenings[]`-Eintrags in der Sitzungsentscheidung), beispielsweise `Approved`, nachdem Ihr Team jeden Treffer geklärt hat. Funktioniert für KYC- und KYB-Sitzungs-IDs; übergeben Sie `node_id` (Query-Parameter oder Body-Feld), wenn die Sitzung mehr als einen AML-Schritt durchlaufen hat, andernfalls wird die jüngste AML-Prüfung aktualisiert. Wenn sich der Status tatsächlich ändert, wird ein Aktivitätseintrag `AML_STATUS_UPDATED` erfasst und ein [Webhook](https://docs.didit.me/de/integration/webhooks) `data.updated` gesendet; das Senden des aktuellen Status gibt `200` zurück und ändert nichts. Der Sitzungsstatus wird nicht neu berechnet: Verwenden Sie `PATCH /v3/session/{sessionId}/update-status/` für die Sitzungsentscheidung und `PATCH /v3/session/{sessionId}/update-aml-hit-status/` für einzelne Treffer. Ein berechtigungsbeschränkter API-Schlüssel benötigt `decisions: write`.",
        "operationId": "patch_v3_session_update_aml_status",
        "x-didit-sdk": {
          "resource": "sessions",
          "method": "update_aml_status",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Sessions"
        ],
        "parameters": [
          {
            "name": "sessionId",
            "in": "path",
            "required": true,
            "description": "UUID der Verifizierungssitzung (die von `POST /v3/session/` zurückgegebene `session_id`). Akzeptiert Sitzungs-IDs sowohl für die Benutzerverifizierung (KYC) als auch für die Unternehmensverifizierung (KYB): Der Server löst die ID über beide Sitzungstypen hinweg auf. Muss eine wohlgeformte UUID sein; ein fehlerhafter Wert entspricht nicht der Route und gibt ein HTML-`404` zurück.",
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "11111111-2222-3333-4444-555555555555"
            }
          },
          {
            "name": "node_id",
            "in": "query",
            "required": false,
            "description": "Workflow-Graph-Knoten-ID der zu aktualisierenden AML-Prüfung. Nur erforderlich, wenn die Sitzung mehr als einen AML-Schritt durchlaufen hat. Hat Vorrang vor `node_id` im Body.",
            "schema": {
              "type": "string",
              "example": "feature_aml_1"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "status"
                ],
                "properties": {
                  "status": {
                    "type": "string",
                    "enum": [
                      "Not Finished",
                      "Approved",
                      "Declined",
                      "In Review",
                      "Resub Requested"
                    ],
                    "description": "Neuer Status der AML-Prüfung.",
                    "example": "Approved"
                  },
                  "node_id": {
                    "type": "string",
                    "description": "Workflow-Graph-Knoten-ID der AML-Prüfung als Alternative zum Query-Parameter.",
                    "example": "feature_aml_1"
                  }
                }
              },
              "example": {
                "status": "Approved"
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X PATCH 'https://verification.didit.me/v3/session/11111111-2222-3333-4444-555555555555/update-aml-status/' \\\n  -H 'x-api-key: YOUR_API_KEY' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\"status\": \"Approved\"}'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.sessions.update_aml_status(\n    \"11111111-2222-3333-4444-555555555555\",\n    status=\"Approved\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.sessions.updateAmlStatus(\"11111111-2222-3333-4444-555555555555\", {\n  status: \"Approved\",\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Sessions.UpdateAMLStatus(ctx, \"11111111-2222-3333-4444-555555555555\", didit.SessionsUpdateAMLStatusParams{\n\tStatus: \"Approved\",\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\nimport me.didit.types.SessionsUpdateAmlStatusParams;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.sessions().updateAmlStatus(\"11111111-2222-3333-4444-555555555555\", SessionsUpdateAmlStatusParams.builder()\n        .status(SessionsUpdateAmlStatusParams.Status.of(\"Approved\"))\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->sessions->updateAmlStatus('11111111-2222-3333-4444-555555555555', [\n    'status' => 'Approved',\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.sessions.update_aml_status(\n  \"11111111-2222-3333-4444-555555555555\",\n  status: \"Approved\"\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Sessions.UpdateAmlStatusAsync(\"11111111-2222-3333-4444-555555555555\", new SessionsUpdateAmlStatusParams\n{\n    Status = \"Approved\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "responses": {
          "200": {
            "description": "Status der AML-Prüfung gesetzt (oder unverändert, wenn er diesen Wert bereits hatte).",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "message",
                    "status",
                    "previous_status"
                  ],
                  "properties": {
                    "message": {
                      "type": "string",
                      "description": "Immer `AML status updated successfully`."
                    },
                    "status": {
                      "type": "string",
                      "enum": [
                        "Not Finished",
                        "Approved",
                        "Declined",
                        "In Review",
                        "Resub Requested"
                      ],
                      "description": "Status der AML-Prüfung zum aktuellen Zeitpunkt."
                    },
                    "previous_status": {
                      "type": "string",
                      "enum": [
                        "Not Finished",
                        "Approved",
                        "Declined",
                        "In Review",
                        "Resub Requested"
                      ],
                      "description": "Status vor dem Aufruf. Entspricht `status`, wenn sich nichts geändert hat."
                    }
                  }
                },
                "example": {
                  "message": "AML status updated successfully",
                  "status": "Approved",
                  "previous_status": "In Review"
                }
              }
            }
          },
          "400": {
            "description": "Validierungsfehler: `status` fehlt oder ist keiner der zulässigen Werte. Der AML-Check-Lookup wird zuerst ausgeführt, daher gibt eine Sitzung ohne AML-Check auch bei einem ungültigen Body `404` zurück.",
            "content": {
              "application/json": {
                "examples": {
                  "Missing status": {
                    "summary": "Leerer Body oder kein Status",
                    "value": {
                      "status": [
                        "This field is required."
                      ]
                    }
                  },
                  "Invalid status": {
                    "summary": "status nicht im Enum enthalten",
                    "value": {
                      "status": [
                        "\"Cleared\" is not a valid choice."
                      ]
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Der API-Schlüssel mit eingeschränktem Geltungsbereich ist abgelaufen. Dies ist der einzige Fall, der `401` zurückgibt: Ein fehlender, ungültiger oder widerrufener Schlüssel gibt `403` zurück.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string",
                      "description": "Lesbare Fehlermeldung."
                    }
                  }
                },
                "examples": {
                  "Expired key": {
                    "summary": "Das Ablaufdatum des Schlüssels ist überschritten",
                    "value": {
                      "detail": "This API key has expired."
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Authentifizierungs- oder Autorisierungsfehler. Ein fehlender Schlüssel gibt `403` zurück, ebenso wie der Schlüssel einer anderen Anwendung, ein berechtigungsbeschränkter Schlüssel ohne die für diesen Endpoint erforderliche Berechtigung sowie eine Anfrage von außerhalb der IP-Allowlist des Schlüssels; ein falscher, widerrufener oder abgelaufener Schlüssel gibt `401` zurück. Unterscheiden Sie diese anhand von `detail`.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string",
                      "description": "Lesbare Fehlermeldung."
                    }
                  }
                },
                "examples": {
                  "Missing or invalid credentials": {
                    "summary": "Kein x-api-key-Header vorhanden oder die Validierung des Schlüssels ist fehlgeschlagen",
                    "value": {
                      "detail": "Authentication credentials were not provided or are invalid."
                    }
                  },
                  "Other application": {
                    "summary": "Ein gültiger Schlüssel, der zu einer anderen Anwendung als die Sitzung gehört",
                    "value": {
                      "detail": "You do not have permission to perform this action."
                    }
                  },
                  "Scoped key without decisions write": {
                    "summary": "Dem Schlüssel mit eingeschränktem Berechtigungsumfang fehlt decisions: write",
                    "value": {
                      "detail": "This API key has no write access to decisions."
                    }
                  },
                  "IP not allowed": {
                    "summary": "Anfrage von außerhalb der IP-Allowlist des Schlüssels",
                    "value": {
                      "detail": "This API key can't be used from this IP address."
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Die Sitzung existiert nicht, wurde gelöscht oder liegt außerhalb der Beschränkungen eines Scoped Keys, oder sie verfügt über keine AML-Prüfung (für die angegebene `node_id`). Die Sitzungssuche erfolgt vor der Prüfung der Anmeldedaten, sodass eine unbekannte `sessionId` auch ohne gültigen Schlüssel `404` zurückgibt.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string",
                      "description": "Lesbare Fehlermeldung."
                    }
                  }
                },
                "examples": {
                  "Unknown session": {
                    "summary": "Es existiert keine Sitzung mit dieser ID oder sie wurde gelöscht",
                    "value": {
                      "detail": "Not found."
                    }
                  },
                  "Outside key limits": {
                    "summary": "Die Sitzung liegt außerhalb der Beschränkungen eines Scoped Keys (wird auch für eine vor Kurzem gelöschte Sitzung zurückgegeben)",
                    "value": {
                      "detail": "Session not found."
                    }
                  },
                  "No AML check": {
                    "summary": "Die Sitzung hat nie einen AML-Schritt ausgeführt",
                    "value": {
                      "detail": "The session does not have an AML check."
                    }
                  },
                  "No AML check for node": {
                    "summary": "node_id stimmt mit keiner AML-Prüfung der Sitzung überein",
                    "value": {
                      "detail": "The session does not have an AML check for node 'feature_aml_2'."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate-Limit überschritten: 300 Schreibanfragen (POST, PATCH, DELETE) pro Minute pro API-Schlüssel. Warten Sie `Retry-After` Sekunden vor einem Wiederholungsversuch; die `X-RateLimit-*`-Header zeigen das Budget an.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string",
                      "description": "Lesbare Fehlermeldung."
                    }
                  }
                },
                "examples": {
                  "Rate limited": {
                    "summary": "Budget für die aktuelle Minute erschöpft",
                    "value": {
                      "detail": "Write request rate limit exceeded. You can make up to 300 requests per minute."
                    }
                  }
                }
              }
            },
            "headers": {
              "Retry-After": {
                "description": "Sekunden, die vor einem Wiederholungsversuch gewartet werden müssen.",
                "schema": {
                  "type": "integer",
                  "minimum": 1,
                  "example": 30
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/v3/status/": {
      "get": {
        "summary": "Dienststatus abrufen (öffentlich, nicht authentifiziert)",
        "description": "Gibt den Status jedes Didit-Dienstes (`operational`, `degraded` oder `down`), den Gesamtstatus (den schlechtesten davon) und die Vorfälle zurück, die noch andauern oder in den letzten 7 Tagen behoben wurden. Nutzen Sie diesen Endpoint für ein Status-Widget oder um den Status von Didit über Ihre Integration zu überprüfen.\n\nÖffentlich: Senden Sie keinen Auth-Header. Die Antwort enthält keine Organisationsdaten und ist für jeden Aufrufer identisch. Antworten werden für 30 Sekunden zwischengespeichert; fragen Sie daher nicht öfter als einmal alle 30 Sekunden ab.",
        "operationId": "get_v3_status",
        "tags": [
          "Status"
        ],
        "security": [
          {}
        ],
        "parameters": [],
        "responses": {
          "200": {
            "description": "Aktueller Dienststatus.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServiceStatusFeed"
                },
                "examples": {
                  "One service degraded": {
                    "summary": "Ein laufender Vorfall und einer, der diese Woche behoben wurde",
                    "value": {
                      "status": "degraded",
                      "updated_at": "2026-10-13T09:41:07.512345Z",
                      "services": [
                        {
                          "key": "service_id_verification",
                          "name": "ID verification",
                          "status": "operational"
                        },
                        {
                          "key": "service_liveness_face_match",
                          "name": "Liveness and face match",
                          "status": "operational"
                        },
                        {
                          "key": "service_aml_screening",
                          "name": "AML screening",
                          "status": "operational"
                        },
                        {
                          "key": "service_kyb_registries",
                          "name": "KYB registries",
                          "status": "operational"
                        },
                        {
                          "key": "service_database_validation",
                          "name": "Database validation",
                          "status": "degraded"
                        },
                        {
                          "key": "service_phone_delivery",
                          "name": "Phone verification delivery",
                          "status": "operational"
                        },
                        {
                          "key": "service_email_delivery",
                          "name": "Email verification delivery",
                          "status": "operational"
                        },
                        {
                          "key": "service_transaction_monitoring",
                          "name": "Transaction monitoring",
                          "status": "operational"
                        }
                      ],
                      "incidents": [
                        {
                          "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
                          "service": "service_database_validation",
                          "service_name": "Database validation",
                          "state": "degraded",
                          "status": "ongoing",
                          "title": "Database validation is degraded in Brazil.",
                          "body": "Checks against Brazil (CPF) may be slow or fail since 08:55 UTC.",
                          "affected": "Brazil (CPF)",
                          "country_name": "Brazil",
                          "started_at": "2026-10-13T08:55:00Z",
                          "resolved_at": null,
                          "duration_minutes": null
                        },
                        {
                          "id": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
                          "service": "service_aml_screening",
                          "service_name": "AML screening",
                          "state": "down",
                          "status": "resolved",
                          "title": "AML screening is back to normal.",
                          "body": "Recovered at 14:32 UTC after 17 minutes.",
                          "affected": "",
                          "country_name": "",
                          "started_at": "2026-10-11T14:15:00Z",
                          "resolved_at": "2026-10-11T14:32:00Z",
                          "duration_minutes": 17
                        }
                      ]
                    }
                  },
                  "All operational": {
                    "summary": "Kein Vorfall in den letzten 7 Tagen",
                    "value": {
                      "status": "operational",
                      "updated_at": "2026-10-13T09:41:07.512345Z",
                      "services": [
                        {
                          "key": "service_id_verification",
                          "name": "ID verification",
                          "status": "operational"
                        },
                        {
                          "key": "service_liveness_face_match",
                          "name": "Liveness and face match",
                          "status": "operational"
                        },
                        {
                          "key": "service_aml_screening",
                          "name": "AML screening",
                          "status": "operational"
                        },
                        {
                          "key": "service_kyb_registries",
                          "name": "KYB registries",
                          "status": "operational"
                        },
                        {
                          "key": "service_database_validation",
                          "name": "Database validation",
                          "status": "operational"
                        },
                        {
                          "key": "service_phone_delivery",
                          "name": "Phone verification delivery",
                          "status": "operational"
                        },
                        {
                          "key": "service_email_delivery",
                          "name": "Email verification delivery",
                          "status": "operational"
                        },
                        {
                          "key": "service_transaction_monitoring",
                          "name": "Transaction monitoring",
                          "status": "operational"
                        }
                      ],
                      "incidents": []
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Mehr als 600 GET-Anfragen in einer Minute von derselben Adresse (oder demselben API-Schlüssel, falls angegeben). Beachten Sie `Retry-After`, bevor Sie einen Wiederholungsversuch durchführen.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "detail"
                  ],
                  "properties": {
                    "detail": {
                      "type": "string"
                    }
                  }
                },
                "example": {
                  "detail": "GET request rate limit exceeded. You can make up to 600 requests per minute."
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -fsS https://verification.didit.me/v3/status/"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "import requests\n\nresp = requests.get('https://verification.didit.me/v3/status/', timeout=5)\nresp.raise_for_status()\nfeed = resp.json()\nprint(feed['status'])\nfor service in feed['services']:\n    if service['status'] != 'operational':\n        print(service['key'], service['status'])"
          },
          {
            "lang": "javascript",
            "label": "JavaScript",
            "source": "const feed = await fetch('https://verification.didit.me/v3/status/').then((r) => r.json());\nconsole.log(feed.status);\nconst affected = feed.services.filter((s) => s.status !== 'operational');\nconsole.log(affected.map((s) => `${s.key}: ${s.status}`));"
          }
        ],
        "x-didit-sdk": {
          "resource": "system",
          "method": "retrieve_status",
          "auth": "public",
          "server": false
        }
      }
    },
    "/v3/organization/bank-verification-pricing/": {
      "get": {
        "summary": "Preise für die Bankverifizierung abrufen (öffentlich, unauthentifiziert)",
        "description": "Gibt den Listenpreis jeder Bankverifizierungsmethode in jedem Land zurück: Bank-Login mit den Add-ons für Guthaben und Transaktionen sowie die Kontoprüfung. Eine Methode, die ein Land derzeit nicht anbietet, wird als nicht verfügbar ohne Preis aufgeführt. Nutzen Sie diesen Endpoint, um einen Bank-Schritt vor der Erstellung eines Workflows zu kalkulieren oder um Bankpreise in Ihrem eigenen Produkt anzuzeigen.\n\nÖffentlich: Senden Sie keinen Auth-Header. Die Antwort enthält keine Organisationsdaten und ist für jeden Aufrufer identisch. Sie wird öffentlich für eine Stunde zwischengespeichert und enthält ein `ETag`; senden Sie daher `If-None-Match`, um ein `304 Not Modified` zu erhalten, wenn sich nichts geändert hat.\n\nEine Methode ist nur dort `available`, wo Didit sie derzeit in der Produktion anbietet; ihr `price_usd` ist überall sonst `null`, sodass der Feed niemals einen Preis anzeigt, den Sie nicht erwerben können. `available: false` umfasst Länder ohne genehmigten Preis, Methoden, die das Land nicht unterstützt, und Routen, die noch nicht freigeschaltet sind.\n\nDies sind Listenpreise vor Ihrem Tarifrabatt. Ihr Tarifrabatt gilt für den gesamten Bankpreis, und ein individuell verhandelter oder vertraglich vereinbarter Preis ersetzt den Listenpreis für Ihre Organisation.",
        "operationId": "get_v3_bank_verification_pricing",
        "tags": [
          "Pricing"
        ],
        "security": [
          {}
        ],
        "parameters": [],
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -fsS https://verification.didit.me/v3/organization/bank-verification-pricing/"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# This call needs no API key.\nclient = Didit()\n\nresult = client.pricing.bank_verification()\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// This call needs no API key.\nconst didit = new Didit();\n\nconst result = await didit.pricing.bankVerification();\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// This call needs no API key.\nclient := didit.NewClient()\n\nresult, err := client.Pricing.BankVerification(ctx)\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// This call needs no API key.\nDidit client = new Didit();\n\nvar result = client.pricing().bankVerification();\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// This call needs no API key.\n$didit = new DiditClient();\n\n$result = $didit->pricing->bankVerification();\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# This call needs no API key.\ndidit = Didit::Client.new\n\nresult = didit.pricing.bank_verification\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// This call needs no API key.\nusing var client = new DiditClient();\n\nvar result = await client.Pricing.BankVerificationAsync();\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "x-didit-sdk": {
          "resource": "pricing",
          "method": "bank_verification",
          "auth": "none",
          "server": true
        },
        "responses": {
          "200": {
            "description": "Listenpreise für Banküberprüfungen nach Land.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BankVerificationPricing"
                },
                "examples": {
                  "Two countries": {
                    "summary": "Ein Land mit beiden Methoden, eines mit keiner von beiden",
                    "value": {
                      "currency": "USD",
                      "statement_upload": {
                        "price_usd": "0.0000",
                        "included_after_charged_bank_attempt": true,
                        "standalone_available": false
                      },
                      "own_provider_fee_usd": "0.0200",
                      "countries": {
                        "GBR": {
                          "name": "United Kingdom",
                          "methods": {
                            "open_banking": {
                              "available": true,
                              "market": "UK and EEA",
                              "price_usd": "0.7900",
                              "add_ons": {
                                "balance": "0.3500",
                                "transactions": "1.3000"
                              }
                            },
                            "account_lookup": {
                              "available": true,
                              "price_usd": "0.4000"
                            }
                          }
                        },
                        "CAN": {
                          "name": "Canada",
                          "methods": {
                            "open_banking": {
                              "available": false,
                              "market": null,
                              "price_usd": null,
                              "add_ons": {}
                            },
                            "account_lookup": {
                              "available": false,
                              "price_usd": null
                            }
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          },
          "304": {
            "description": "Nicht geändert: Das in `If-None-Match` übermittelte `ETag` stimmt weiterhin überein. Kein Body."
          }
        }
      }
    },
    "/v3/session/{sessionId}/simulate/": {
      "post": {
        "summary": "Status einer Sandbox-Sitzung simulieren",
        "description": "Erzwingen Sie nachträglich von Ihrem Backend aus einen finalen Status für eine Sandbox-Sitzung, ohne den Ablauf zu durchlaufen. Nur für Sandbox-Anwendungen: Eine Produktions-Sitzung gibt `404` zurück. Funktioniert für Sitzungen der Benutzerverifizierung (KYC) und Unternehmensverifizierung (KYB).\n\nSetzen Sie `new_status` oder lassen Sie den Wert über `scenario` oder `risk` bereitstellen. `risk` (oder das erste Risiko, das die Magic Values des Szenarios enthalten) fügt der Sitzung diese Warnung hinzu. Die Änderung wird in der Aktivität der Sitzung erfasst.\n\n`send_webhooks` (Standardwert `true`) sendet genau die Webhooks, die ein echter Statuswechsel auslöst. Bei `false` ändert sich der Status dennoch und die Konsole wird weiterhin live aktualisiert, es wird jedoch kein Webhook protokolliert oder gesendet; die Wiederherstellung verpasster Webhooks sendet diese Entscheidung niemals erneut, und der nächste Statuswechsel sendet Webhooks wie gewohnt. Die Antwort gibt den angewendeten Wert wieder.\n\nErfordert die Berechtigung `write:sessions`; ein berechtigungsbeschränkter API-Schlüssel benötigt Schreibzugriff auf Sitzungen. Eine unbekannte `session_id` gibt `404` zurück und die Sitzung einer anderen Anwendung gibt `403` zurück, jeweils bevor der Body gelesen wird; eine Produktions-Sitzung gibt `404` erst nach der Validierung des Bodys zurück. Um die Simulation aus dem gehosteten Ablauf mit dem eigenen Token der Sitzung durchzuführen, verwenden Sie `POST /v3/session/{sessionId}/sandbox/simulate/`. Siehe [Sandbox & Testdaten](/de/integration/sandbox-testing) für den Szenariokatalog.",
        "operationId": "post_v3_session_simulate",
        "tags": [
          "Sessions"
        ],
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "parameters": [
          {
            "in": "path",
            "name": "sessionId",
            "required": true,
            "description": "UUID der Sandbox-Verifizierungssitzung. Akzeptiert sowohl Benutzer- (KYC) als auch Unternehmens- (KYB) Sitzungs-IDs.",
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "3fa85f64-5717-4562-b3fc-2c963f66afa6"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SandboxSimulateRequest"
              },
              "examples": {
                "Scenario Without Webhooks": {
                  "summary": "Über ein Szenario ablehnen, ohne Webhooks zu senden",
                  "value": {
                    "scenario": "decline_aml_hit",
                    "send_webhooks": false
                  }
                },
                "Status Only": {
                  "summary": "Die üblichen Webhooks genehmigen und senden",
                  "value": {
                    "new_status": "Approved"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Der Status hat sich geändert.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SandboxSimulateResponse"
                },
                "examples": {
                  "Simulated": {
                    "summary": "Über ein Szenario abgelehnt, Webhooks nicht gesendet",
                    "value": {
                      "session_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
                      "previous_status": "In Progress",
                      "status": "Declined",
                      "scenario": "decline_aml_hit",
                      "risk": "POSSIBLE_MATCH_FOUND",
                      "send_webhooks": false
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Validierungsfehler: ein unbekanntes Szenario oder Risiko, kein `new_status`, wenn weder `scenario` noch `risk` einen liefert, ein Status, den dieser Endpoint nicht setzt, oder die Sitzung hat bereits den angeforderten Status (ein einfaches JSON-Array).",
            "content": {
              "application/json": {
                "examples": {
                  "Unknown Scenario": {
                    "summary": "scenario ist nicht im Katalog enthalten",
                    "value": {
                      "scenario": [
                        "Unknown sandbox scenario: 'not-a-scenario'."
                      ]
                    }
                  },
                  "Unknown Risk": {
                    "summary": "risk ist nicht im Katalog enthalten",
                    "value": {
                      "risk": [
                        "Unknown sandbox risk case: 'NOT_A_RISK'."
                      ]
                    }
                  },
                  "Missing new_status": {
                    "summary": "Kein new_status, scenario oder risk",
                    "value": {
                      "new_status": [
                        "This field is required."
                      ]
                    }
                  },
                  "Invalid new_status": {
                    "summary": "Ein Status, den die Simulation nicht setzt",
                    "value": {
                      "new_status": [
                        "\"Resubmitted\" is not a valid choice."
                      ]
                    }
                  },
                  "Same Status": {
                    "summary": "Die Sitzung hat diesen Status bereits",
                    "value": [
                      "The new status is the same as the current status."
                    ]
                  }
                }
              }
            }
          },
          "401": {
            "description": "Der API-Schlüssel mit eingeschränktem Geltungsbereich ist abgelaufen.",
            "content": {
              "application/json": {
                "examples": {
                  "Expired API Key": {
                    "summary": "API-Schlüssel mit eingeschränktem Berechtigungsumfang nach Ablaufdatum",
                    "value": {
                      "detail": "This API key has expired."
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Fehlende Anmeldedaten, ein Aufrufer ohne das `write:sessions`-Privileg, ein API-Schlüssel mit Gültigkeitsbereich ohne den für diesen Endpoint erforderlichen Zugriff oder eine `session_id`, die zu einer anderen Anwendung gehört.",
            "content": {
              "application/json": {
                "examples": {
                  "Invalid Credentials": {
                    "summary": "Fehlender oder ungültiger x-api-key",
                    "value": {
                      "detail": "Authentication credentials were not provided or are invalid."
                    }
                  },
                  "Missing Privilege": {
                    "summary": "Dem Aufrufer fehlt write:sessions",
                    "value": {
                      "detail": "You do not have permission to perform this action."
                    }
                  },
                  "Scoped Key Without Access": {
                    "summary": "API-Schlüssel mit eingeschränktem Berechtigungsumfang ohne diesen Zugriff",
                    "value": {
                      "detail": "This API key has no write access to sessions."
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Es existiert keine Sitzung mit dieser `session_id` oder es handelt sich um eine Live-Sitzung (keine Sandbox).",
            "content": {
              "application/json": {
                "examples": {
                  "Not Found": {
                    "summary": "Unbekannte oder produktive Sitzung",
                    "value": {
                      "detail": "Not found."
                    }
                  }
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X POST \\\n  https://verification.didit.me/v3/session/3fa85f64-5717-4562-b3fc-2c963f66afa6/simulate/ \\\n  -H 'x-api-key: YOUR_API_KEY' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\"scenario\": \"decline_aml_hit\", \"send_webhooks\": false}'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.sessions.simulate(\n    \"3fa85f64-5717-4562-b3fc-2c963f66afa6\",\n    scenario=\"decline_aml_hit\",\n    send_webhooks=False,\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.sessions.simulate(\"3fa85f64-5717-4562-b3fc-2c963f66afa6\", {\n  scenario: \"decline_aml_hit\",\n  send_webhooks: false,\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Sessions.Simulate(ctx, \"3fa85f64-5717-4562-b3fc-2c963f66afa6\", didit.SandboxSimulateRequest{\n\tScenario:     didit.String(\"decline_aml_hit\"),\n\tSendWebhooks: didit.Bool(false),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\nimport me.didit.types.SandboxSimulateRequest;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.sessions().simulate(\"3fa85f64-5717-4562-b3fc-2c963f66afa6\", SandboxSimulateRequest.builder()\n        .scenario(\"decline_aml_hit\")\n        .sendWebhooks(false)\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->sessions->simulate('3fa85f64-5717-4562-b3fc-2c963f66afa6', [\n    'scenario' => 'decline_aml_hit',\n    'send_webhooks' => false,\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.sessions.simulate(\n  \"3fa85f64-5717-4562-b3fc-2c963f66afa6\",\n  scenario: \"decline_aml_hit\",\n  send_webhooks: false\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Sessions.SimulateAsync(\"3fa85f64-5717-4562-b3fc-2c963f66afa6\", new SandboxSimulateRequest\n{\n    Scenario = \"decline_aml_hit\",\n    SendWebhooks = false,\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "x-didit-sdk": {
          "resource": "sessions",
          "method": "simulate",
          "auth": "api_key",
          "server": true
        }
      }
    },
    "/v3/session/{sessionId}/sandbox/simulate/": {
      "post": {
        "summary": "Status einer Sandbox-Sitzung vom Client aus simulieren",
        "description": "Dieselbe Simulation wie `POST /v3/session/{sessionId}/simulate/`, authentifiziert mit dem sitzungseigenen `Session-Token` (von [Create Session](/de/sessions-api/create-session) in `session_token` zurückgegeben) anstelle Ihres API-Schlüssels, sodass ein Test-Harness oder der gehostete Ablauf sie vom Client aus aufrufen kann. Der Body, die Antwort und `send_webhooks` verhalten sich exakt wie an diesem Endpoint.\n\nEin `Session-Token` einer Live-Anwendung (keine Sandbox) oder eines, das nicht mit der `sessionId` im Pfad übereinstimmt, gibt `404` zurück. Siehe [Sandbox & Testdaten](/de/integration/sandbox-testing).",
        "operationId": "post_v3_session_sandbox_simulate",
        "tags": [
          "Sessions"
        ],
        "security": [
          {
            "SessionTokenAuth": []
          }
        ],
        "parameters": [
          {
            "in": "path",
            "name": "sessionId",
            "required": true,
            "description": "UUID der Sandbox-Verifizierungssitzung. Muss mit der im zur Authentifizierung verwendeten Sitzungs-Token codierten Sitzung übereinstimmen.",
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "3fa85f64-5717-4562-b3fc-2c963f66afa6"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SandboxSimulateRequest"
              },
              "examples": {
                "Scenario Without Webhooks": {
                  "summary": "Über ein Szenario ablehnen, ohne Webhooks zu senden",
                  "value": {
                    "scenario": "decline_aml_hit",
                    "send_webhooks": false
                  }
                },
                "Status Only": {
                  "summary": "Die üblichen Webhooks genehmigen und senden",
                  "value": {
                    "new_status": "Approved"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Der Status hat sich geändert.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SandboxSimulateResponse"
                },
                "examples": {
                  "Simulated": {
                    "summary": "Über ein Szenario abgelehnt, Webhooks nicht gesendet",
                    "value": {
                      "session_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
                      "previous_status": "In Progress",
                      "status": "Declined",
                      "scenario": "decline_aml_hit",
                      "risk": "POSSIBLE_MATCH_FOUND",
                      "send_webhooks": false
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Validierungsfehler: ein unbekanntes Szenario oder Risiko, kein `new_status`, wenn weder `scenario` noch `risk` einen liefert, ein Status, den dieser Endpoint nicht setzt, oder die Sitzung hat bereits den angeforderten Status (ein einfaches JSON-Array).",
            "content": {
              "application/json": {
                "examples": {
                  "Unknown Scenario": {
                    "summary": "scenario ist nicht im Katalog enthalten",
                    "value": {
                      "scenario": [
                        "Unknown sandbox scenario: 'not-a-scenario'."
                      ]
                    }
                  },
                  "Unknown Risk": {
                    "summary": "risk ist nicht im Katalog enthalten",
                    "value": {
                      "risk": [
                        "Unknown sandbox risk case: 'NOT_A_RISK'."
                      ]
                    }
                  },
                  "Missing new_status": {
                    "summary": "Kein new_status, scenario oder risk",
                    "value": {
                      "new_status": [
                        "This field is required."
                      ]
                    }
                  },
                  "Invalid new_status": {
                    "summary": "Ein Status, den die Simulation nicht setzt",
                    "value": {
                      "new_status": [
                        "\"Resubmitted\" is not a valid choice."
                      ]
                    }
                  },
                  "Same Status": {
                    "summary": "Die Sitzung hat diesen Status bereits",
                    "value": [
                      "The new status is the same as the current status."
                    ]
                  }
                }
              }
            }
          },
          "403": {
            "description": "Der `Session-Token`-Header fehlt oder ist ungültig.",
            "content": {
              "application/json": {
                "examples": {
                  "Invalid Session Token": {
                    "summary": "Fehlendes oder ungültiges Session-Token",
                    "value": {
                      "detail": "You do not have permission to perform this action."
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Das `Session-Token` gehört zu einer Live-Anwendung (nicht Sandbox) oder stimmt nicht mit der `sessionId` im Pfad überein.",
            "content": {
              "application/json": {
                "examples": {
                  "Not Found": {
                    "summary": "Aktive Sitzung oder Unstimmigkeit zwischen session_id und Token",
                    "value": {
                      "detail": "Not found."
                    }
                  }
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X POST \\\n  https://verification.didit.me/v3/session/3fa85f64-5717-4562-b3fc-2c963f66afa6/sandbox/simulate/ \\\n  -H 'Session-Token: YOUR_SESSION_TOKEN' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\"new_status\": \"Approved\", \"send_webhooks\": false}'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "import requests\n\nresponse = requests.post(\n    \"https://verification.didit.me/v3/session/3fa85f64-5717-4562-b3fc-2c963f66afa6/sandbox/simulate/\",\n    headers={\"Session-Token\": \"YOUR_SESSION_TOKEN\"},\n    json={\"new_status\": \"Approved\", \"send_webhooks\": False},\n)\nresponse.raise_for_status()\nprint(response.json())"
          }
        ],
        "x-didit-sdk": {
          "resource": "sessions",
          "method": "simulate_sandbox",
          "auth": "device_token",
          "server": false
        }
      }
    },
    "/v3/session/{sessionId}/features/overrides/": {
      "get": {
        "summary": "Prüfungsüberschreibungen einer Sitzung auflisten",
        "description": "Jede Überschreibung des Status einer einzelnen Funktion (Schritts) in einer Sitzung zur Benutzerverifizierung (KYC) oder Unternehmensverifizierung (KYB), die neueste zuerst und nicht paginiert: angewendete Überschreibungen, solche, die darauf warten, dass die Person den Flow abschließt (`pending_until_flow_finishes`), und stornierte Überschreibungen, jeweils mit Angaben dazu, wer sie angefordert hat, dem Grund und ob sie angewendet wurden, während sich die Person noch im Flow befand (`forced`).\n\n`person_in_flow` gibt an, ob eine neue Überschreibung mit `defer_until_flow_finishes: true` warten würde. `flow_finished_at` gibt an, wann die Person den Flow zuletzt abgeschlossen hat; dieser Wert ist `null`, während sie sich noch darin befindet (eine erneute Einreichung eingeschlossen) und wenn die Sitzung geschlossen wurde, bevor sie ihn abgeschlossen hat.\n\nErfordert die Berechtigung `read:sessions`; ein berechtigungsbeschränkter API-Schlüssel benötigt Lesezugriff auf Entscheidungen.",
        "operationId": "get_v3_session_feature_overrides",
        "tags": [
          "Sessions"
        ],
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "parameters": [
          {
            "in": "path",
            "name": "sessionId",
            "required": true,
            "description": "UUID der Verifizierungssitzung. Akzeptiert sowohl Benutzer- (KYC) als auch Unternehmens- (KYB) Sitzungs-IDs.",
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "3fa85f64-5717-4562-b3fc-2c963f66afa6"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Die Prüfungsüberschreibungen der Sitzung, neueste zuerst.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "session_id",
                    "person_in_flow",
                    "flow_finished_at",
                    "overrides"
                  ],
                  "properties": {
                    "session_id": {
                      "type": "string",
                      "format": "uuid",
                      "example": "3fa85f64-5717-4562-b3fc-2c963f66afa6"
                    },
                    "person_in_flow": {
                      "type": "boolean",
                      "description": "Gibt an, ob sich die Person noch im Ablauf befindet, sodass ein neuer Override mit `defer_until_flow_finishes: true` warten würde.",
                      "example": true
                    },
                    "flow_finished_at": {
                      "type": "string",
                      "format": "date-time",
                      "nullable": true,
                      "description": "Wann die Person den Ablauf zuletzt abgeschlossen hat. `null`, während sie sich noch darin befindet (einschließlich einer erneuten Einreichung) und wenn die Sitzung geschlossen wurde, bevor sie abgeschlossen wurde (abgebrochen, abgelaufen oder eine Entscheidung mitten im Ablauf getroffen wurde).",
                      "example": null
                    },
                    "overrides": {
                      "type": "array",
                      "description": "Jede Überschreibung der Sitzung, die neueste zuerst.",
                      "items": {
                        "$ref": "#/components/schemas/FeatureStatusOverride"
                      }
                    }
                  }
                },
                "examples": {
                  "Overrides": {
                    "summary": "Eine ausstehende Überschreibung, eine angewendete",
                    "value": {
                      "session_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
                      "person_in_flow": true,
                      "flow_finished_at": null,
                      "overrides": [
                        {
                          "id": "9b2f4c1e-8d3a-4e5f-a6b7-c8d9e0f1a2b3",
                          "node_id": "feature_liveness_1",
                          "feature_type": "",
                          "feature_model": "Face",
                          "previous_status": "Declined",
                          "new_status": "Approved",
                          "state": "pending_until_flow_finishes",
                          "forced": false,
                          "reason": "Liveness retried with a reviewer present.",
                          "requested_by": {
                            "email": "reviewer@example.com",
                            "name": "Alex Reviewer",
                            "type": "CONSOLE_USER"
                          },
                          "requested_at": "2026-10-13T09:15:00Z",
                          "applied_at": null,
                          "cancelled_at": null,
                          "cancel_reason": null
                        },
                        {
                          "id": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
                          "node_id": "feature_ocr_1",
                          "feature_type": "",
                          "feature_model": "KYC",
                          "previous_status": "In Review",
                          "new_status": "Approved",
                          "state": "applied",
                          "forced": true,
                          "reason": "Document manually verified by compliance.",
                          "requested_by": {
                            "email": "reviewer@example.com",
                            "name": "Alex Reviewer",
                            "type": "CONSOLE_USER"
                          },
                          "requested_at": "2026-10-13T09:15:00Z",
                          "applied_at": "2026-10-13T09:15:00Z",
                          "cancelled_at": null,
                          "cancel_reason": null
                        }
                      ]
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Der API-Schlüssel mit eingeschränktem Geltungsbereich ist abgelaufen.",
            "content": {
              "application/json": {
                "examples": {
                  "Expired API Key": {
                    "summary": "API-Schlüssel mit eingeschränktem Berechtigungsumfang nach Ablaufdatum",
                    "value": {
                      "detail": "This API key has expired."
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Fehlende Anmeldedaten, ein Aufrufer ohne das `read:sessions`-Privileg, ein API-Schlüssel mit Gültigkeitsbereich ohne den für diesen Endpoint erforderlichen Zugriff oder eine `session_id`, die zu einer anderen Anwendung gehört.",
            "content": {
              "application/json": {
                "examples": {
                  "Invalid Credentials": {
                    "summary": "Fehlender oder ungültiger x-api-key",
                    "value": {
                      "detail": "Authentication credentials were not provided or are invalid."
                    }
                  },
                  "Missing Privilege": {
                    "summary": "Dem Aufrufer fehlt read:sessions",
                    "value": {
                      "detail": "You do not have permission to perform this action."
                    }
                  },
                  "Scoped Key Without Access": {
                    "summary": "API-Schlüssel mit eingeschränktem Berechtigungsumfang ohne diesen Zugriff",
                    "value": {
                      "detail": "This API key has no read access to decisions."
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Es existiert keine KYC- oder KYB-Sitzung mit dieser `session_id`.",
            "content": {
              "application/json": {
                "examples": {
                  "Not Found": {
                    "summary": "Unbekannte session_id",
                    "value": {
                      "detail": "Not found."
                    }
                  }
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X GET \\\n  https://verification.didit.me/v3/session/3fa85f64-5717-4562-b3fc-2c963f66afa6/features/overrides/ \\\n  -H 'x-api-key: YOUR_API_KEY'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.sessions.list_feature_overrides(\n    \"3fa85f64-5717-4562-b3fc-2c963f66afa6\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.sessions.listFeatureOverrides(\"3fa85f64-5717-4562-b3fc-2c963f66afa6\");\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Sessions.ListFeatureOverrides(ctx, \"3fa85f64-5717-4562-b3fc-2c963f66afa6\")\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.sessions().listFeatureOverrides(\"3fa85f64-5717-4562-b3fc-2c963f66afa6\");\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->sessions->listFeatureOverrides('3fa85f64-5717-4562-b3fc-2c963f66afa6');\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.sessions.list_feature_overrides(\"3fa85f64-5717-4562-b3fc-2c963f66afa6\")\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Sessions.ListFeatureOverridesAsync(\"3fa85f64-5717-4562-b3fc-2c963f66afa6\");\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "x-didit-sdk": {
          "resource": "sessions",
          "method": "list_feature_overrides",
          "auth": "api_key",
          "server": true
        }
      }
    },
    "/v3/session/{sessionId}/features/overrides/{overrideId}/cancel/": {
      "post": {
        "summary": "Ein Überschreiben einer Prüfung abbrechen, das auf den Abschluss des Workflows wartet",
        "description": "Bricht ein Überschreiben eines Funktionsstatus (Schrittstatus) ab, das noch `pending_until_flow_finishes` ist, sodass es nie angewendet wird. Die Prüfung behält ihren Status, der Abbruch wird in der Aktivität der Sitzung als `FEATURE_OVERRIDE_CANCELLED` protokolliert, und es wird kein Webhook gesendet. Die Antwort ist das Überschreiben mit `state: cancelled` und `cancel_reason: cancelled_by_reviewer`.\n\nEin Überschreiben, das bereits angewendet oder abgebrochen wurde, gibt `409` mit dem Code `feature_override_not_pending` zurück. Override-IDs finden Sie über `GET /v3/session/{sessionId}/features/overrides/` oder im von der Statusaktualisierung der Funktion zurückgegebenen `override`.\n\nErfordert die Berechtigung `write:sessions`; ein berechtigungsbeschränkter API-Schlüssel benötigt Schreibzugriff auf Entscheidungen.",
        "operationId": "post_v3_session_feature_override_cancel",
        "tags": [
          "Sessions"
        ],
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "parameters": [
          {
            "in": "path",
            "name": "sessionId",
            "required": true,
            "description": "UUID der Verifizierungssitzung. Akzeptiert sowohl Benutzer- (KYC) als auch Unternehmens- (KYB) Sitzungs-IDs.",
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "3fa85f64-5717-4562-b3fc-2c963f66afa6"
            }
          },
          {
            "in": "path",
            "name": "overrideId",
            "required": true,
            "description": "Die `id` des zu stornierenden Overrides.",
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "9b2f4c1e-8d3a-4e5f-a6b7-c8d9e0f1a2b3"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Der Override wurde storniert und wird nie angewendet.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/FeatureStatusOverride"
                },
                "examples": {
                  "Cancelled": {
                    "summary": "Der stornierte Override",
                    "value": {
                      "id": "9b2f4c1e-8d3a-4e5f-a6b7-c8d9e0f1a2b3",
                      "node_id": "feature_liveness_1",
                      "feature_type": "",
                      "feature_model": "Face",
                      "previous_status": "Declined",
                      "new_status": "Approved",
                      "state": "cancelled",
                      "forced": false,
                      "reason": "Liveness retried with a reviewer present.",
                      "requested_by": {
                        "email": "reviewer@example.com",
                        "name": "Alex Reviewer",
                        "type": "CONSOLE_USER"
                      },
                      "requested_at": "2026-10-13T09:15:00Z",
                      "applied_at": null,
                      "cancelled_at": "2026-10-13T09:20:00Z",
                      "cancel_reason": "cancelled_by_reviewer"
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Der API-Schlüssel mit eingeschränktem Geltungsbereich ist abgelaufen.",
            "content": {
              "application/json": {
                "examples": {
                  "Expired API Key": {
                    "summary": "API-Schlüssel mit eingeschränktem Berechtigungsumfang nach Ablaufdatum",
                    "value": {
                      "detail": "This API key has expired."
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Fehlende Anmeldedaten, ein Aufrufer ohne das `write:sessions`-Privileg, ein API-Schlüssel mit Gültigkeitsbereich ohne den für diesen Endpoint erforderlichen Zugriff oder eine `session_id`, die zu einer anderen Anwendung gehört.",
            "content": {
              "application/json": {
                "examples": {
                  "Invalid Credentials": {
                    "summary": "Fehlender oder ungültiger x-api-key",
                    "value": {
                      "detail": "Authentication credentials were not provided or are invalid."
                    }
                  },
                  "Missing Privilege": {
                    "summary": "Dem Aufrufer fehlt write:sessions",
                    "value": {
                      "detail": "You do not have permission to perform this action."
                    }
                  },
                  "Scoped Key Without Access": {
                    "summary": "API-Schlüssel mit eingeschränktem Berechtigungsumfang ohne diesen Zugriff",
                    "value": {
                      "detail": "This API key has no write access to decisions."
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Es existiert keine KYC- oder KYB-Sitzung mit dieser `session_id`, oder die Sitzung hat keinen Override mit dieser `overrideId`.",
            "content": {
              "application/json": {
                "examples": {
                  "Not Found": {
                    "summary": "Unbekannte session_id",
                    "value": {
                      "detail": "Not found."
                    }
                  },
                  "Override Not Found": {
                    "summary": "Kein Override mit dieser ID in der Sitzung",
                    "value": {
                      "detail": "Override not found."
                    }
                  }
                }
              }
            }
          },
          "409": {
            "description": "Der Override wurde bereits angewendet oder storniert.",
            "content": {
              "application/json": {
                "examples": {
                  "Not Pending": {
                    "summary": "Nur ein ausstehendes Override kann abgebrochen werden",
                    "value": {
                      "detail": "This override is no longer pending: it already applied or was cancelled.",
                      "code": "feature_override_not_pending"
                    }
                  }
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X POST \\\n  https://verification.didit.me/v3/session/3fa85f64-5717-4562-b3fc-2c963f66afa6/features/overrides/9b2f4c1e-8d3a-4e5f-a6b7-c8d9e0f1a2b3/cancel/ \\\n  -H 'x-api-key: YOUR_API_KEY'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.sessions.cancel_feature_override(\n    \"3fa85f64-5717-4562-b3fc-2c963f66afa6\",\n    \"9b2f4c1e-8d3a-4e5f-a6b7-c8d9e0f1a2b3\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.sessions.cancelFeatureOverride(\n  \"3fa85f64-5717-4562-b3fc-2c963f66afa6\",\n  \"9b2f4c1e-8d3a-4e5f-a6b7-c8d9e0f1a2b3\",\n);\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Sessions.CancelFeatureOverride(ctx, \"3fa85f64-5717-4562-b3fc-2c963f66afa6\", \"9b2f4c1e-8d3a-4e5f-a6b7-c8d9e0f1a2b3\")\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.sessions().cancelFeatureOverride(\"3fa85f64-5717-4562-b3fc-2c963f66afa6\", \"9b2f4c1e-8d3a-4e5f-a6b7-c8d9e0f1a2b3\");\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->sessions->cancelFeatureOverride('3fa85f64-5717-4562-b3fc-2c963f66afa6', '9b2f4c1e-8d3a-4e5f-a6b7-c8d9e0f1a2b3');\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.sessions.cancel_feature_override(\n  \"3fa85f64-5717-4562-b3fc-2c963f66afa6\",\n  \"9b2f4c1e-8d3a-4e5f-a6b7-c8d9e0f1a2b3\"\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Sessions.CancelFeatureOverrideAsync(\"3fa85f64-5717-4562-b3fc-2c963f66afa6\", \"9b2f4c1e-8d3a-4e5f-a6b7-c8d9e0f1a2b3\");\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "x-didit-sdk": {
          "resource": "sessions",
          "method": "cancel_feature_override",
          "auth": "api_key",
          "server": true
        }
      }
    },
    "/v3/organization/{organization_id}/application/{application_id}/networks/{network_uuid}/tags/add/": {
      "post": {
        "summary": "Tag zu einem Netzwerk hinzufügen",
        "description": "Weisen Sie dem Netzwerk eines der Tags Ihrer Anwendung zu. Gibt die Netzwerkdetails zurück, deren `tags` die Tags Ihrer Anwendung im Netzwerk auflistet, mit `201`, wenn das Tag hinzugefügt wurde, und `200`, wenn es sich bereits im Netzwerk befand. Ein Tag, das zu einer anderen Anwendung gehört oder nicht existiert, gibt 404 `Tag not found.` zurück. Erfordert einen API-Schlüssel mit Vollzugriff oder `write:networks` für ein Konsolenmitglied.",
        "operationId": "add_network_tag",
        "tags": [
          "Networks"
        ],
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "parameters": [
          {
            "name": "organization_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "UUID der Organisation."
          },
          {
            "name": "application_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Anwendungs-UUID."
          },
          {
            "name": "network_uuid",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "3fa85f64-5717-4562-b3fc-2c963f66afa6"
            },
            "description": "Netzwerk-UUID."
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/NetworkTagRequest"
              },
              "example": {
                "tag_uuid": "7c9e6679-7425-40de-944b-e07fc1f90ae7"
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X POST 'https://verification.didit.me/v3/organization/11111111-2222-3333-4444-555555555555/application/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/networks/3fa85f64-5717-4562-b3fc-2c963f66afa6/tags/add/' \\\n  -H 'x-api-key: YOUR_API_KEY' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\"tag_uuid\": \"7c9e6679-7425-40de-944b-e07fc1f90ae7\"}'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.networks.add_tag(\n    \"3fa85f64-5717-4562-b3fc-2c963f66afa6\",\n    tag_uuid=\"7c9e6679-7425-40de-944b-e07fc1f90ae7\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.networks.addTag(\"3fa85f64-5717-4562-b3fc-2c963f66afa6\", {\n  tag_uuid: \"7c9e6679-7425-40de-944b-e07fc1f90ae7\",\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.Networks.AddTag(ctx, \"3fa85f64-5717-4562-b3fc-2c963f66afa6\", didit.NetworkTagRequest{\n\tTagUUID: \"7c9e6679-7425-40de-944b-e07fc1f90ae7\",\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\nimport me.didit.types.NetworkTagRequest;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.networks().addTag(\"3fa85f64-5717-4562-b3fc-2c963f66afa6\", NetworkTagRequest.builder()\n        .tagUuid(\"7c9e6679-7425-40de-944b-e07fc1f90ae7\")\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\n$didit = new DiditClient();\n\n$result = $didit->networks->addTag('3fa85f64-5717-4562-b3fc-2c963f66afa6', [\n    'tag_uuid' => '7c9e6679-7425-40de-944b-e07fc1f90ae7',\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.networks.add_tag(\n  \"3fa85f64-5717-4562-b3fc-2c963f66afa6\",\n  tag_uuid: \"7c9e6679-7425-40de-944b-e07fc1f90ae7\"\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.Networks.AddTagAsync(\"3fa85f64-5717-4562-b3fc-2c963f66afa6\", new NetworkTagRequest\n{\n    TagUuid = \"7c9e6679-7425-40de-944b-e07fc1f90ae7\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "responses": {
          "201": {
            "description": "Das Tag wurde hinzugefügt. Gibt die Netzwerkdetails zurück.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NetworkDetailResponse"
                },
                "example": {
                  "uuid": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
                  "network_id": "N-0042",
                  "name": null,
                  "status": "in_review",
                  "risk": {
                    "score": 82,
                    "band": "high",
                    "bar": 0.82
                  },
                  "pattern_types": [
                    "exact_same_device",
                    "same_email"
                  ],
                  "signal_types": [
                    "device",
                    "email"
                  ],
                  "member_counts": {
                    "total": 3,
                    "users": 3,
                    "businesses": 0,
                    "transaction_parties": 0
                  },
                  "member_status": {
                    "approved": 1,
                    "declined": 1,
                    "in_review": 0,
                    "not_completed": 1
                  },
                  "signal_coverage": {
                    "device": {
                      "signals": 1,
                      "subjects": 3,
                      "coverage": 1.0
                    },
                    "email": {
                      "signals": 1,
                      "subjects": 2,
                      "coverage": 0.6667
                    }
                  },
                  "first_activity_at": "2026-10-01T09:12:44Z",
                  "last_activity_at": "2026-10-12T16:03:10Z",
                  "stats": {
                    "members": {
                      "total": 3,
                      "users": 3,
                      "businesses": 0,
                      "transaction_parties": 0
                    },
                    "member_status": {
                      "approved": 1,
                      "declined": 1,
                      "in_review": 0,
                      "not_completed": 1
                    },
                    "signals": {
                      "total": 2,
                      "by_type": {
                        "device": {
                          "signals": 1,
                          "subjects": 3,
                          "coverage": 1.0
                        },
                        "email": {
                          "signals": 1,
                          "subjects": 2,
                          "coverage": 0.6667
                        }
                      }
                    }
                  },
                  "fraud_tags": [],
                  "risk_signals": {
                    "residential_proxy_reuse": {
                      "detected": false,
                      "signal_count": 0,
                      "max_subject_count": 0
                    },
                    "email_intelligence": {
                      "enriched_signal_count": 1,
                      "high_risk_count": 0,
                      "social_profile_count": 0
                    },
                    "phone_intelligence": {
                      "enriched_signal_count": 0,
                      "high_risk_count": 0
                    }
                  },
                  "reviewed_at": "2026-10-12T16:30:00Z",
                  "reviewed_by": "reviewer@example.com",
                  "review_reason": "Shared device across three new accounts.",
                  "notes_count": 0,
                  "sharing_mode": "global",
                  "cross_org_available": true,
                  "cross_org_unavailable_reason": null,
                  "tags": [
                    {
                      "uuid": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
                      "name": "SUSPICIOUS",
                      "color": "#6366F1",
                      "source": "custom",
                      "added_by": null,
                      "added_at": "2026-10-13T08:15:00Z"
                    }
                  ],
                  "outcomes": {
                    "approved": 1,
                    "declined": 1,
                    "in_review": 0,
                    "total": 3
                  },
                  "patterns": [
                    {
                      "type": "background",
                      "score": 0.8125,
                      "members": 3,
                      "reason": null,
                      "computed_at": "2026-10-13T08:00:00Z"
                    }
                  ]
                }
              }
            }
          },
          "200": {
            "description": "Das Tag war bereits im Netzwerk vorhanden und bleibt unverändert. Gibt die Netzwerkdetails zurück.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NetworkDetailResponse"
                },
                "example": {
                  "uuid": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
                  "network_id": "N-0042",
                  "name": null,
                  "status": "in_review",
                  "risk": {
                    "score": 82,
                    "band": "high",
                    "bar": 0.82
                  },
                  "pattern_types": [
                    "exact_same_device",
                    "same_email"
                  ],
                  "signal_types": [
                    "device",
                    "email"
                  ],
                  "member_counts": {
                    "total": 3,
                    "users": 3,
                    "businesses": 0,
                    "transaction_parties": 0
                  },
                  "member_status": {
                    "approved": 1,
                    "declined": 1,
                    "in_review": 0,
                    "not_completed": 1
                  },
                  "signal_coverage": {
                    "device": {
                      "signals": 1,
                      "subjects": 3,
                      "coverage": 1.0
                    },
                    "email": {
                      "signals": 1,
                      "subjects": 2,
                      "coverage": 0.6667
                    }
                  },
                  "first_activity_at": "2026-10-01T09:12:44Z",
                  "last_activity_at": "2026-10-12T16:03:10Z",
                  "stats": {
                    "members": {
                      "total": 3,
                      "users": 3,
                      "businesses": 0,
                      "transaction_parties": 0
                    },
                    "member_status": {
                      "approved": 1,
                      "declined": 1,
                      "in_review": 0,
                      "not_completed": 1
                    },
                    "signals": {
                      "total": 2,
                      "by_type": {
                        "device": {
                          "signals": 1,
                          "subjects": 3,
                          "coverage": 1.0
                        },
                        "email": {
                          "signals": 1,
                          "subjects": 2,
                          "coverage": 0.6667
                        }
                      }
                    }
                  },
                  "fraud_tags": [],
                  "risk_signals": {
                    "residential_proxy_reuse": {
                      "detected": false,
                      "signal_count": 0,
                      "max_subject_count": 0
                    },
                    "email_intelligence": {
                      "enriched_signal_count": 1,
                      "high_risk_count": 0,
                      "social_profile_count": 0
                    },
                    "phone_intelligence": {
                      "enriched_signal_count": 0,
                      "high_risk_count": 0
                    }
                  },
                  "reviewed_at": "2026-10-12T16:30:00Z",
                  "reviewed_by": "reviewer@example.com",
                  "review_reason": "Shared device across three new accounts.",
                  "notes_count": 0,
                  "sharing_mode": "global",
                  "cross_org_available": true,
                  "cross_org_unavailable_reason": null,
                  "tags": [
                    {
                      "uuid": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
                      "name": "SUSPICIOUS",
                      "color": "#6366F1",
                      "source": "custom",
                      "added_by": null,
                      "added_at": "2026-10-13T08:15:00Z"
                    }
                  ],
                  "outcomes": {
                    "approved": 1,
                    "declined": 1,
                    "in_review": 0,
                    "total": 3
                  },
                  "patterns": [
                    {
                      "type": "background",
                      "score": 0.8125,
                      "members": 3,
                      "reason": null,
                      "computed_at": "2026-10-13T08:00:00Z"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "Ungültiger Body: `tag_uuid` fehlt oder ist keine UUID.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "tag_uuid": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      }
                    }
                  }
                },
                "examples": {
                  "Missing tag_uuid": {
                    "summary": "Fehlende tag_uuid",
                    "value": {
                      "tag_uuid": [
                        "This field is required."
                      ]
                    }
                  },
                  "Invalid tag_uuid": {
                    "summary": "Ungültige tag_uuid",
                    "value": {
                      "tag_uuid": [
                        "Must be a valid UUID."
                      ]
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Fehlende oder ungültige Anmeldedaten.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string"
                    },
                    "code": {
                      "type": "string",
                      "description": "Vorhanden bei codierten Fehlern, zum Beispiel `networks_not_entitled`."
                    }
                  }
                },
                "examples": {
                  "Missing or invalid credentials": {
                    "summary": "Fehlende oder ungültige Anmeldedaten",
                    "value": {
                      "detail": "Authentication credentials were not provided or are invalid."
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Der API-Schlüssel gehört zu einer anderen Anwendung oder ist ein Schlüssel mit eingeschränktem Zugriff: Networks-Endpoints erfordern einen Schlüssel mit Vollzugriff. Ein Konsolen-Mitgliedstoken benötigt `write:networks`. Wird auch mit `code: networks_not_entitled` zurückgegeben, wenn Networks für die Organisation nicht aktiviert ist.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string"
                    },
                    "code": {
                      "type": "string",
                      "description": "Vorhanden bei codierten Fehlern, zum Beispiel `networks_not_entitled`."
                    }
                  }
                },
                "examples": {
                  "Networks not enabled": {
                    "summary": "Netzwerke nicht aktiviert",
                    "value": {
                      "detail": "Networks is disabled for this organization. Contact Didit support if you believe this is an error.",
                      "code": "networks_not_entitled"
                    }
                  },
                  "Restricted API key": {
                    "summary": "Eingeschränkter API-Schlüssel",
                    "value": {
                      "detail": "This API key has no access to this endpoint."
                    }
                  },
                  "No permission": {
                    "summary": "Keine Berechtigung",
                    "value": {
                      "detail": "You do not have permission to perform this action."
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Nicht gefunden.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string"
                    },
                    "code": {
                      "type": "string",
                      "description": "Vorhanden bei codierten Fehlern, zum Beispiel `networks_not_entitled`."
                    }
                  }
                },
                "examples": {
                  "Network not found": {
                    "summary": "Netzwerk nicht gefunden",
                    "value": {
                      "detail": "Network not found."
                    }
                  },
                  "Tag not found": {
                    "summary": "Tag nicht gefunden",
                    "value": {
                      "detail": "Tag not found."
                    }
                  }
                }
              }
            }
          }
        },
        "x-didit-sdk": {
          "resource": "networks",
          "method": "add_tag",
          "auth": "api_key",
          "server": true,
          "scope": "application"
        }
      }
    },
    "/v3/organization/{organization_id}/application/{application_id}/networks/{network_uuid}/tags/remove/": {
      "post": {
        "summary": "Tag aus einem Netzwerk entfernen",
        "description": "Entfernt eines der Tags Ihrer Anwendung aus dem Netzwerk. Gibt die Netzwerkdetails zurück. 404, wenn sich das Tag nicht im Netzwerk befindet oder nicht zu Ihrer Anwendung gehört. Erfordert einen API-Schlüssel mit Vollzugriff oder `write:networks` für ein Konsolenmitglied.",
        "operationId": "remove_network_tag",
        "tags": [
          "Networks"
        ],
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "parameters": [
          {
            "name": "organization_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "UUID der Organisation."
          },
          {
            "name": "application_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Anwendungs-UUID."
          },
          {
            "name": "network_uuid",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "3fa85f64-5717-4562-b3fc-2c963f66afa6"
            },
            "description": "Netzwerk-UUID."
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/NetworkTagRequest"
              },
              "example": {
                "tag_uuid": "7c9e6679-7425-40de-944b-e07fc1f90ae7"
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X POST 'https://verification.didit.me/v3/organization/11111111-2222-3333-4444-555555555555/application/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/networks/3fa85f64-5717-4562-b3fc-2c963f66afa6/tags/remove/' \\\n  -H 'x-api-key: YOUR_API_KEY' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\"tag_uuid\": \"7c9e6679-7425-40de-944b-e07fc1f90ae7\"}'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.networks.remove_tag(\n    \"3fa85f64-5717-4562-b3fc-2c963f66afa6\",\n    tag_uuid=\"7c9e6679-7425-40de-944b-e07fc1f90ae7\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.networks.removeTag(\"3fa85f64-5717-4562-b3fc-2c963f66afa6\", {\n  tag_uuid: \"7c9e6679-7425-40de-944b-e07fc1f90ae7\",\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.Networks.RemoveTag(ctx, \"3fa85f64-5717-4562-b3fc-2c963f66afa6\", didit.NetworkTagRequest{\n\tTagUUID: \"7c9e6679-7425-40de-944b-e07fc1f90ae7\",\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\nimport me.didit.types.NetworkTagRequest;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.networks().removeTag(\"3fa85f64-5717-4562-b3fc-2c963f66afa6\", NetworkTagRequest.builder()\n        .tagUuid(\"7c9e6679-7425-40de-944b-e07fc1f90ae7\")\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\n$didit = new DiditClient();\n\n$result = $didit->networks->removeTag('3fa85f64-5717-4562-b3fc-2c963f66afa6', [\n    'tag_uuid' => '7c9e6679-7425-40de-944b-e07fc1f90ae7',\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.networks.remove_tag(\n  \"3fa85f64-5717-4562-b3fc-2c963f66afa6\",\n  tag_uuid: \"7c9e6679-7425-40de-944b-e07fc1f90ae7\"\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.Networks.RemoveTagAsync(\"3fa85f64-5717-4562-b3fc-2c963f66afa6\", new NetworkTagRequest\n{\n    TagUuid = \"7c9e6679-7425-40de-944b-e07fc1f90ae7\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "responses": {
          "200": {
            "description": "Das Tag wurde aus dem Netzwerk entfernt. Gibt die Netzwerkdetails zurück.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NetworkDetailResponse"
                },
                "example": {
                  "uuid": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
                  "network_id": "N-0042",
                  "name": null,
                  "status": "in_review",
                  "risk": {
                    "score": 82,
                    "band": "high",
                    "bar": 0.82
                  },
                  "pattern_types": [
                    "exact_same_device",
                    "same_email"
                  ],
                  "signal_types": [
                    "device",
                    "email"
                  ],
                  "member_counts": {
                    "total": 3,
                    "users": 3,
                    "businesses": 0,
                    "transaction_parties": 0
                  },
                  "member_status": {
                    "approved": 1,
                    "declined": 1,
                    "in_review": 0,
                    "not_completed": 1
                  },
                  "signal_coverage": {
                    "device": {
                      "signals": 1,
                      "subjects": 3,
                      "coverage": 1.0
                    },
                    "email": {
                      "signals": 1,
                      "subjects": 2,
                      "coverage": 0.6667
                    }
                  },
                  "first_activity_at": "2026-10-01T09:12:44Z",
                  "last_activity_at": "2026-10-12T16:03:10Z",
                  "stats": {
                    "members": {
                      "total": 3,
                      "users": 3,
                      "businesses": 0,
                      "transaction_parties": 0
                    },
                    "member_status": {
                      "approved": 1,
                      "declined": 1,
                      "in_review": 0,
                      "not_completed": 1
                    },
                    "signals": {
                      "total": 2,
                      "by_type": {
                        "device": {
                          "signals": 1,
                          "subjects": 3,
                          "coverage": 1.0
                        },
                        "email": {
                          "signals": 1,
                          "subjects": 2,
                          "coverage": 0.6667
                        }
                      }
                    }
                  },
                  "fraud_tags": [],
                  "risk_signals": {
                    "residential_proxy_reuse": {
                      "detected": false,
                      "signal_count": 0,
                      "max_subject_count": 0
                    },
                    "email_intelligence": {
                      "enriched_signal_count": 1,
                      "high_risk_count": 0,
                      "social_profile_count": 0
                    },
                    "phone_intelligence": {
                      "enriched_signal_count": 0,
                      "high_risk_count": 0
                    }
                  },
                  "reviewed_at": "2026-10-12T16:30:00Z",
                  "reviewed_by": "reviewer@example.com",
                  "review_reason": "Shared device across three new accounts.",
                  "notes_count": 0,
                  "sharing_mode": "global",
                  "cross_org_available": true,
                  "cross_org_unavailable_reason": null,
                  "tags": [],
                  "outcomes": {
                    "approved": 1,
                    "declined": 1,
                    "in_review": 0,
                    "total": 3
                  },
                  "patterns": [
                    {
                      "type": "background",
                      "score": 0.8125,
                      "members": 3,
                      "reason": null,
                      "computed_at": "2026-10-13T08:00:00Z"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "Ungültiger Body: `tag_uuid` fehlt oder ist keine UUID.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "tag_uuid": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      }
                    }
                  }
                },
                "examples": {
                  "Missing tag_uuid": {
                    "summary": "Fehlende tag_uuid",
                    "value": {
                      "tag_uuid": [
                        "This field is required."
                      ]
                    }
                  },
                  "Invalid tag_uuid": {
                    "summary": "Ungültige tag_uuid",
                    "value": {
                      "tag_uuid": [
                        "Must be a valid UUID."
                      ]
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Fehlende oder ungültige Anmeldedaten.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string"
                    },
                    "code": {
                      "type": "string",
                      "description": "Vorhanden bei codierten Fehlern, zum Beispiel `networks_not_entitled`."
                    }
                  }
                },
                "examples": {
                  "Missing or invalid credentials": {
                    "summary": "Fehlende oder ungültige Anmeldedaten",
                    "value": {
                      "detail": "Authentication credentials were not provided or are invalid."
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Der API-Schlüssel gehört zu einer anderen Anwendung oder ist ein Schlüssel mit eingeschränktem Zugriff: Networks-Endpoints erfordern einen Schlüssel mit Vollzugriff. Ein Konsolen-Mitgliedstoken benötigt `write:networks`. Wird auch mit `code: networks_not_entitled` zurückgegeben, wenn Networks für die Organisation nicht aktiviert ist.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string"
                    },
                    "code": {
                      "type": "string",
                      "description": "Vorhanden bei codierten Fehlern, zum Beispiel `networks_not_entitled`."
                    }
                  }
                },
                "examples": {
                  "Networks not enabled": {
                    "summary": "Netzwerke nicht aktiviert",
                    "value": {
                      "detail": "Networks is disabled for this organization. Contact Didit support if you believe this is an error.",
                      "code": "networks_not_entitled"
                    }
                  },
                  "Restricted API key": {
                    "summary": "Eingeschränkter API-Schlüssel",
                    "value": {
                      "detail": "This API key has no access to this endpoint."
                    }
                  },
                  "No permission": {
                    "summary": "Keine Berechtigung",
                    "value": {
                      "detail": "You do not have permission to perform this action."
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Nicht gefunden.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string"
                    },
                    "code": {
                      "type": "string",
                      "description": "Vorhanden bei codierten Fehlern, zum Beispiel `networks_not_entitled`."
                    }
                  }
                },
                "examples": {
                  "Network not found": {
                    "summary": "Netzwerk nicht gefunden",
                    "value": {
                      "detail": "Network not found."
                    }
                  },
                  "Tag not found": {
                    "summary": "Tag nicht gefunden",
                    "value": {
                      "detail": "Tag not found."
                    }
                  },
                  "Tag not on the network": {
                    "summary": "Tag nicht im Netzwerk",
                    "value": {
                      "detail": "This tag is not on the network."
                    }
                  }
                }
              }
            }
          }
        },
        "x-didit-sdk": {
          "resource": "networks",
          "method": "remove_tag",
          "auth": "api_key",
          "server": true,
          "scope": "application"
        }
      }
    },
    "/v3/organization/{organization_id}/application/{application_id}/cases/{case_uuid}/requests/{request_uuid}/remind/": {
      "post": {
        "summary": "Den Kunden an eine Anfrage erinnern",
        "description": "Senden Sie die E-Mail einer ausstehenden Kundenanfrage erneut an denselben verifizierten Empfänger mit demselben Inhalt. Sie können maximal einmal alle 24 Stunden an eine Anfrage erinnern. Eine Erinnerung ändert sonst nichts: Die Anfrage behält ihre Frist und der Fall behält seinen Status. Jede Erinnerung wird im Fall als CUSTOMER_REQUEST-Ereignis mit der Aktion `reminded` protokolliert. Der `delivery_status` der Antwort gibt an, wie die Zustellung dieser Erinnerung endete: SENT, SIMULATED (die E-Mail wurde nicht gesendet) oder UNKNOWN (die E-Mail wurde möglicherweise angenommen; sie wird nicht automatisch erneut gesendet). `next_reminder_at` gibt an, wann Sie erneut an diese Anfrage erinnern können. Gibt 409 mit einem `reason` zurück, wenn der Kunde die Anfrage nicht mehr zu beantworten hat, und 429 mit `retry_at` sowie einem `Retry-After`-Header, wenn an die Anfrage in den letzten 24 Stunden bereits erinnert wurde. Erfordert `write:cases`.",
        "operationId": "organization_application_cases_requests_remind_create",
        "parameters": [
          {
            "in": "path",
            "name": "organization_id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "required": true,
            "description": "UUID der Organisation."
          },
          {
            "in": "path",
            "name": "application_id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "required": true,
            "description": "Anwendungs-UUID."
          },
          {
            "in": "path",
            "name": "case_uuid",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "required": true,
            "description": "Fall-UUID."
          },
          {
            "in": "path",
            "name": "request_uuid",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "required": true,
            "description": "UUID der Kundenanfrage aus der Anfragenliste des Falls."
          }
        ],
        "tags": [
          "Case Management"
        ],
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X POST 'https://verification.didit.me/v3/organization/11111111-2222-3333-4444-555555555555/application/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/cases/c1a5e000-0000-4000-8000-000000000001/requests/3fa85f64-5717-4562-b3fc-2c963f66afa6/remind/' \\\n  -H 'x-api-key: YOUR_API_KEY'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nresult = client.cases.requests.remind(\n    \"11111111-2222-3333-4444-555555555555\",\n    \"11111111-2222-3333-4444-555555555555\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nconst result = await didit.cases.requests.remind(\n  \"11111111-2222-3333-4444-555555555555\",\n  \"11111111-2222-3333-4444-555555555555\",\n);\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.Cases.Requests.Remind(ctx, \"11111111-2222-3333-4444-555555555555\", \"11111111-2222-3333-4444-555555555555\")\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nvar result = client.cases().requests().remind(\"11111111-2222-3333-4444-555555555555\", \"11111111-2222-3333-4444-555555555555\");\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\n$didit = new DiditClient();\n\n$result = $didit->cases->requests->remind('11111111-2222-3333-4444-555555555555', '11111111-2222-3333-4444-555555555555');\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\nresult = didit.cases.requests.remind(\n  \"11111111-2222-3333-4444-555555555555\",\n  \"11111111-2222-3333-4444-555555555555\"\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nvar result = await client.Cases.Requests.RemindAsync(\"11111111-2222-3333-4444-555555555555\", \"11111111-2222-3333-4444-555555555555\");\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "responses": {
          "200": {
            "description": "Die Erinnerung wurde erfasst und ihre E-Mail versendet.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "request",
                    "reminded_at",
                    "delivery_status",
                    "next_reminder_at"
                  ],
                  "properties": {
                    "request": {
                      "$ref": "#/components/schemas/CustomerMessagingCaseRequest"
                    },
                    "reminded_at": {
                      "type": "string",
                      "format": "date-time",
                      "description": "Wann diese Erinnerung erfasst wurde."
                    },
                    "delivery_status": {
                      "type": "string",
                      "enum": [
                        "SENT",
                        "SIMULATED",
                        "UNKNOWN"
                      ],
                      "description": "Wie die Zustellung dieser Erinnerung endete. SIMULATED: Die E-Mail wurde nicht gesendet. UNKNOWN: Die E-Mail wurde möglicherweise akzeptiert; sie wird nicht automatisch erneut gesendet."
                    },
                    "next_reminder_at": {
                      "type": "string",
                      "format": "date-time",
                      "description": "Wann Sie erneut an diese Anfrage erinnern können: `reminded_at` plus 24 Stunden."
                    }
                  }
                },
                "example": {
                  "request": {
                    "uuid": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
                    "purpose": "confirm_details",
                    "language": "en",
                    "recipient": "customer@example.com",
                    "expires_at": "2026-10-20T09:00:00Z",
                    "actor_email": "reviewer@example.com",
                    "delivery_status": "SENT",
                    "delivered_at": "2026-10-13T09:00:04Z",
                    "cancelled_at": null,
                    "responded_at": null,
                    "response": null,
                    "has_attachment": false,
                    "created_at": "2026-10-13T09:00:00Z"
                  },
                  "reminded_at": "2026-10-14T10:30:00Z",
                  "delivery_status": "SENT",
                  "next_reminder_at": "2026-10-15T10:30:00Z"
                }
              }
            }
          },
          "400": {
            "description": "Der Fall hat einen Beschluss, dessen Genehmigung noch aussteht. Der Body ist eine Liste von Strings.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  }
                },
                "example": [
                  "Customer messages require an active case without a pending resolution."
                ]
              }
            }
          },
          "403": {
            "description": "Dem Aufrufer fehlt die erforderliche Berechtigung für Fälle."
          },
          "404": {
            "description": "Die Anfrage oder der Fall ist für diesen Aufrufer nicht verfügbar."
          },
          "409": {
            "description": "Die Anfrage wartet nicht mehr auf den Kunden, daher gibt es nichts, woran er erinnert werden müsste. `reason` gibt den Grund an: `answered` (der Kunde hat geantwortet), `cancelled`, `expired`, `closed` (der Fall wurde nach dem Absenden der Anfrage gelöst, selbst wenn er seitdem wiedereröffnet wurde), `not_actionable` (ein Update für eine laufende Prüfung erfordert keine Aktion), `not_delivered` (die erste E-Mail wurde noch nicht versendet) oder `contact_unavailable` (die verifizierte E-Mail ist nicht mehr verfügbar).",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string"
                    },
                    "code": {
                      "type": "string",
                      "enum": [
                        "case_request_not_waiting"
                      ]
                    },
                    "reason": {
                      "type": "string",
                      "enum": [
                        "answered",
                        "cancelled",
                        "expired",
                        "closed",
                        "not_actionable",
                        "not_delivered",
                        "contact_unavailable"
                      ]
                    }
                  }
                },
                "example": {
                  "detail": "This request no longer waits on the customer, so there is nothing to remind them of.",
                  "code": "case_request_not_waiting",
                  "reason": "answered"
                }
              }
            }
          },
          "429": {
            "description": "Für die Anfrage wurde in den letzten 24 Stunden bereits eine Erinnerung versendet. `retry_at` und der Header `Retry-After` geben an, wann Sie erneut eine Erinnerung senden können.",
            "headers": {
              "Retry-After": {
                "description": "Sekunden, die gewartet werden müssen, bevor Sie erneut an diese Anfrage erinnern können.",
                "schema": {
                  "type": "integer",
                  "minimum": 1,
                  "example": 3600
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string"
                    },
                    "code": {
                      "type": "string",
                      "enum": [
                        "case_request_reminder_too_soon"
                      ]
                    },
                    "retry_at": {
                      "type": "string",
                      "format": "date-time"
                    }
                  }
                },
                "example": {
                  "detail": "This request was already reminded in the last 24 hours.",
                  "code": "case_request_reminder_too_soon",
                  "retry_at": "2026-10-15T10:30:00Z"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "x-didit-sdk": {
          "resource": "cases.requests",
          "method": "remind",
          "auth": "api_key",
          "server": true,
          "scope": "application"
        }
      }
    },
    "/v3/session/{sessionId}/decision-email-preview/": {
      "post": {
        "summary": "Vorschau der Entscheidungs-E-Mail einer Sitzung anzeigen",
        "description": "Rendern Sie die E-Mail, die die Person erhält, wenn Sie eine Sitzung mit `send_email: true` auf `Approved` oder `Declined` setzen, ohne die Sitzung zu ändern oder etwas zu senden. Die Antwort zeigt Betreff und HTML genau so, wie sie gesendet werden, den Empfänger, den Absender, die Sprache und ob das Bestätigen der Änderung die E-Mail überhaupt sendet (`will_be_sent`, `not_sent_reason`).\n\nDer Empfänger ist die eigene Adresse der Person: diejenige, die sie in einem E-Mail-Verifizierungsschritt des Workflows verifiziert hat, andernfalls diejenige, die bei der Erstellung der Sitzung in `contact_details` angegeben wurde. Der Absender ist die verifizierte Absenderdomain Ihrer Anwendung, wenn White-Label gilt (`sender_kind: customer`), andernfalls der Didit-Absender (`sender_kind: didit`).\n\nUm genau das zu senden, was Sie in der Vorschau gesehen haben, rufen Sie [Update Session Status](/de/sessions-api/update-status) mit demselben `new_status`, `send_email: true`, `email_address` auf `recipient`, `email_language` auf `language` und `email_preview_token` auf `preview_token` auf. Der Beleg läuft nach 15 Minuten ab. Wenn sich Empfänger, Sprache, Sitzungsstatus, Absender oder E-Mail seit der Vorschau geändert haben, gibt die Aktualisierung `409` zurück, bevor etwas geändert wird; führen Sie die Vorschau erneut durch und bestätigen Sie mit dem neuen Beleg.\n\nFunktioniert für Benutzerverifizierungs- (KYC) und Unternehmensverifizierungs-Sitzungen (KYB) im Status `Approved`, `Declined`, `In Review`, `Kyc Expired`, `Abandoned` oder `Resubmitted`. Die Statusprüfung läuft vor der Body-Validierung. Erfordert die Berechtigung `write:sessions`; ein berechtigungsbeschränkter API-Schlüssel benötigt Schreibzugriff auf Entscheidungen. Antworten verwenden `Cache-Control: no-store`: Behandeln Sie sie als vertraulichen Verifizierungsinhalt.",
        "operationId": "post_v3_session_decision_email_preview",
        "tags": [
          "Sessions"
        ],
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "parameters": [
          {
            "in": "path",
            "name": "sessionId",
            "required": true,
            "description": "UUID der Verifizierungssitzung. Akzeptiert sowohl Benutzer- (KYC) als auch Unternehmens- (KYB) Sitzungs-IDs.",
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "3fa85f64-5717-4562-b3fc-2c963f66afa6"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "new_status"
                ],
                "properties": {
                  "new_status": {
                    "type": "string",
                    "enum": [
                      "Approved",
                      "Declined"
                    ],
                    "description": "Die Entscheidung, deren E-Mail Sie in der Vorschau anzeigen möchten.",
                    "example": "Approved"
                  },
                  "email_language": {
                    "type": "string",
                    "default": "en",
                    "description": "Sprache der E-Mail, derselbe Standardwert wie bei Sitzungsstatus aktualisieren. Wird eine nicht angebotene Sprache angegeben, erfolgt ein Fallback auf Englisch; das Feld `language` in der Antwort gibt an, welche Sprache verwendet wird.",
                    "example": "en"
                  }
                }
              },
              "examples": {
                "Approved": {
                  "summary": "Vorschau der E-Mail „Genehmigt“ auf Englisch anzeigen",
                  "value": {
                    "new_status": "Approved"
                  }
                },
                "Declined in Spanish": {
                  "summary": "Vorschau der E-Mail „Abgelehnt“ auf Spanisch anzeigen",
                  "value": {
                    "new_status": "Declined",
                    "email_language": "es"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Nur Vorschau. Die Sitzung bleibt unverändert und es wird keine E-Mail gesendet.",
            "headers": {
              "Cache-Control": {
                "description": "Immer `no-store`: Die Vorschau enthält Verifizierungsinhalte und darf nicht zwischengespeichert werden.",
                "schema": {
                  "type": "string",
                  "example": "no-store"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "recipient",
                    "recipient_source",
                    "sender",
                    "sender_name",
                    "sender_email",
                    "sender_kind",
                    "subject",
                    "html",
                    "text",
                    "language",
                    "will_be_sent",
                    "not_sent_reason",
                    "preview_token"
                  ],
                  "properties": {
                    "recipient": {
                      "type": "string",
                      "description": "Die Adresse, an die die E-Mail gesendet wird. Eine leere Zeichenkette, wenn keine Adresse für die Person bekannt ist: Dann kann keine E-Mail gesendet werden und `preview_token` ist ebenfalls leer. Übergeben Sie sie als `email_address`, wenn Sie bestätigen.",
                      "example": "person@example.com"
                    },
                    "recipient_source": {
                      "type": "string",
                      "enum": [
                        "email_verification",
                        "contact_details",
                        ""
                      ],
                      "description": "Woher `recipient` stammt. `email_verification`: die Adresse, die die Person in einem E-Mail-Verifizierungsschritt des Ablaufs verifiziert hat. `contact_details`: die in `contact_details` bei der Erstellung der Sitzung angegebene Adresse. Eine leere Zeichenkette, wenn keine Adresse vorhanden ist.",
                      "example": "email_verification"
                    },
                    "sender": {
                      "type": "string",
                      "description": "Der `From`-Header, mit dem die E-Mail gesendet wird.",
                      "example": "Example App <no-reply@mail.example.com>"
                    },
                    "sender_name": {
                      "type": "string",
                      "description": "Der Teil des Anzeigenamens von `sender`.",
                      "example": "Example App"
                    },
                    "sender_email": {
                      "type": "string",
                      "format": "email",
                      "description": "Der Adressteil von `sender`.",
                      "example": "no-reply@mail.example.com"
                    },
                    "sender_kind": {
                      "type": "string",
                      "enum": [
                        "customer",
                        "didit"
                      ],
                      "description": "`customer`: Die E-Mail wird von der verifizierten Absender-Domain Ihrer Anwendung versendet (White-Label). `didit`: Sie wird vom Didit-eigenen Absender versendet.",
                      "example": "customer"
                    },
                    "subject": {
                      "type": "string",
                      "description": "Die Betreffzeile genau so, wie sie gesendet wird.",
                      "example": "Your verification has been approved in Example App"
                    },
                    "html": {
                      "type": "string",
                      "description": "Das HTML der E-Mail exakt so, wie es versendet wird, mit eingebettetem Logo als Data-URL. Rendern Sie es in einem Sandboxed-Frame, niemals direkt im DOM Ihrer Anwendung.",
                      "example": "<!DOCTYPE html><html><body>...</body></html>"
                    },
                    "text": {
                      "type": "string",
                      "description": "Der Text der E-Mail als Klartext, wie ihn der Nachrichtenverlauf der Person speichert, für eine kompakte Vorschau (das HTML bleibt die E-Mail, die die Person erhält).",
                      "example": "Verification Approved\n\nYour identity has been successfully verified with Acme Pay. No further action is needed on your part."
                    },
                    "language": {
                      "type": "string",
                      "description": "Die Sprache, in der die E-Mail verfasst ist. Englisch (`en`), wenn das angeforderte `email_language` nicht angeboten wird.",
                      "example": "en"
                    },
                    "will_be_sent": {
                      "type": "boolean",
                      "description": "Gibt an, ob das Bestätigen der Änderung mit `send_email: true` diese E-Mail versendet. `false`, wenn `not_sent_reason` gesetzt ist.",
                      "example": true
                    },
                    "not_sent_reason": {
                      "type": "string",
                      "nullable": true,
                      "enum": [
                        "status_unchanged",
                        "notification_emails_disabled",
                        "no_recipient",
                        "sandbox",
                        null
                      ],
                      "description": "Warum bei der Bestätigung keine E-Mail gesendet werden würde, oder `null`, wenn sie gesendet wird. `status_unchanged`: Die Sitzung hat diesen Status bereits, daher ändert die Aktualisierung nichts und sendet nichts. `notification_emails_disabled`: Die Sitzung wurde ohne `contact_details.send_notification_emails: true` erstellt, daher geht keine Entscheidungs-E-Mail an die in `contact_details` angegebene Adresse. `no_recipient`: Für die Person ist keine Adresse bekannt. `sandbox`: Eine Sandbox-Sitzung, deren Empfänger die Sandbox-E-Mail-Zustellung nicht aktiviert hat, sodass der Versand nur simuliert wird.",
                      "example": null
                    },
                    "preview_token": {
                      "type": "string",
                      "description": "Signierte Quittung für genau diese E-Mail, gültig für 15 Minuten. Übergeben Sie sie als `email_preview_token` an [Sitzungsstatus aktualisieren](/de/sessions-api/update-status). Eine leere Zeichenfolge, wenn kein Empfänger vorhanden ist.",
                      "example": "eyJkaWdlc3QiOiI0ZjJhIn0:1uExAm:Pl3x4mpleS1gnatureValue000000000000000"
                    }
                  }
                },
                "examples": {
                  "Will Be Sent": {
                    "summary": "Die „Approved“-E-Mail geht an die im Ablauf verifizierte Adresse",
                    "value": {
                      "recipient": "person@example.com",
                      "recipient_source": "email_verification",
                      "sender": "Example App <no-reply@mail.example.com>",
                      "sender_name": "Example App",
                      "sender_email": "no-reply@mail.example.com",
                      "sender_kind": "customer",
                      "subject": "Your verification has been approved in Example App",
                      "html": "<!DOCTYPE html><html><body>...</body></html>",
                      "language": "en",
                      "will_be_sent": true,
                      "not_sent_reason": null,
                      "preview_token": "eyJkaWdlc3QiOiI0ZjJhIn0:1uExAm:Pl3x4mpleS1gnatureValue000000000000000"
                    }
                  },
                  "No Recipient": {
                    "summary": "Für die Person ist keine Adresse bekannt",
                    "value": {
                      "recipient": "",
                      "recipient_source": "",
                      "sender": "Example App <no-reply@mail.example.com>",
                      "sender_name": "Example App",
                      "sender_email": "no-reply@mail.example.com",
                      "sender_kind": "customer",
                      "subject": "Your verification has been declined in Example App",
                      "html": "<!DOCTYPE html><html><body>...</body></html>",
                      "language": "en",
                      "will_be_sent": false,
                      "not_sent_reason": "no_recipient",
                      "preview_token": ""
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Die Sitzung befindet sich nicht in einem von diesem Endpoint akzeptierten Status (`{\"detail\": ...}`), oder der Body ist ungültig (`{\"<field>\": [\"<message>\"]}`).",
            "content": {
              "application/json": {
                "examples": {
                  "Wrong Current Status": {
                    "summary": "Sitzung befindet sich nicht in einem Status, den dieser Endpoint akzeptiert",
                    "value": {
                      "detail": "Only sessions with status Approved, Declined, In Review, Kyc Expired, Abandoned, Resubmitted can be updated. Current status: In Progress"
                    }
                  },
                  "Invalid new_status": {
                    "summary": "new_status ist nicht Approved oder Declined",
                    "value": {
                      "new_status": [
                        "\"Resubmitted\" is not a valid choice."
                      ]
                    }
                  },
                  "Missing new_status": {
                    "summary": "Erforderliches Feld weggelassen",
                    "value": {
                      "new_status": [
                        "This field is required."
                      ]
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Der API-Schlüssel mit eingeschränktem Geltungsbereich ist abgelaufen.",
            "content": {
              "application/json": {
                "examples": {
                  "Expired API Key": {
                    "summary": "API-Schlüssel mit eingeschränktem Berechtigungsumfang nach Ablaufdatum",
                    "value": {
                      "detail": "This API key has expired."
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Fehlende Anmeldedaten, ein Aufrufer ohne das `write:sessions`-Privileg, ein API-Schlüssel mit Gültigkeitsbereich ohne den für diesen Endpoint erforderlichen Zugriff oder eine `session_id`, die zu einer anderen Anwendung gehört.",
            "content": {
              "application/json": {
                "examples": {
                  "Invalid Credentials": {
                    "summary": "Fehlender oder ungültiger x-api-key",
                    "value": {
                      "detail": "Authentication credentials were not provided or are invalid."
                    }
                  },
                  "Missing Privilege": {
                    "summary": "Dem Aufrufer fehlt write:sessions",
                    "value": {
                      "detail": "You do not have permission to perform this action."
                    }
                  },
                  "Scoped Key Without Access": {
                    "summary": "API-Schlüssel mit eingeschränktem Berechtigungsumfang ohne diesen Zugriff",
                    "value": {
                      "detail": "This API key has no write access to decisions."
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Es existiert keine KYC- oder KYB-Sitzung mit dieser `session_id`.",
            "content": {
              "application/json": {
                "examples": {
                  "Not Found": {
                    "summary": "Unbekannte session_id",
                    "value": {
                      "detail": "Not found."
                    }
                  }
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X POST \\\n  https://verification.didit.me/v3/session/3fa85f64-5717-4562-b3fc-2c963f66afa6/decision-email-preview/ \\\n  -H 'x-api-key: YOUR_API_KEY' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\"new_status\": \"Approved\", \"email_language\": \"en\"}'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.sessions.preview_decision_email(\n    \"3fa85f64-5717-4562-b3fc-2c963f66afa6\",\n    new_status=\"Approved\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.sessions.previewDecisionEmail(\"3fa85f64-5717-4562-b3fc-2c963f66afa6\", {\n  new_status: \"Approved\",\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Sessions.PreviewDecisionEmail(ctx, \"3fa85f64-5717-4562-b3fc-2c963f66afa6\", didit.SessionsPreviewDecisionEmailParams{\n\tNewStatus: \"Approved\",\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\nimport me.didit.types.SessionsPreviewDecisionEmailParams;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.sessions().previewDecisionEmail(\"3fa85f64-5717-4562-b3fc-2c963f66afa6\", SessionsPreviewDecisionEmailParams.builder()\n        .newStatus(SessionsPreviewDecisionEmailParams.NewStatus.of(\"Approved\"))\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->sessions->previewDecisionEmail('3fa85f64-5717-4562-b3fc-2c963f66afa6', [\n    'new_status' => 'Approved',\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.sessions.preview_decision_email(\n  \"3fa85f64-5717-4562-b3fc-2c963f66afa6\",\n  new_status: \"Approved\"\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Sessions.PreviewDecisionEmailAsync(\"3fa85f64-5717-4562-b3fc-2c963f66afa6\", new SessionsPreviewDecisionEmailParams\n{\n    NewStatus = \"Approved\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "x-didit-sdk": {
          "resource": "sessions",
          "method": "preview_decision_email",
          "auth": "api_key",
          "server": true
        }
      }
    },
    "/v3/travel-rule/join/{token}/": {
      "get": {
        "summary": "Einladung zum freien Beitritt abrufen",
        "description": "Öffentlich, nicht authentifiziert. Zeigt die Einladung an, für die ein Beitrittslink bestimmt ist, solange sie offen ist: wer angefragt hat, an welche Adresse sie gesendet wurde und welche Verzeichniswerte vorausgefüllt werden. Das Token dient der Authentifizierung.",
        "operationId": "getTravelRuleJoinInvitation",
        "x-didit-sdk": {
          "resource": "travel_rule.join",
          "method": "get_invitation",
          "auth": "public",
          "server": false
        },
        "tags": [
          "Travel Rule"
        ],
        "security": [
          {}
        ],
        "parameters": [
          {
            "name": "token",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Das Einladungs-Token aus dem Beitrittslink."
          }
        ],
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl https://verification.didit.me/v3/travel-rule/join/{token}/"
          }
        ],
        "responses": {
          "200": {
            "description": "Die Einladung.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TravelRuleJoinInvitation"
                }
              }
            }
          },
          "404": {
            "description": "Keine Einladung enthält diesen Link."
          },
          "410": {
            "description": "Die Einladung ist nicht mehr offen: abgelaufen, bereits verwendet oder zurückgezogen."
          }
        }
      },
      "post": {
        "summary": "Kostenloses Travel Rule-Konto registrieren",
        "description": "Öffentlich, nicht authentifiziert. Erstellt ein kostenloses Travel Rule-Konto für einen Gegenpartei-VASP, der eine Anfrage erhalten hat. Die E-Mail-Adresse muss die Adresse sein, an die die Einladung gesendet wurde. Ein 6-stelliger Code wird per E-Mail dorthin gesendet; übermitteln Sie ihn an den Verify-Endpoint, um den Vorgang abzuschließen. Registrierungsversuche unterliegen einem Rate-Limit pro Adresse und pro IP.",
        "operationId": "registerTravelRuleJoin",
        "x-didit-sdk": {
          "resource": "travel_rule.join",
          "method": "register",
          "auth": "public",
          "server": false
        },
        "tags": [
          "Travel Rule"
        ],
        "security": [
          {}
        ],
        "parameters": [
          {
            "name": "token",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Das Einladungs-Token aus dem Beitrittslink."
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TravelRuleJoinRegisterRequest"
              },
              "example": {
                "email": "compliance@example.com",
                "password": "a-long-passphrase"
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X POST https://verification.didit.me/v3/travel-rule/join/{token}/ \\\n  -H 'Content-Type: application/json' \\\n  -d '{\"email\": \"compliance@example.com\", \"password\": \"a-long-passphrase\"}'"
          }
        ],
        "responses": {
          "202": {
            "description": "Das Konto wurde erstellt und ein Code wurde per E-Mail gesendet.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "message": {
                      "type": "string",
                      "description": "Fordert die Gegenpartei auf, ihr E-Mail-Postfach nach dem Verifizierungscode zu überprüfen."
                    },
                    "email": {
                      "type": "string",
                      "format": "email",
                      "description": "Die Adresse, an die der Code gesendet wurde."
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Die E-Mail ist nicht die eingeladene Adresse, oder das Passwort bzw. die Adresse wurde abgelehnt."
          },
          "404": {
            "description": "Keine Einladung enthält diesen Link."
          },
          "410": {
            "description": "Die Einladung ist nicht mehr offen: abgelaufen, bereits verwendet oder zurückgezogen."
          },
          "429": {
            "description": "Zu viele Beitrittsversuche. Die `X-RateLimit-*`-Header geben das verbrauchte Budget an."
          }
        }
      }
    },
    "/v3/travel-rule/join/{token}/verify/": {
      "post": {
        "summary": "Kostenloses Travel-Rule-Konto verifizieren",
        "description": "Öffentlich, nicht authentifiziert. Löst den per E-Mail gesendeten Code ein, erstellt die kostenlose Organisation und antwortet mit den Anmeldedaten, die ihre Anwendung an den Workspace-Endpoints verwendet. Der Empfang von Travel Rule-Daten ist kostenlos.",
        "operationId": "verifyTravelRuleJoin",
        "x-didit-sdk": {
          "resource": "travel_rule.join",
          "method": "verify",
          "auth": "public",
          "server": false
        },
        "tags": [
          "Travel Rule"
        ],
        "security": [
          {}
        ],
        "parameters": [
          {
            "name": "token",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Das Einladungs-Token aus dem Beitrittslink."
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TravelRuleJoinVerifyRequest"
              },
              "example": {
                "email": "compliance@example.com",
                "code": "123456"
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X POST https://verification.didit.me/v3/travel-rule/join/{token}/verify/ \\\n  -H 'Content-Type: application/json' \\\n  -d '{\"email\": \"compliance@example.com\", \"code\": \"123456\"}'"
          }
        ],
        "responses": {
          "201": {
            "description": "Die Anmeldedaten der Organisation und der Anwendung.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TravelRuleJoinCredentials"
                }
              }
            }
          },
          "400": {
            "description": "Der Code oder die E-Mail wurde abgelehnt."
          },
          "404": {
            "description": "Keine Einladung enthält diesen Link."
          },
          "410": {
            "description": "Die Einladung ist nicht mehr offen: abgelaufen, bereits verwendet oder zurückgezogen."
          },
          "429": {
            "description": "Zu viele Beitrittsversuche. Die `X-RateLimit-*`-Header geben das verbrauchte Budget an."
          }
        }
      }
    },
    "/v3/travel-rule/workspace/": {
      "get": {
        "summary": "Kostenlosen Travel-Rule-Workspace abrufen",
        "description": "Liest den kostenlosen Workspace einer Anwendung aus, die kostenlos beigetreten ist: Anspruch auf einen Verzeichniseintrag, Domain-Nachweis, Abrechnung und Didit-Netzwerkeintrag.",
        "operationId": "getTravelRuleWorkspace",
        "x-didit-sdk": {
          "resource": "travel_rule.workspace",
          "method": "get",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Travel Rule"
        ],
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X GET https://verification.didit.me/v3/travel-rule/workspace/ \\\n  -H 'x-api-key: YOUR_API_KEY'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.travel_rule.workspace.get()\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.travelRule.workspace.get();\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.TravelRule.Workspace.Get(ctx)\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.travelRule().workspace().get();\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->travelRule->workspace->get();\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.travel_rule.workspace.get\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.TravelRule.Workspace.GetAsync();\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "responses": {
          "200": {
            "description": "Der Workspace.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TravelRuleWorkspace"
                }
              }
            }
          },
          "404": {
            "description": "Diese Anwendung ist nicht dem kostenlosen Angebot beigetreten, daher verfügt sie über keinen kostenlosen Workspace."
          }
        }
      }
    },
    "/v3/travel-rule/workspace/claim/": {
      "post": {
        "summary": "Einen Verzeichniseintrag beanspruchen",
        "description": "Beansprucht den Verzeichniseintrag, der diesem Workspace entspricht. Wenn die geschäftliche E-Mail-Adresse zu einer Domain gehört, die im Eintrag aufgeführt ist, ist der Anspruch nachgewiesen und gilt sofort: Das VASP-Profil und die Travel-Rule-Einstellungen werden anhand des Eintrags ausgefüllt und die Travel Rule wird aktiviert, sodass die nächste Übertragung dorthin über das Didit-Netzwerk geroutet wird. Andernfalls wartet der Anspruch auf Prüfung (`pending_review`).",
        "operationId": "claimTravelRuleWorkspace",
        "x-didit-sdk": {
          "resource": "travel_rule.workspace",
          "method": "claim",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Travel Rule"
        ],
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TravelRuleWorkspaceClaimRequest"
              },
              "example": {
                "vasp_id": "0b0c9d3e-5a53-4a3e-9d6e-1f2f6f6a1c11"
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X POST https://verification.didit.me/v3/travel-rule/workspace/claim/ \\\n  -H 'x-api-key: YOUR_API_KEY' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\"vasp_id\": \"0b0c9d3e-5a53-4a3e-9d6e-1f2f6f6a1c11\"}'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.travel_rule.workspace.claim(\n    vasp_id=\"0b0c9d3e-5a53-4a3e-9d6e-1f2f6f6a1c11\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.travelRule.workspace.claim({\n  vasp_id: \"0b0c9d3e-5a53-4a3e-9d6e-1f2f6f6a1c11\",\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.TravelRule.Workspace.Claim(ctx, didit.TravelRuleWorkspaceClaimRequest{\n\tVASPID: \"0b0c9d3e-5a53-4a3e-9d6e-1f2f6f6a1c11\",\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\nimport me.didit.types.TravelRuleWorkspaceClaimRequest;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.travelRule().workspace().claim(TravelRuleWorkspaceClaimRequest.builder()\n        .vaspId(\"0b0c9d3e-5a53-4a3e-9d6e-1f2f6f6a1c11\")\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->travelRule->workspace->claim([\n    'vasp_id' => '0b0c9d3e-5a53-4a3e-9d6e-1f2f6f6a1c11',\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.travel_rule.workspace.claim(vasp_id: \"0b0c9d3e-5a53-4a3e-9d6e-1f2f6f6a1c11\")\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.TravelRule.Workspace.ClaimAsync(new TravelRuleWorkspaceClaimRequest\n{\n    VaspId = \"0b0c9d3e-5a53-4a3e-9d6e-1f2f6f6a1c11\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "responses": {
          "200": {
            "description": "Der Workspace mit seinem Claim-Status.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TravelRuleWorkspace"
                }
              }
            }
          },
          "400": {
            "description": "Kein Verzeichniseintrag besitzt diese ID."
          },
          "404": {
            "description": "Diese Anwendung ist nicht dem kostenlosen Angebot beigetreten, daher verfügt sie über keinen kostenlosen Workspace."
          }
        }
      }
    },
    "/v3/travel-rule/workspace/domain/code/": {
      "post": {
        "summary": "Einen Domain-Verifizierungscode per E-Mail senden",
        "description": "Sendet einen Einmalcode an die geschäftliche Adresse des Workspace, um nachzuweisen, dass er die E-Mail-Domain kontrolliert. Gedrosselt, und pro Code wird nur eine begrenzte Anzahl falscher Versuche akzeptiert. Gibt auch den TXT-Eintrag für die DNS-Alternative zurück.",
        "operationId": "sendTravelRuleWorkspaceDomainCode",
        "x-didit-sdk": {
          "resource": "travel_rule.workspace",
          "method": "send_domain_code",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Travel Rule"
        ],
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X POST https://verification.didit.me/v3/travel-rule/workspace/domain/code/ \\\n  -H 'x-api-key: YOUR_API_KEY'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.travel_rule.workspace.send_domain_code()\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.travelRule.workspace.sendDomainCode();\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.TravelRule.Workspace.SendDomainCode(ctx)\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.travelRule().workspace().sendDomainCode();\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->travelRule->workspace->sendDomainCode();\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.travel_rule.workspace.send_domain_code\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.TravelRule.Workspace.SendDomainCodeAsync();\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "responses": {
          "200": {
            "description": "Die Domain, ihr Status und der TXT-Eintrag.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TravelRuleWorkspaceDomainCodeResponse"
                }
              }
            }
          },
          "404": {
            "description": "Diese Anwendung ist nicht dem kostenlosen Angebot beigetreten, daher verfügt sie über keinen kostenlosen Workspace."
          }
        }
      }
    },
    "/v3/travel-rule/workspace/domain/confirm/": {
      "post": {
        "summary": "Domain-Verifizierungscode bestätigen",
        "description": "Löst den per E-Mail gesendeten Code ein und markiert die E-Mail-Domain als verifiziert.",
        "operationId": "confirmTravelRuleWorkspaceDomain",
        "x-didit-sdk": {
          "resource": "travel_rule.workspace",
          "method": "confirm_domain",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Travel Rule"
        ],
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TravelRuleWorkspaceDomainConfirmRequest"
              },
              "example": {
                "code": "123456"
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X POST https://verification.didit.me/v3/travel-rule/workspace/domain/confirm/ \\\n  -H 'x-api-key: YOUR_API_KEY' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\"code\": \"123456\"}'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.travel_rule.workspace.confirm_domain(\n    code=\"123456\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.travelRule.workspace.confirmDomain({\n  code: \"123456\",\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.TravelRule.Workspace.ConfirmDomain(ctx, didit.TravelRuleWorkspaceDomainConfirmRequest{\n\tCode: \"123456\",\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\nimport me.didit.types.TravelRuleWorkspaceDomainConfirmRequest;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.travelRule().workspace().confirmDomain(TravelRuleWorkspaceDomainConfirmRequest.builder()\n        .code(\"123456\")\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->travelRule->workspace->confirmDomain([\n    'code' => '123456',\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.travel_rule.workspace.confirm_domain(code: \"123456\")\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.TravelRule.Workspace.ConfirmDomainAsync(new TravelRuleWorkspaceDomainConfirmRequest\n{\n    Code = \"123456\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "responses": {
          "200": {
            "description": "Der Workspace.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TravelRuleWorkspace"
                }
              }
            }
          },
          "400": {
            "description": "Der Code ist falsch, abgelaufen oder wurde bereits verwendet."
          },
          "404": {
            "description": "Diese Anwendung ist nicht dem kostenlosen Angebot beigetreten, daher verfügt sie über keinen kostenlosen Workspace."
          }
        }
      }
    },
    "/v3/travel-rule/workspace/domain/dns/": {
      "post": {
        "summary": "Verifizieren Sie die Domain anhand ihres TXT-Eintrags",
        "description": "Prüft auf den vom Code-Endpoint zurückgegebenen TXT-Eintrag `didit-tr-verify.<domain>` und markiert die Domain als verifiziert, sobald er übereinstimmt. Einer der beiden Nachweise, der per E-Mail gesendete Code oder der TXT-Eintrag, genügt.",
        "operationId": "verifyTravelRuleWorkspaceDomainDns",
        "x-didit-sdk": {
          "resource": "travel_rule.workspace",
          "method": "verify_domain_dns",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Travel Rule"
        ],
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X POST https://verification.didit.me/v3/travel-rule/workspace/domain/dns/ \\\n  -H 'x-api-key: YOUR_API_KEY'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.travel_rule.workspace.verify_domain_dns()\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.travelRule.workspace.verifyDomainDns();\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.TravelRule.Workspace.VerifyDomainDNS(ctx)\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.travelRule().workspace().verifyDomainDns();\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->travelRule->workspace->verifyDomainDns();\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.travel_rule.workspace.verify_domain_dns\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.TravelRule.Workspace.VerifyDomainDnsAsync();\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "responses": {
          "200": {
            "description": "Der Workspace.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TravelRuleWorkspace"
                }
              }
            }
          },
          "400": {
            "description": "Der TXT-Eintrag wurde nicht gefunden oder stimmt nicht überein."
          },
          "404": {
            "description": "Diese Anwendung ist nicht dem kostenlosen Angebot beigetreten, daher verfügt sie über keinen kostenlosen Workspace."
          }
        }
      }
    },
    "/v3/travel-rule/workspace/billing/": {
      "post": {
        "summary": "Ausgehende Abrechnung aktivieren",
        "description": "Schaltet die Abrechnung für ausgehende Travel Rule für den Workspace ein. Der Empfang bleibt kostenlos. Dies kann nicht über die API rückgängig gemacht werden: Wenden Sie sich an den Didit-Support.",
        "operationId": "enableTravelRuleWorkspaceBilling",
        "x-didit-sdk": {
          "resource": "travel_rule.workspace",
          "method": "enable_billing",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Travel Rule"
        ],
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TravelRuleWorkspaceBillingRequest"
              },
              "example": {
                "enabled": true
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X POST https://verification.didit.me/v3/travel-rule/workspace/billing/ \\\n  -H 'x-api-key: YOUR_API_KEY' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\"enabled\": true}'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.travel_rule.workspace.enable_billing(\n    enabled=True,\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.travelRule.workspace.enableBilling({\n  enabled: true,\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.TravelRule.Workspace.EnableBilling(ctx, didit.TravelRuleWorkspaceBillingRequest{\n\tEnabled: didit.Bool(true),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\nimport me.didit.types.TravelRuleWorkspaceBillingRequest;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.travelRule().workspace().enableBilling(TravelRuleWorkspaceBillingRequest.builder()\n        .enabled(true)\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->travelRule->workspace->enableBilling([\n    'enabled' => true,\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.travel_rule.workspace.enable_billing(enabled: true)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.TravelRule.Workspace.EnableBillingAsync(new TravelRuleWorkspaceBillingRequest\n{\n    Enabled = true,\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "responses": {
          "200": {
            "description": "Der Workspace, bei dem `billing_enabled` auf true gesetzt ist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TravelRuleWorkspace"
                }
              }
            }
          },
          "400": {
            "description": "`enabled` war false."
          },
          "404": {
            "description": "Diese Anwendung ist nicht dem kostenlosen Angebot beigetreten, daher verfügt sie über keinen kostenlosen Workspace."
          }
        }
      }
    },
    "/v3/investigator/summary/": {
      "get": {
        "operationId": "investigator_summary",
        "summary": "Ermittler-Zusammenfassung",
        "description": "Stufe, Warteschlangenzahlen, heute vorbereitete und entschiedene Berichte, 30-Tage-Übereinstimmung, Preise und Autonomiestufe jeder Warteschlange. Eingeschränkte Schlüssel erfordern den Scope `decisions` (Lesen); Transaktions-Alerts erfordern zusätzlich `transactions`.",
        "tags": [
          "Investigator"
        ],
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true,
                  "properties": {
                    "stage": {
                      "type": "string"
                    },
                    "last_report_at": {
                      "type": "string",
                      "format": "date-time",
                      "nullable": true
                    },
                    "prepared_today": {
                      "type": "integer"
                    },
                    "ready_to_accept": {
                      "type": "integer"
                    },
                    "open": {
                      "type": "integer"
                    },
                    "decided_today": {
                      "type": "integer"
                    },
                    "automation_rate_month": {
                      "type": "number",
                      "nullable": true
                    },
                    "preparing": {
                      "type": "integer"
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Fehlender oder ungültiger API-Schlüssel."
          },
          "403": {
            "description": "Dem Schlüssel fehlt der Scope, der Elementtyp ist nicht lesbar oder der Tarif beinhaltet den Investigator nicht."
          }
        },
        "parameters": [
          {
            "in": "query",
            "name": "scope",
            "schema": {
              "type": "string",
              "enum": [
                "all",
                "identity",
                "transactions"
              ],
              "default": "all"
            },
            "description": "`identity` (Sitzungen und Fälle, die nicht durch eine Transaktionsregel geöffnet wurden) oder `transactions` (Transaktions-Alerts und Fälle, die eine Transaktionsregel geöffnet hat)."
          },
          {
            "in": "query",
            "name": "timezone",
            "schema": {
              "type": "string"
            },
            "description": "IANA-Zeitzone (zum Beispiel `Europe/Madrid`), ab der „heute“ zählt. Standardmäßig UTC."
          }
        ],
        "x-didit-sdk": {
          "resource": "investigator",
          "method": "retrieve_summary",
          "auth": "api_key",
          "server": true
        },
        "x-codeSamples": [
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.investigator.retrieve_summary()\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.investigator.retrieveSummary();\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Investigator.RetrieveSummary(ctx, didit.InvestigatorRetrieveSummaryParams{})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.investigator().retrieveSummary();\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->investigator->retrieveSummary();\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.investigator.retrieve_summary\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Investigator.RetrieveSummaryAsync();\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ]
      }
    },
    "/v3/investigator/queue/": {
      "get": {
        "operationId": "investigator_queue",
        "summary": "Investigator-Warteschlange auflisten",
        "description": "Offene Berichte, zuerst **Bereit zur Annahme**, dann nach Frist, Risiko und Wartezeit. `counts` deckt jede Art im Geltungsbereich ab. `count` ist auf 100 begrenzt. Eingeschränkte Schlüssel erfordern den Scope `decisions` (Lesen); Transaktions-Alerts erfordern zusätzlich `transactions`.",
        "tags": [
          "Investigator"
        ],
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "count": {
                      "type": "integer"
                    },
                    "next": {
                      "type": "string",
                      "nullable": true
                    },
                    "previous": {
                      "type": "string",
                      "nullable": true
                    },
                    "counts": {
                      "type": "object",
                      "additionalProperties": true
                    },
                    "results": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/InvestigatorQueueRow"
                      }
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Fehlender oder ungültiger API-Schlüssel."
          },
          "403": {
            "description": "Dem Schlüssel fehlt der Scope, der Elementtyp ist nicht lesbar oder der Tarif beinhaltet den Investigator nicht."
          }
        },
        "parameters": [
          {
            "in": "query",
            "name": "scope",
            "schema": {
              "type": "string",
              "enum": [
                "all",
                "identity",
                "transactions"
              ],
              "default": "all"
            },
            "description": "`identity` (Sitzungen und Fälle, die nicht durch eine Transaktionsregel geöffnet wurden) oder `transactions` (Transaktions-Alerts und Fälle, die eine Transaktionsregel geöffnet hat)."
          },
          {
            "in": "query",
            "name": "kind",
            "schema": {
              "type": "string"
            },
            "description": "`session`, `business_session`, `transaction` oder `case`, oder mehrere durch Kommas getrennt."
          },
          {
            "in": "query",
            "name": "queue",
            "schema": {
              "type": "string",
              "enum": [
                "kyc",
                "kyb",
                "aml",
                "transactions",
                "cases"
              ]
            }
          },
          {
            "in": "query",
            "name": "recommendation",
            "schema": {
              "type": "string",
              "enum": [
                "approve",
                "decline",
                "escalate",
                "request"
              ]
            }
          },
          {
            "in": "query",
            "name": "confidence",
            "schema": {
              "type": "string",
              "enum": [
                "high",
                "moderate",
                "low"
              ]
            }
          },
          {
            "in": "query",
            "name": "ready",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "in": "query",
            "name": "search",
            "schema": {
              "type": "string"
            },
            "description": "Name, Unternehmen, Falltitel, Nummer, Transaktions-ID oder Element-ID."
          },
          {
            "in": "query",
            "name": "limit",
            "schema": {
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "offset",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "x-didit-sdk": {
          "resource": "investigator",
          "method": "list_queue",
          "auth": "api_key",
          "server": true
        },
        "x-codeSamples": [
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nfor item in client.investigator.list_queue():\n    print(item)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nfor await (const item of didit.investigator.listQueue()) {\n  console.log(item);\n}"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\niter := client.Investigator.ListQueueAutoPaging(ctx, didit.InvestigatorListQueueParams{})\nfor iter.Next() {\n\tfmt.Printf(\"%+v\\n\", iter.Current())\n}\nif err := iter.Err(); err != nil {\n\tlog.Fatal(err)\n}"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nfor (var item : client.investigator().listQueue()) {\n    System.out.println(item);\n}"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\nforeach ($didit->investigator->listQueue() as $item) {\n    print_r($item->toArray());\n}"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\ndidit.investigator.list_queue.auto_paging_each do |item|\n  puts item.to_h\nend"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nawait foreach (var item in await client.Investigator.ListQueueAsync())\n{\n    Console.WriteLine(JsonSerializer.Serialize(item));\n}"
          }
        ]
      }
    },
    "/v3/investigator/runs/{run_id}/": {
      "get": {
        "operationId": "investigator_run_retrieve",
        "summary": "Investigator-Bericht abrufen",
        "description": "Der vollständige Bericht eines Durchlaufs. 404, wenn der Durchlauf keinen abgeschlossenen Bericht hat oder sein Eintrag gelöscht wurde. Eingeschränkte Schlüssel benötigen den Scope `decisions` (Leserecht); Transaktions-Alerts benötigen zusätzlich `transactions`.",
        "tags": [
          "Investigator"
        ],
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/InvestigatorRunDetail"
                }
              }
            }
          },
          "404": {
            "description": "Nicht gefunden oder kein Bericht."
          },
          "401": {
            "description": "Fehlender oder ungültiger API-Schlüssel."
          },
          "403": {
            "description": "Dem Schlüssel fehlt der Scope, der Elementtyp ist nicht lesbar oder der Tarif beinhaltet den Investigator nicht."
          }
        },
        "parameters": [
          {
            "in": "path",
            "name": "run_id",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "x-didit-sdk": {
          "resource": "investigator",
          "method": "retrieve_run",
          "auth": "api_key",
          "server": true
        },
        "x-codeSamples": [
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.investigator.retrieve_run(\n    \"11111111-2222-3333-4444-555555555555\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.investigator.retrieveRun(\"11111111-2222-3333-4444-555555555555\");\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Investigator.RetrieveRun(ctx, \"11111111-2222-3333-4444-555555555555\")\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.investigator().retrieveRun(\"11111111-2222-3333-4444-555555555555\");\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->investigator->retrieveRun('11111111-2222-3333-4444-555555555555');\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.investigator.retrieve_run(\"11111111-2222-3333-4444-555555555555\")\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Investigator.RetrieveRunAsync(\"11111111-2222-3333-4444-555555555555\");\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ]
      }
    },
    "/v3/investigator/runs/{run_id}/accept/": {
      "post": {
        "operationId": "investigator_run_accept",
        "summary": "Eine Empfehlung annehmen",
        "description": "Wendet die empfohlene Aktion über den regulären Pfad des Elements an, sodass Ihre gewohnten Webhooks ausgelöst werden. Eine `narrative` sorgt dafür, dass sie bearbeitet und akzeptiert wird. Eingeschränkte Schlüssel erfordern den Scope `decisions` (Schreiben); Transaktions-Alerts erfordern zudem `transactions` (Schreiben). Das Eskalieren einer Verifizierung oder Transaktion öffnet einen Fall.",
        "tags": [
          "Investigator"
        ],
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/InvestigatorDecision"
                }
              }
            }
          },
          "409": {
            "description": "Bereits entschieden, Bericht nicht bereit oder eine Schutzmaßnahme hält das Element zurück."
          },
          "401": {
            "description": "Fehlender oder ungültiger API-Schlüssel."
          },
          "403": {
            "description": "Dem Schlüssel fehlt der Scope, der Elementtyp ist nicht lesbar oder der Tarif beinhaltet den Investigator nicht."
          }
        },
        "parameters": [
          {
            "in": "path",
            "name": "run_id",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/InvestigatorAcceptRequest"
              },
              "example": {
                "send_email": false
              }
            }
          }
        },
        "x-didit-sdk": {
          "resource": "investigator",
          "method": "accept_run",
          "auth": "api_key",
          "server": true
        },
        "x-codeSamples": [
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.investigator.accept_run(\n    \"11111111-2222-3333-4444-555555555555\",\n    send_email=False,\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.investigator.acceptRun(\"11111111-2222-3333-4444-555555555555\", {\n  send_email: false,\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Investigator.AcceptRun(ctx, \"11111111-2222-3333-4444-555555555555\", didit.InvestigatorAcceptRequest{\n\tSendEmail: didit.Bool(false),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\nimport me.didit.types.InvestigatorAcceptRequest;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.investigator().acceptRun(\"11111111-2222-3333-4444-555555555555\", InvestigatorAcceptRequest.builder()\n        .sendEmail(false)\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->investigator->acceptRun('11111111-2222-3333-4444-555555555555', [\n    'send_email' => false,\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.investigator.accept_run(\n  \"11111111-2222-3333-4444-555555555555\",\n  send_email: false\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Investigator.AcceptRunAsync(\"11111111-2222-3333-4444-555555555555\", new InvestigatorAcceptRequest\n{\n    SendEmail = false,\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ]
      }
    },
    "/v3/investigator/runs/{run_id}/override/": {
      "post": {
        "operationId": "investigator_run_override",
        "summary": "Eine Empfehlung überschreiben",
        "description": "Führt eine weitere Aktion mit einer Kategorie und einer Begründung aus. Setzt auch eine Entscheidung außer Kraft, die der Investigator eigenständig getroffen hat, während sie noch gültig ist. Eingeschränkte Schlüssel erfordern den Scope `decisions` (Schreiben); Transaktions-Alerts erfordern zusätzlich `transactions` (Schreiben). Das Eskalieren einer Verifizierung oder Transaktion öffnet einen Fall.",
        "tags": [
          "Investigator"
        ],
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/InvestigatorDecision"
                }
              }
            }
          },
          "409": {
            "description": "Bereits entschieden oder eine Schutzmaßnahme hält das Element zurück."
          },
          "401": {
            "description": "Fehlender oder ungültiger API-Schlüssel."
          },
          "403": {
            "description": "Dem Schlüssel fehlt der Scope, der Elementtyp ist nicht lesbar oder der Tarif beinhaltet den Investigator nicht."
          }
        },
        "parameters": [
          {
            "in": "path",
            "name": "run_id",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/InvestigatorOverrideRequest"
              },
              "example": {
                "action": "decline",
                "category": "evidence_misread",
                "reason": "The proof of address is older than three months."
              }
            }
          }
        },
        "x-didit-sdk": {
          "resource": "investigator",
          "method": "override_run",
          "auth": "api_key",
          "server": true
        },
        "x-codeSamples": [
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.investigator.override_run(\n    \"11111111-2222-3333-4444-555555555555\",\n    action=\"decline\",\n    category=\"evidence_misread\",\n    reason=\"The proof of address is older than three months.\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.investigator.overrideRun(\"11111111-2222-3333-4444-555555555555\", {\n  action: \"decline\",\n  category: \"evidence_misread\",\n  reason: \"The proof of address is older than three months.\",\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Investigator.OverrideRun(ctx, \"11111111-2222-3333-4444-555555555555\", didit.InvestigatorOverrideRequest{\n\tAction:   \"decline\",\n\tCategory: \"evidence_misread\",\n\tReason:   \"The proof of address is older than three months.\",\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\nimport me.didit.types.InvestigatorOverrideRequest;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.investigator().overrideRun(\"11111111-2222-3333-4444-555555555555\", InvestigatorOverrideRequest.builder()\n        .action(InvestigatorOverrideRequest.Action.of(\"decline\"))\n        .category(InvestigatorOverrideRequest.Category.of(\"evidence_misread\"))\n        .reason(\"The proof of address is older than three months.\")\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->investigator->overrideRun('11111111-2222-3333-4444-555555555555', [\n    'action' => 'decline',\n    'category' => 'evidence_misread',\n    'reason' => 'The proof of address is older than three months.',\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.investigator.override_run(\n  \"11111111-2222-3333-4444-555555555555\",\n  action: \"decline\",\n  category: \"evidence_misread\",\n  reason: \"The proof of address is older than three months.\"\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Investigator.OverrideRunAsync(\"11111111-2222-3333-4444-555555555555\", new InvestigatorOverrideRequest\n{\n    Action = \"decline\",\n    Category = \"evidence_misread\",\n    Reason = \"The proof of address is older than three months.\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ]
      }
    },
    "/v3/investigator/runs/batch-accept/": {
      "post": {
        "operationId": "investigator_batch_accept",
        "summary": "Empfehlungen im Batch annehmen",
        "description": "Akzeptiert bis zu 50 Berichte, die als „Ready to accept“ markiert sind. Jeder Bericht stellt eine eigene Entscheidung dar: Berichte, die nicht akzeptiert werden können, werden unter Angabe des Grundes übersprungen. Eingeschränkte Schlüssel benötigen den Scope `decisions` (Schreibberechtigung); Transaktions-Alerts erfordern zusätzlich `transactions` (Schreibberechtigung). Das Eskalieren einer Verifizierung oder Transaktion öffnet einen Fall.",
        "tags": [
          "Investigator"
        ],
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/InvestigatorBatchAcceptResponse"
                }
              }
            }
          },
          "401": {
            "description": "Fehlender oder ungültiger API-Schlüssel."
          },
          "403": {
            "description": "Dem Schlüssel fehlt der Scope, der Elementtyp ist nicht lesbar oder der Tarif beinhaltet den Investigator nicht."
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/InvestigatorBatchAcceptRequest"
              }
            }
          }
        },
        "x-didit-sdk": {
          "resource": "investigator",
          "method": "batch_accept_runs",
          "auth": "api_key",
          "server": true
        },
        "x-codeSamples": [
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.investigator.batch_accept_runs(\n    run_ids=[\"11111111-2222-3333-4444-555555555555\"],\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.investigator.batchAcceptRuns({\n  run_ids: [\"11111111-2222-3333-4444-555555555555\"],\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Investigator.BatchAcceptRuns(ctx, didit.InvestigatorBatchAcceptRequest{\n\tRunIDs: []string{\"11111111-2222-3333-4444-555555555555\"},\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import java.util.List;\nimport me.didit.Didit;\nimport me.didit.types.InvestigatorBatchAcceptRequest;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.investigator().batchAcceptRuns(InvestigatorBatchAcceptRequest.builder()\n        .runIds(List.of(\"11111111-2222-3333-4444-555555555555\"))\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->investigator->batchAcceptRuns([\n    'run_ids' => ['11111111-2222-3333-4444-555555555555'],\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.investigator.batch_accept_runs(run_ids: [\"11111111-2222-3333-4444-555555555555\"])\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Investigator.BatchAcceptRunsAsync(new InvestigatorBatchAcceptRequest\n{\n    RunIds = new string[] { \"11111111-2222-3333-4444-555555555555\" },\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ]
      }
    },
    "/v3/investigator/transactions/{transaction_id}/": {
      "get": {
        "operationId": "investigator_transaction_retrieve",
        "summary": "Investigator-Prüfung einer Transaktion abrufen",
        "description": "Die letzte Prüfung der Transaktion oder `investigator: null`, wenn sie nie geprüft wurde. Eingeschränkte Schlüssel erfordern die Scopes `decisions` und `transactions` (Leseberechtigung).",
        "tags": [
          "Investigator"
        ],
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "transaction_id": {
                      "type": "string",
                      "format": "uuid"
                    },
                    "investigator": {
                      "$ref": "#/components/schemas/InvestigatorBlock"
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Nicht die Transaktion dieser Anwendung."
          },
          "401": {
            "description": "Fehlender oder ungültiger API-Schlüssel."
          },
          "403": {
            "description": "Dem Schlüssel fehlt der Scope, der Elementtyp ist nicht lesbar oder der Tarif beinhaltet den Investigator nicht."
          }
        },
        "parameters": [
          {
            "in": "path",
            "name": "transaction_id",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "x-didit-sdk": {
          "resource": "investigator",
          "method": "retrieve_transaction",
          "auth": "api_key",
          "server": true
        },
        "x-codeSamples": [
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.investigator.retrieve_transaction(\n    \"11111111-2222-3333-4444-555555555555\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.investigator.retrieveTransaction(\"11111111-2222-3333-4444-555555555555\");\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Investigator.RetrieveTransaction(ctx, \"11111111-2222-3333-4444-555555555555\")\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.investigator().retrieveTransaction(\"11111111-2222-3333-4444-555555555555\");\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->investigator->retrieveTransaction('11111111-2222-3333-4444-555555555555');\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.investigator.retrieve_transaction(\"11111111-2222-3333-4444-555555555555\")\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Investigator.RetrieveTransactionAsync(\"11111111-2222-3333-4444-555555555555\");\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ]
      }
    },
    "/v3/investigator/guardrails/": {
      "get": {
        "operationId": "investigator_guardrails",
        "summary": "Gesperrte Guardrails auflisten",
        "description": "Die fünf Schutzvorgaben, die für jede Warteschlange gelten. Sie können nicht deaktiviert werden. Eingeschränkte Schlüssel benötigen den Scope `decisions` (Leserecht); Transaktions-Alerts benötigen zusätzlich `transactions`.",
        "tags": [
          "Investigator"
        ],
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "results": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "key": {
                            "type": "string",
                            "enum": [
                              "sanctions_to_person",
                              "no_tipping_off",
                              "no_protected_characteristics",
                              "never_files_reports",
                              "every_decision_logged"
                            ]
                          },
                          "title": {
                            "type": "string"
                          },
                          "description": {
                            "type": "string"
                          },
                          "locked": {
                            "type": "boolean"
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Fehlender oder ungültiger API-Schlüssel."
          },
          "403": {
            "description": "Dem Schlüssel fehlt der Scope, der Elementtyp ist nicht lesbar oder der Tarif beinhaltet den Investigator nicht."
          }
        },
        "x-didit-sdk": {
          "resource": "investigator",
          "method": "list_guardrails",
          "auth": "api_key",
          "server": true
        },
        "x-codeSamples": [
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.investigator.list_guardrails()\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.investigator.listGuardrails();\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Investigator.ListGuardrails(ctx)\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.investigator().listGuardrails();\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->investigator->listGuardrails();\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.investigator.list_guardrails\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Investigator.ListGuardrailsAsync();\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ]
      }
    },
    "/v3/investigator/dashboard/": {
      "get": {
        "operationId": "investigator_dashboard",
        "summary": "Ermittler-Dashboard",
        "description": "Die letzten 30 Tage: Prüfungen, Entscheidungen, Automatisierungsrate, eingesparte Stunden, Ausgaben, Überschreibungen, Qualitätsstichproben seit dem Go-Live, Zahlen pro Warteschlange und wöchentliche Zahlen. Eingeschränkte Schlüssel benötigen den Scope `decisions` (Lesen); Transaktions-Alerts benötigen zudem `transactions`.",
        "tags": [
          "Investigator"
        ],
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true,
                  "properties": {
                    "stage": {
                      "type": "string"
                    },
                    "window_days": {
                      "type": "integer"
                    },
                    "reviews": {
                      "type": "integer"
                    },
                    "decided": {
                      "type": "integer"
                    },
                    "automated": {
                      "type": "integer"
                    },
                    "automation_rate": {
                      "type": "number",
                      "nullable": true
                    },
                    "hours_saved": {
                      "type": "number",
                      "nullable": true
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Fehlender oder ungültiger API-Schlüssel."
          },
          "403": {
            "description": "Dem Schlüssel fehlt der Scope, der Elementtyp ist nicht lesbar oder der Tarif beinhaltet den Investigator nicht."
          }
        },
        "parameters": [
          {
            "in": "query",
            "name": "scope",
            "schema": {
              "type": "string",
              "enum": [
                "all",
                "identity",
                "transactions"
              ],
              "default": "all"
            },
            "description": "`identity` (Sitzungen und Fälle, die nicht durch eine Transaktionsregel geöffnet wurden) oder `transactions` (Transaktions-Alerts und Fälle, die eine Transaktionsregel geöffnet hat)."
          }
        ],
        "x-didit-sdk": {
          "resource": "investigator",
          "method": "retrieve_dashboard",
          "auth": "api_key",
          "server": true
        },
        "x-codeSamples": [
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.investigator.retrieve_dashboard()\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.investigator.retrieveDashboard();\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Investigator.RetrieveDashboard(ctx, didit.InvestigatorRetrieveDashboardParams{})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.investigator().retrieveDashboard();\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->investigator->retrieveDashboard();\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.investigator.retrieve_dashboard\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Investigator.RetrieveDashboardAsync();\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ]
      }
    },
    "/v3/investigator/performance/": {
      "get": {
        "operationId": "investigator_performance",
        "summary": "Ermittler-Leistung",
        "description": "Übereinstimmung mit Ihrem Team, Volumen, eingesparte Zeit, Konfidenzkalibrierung, Ergebnisse pro Warteschlange, Gründe für Überschreibungen und Meinungsverschiedenheiten für einen Zeitraum. Beschränkte Schlüssel benötigen den Scope `decisions` (Leserecht); Transaktions-Alerts benötigen zusätzlich `transactions`.",
        "tags": [
          "Investigator"
        ],
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true,
                  "properties": {
                    "period": {
                      "type": "integer"
                    },
                    "start": {
                      "type": "string",
                      "format": "date"
                    },
                    "end": {
                      "type": "string",
                      "format": "date"
                    },
                    "investigated": {
                      "type": "integer"
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Fehlender oder ungültiger API-Schlüssel."
          },
          "403": {
            "description": "Dem Schlüssel fehlt der Scope, der Elementtyp ist nicht lesbar oder der Tarif beinhaltet den Investigator nicht."
          }
        },
        "parameters": [
          {
            "in": "query",
            "name": "scope",
            "schema": {
              "type": "string",
              "enum": [
                "all",
                "identity",
                "transactions"
              ],
              "default": "all"
            },
            "description": "`identity` (Sitzungen und Fälle, die nicht durch eine Transaktionsregel geöffnet wurden) oder `transactions` (Transaktions-Alerts und Fälle, die eine Transaktionsregel geöffnet hat)."
          },
          {
            "in": "query",
            "name": "period",
            "schema": {
              "type": "string",
              "enum": [
                "7",
                "30",
                "90"
              ],
              "default": "30"
            },
            "description": "Tage bis einschließlich heute."
          }
        ],
        "x-didit-sdk": {
          "resource": "investigator",
          "method": "retrieve_performance",
          "auth": "api_key",
          "server": true
        },
        "x-codeSamples": [
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.investigator.retrieve_performance()\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.investigator.retrievePerformance();\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Investigator.RetrievePerformance(ctx, didit.InvestigatorRetrievePerformanceParams{})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.investigator().retrievePerformance();\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->investigator->retrievePerformance();\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.investigator.retrieve_performance\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Investigator.RetrievePerformanceAsync();\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ]
      }
    },
    "/v3/investigator/activity/": {
      "get": {
        "operationId": "investigator_activity",
        "summary": "Investigator-Aktivitäten auflisten",
        "description": "Das Append-only-Audit-Log, neueste zuerst. Ein Batch-Accept ist ein einzelner Eintrag. Ergänzt `counts` pro Gruppe und `actors`. Eingeschränkte Schlüssel erfordern den Scope `decisions` (Leserecht); Transaktions-Alerts erfordern zusätzlich `transactions`.",
        "tags": [
          "Investigator"
        ],
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "count": {
                      "type": "integer"
                    },
                    "next": {
                      "type": "string",
                      "nullable": true
                    },
                    "previous": {
                      "type": "string",
                      "nullable": true
                    },
                    "counts": {
                      "type": "object",
                      "additionalProperties": true
                    },
                    "actors": {
                      "type": "array",
                      "items": {}
                    },
                    "results": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "additionalProperties": true,
                        "description": "`id`, `at`, `kind`, `group`, `queue`, `run_id`, `item`, `actor`, `agent_version`, `data`, `report_version`, `steps`, `sources`, `batch`."
                      }
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Fehlender oder ungültiger API-Schlüssel."
          },
          "403": {
            "description": "Dem Schlüssel fehlt der Scope, der Elementtyp ist nicht lesbar oder der Tarif beinhaltet den Investigator nicht."
          }
        },
        "parameters": [
          {
            "in": "query",
            "name": "scope",
            "schema": {
              "type": "string",
              "enum": [
                "all",
                "identity",
                "transactions"
              ],
              "default": "all"
            },
            "description": "`identity` (Sitzungen und Fälle, die nicht durch eine Transaktionsregel geöffnet wurden) oder `transactions` (Transaktions-Alerts und Fälle, die eine Transaktionsregel geöffnet hat)."
          },
          {
            "in": "query",
            "name": "group",
            "schema": {
              "type": "string",
              "enum": [
                "agent",
                "decisions",
                "overrides",
                "autonomy"
              ]
            }
          },
          {
            "in": "query",
            "name": "actor",
            "schema": {
              "type": "string"
            },
            "description": "`agent` für den Investigator oder die E-Mail einer Person."
          },
          {
            "in": "query",
            "name": "since",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "in": "query",
            "name": "until",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "in": "query",
            "name": "limit",
            "schema": {
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "offset",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "x-didit-sdk": {
          "resource": "investigator",
          "method": "list_activity",
          "auth": "api_key",
          "server": true
        },
        "x-codeSamples": [
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nfor item in client.investigator.list_activity():\n    print(item)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nfor await (const item of didit.investigator.listActivity()) {\n  console.log(item);\n}"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\niter := client.Investigator.ListActivityAutoPaging(ctx, didit.InvestigatorListActivityParams{})\nfor iter.Next() {\n\tfmt.Printf(\"%+v\\n\", iter.Current())\n}\nif err := iter.Err(); err != nil {\n\tlog.Fatal(err)\n}"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nfor (var item : client.investigator().listActivity()) {\n    System.out.println(item);\n}"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\nforeach ($didit->investigator->listActivity() as $item) {\n    print_r($item);\n}"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\ndidit.investigator.list_activity.auto_paging_each do |item|\n  puts item.to_h\nend"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nawait foreach (var item in await client.Investigator.ListActivityAsync())\n{\n    Console.WriteLine(JsonSerializer.Serialize(item));\n}"
          }
        ]
      }
    },
    "/v3/investigator/activity/export/": {
      "get": {
        "operationId": "investigator_activity_export",
        "summary": "Investigator-Aktivität exportieren",
        "description": "Dieselben Einträge als CSV, eine Zeile pro Entscheidung, die neuesten zuerst, bis zu 10.000 Einträge. Eingeschränkte Schlüssel erfordern den Scope `decisions` (Leseberechtigung); Transaktions-Alerts erfordern zusätzlich `transactions`.",
        "tags": [
          "Investigator"
        ],
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "content": {
              "text/csv": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "401": {
            "description": "Fehlender oder ungültiger API-Schlüssel."
          },
          "403": {
            "description": "Dem Schlüssel fehlt der Scope, der Elementtyp ist nicht lesbar oder der Tarif beinhaltet den Investigator nicht."
          }
        },
        "parameters": [
          {
            "in": "query",
            "name": "scope",
            "schema": {
              "type": "string",
              "enum": [
                "all",
                "identity",
                "transactions"
              ],
              "default": "all"
            },
            "description": "`identity` (Sitzungen und Fälle, die nicht durch eine Transaktionsregel geöffnet wurden) oder `transactions` (Transaktions-Alerts und Fälle, die eine Transaktionsregel geöffnet hat)."
          },
          {
            "in": "query",
            "name": "group",
            "schema": {
              "type": "string",
              "enum": [
                "agent",
                "decisions",
                "overrides",
                "autonomy"
              ]
            }
          },
          {
            "in": "query",
            "name": "actor",
            "schema": {
              "type": "string"
            },
            "description": "`agent` für den Investigator oder die E-Mail einer Person."
          },
          {
            "in": "query",
            "name": "since",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "in": "query",
            "name": "until",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          }
        ],
        "x-didit-sdk": {
          "resource": "investigator",
          "method": "export_activity",
          "auth": "api_key",
          "server": true
        },
        "x-codeSamples": [
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\ncontent = client.investigator.export_activity()\nwith open(\"download.csv\", \"wb\") as file:\n    file.write(content)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import { writeFile } from \"node:fs/promises\";\nimport Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst content = await didit.investigator.exportActivity();\nawait writeFile(\"download.csv\", Buffer.from(await content.arrayBuffer()));"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresp, err := client.Investigator.ExportActivity(ctx, didit.InvestigatorExportActivityParams{})\nif err != nil {\n\tlog.Fatal(err)\n}\ndefer resp.Body.Close()\nfile, err := os.Create(\"download.csv\")\nif err != nil {\n\tlog.Fatal(err)\n}\ndefer file.Close()\nif _, err := io.Copy(file, resp.Body); err != nil {\n\tlog.Fatal(err)\n}"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import java.nio.file.Path;\nimport me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nclient.investigator().exportActivity()\n        .writeTo(Path.of(\"download.csv\"));"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$content = $didit->investigator->exportActivity();\n$content->saveTo('download.csv');"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\ncontent = didit.investigator.export_activity\nFile.binwrite(\"download.csv\", content)"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar content = await client.Investigator.ExportActivityAsync();\nawait content.SaveToAsync(\"download.csv\");"
          }
        ]
      }
    },
    "/v3/investigator/settings/": {
      "get": {
        "operationId": "investigator_settings_retrieve",
        "summary": "Investigator-Einstellungen abrufen",
        "description": "Die Phase (`none`, `shadow` oder `live`) und das monatliche Ausgabenlimit mit den Ausgaben dieses Monats. Eingeschränkte Schlüssel erfordern den Scope `applications` (read).",
        "tags": [
          "Investigator"
        ],
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/InvestigatorSettings"
                }
              }
            }
          },
          "401": {
            "description": "Fehlender oder ungültiger API-Schlüssel."
          },
          "403": {
            "description": "Dem Schlüssel fehlt der Scope, der Elementtyp ist nicht lesbar oder der Tarif beinhaltet den Investigator nicht."
          }
        },
        "x-didit-sdk": {
          "resource": "investigator",
          "method": "retrieve_settings",
          "auth": "api_key",
          "server": true
        },
        "x-codeSamples": [
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.investigator.retrieve_settings()\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.investigator.retrieveSettings();\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Investigator.RetrieveSettings(ctx)\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.investigator().retrieveSettings();\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->investigator->retrieveSettings();\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.investigator.retrieve_settings\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Investigator.RetrieveSettingsAsync();\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ]
      },
      "patch": {
        "operationId": "investigator_settings_update",
        "summary": "Investigator-Einstellungen aktualisieren",
        "description": "Stufe, das monatliche Ausgabenlimit oder beides ändern. Ein Wechsel über `none` hinaus erfordert einen Tarif, der den Investigator enthält (Growth oder höher); `live` erfordert zudem einen Vertrag mit entsprechender Bepreisung, sofern vorhanden. Eingeschränkte Schlüssel erfordern den Scope `applications` (write).",
        "tags": [
          "Investigator"
        ],
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/InvestigatorSettings"
                }
              }
            }
          },
          "400": {
            "description": "Keines der Felder gesendet oder ein ungültiger Wert."
          },
          "401": {
            "description": "Fehlender oder ungültiger API-Schlüssel."
          },
          "403": {
            "description": "Dem Schlüssel fehlt der Scope, der Elementtyp ist nicht lesbar oder der Tarif beinhaltet den Investigator nicht."
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/InvestigatorSettings"
              },
              "example": {
                "stage": "shadow",
                "monthly_spend_limit": "500.00"
              }
            }
          }
        },
        "x-didit-sdk": {
          "resource": "investigator",
          "method": "update_settings",
          "auth": "api_key",
          "server": true
        },
        "x-codeSamples": [
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.investigator.update_settings(\n    stage=\"shadow\",\n    monthly_spend_limit=\"500.00\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.investigator.updateSettings({\n  stage: \"shadow\",\n  monthly_spend_limit: \"500.00\",\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Investigator.UpdateSettings(ctx, didit.InvestigatorSettingsParam{\n\tStage:             didit.Some(didit.InvestigatorSettingsStage(\"shadow\")),\n\tMonthlySpendLimit: didit.String(\"500.00\"),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\nimport me.didit.types.InvestigatorSettings;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.investigator().updateSettings(InvestigatorSettings.builder()\n        .stage(InvestigatorSettings.Stage.of(\"shadow\"))\n        .monthlySpendLimit(\"500.00\")\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->investigator->updateSettings([\n    'stage' => 'shadow',\n    'monthly_spend_limit' => '500.00',\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.investigator.update_settings(\n  stage: \"shadow\",\n  monthly_spend_limit: \"500.00\"\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Investigator.UpdateSettingsAsync(new InvestigatorSettings\n{\n    Stage = new InvestigatorSettingsStage(\"shadow\"),\n    MonthlySpendLimit = \"500.00\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ]
      }
    },
    "/v3/travel-rule/wallet-addresses/import/": {
      "post": {
        "summary": "Wallet-Adressen massenweise importieren",
        "description": "Fügen Sie Ihrem Travel-Rule-Adressbuch bis zu 10.000 Wallets in einem Aufruf als JSON oder CSV-Datei hinzu. Eine Wallet kann über ihre Adresse, über den SHA-256-Hash ihrer in Kleinbuchstaben konvertierten Adresse (`address_hash`), um die Adresse geheim zu halten, oder beides übermittelt werden. Der Import ist idempotent: Eine Wallet, die bereits im Adressbuch vorhanden ist, wird als `existing` gemeldet und unverändert belassen, sodass dieselbe Datei erneut gesendet werden kann. Jede Zeile wird einzeln validiert, sodass eine fehlerhafte Zeile niemals die anderen beeinträchtigt. Eine nur über ihren Hash importierte Wallet stimmt nur mit Transfers an diese Adresse überein und kann wie jeder andere Eintrag über das Wallet-Ownership-Widget nachgewiesen werden.",
        "operationId": "importTravelRuleWalletAddresses",
        "tags": [
          "Travel Rule"
        ],
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "x-didit-sdk": {
          "resource": "travel_rule.wallet_addresses",
          "method": "bulk_import",
          "auth": "api_key",
          "server": true
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "oneOf": [
                  {
                    "type": "object",
                    "required": [
                      "entries"
                    ],
                    "properties": {
                      "entries": {
                        "type": "array",
                        "minItems": 1,
                        "maxItems": 10000,
                        "items": {
                          "$ref": "#/components/schemas/WalletAddressImportRow"
                        }
                      }
                    }
                  },
                  {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 10000,
                    "items": {
                      "$ref": "#/components/schemas/WalletAddressImportRow"
                    }
                  }
                ]
              },
              "example": {
                "entries": [
                  {
                    "address": "0xBeneficiaryWallet01",
                    "chain": "ETH",
                    "holder_name": "Ana Diaz",
                    "holder_vendor_data": "user-042"
                  },
                  {
                    "address_hash": "4f7d2e1c9b8a7f6e5d4c3b2a1f0e9d8c7b6a5f4e3d2c1b0a9f8e7d6c5b4a3f2e",
                    "chain": "bitcoin",
                    "holder_vendor_data": "user-043"
                  },
                  {
                    "address": "rExchangeSharedAddress01",
                    "chain": "XRP",
                    "memo": "104729",
                    "holder_name": "Ana Diaz"
                  }
                ]
              }
            },
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "required": [
                  "file"
                ],
                "properties": {
                  "file": {
                    "type": "string",
                    "format": "binary",
                    "description": "Eine UTF-8-CSV-Datei mit maximal 5 MB und einer Header-Zeile, die die Spalten benennt (die Feldnamen oder ihre Aliase). Leere Zellen gelten als nicht gesendet; Spalten, die der Import nicht liest, werden ignoriert."
                  }
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl (JSON)",
            "source": "curl -X POST https://verification.didit.me/v3/travel-rule/wallet-addresses/import/ \\\n  -H 'x-api-key: YOUR_API_KEY' -H 'Content-Type: application/json' \\\n  -d '{\"entries\": [{\"address\": \"0xBeneficiaryWallet01\", \"chain\": \"ETH\", \"holder_name\": \"Ana Diaz\"}, {\"address\": \"rExchangeSharedAddress01\", \"chain\": \"XRP\", \"memo\": \"104729\"}]}'"
          },
          {
            "lang": "curl",
            "label": "curl (CSV)",
            "source": "curl -X POST https://verification.didit.me/v3/travel-rule/wallet-addresses/import/ \\\n  -H 'x-api-key: YOUR_API_KEY' \\\n  -F 'file=@wallets.csv;type=text/csv'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.travel_rule.wallet_addresses.bulk_import(\n    body={\n        \"entries\": [{\n            \"address\": \"0xBeneficiaryWallet01\",\n            \"chain\": \"ETH\",\n            \"holder_name\": \"Ana Diaz\",\n            \"holder_vendor_data\": \"user-042\",\n        }, {\n            \"address_hash\": \"4f7d2e1c9b8a7f6e5d4c3b2a1f0e9d8c7b6a5f4e3d2c1b0a9f8e7d6c5b4a3f2e\",\n            \"chain\": \"bitcoin\",\n            \"holder_vendor_data\": \"user-043\",\n        }, {\n            \"address\": \"rExchangeSharedAddress01\",\n            \"chain\": \"XRP\",\n            \"memo\": \"104729\",\n            \"holder_name\": \"Ana Diaz\",\n        }],\n    },\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit, { fileFromPath } from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.travelRule.walletAddresses.bulkImport({\n  file: await fileFromPath(\"wallet-addresses.csv\"),\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.TravelRule.WalletAddresses.BulkImport(ctx, didit.TravelRuleWalletAddressesBulkImportParams{\n\tFile: didit.Some(didit.FileFromPath(\"wallet-addresses.csv\")),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import java.nio.file.Path;\nimport me.didit.Didit;\nimport me.didit.types.TravelRuleWalletAddressesBulkImportParams;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.travelRule().walletAddresses().bulkImport(TravelRuleWalletAddressesBulkImportParams.builder()\n        .file(Path.of(\"wallet-addresses.csv\"))\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\nuse Didit\\File;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->travelRule->walletAddresses->bulkImport([\n    'file' => File::fromPath('wallet-addresses.csv'),\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.travel_rule.wallet_addresses.bulk_import(\n  body: {\n    entries: [{\n      address: \"0xBeneficiaryWallet01\",\n      chain: \"ETH\",\n      holder_name: \"Ana Diaz\",\n      holder_vendor_data: \"user-042\",\n    }, {\n      address_hash: \"4f7d2e1c9b8a7f6e5d4c3b2a1f0e9d8c7b6a5f4e3d2c1b0a9f8e7d6c5b4a3f2e\",\n      chain: \"bitcoin\",\n      holder_vendor_data: \"user-043\",\n    }, {\n      address: \"rExchangeSharedAddress01\",\n      chain: \"XRP\",\n      memo: \"104729\",\n      holder_name: \"Ana Diaz\",\n    }],\n  }\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.TravelRule.WalletAddresses.BulkImportAsync(new TravelRuleWalletAddressesBulkImportParams\n{\n    File = FileUpload.FromPath(\"wallet-addresses.csv\"),\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "responses": {
          "200": {
            "description": "Jede Zeile wurde erstellt, war bereits vorhanden oder ist eine Wiederholung einer früheren Zeile.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WalletAddressImportReport"
                },
                "example": {
                  "total": 3,
                  "created": 2,
                  "existing": 1,
                  "duplicate": 0,
                  "failed": 0,
                  "rows": [
                    {
                      "row": 1,
                      "status": "existing",
                      "entry_id": "11111111-2222-3333-4444-555555555555",
                      "errors": {},
                      "duplicate_of_row": null
                    },
                    {
                      "row": 2,
                      "status": "created",
                      "entry_id": "22222222-3333-4444-5555-666666666666",
                      "errors": {},
                      "duplicate_of_row": null
                    },
                    {
                      "row": 3,
                      "status": "created",
                      "entry_id": "33333333-4444-5555-6666-777777777777",
                      "errors": {},
                      "duplicate_of_row": null
                    }
                  ]
                }
              }
            }
          },
          "207": {
            "description": "Mindestens eine Zeile ist fehlgeschlagen; die anderen wurden importiert. Jede fehlgeschlagene Zeile benennt ihre Fehler.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WalletAddressImportReport"
                },
                "example": {
                  "total": 2,
                  "created": 1,
                  "existing": 0,
                  "duplicate": 0,
                  "failed": 1,
                  "rows": [
                    {
                      "row": 1,
                      "status": "created",
                      "entry_id": "44444444-5555-6666-7777-888888888888",
                      "errors": {},
                      "duplicate_of_row": null
                    },
                    {
                      "row": 2,
                      "status": "failed",
                      "entry_id": null,
                      "errors": {
                        "address": [
                          "Send address, address_hash or both."
                        ]
                      },
                      "duplicate_of_row": null
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "Die Anfrage selbst kann nicht gelesen werden: sowohl `entries` als auch eine `file` oder keines von beiden angegeben; mehr als 10.000 Zeilen; eine Datei über 5 MB, keine UTF-8-CSV, ohne Kopfzeile oder ohne Zeilen.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                },
                "example": {
                  "file": [
                    "At most 10000 rows per import."
                  ]
                }
              }
            }
          }
        }
      }
    },
    "/v3/travel-rule/counterparty-contacts/": {
      "get": {
        "summary": "Kontakte der Gegenpartei auflisten",
        "description": "Die Compliance-Adressen, an die die EMAIL-Schiene für Ihre Anwendung schreiben darf: Didits Plattformkontakte plus die privaten Kontakte Ihrer Anwendung, einschließlich unzustellbarer, die neuesten zuerst. Paginiert mit `limit` (Standardwert 50) und `offset`; `count` stoppt bei 100, 100 bedeutet also 100 oder mehr.",
        "operationId": "listTravelRuleCounterpartyContacts",
        "x-didit-sdk": {
          "resource": "travel_rule.counterparty_contacts",
          "method": "list",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Travel Rule"
        ],
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "parameters": [
          {
            "name": "counterparty",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Nur die Kontakte dieses Verzeichniseintrags. Muss eine UUID sein; ein leerer Wert bedeutet kein Filter."
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1
            },
            "description": "Seitengröße, Standardwert 50."
          },
          {
            "name": "offset",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 0
            },
            "description": "Zu überspringende Zeilen."
          }
        ],
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X GET 'https://verification.didit.me/v3/travel-rule/counterparty-contacts/?counterparty={vasp_id}' \\\n  -H 'x-api-key: YOUR_API_KEY'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nfor item in client.travel_rule.counterparty_contacts.list():\n    print(item)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nfor await (const item of didit.travelRule.counterpartyContacts.list()) {\n  console.log(item);\n}"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\niter := client.TravelRule.CounterpartyContacts.ListAutoPaging(ctx, didit.TravelRuleCounterpartyContactsListParams{})\nfor iter.Next() {\n\tfmt.Printf(\"%+v\\n\", iter.Current())\n}\nif err := iter.Err(); err != nil {\n\tlog.Fatal(err)\n}"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nfor (var item : client.travelRule().counterpartyContacts().list()) {\n    System.out.println(item);\n}"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\nforeach ($didit->travelRule->counterpartyContacts->list() as $item) {\n    print_r($item->toArray());\n}"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\ndidit.travel_rule.counterparty_contacts.list.auto_paging_each do |item|\n  puts item.to_h\nend"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nawait foreach (var item in await client.TravelRule.CounterpartyContacts.ListAsync())\n{\n    Console.WriteLine(JsonSerializer.Serialize(item));\n}"
          }
        ],
        "responses": {
          "200": {
            "description": "Die Kontakte.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "count": {
                      "type": "integer"
                    },
                    "next": {
                      "type": "string",
                      "nullable": true
                    },
                    "previous": {
                      "type": "string",
                      "nullable": true
                    },
                    "results": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/TravelRuleCounterpartyContact"
                      }
                    }
                  }
                },
                "example": {
                  "count": 1,
                  "next": null,
                  "previous": null,
                  "results": [
                    {
                      "uuid": "6c1f9b8e-2d4a-4f7e-8b3c-5a9d0e1f2a3b",
                      "counterparty": "0d6f3c2a-6a1e-4c55-9a39-1f2b0c7d8e91",
                      "counterparty_name": "Example Counterparty VASP",
                      "email": "compliance@counterparty.example",
                      "name": "Compliance desk",
                      "source": "application",
                      "scope": "application",
                      "created_by": "",
                      "verified_at": null,
                      "is_invalid": false,
                      "invalid_reason": "",
                      "invalid_detail": "",
                      "invalid_at": null,
                      "created_at": "2026-10-19T09:00:00Z"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "`counterparty` ist keine UUID.",
            "content": {
              "application/json": {
                "example": {
                  "counterparty": [
                    "Must be a valid UUID."
                  ]
                }
              }
            }
          }
        }
      },
      "post": {
        "summary": "Einen Gegenpartei-Kontakt hinzufügen",
        "description": "Fügt eine private Compliance-Adresse für einen Directory-Eintrag hinzu. Nur Ihre Anwendung sieht und nutzt diese, und der EMAIL-Rail schreibt vor jedem Plattformkontakt an sie. Das Hinzufügen einer Adresse, die der Eintrag bereits unter Ihren eigenen Kontakten hat, gibt diesen Kontakt zurück.",
        "operationId": "createTravelRuleCounterpartyContact",
        "x-didit-sdk": {
          "resource": "travel_rule.counterparty_contacts",
          "method": "create",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Travel Rule"
        ],
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TravelRuleCounterpartyContactCreate"
              },
              "example": {
                "counterparty": "0d6f3c2a-6a1e-4c55-9a39-1f2b0c7d8e91",
                "email": "compliance@counterparty.example",
                "name": "Compliance desk"
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X POST https://verification.didit.me/v3/travel-rule/counterparty-contacts/ \\\n  -H 'x-api-key: YOUR_API_KEY' -H 'Content-Type: application/json' \\\n  -d '{\"counterparty\": \"0d6f3c2a-6a1e-4c55-9a39-1f2b0c7d8e91\", \"email\": \"compliance@counterparty.example\", \"name\": \"Compliance desk\"}'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.travel_rule.counterparty_contacts.create(\n    counterparty=\"0d6f3c2a-6a1e-4c55-9a39-1f2b0c7d8e91\",\n    email=\"compliance@counterparty.example\",\n    name=\"Compliance desk\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.travelRule.counterpartyContacts.create({\n  counterparty: \"0d6f3c2a-6a1e-4c55-9a39-1f2b0c7d8e91\",\n  email: \"compliance@counterparty.example\",\n  name: \"Compliance desk\",\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.TravelRule.CounterpartyContacts.Create(ctx, didit.TravelRuleCounterpartyContactCreate{\n\tCounterparty: \"0d6f3c2a-6a1e-4c55-9a39-1f2b0c7d8e91\",\n\tEmail:        \"compliance@counterparty.example\",\n\tName:         didit.String(\"Compliance desk\"),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\nimport me.didit.types.TravelRuleCounterpartyContactCreate;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.travelRule().counterpartyContacts().create(TravelRuleCounterpartyContactCreate.builder()\n        .counterparty(\"0d6f3c2a-6a1e-4c55-9a39-1f2b0c7d8e91\")\n        .email(\"compliance@counterparty.example\")\n        .name(\"Compliance desk\")\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->travelRule->counterpartyContacts->create([\n    'counterparty' => '0d6f3c2a-6a1e-4c55-9a39-1f2b0c7d8e91',\n    'email' => 'compliance@counterparty.example',\n    'name' => 'Compliance desk',\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.travel_rule.counterparty_contacts.create(\n  counterparty: \"0d6f3c2a-6a1e-4c55-9a39-1f2b0c7d8e91\",\n  email: \"compliance@counterparty.example\",\n  name: \"Compliance desk\"\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.TravelRule.CounterpartyContacts.CreateAsync(new TravelRuleCounterpartyContactCreate\n{\n    Counterparty = \"0d6f3c2a-6a1e-4c55-9a39-1f2b0c7d8e91\",\n    Email = \"compliance@counterparty.example\",\n    Name = \"Compliance desk\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "responses": {
          "201": {
            "description": "Der Kontakt wurde hinzugefügt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TravelRuleCounterpartyContact"
                },
                "example": {
                  "uuid": "6c1f9b8e-2d4a-4f7e-8b3c-5a9d0e1f2a3b",
                  "counterparty": "0d6f3c2a-6a1e-4c55-9a39-1f2b0c7d8e91",
                  "counterparty_name": "Example Counterparty VASP",
                  "email": "compliance@counterparty.example",
                  "name": "Compliance desk",
                  "source": "application",
                  "scope": "application",
                  "created_by": "",
                  "verified_at": null,
                  "is_invalid": false,
                  "invalid_reason": "",
                  "invalid_detail": "",
                  "invalid_at": null,
                  "created_at": "2026-10-19T09:00:00Z"
                }
              }
            }
          },
          "400": {
            "description": "Ein Feld fehlt oder ist ungültig, oder kein Verzeichniseintrag hat diese ID.",
            "content": {
              "application/json": {
                "example": {
                  "counterparty": [
                    "No directory entry with this id."
                  ]
                }
              }
            }
          }
        }
      }
    },
    "/v3/travel-rule/counterparty-contacts/{contact_uuid}/": {
      "delete": {
        "summary": "Einen Gegenpartei-Kontakt löschen",
        "description": "Löscht einen der anwendungseigenen Kontakte. Die EMAIL-Schiene schreibt ab sofort nicht mehr in diesen Kontakt. Plattformkontakte können nicht gelöscht werden.",
        "operationId": "deleteTravelRuleCounterpartyContact",
        "x-didit-sdk": {
          "resource": "travel_rule.counterparty_contacts",
          "method": "delete",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Travel Rule"
        ],
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "parameters": [
          {
            "name": "contact_uuid",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X DELETE https://verification.didit.me/v3/travel-rule/counterparty-contacts/{contact_uuid}/ \\\n  -H 'x-api-key: YOUR_API_KEY'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nclient.travel_rule.counterparty_contacts.delete(\n    \"11111111-2222-3333-4444-555555555555\",\n)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nawait didit.travelRule.counterpartyContacts.delete(\"11111111-2222-3333-4444-555555555555\");"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nif err := client.TravelRule.CounterpartyContacts.Delete(ctx, \"11111111-2222-3333-4444-555555555555\"); err != nil {\n\tlog.Fatal(err)\n}"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nclient.travelRule().counterpartyContacts().delete(\"11111111-2222-3333-4444-555555555555\");"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$didit->travelRule->counterpartyContacts->delete('11111111-2222-3333-4444-555555555555');"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\ndidit.travel_rule.counterparty_contacts.delete(\"11111111-2222-3333-4444-555555555555\")"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nawait client.TravelRule.CounterpartyContacts.DeleteAsync(\"11111111-2222-3333-4444-555555555555\");"
          }
        ],
        "responses": {
          "204": {
            "description": "Gelöscht."
          },
          "404": {
            "description": "Kein Kontakt Ihrer Anwendung besitzt diese ID. Ein Plattformkontakt gibt ebenfalls 404 zurück."
          }
        }
      }
    },
    "/v3/travel-rule/transfers/": {
      "get": {
        "summary": "Travel Rule-Transfers auflisten",
        "description": "Die Travel-Rule-Transfers Ihrer Anwendung, neueste zuerst, paginiert mit `limit` (Standardwert 50) und `offset`. Zeilen enthalten nur VASP-Namen, Wallets und Memos, niemals personenbezogene Daten. Kommagetrennte Werte wählen mehrere aus. Bei einem unbekannten Wert wird 400 unter Nennung des Parameters zurückgegeben, zum Beispiel `{\"direction\": [\"Unknown value(s): inbound.\"]}`.",
        "operationId": "listTravelRuleTransfers",
        "x-didit-sdk": {
          "resource": "travel_rule.transfers",
          "method": "list",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Travel Rule"
        ],
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "parameters": [
          {
            "name": "direction",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "INBOUND, OUTBOUND oder beides durch Kommas getrennt. Groß-/Kleinschreibung wird beachtet."
          },
          {
            "name": "status",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "Ein oder mehrere Transferstatus, kommagetrennt."
          },
          {
            "name": "rail",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "Einer oder mehrere der Werte INTERNAL, TRP, GTR, TRUST, VERIFYVASP, SYGNA, EMAIL, TEST_VASP, kommagetrennt."
          },
          {
            "name": "kind",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "withdrawal, deposit oder message, kommagetrennt."
          },
          {
            "name": "currency",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "Die Währung der Transaktion, ohne Berücksichtigung der Groß-/Kleinschreibung."
          },
          {
            "name": "start_date",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "date"
            },
            "description": "Transfers, die an oder nach diesem Tag (UTC) erstellt wurden, YYYY-MM-DD."
          },
          {
            "name": "end_date",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "date"
            },
            "description": "Transfers, die an oder vor diesem Tag (UTC) erstellt wurden, YYYY-MM-DD."
          },
          {
            "name": "counterparty",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Die `id` eines Verzeichniseintrags oder Didit-Netzwerkmitglieds aus GET /v3/travel-rule/vasps/: Ihre Übertragungen mit dieser Gegenpartei. Bei einem Wert, der keine gültige ID ist, wird 400 zurückgegeben."
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1
            },
            "description": "Seitengröße, Standardwert 50."
          },
          {
            "name": "offset",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 0
            },
            "description": "Zu überspringende Zeilen."
          }
        ],
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X GET 'https://verification.didit.me/v3/travel-rule/transfers/?direction=OUTBOUND&status=AWAITING_COUNTERPARTY' \\\n  -H 'x-api-key: YOUR_API_KEY'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nfor item in client.travel_rule.transfers.list():\n    print(item)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nfor await (const item of didit.travelRule.transfers.list()) {\n  console.log(item);\n}"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\niter := client.TravelRule.Transfers.ListAutoPaging(ctx, didit.TravelRuleTransfersListParams{})\nfor iter.Next() {\n\tfmt.Printf(\"%+v\\n\", iter.Current())\n}\nif err := iter.Err(); err != nil {\n\tlog.Fatal(err)\n}"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nfor (var item : client.travelRule().transfers().list()) {\n    System.out.println(item);\n}"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\nforeach ($didit->travelRule->transfers->list() as $item) {\n    print_r($item->toArray());\n}"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\ndidit.travel_rule.transfers.list.auto_paging_each do |item|\n  puts item.to_h\nend"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nawait foreach (var item in await client.TravelRule.Transfers.ListAsync())\n{\n    Console.WriteLine(JsonSerializer.Serialize(item));\n}"
          }
        ],
        "responses": {
          "200": {
            "description": "Eine Seite mit Transfers.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "count": {
                      "type": "integer"
                    },
                    "next": {
                      "type": "string",
                      "nullable": true
                    },
                    "previous": {
                      "type": "string",
                      "nullable": true
                    },
                    "results": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/TravelRuleTransferRow"
                      }
                    }
                  }
                },
                "example": {
                  "count": 1,
                  "next": null,
                  "previous": null,
                  "results": [
                    {
                      "id": "5b0f6c2e-2a4d-4f0e-9a41-0c3f9a7e1d22",
                      "transaction_id": "a3c1e8f4-7b62-4d1a-8e0b-2f9d6c4b7a10",
                      "txn_id": "wd-2026-10-19-0042",
                      "txn_date": "2026-10-19T08:41:12Z",
                      "kind": "withdrawal",
                      "direction": "OUTBOUND",
                      "status": "AWAITING_COUNTERPARTY",
                      "rail": "TRP",
                      "asset": "ETH",
                      "amount": "1.25",
                      "originator_vasp": "Origin CASP SL",
                      "beneficiary_vasp": "Example Counterparty VASP",
                      "originator_wallet": "0x77ccff0cc624a53cd8b8d8703ced826710211ec7",
                      "beneficiary_wallet": "0xede2d7e4f5b097e6391ab6bbcf2f47a53f4778cb",
                      "originator_memo": "",
                      "beneficiary_memo": "",
                      "originator_wallet_type": "vasp",
                      "beneficiary_wallet_type": "vasp",
                      "matched_transaction_id": null,
                      "deadline_at": "2026-10-21T08:41:13Z",
                      "created_at": "2026-10-19T08:41:13Z"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "Ein Filterwert ist ungültig.",
            "content": {
              "application/json": {
                "example": {
                  "start_date": [
                    "Use the YYYY-MM-DD format."
                  ]
                }
              }
            }
          }
        }
      }
    },
    "/v3/session/imports/providers/": {
      "get": {
        "summary": "Migrationsanbieter auflisten",
        "description": "Die 15 Anbieter, von denen Sie Verifizierungen migrieren können: Was jeder für die Verbindung benötigt, ob seine API Datensätze auflisten kann, welche Berechtigungen sein Schlüssel benötigt und sein Standard-Status-Mapping.",
        "operationId": "get_v3_session_imports_providers_list",
        "x-didit-sdk": {
          "resource": "sessions.imports",
          "method": "list_providers",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Sessions"
        ],
        "responses": {
          "200": {
            "description": "Migrationsanbieter.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "providers": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/ImportProvider"
                      }
                    },
                    "mapping_targets": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      }
                    },
                    "skipped_statuses": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      }
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Fehlender, ungültiger oder widerrufener API-Schlüssel, oder der Aufrufer kann keine Verifizierungen für diese Anwendung importieren.",
            "content": {
              "application/json": {
                "examples": {
                  "Forbidden": {
                    "value": {
                      "detail": "You do not have permission to perform this action."
                    }
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "x-codeSamples": [
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.sessions.imports.list_providers()\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.sessions.imports.listProviders();\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Sessions.Imports.ListProviders(ctx)\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.sessions().imports().listProviders();\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->sessions->imports->listProviders();\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.sessions.imports.list_providers\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Sessions.Imports.ListProvidersAsync();\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ]
      }
    },
    "/v3/session/imports/providers/check/": {
      "post": {
        "summary": "Provider-Schlüssel prüfen",
        "description": "Lesen Sie den Anbieter mit Ihrem Schlüssel aus, bevor Sie eine Migration erstellen. Es wird nichts gespeichert.",
        "operationId": "post_v3_session_imports_providers_check",
        "x-didit-sdk": {
          "resource": "sessions.imports",
          "method": "check_provider",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Sessions"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "provider": {
                    "type": "string",
                    "enum": [
                      "sumsub",
                      "jumio",
                      "veriff",
                      "onfido",
                      "persona",
                      "metamap",
                      "socure",
                      "idnow",
                      "shufti",
                      "idenfy",
                      "ondato",
                      "trulioo",
                      "au10tix",
                      "complycube",
                      "other"
                    ],
                    "description": "Migrationsquelle, aus `GET /v3/session/imports/providers/`. Erforderlich, wenn `source` den Wert `provider` hat."
                  },
                  "credentials": {
                    "type": "object",
                    "additionalProperties": {
                      "type": "string"
                    },
                    "description": "Der schreibgeschützte Schlüssel des Anbieters mit den von `credential_fields` aufgelisteten Feldnamen. Im Ruhezustand verschlüsselt, wird niemals zurückgegeben und nach Abschluss des Imports gelöscht. Senden Sie ihn als JSON-String in multipart."
                  },
                  "options": {
                    "type": "object",
                    "properties": {
                      "region": {
                        "type": "string",
                        "description": "Die Region des Anbieters, eine seiner `regions` (Onfido: `eu`, `us`, `ca`)."
                      }
                    }
                  },
                  "record_ids": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    },
                    "description": "Für `api_ids`-Anbieter: die erste Datensatz-ID Ihres Exports."
                  }
                },
                "required": [
                  "provider",
                  "credentials"
                ]
              },
              "example": {
                "provider": "sumsub",
                "credentials": {
                  "app_token": "YOUR_PROVIDER_APP_TOKEN",
                  "secret_key": "YOUR_PROVIDER_SECRET_KEY"
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Der Schlüssel kann Datensätze lesen.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "ok": {
                      "type": "boolean"
                    },
                    "provider": {
                      "type": "string"
                    },
                    "credential_hint": {
                      "type": "string",
                      "nullable": true
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Der Anbieter hat den Schlüssel abgelehnt: `code`, `detail`, `missing_permissions`, `suggested_region`."
          },
          "403": {
            "description": "Fehlender, ungültiger oder widerrufener API-Schlüssel, oder der Aufrufer kann keine Verifizierungen für diese Anwendung importieren.",
            "content": {
              "application/json": {
                "examples": {
                  "Forbidden": {
                    "value": {
                      "detail": "You do not have permission to perform this action."
                    }
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "x-codeSamples": [
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.sessions.imports.check_provider(\n    provider=\"sumsub\",\n    credentials={\"app_token\": \"YOUR_PROVIDER_APP_TOKEN\", \"secret_key\": \"YOUR_PROVIDER_SECRET_KEY\"},\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.sessions.imports.checkProvider({\n  provider: \"sumsub\",\n  credentials: { app_token: \"YOUR_PROVIDER_APP_TOKEN\", secret_key: \"YOUR_PROVIDER_SECRET_KEY\" },\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Sessions.Imports.CheckProvider(ctx, didit.SessionsImportsCheckProviderParams{\n\tProvider:    \"sumsub\",\n\tCredentials: map[string]string{\"app_token\": \"YOUR_PROVIDER_APP_TOKEN\", \"secret_key\": \"YOUR_PROVIDER_SECRET_KEY\"},\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import java.util.Map;\nimport me.didit.Didit;\nimport me.didit.types.SessionsImportsCheckProviderParams;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.sessions().imports().checkProvider(SessionsImportsCheckProviderParams.builder()\n        .provider(SessionsImportsCheckProviderParams.Provider.of(\"sumsub\"))\n        .credentials(Map.of(\"app_token\", \"YOUR_PROVIDER_APP_TOKEN\", \"secret_key\", \"YOUR_PROVIDER_SECRET_KEY\"))\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->sessions->imports->checkProvider([\n    'provider' => 'sumsub',\n    'credentials' => ['app_token' => 'YOUR_PROVIDER_APP_TOKEN', 'secret_key' => 'YOUR_PROVIDER_SECRET_KEY'],\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.sessions.imports.check_provider(\n  provider: \"sumsub\",\n  credentials: { app_token: \"YOUR_PROVIDER_APP_TOKEN\", secret_key: \"YOUR_PROVIDER_SECRET_KEY\" }\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Collections.Generic;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Sessions.Imports.CheckProviderAsync(new SessionsImportsCheckProviderParams\n{\n    Provider = \"sumsub\",\n    Credentials = new Dictionary<string, string> { [\"app_token\"] = \"YOUR_PROVIDER_APP_TOKEN\", [\"secret_key\"] = \"YOUR_PROVIDER_SECRET_KEY\" },\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ]
      }
    },
    "/v3/session/imports/{importId}/start/": {
      "post": {
        "summary": "Testlauf starten",
        "description": "Eine Migration starten, deren Testlauf abgeschlossen wurde (`READY`): Derselbe Auftrag führt den tatsächlichen Import durch, mit dem Status-Mapping und der Auswahl der Gesichts-Templates wie jetzt übermittelt.",
        "operationId": "post_v3_session_imports_start",
        "x-didit-sdk": {
          "resource": "sessions.imports",
          "method": "start",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Sessions"
        ],
        "parameters": [
          {
            "name": "importId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "status_mapping": {
                    "type": "object",
                    "additionalProperties": {
                      "type": "string",
                      "enum": [
                        "Approved",
                        "Declined",
                        "In Review",
                        "Expired",
                        "Not Finished",
                        "Abandoned"
                      ]
                    },
                    "description": "Anpassungen des Standard-Status-Mappings des Anbieters: Quellstatus zu Didit-Status. `Not Finished` und `Abandoned` werden übersprungen und gezählt, jedoch niemals importiert."
                  },
                  "face_templates": {
                    "type": "boolean",
                    "default": false,
                    "description": "Erstellen Sie biometrische Templates aus den importierten Selfies und gleichen Sie diese mit den Gesichtern und der Sperrliste der Anwendung ab. Übereinstimmungen werden nur zur Prüfung markiert. Erfordert `lawful_basis_confirmed`."
                  },
                  "lawful_basis_confirmed": {
                    "type": "boolean",
                    "default": false,
                    "description": "Bestätigt, dass Sie über eine Rechtsgrundlage verfügen, um diese Selfies mit Didit als Auftragsverarbeiter zu teilen."
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Der Import-Job.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SessionImportJob"
                }
              }
            }
          },
          "400": {
            "description": "Der Job befindet sich nicht in einem Zustand, auf den diese Aktion anwendbar ist."
          },
          "403": {
            "description": "Fehlender, ungültiger oder widerrufener API-Schlüssel, oder der Aufrufer kann keine Verifizierungen für diese Anwendung importieren.",
            "content": {
              "application/json": {
                "examples": {
                  "Forbidden": {
                    "value": {
                      "detail": "You do not have permission to perform this action."
                    }
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "x-codeSamples": [
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.sessions.imports.start(\n    \"11111111-2222-3333-4444-555555555555\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.sessions.imports.start(\"11111111-2222-3333-4444-555555555555\");\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Sessions.Imports.Start(ctx, \"11111111-2222-3333-4444-555555555555\", didit.SessionsImportsStartParams{})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.sessions().imports().start(\"11111111-2222-3333-4444-555555555555\");\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->sessions->imports->start('11111111-2222-3333-4444-555555555555');\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.sessions.imports.start(\"11111111-2222-3333-4444-555555555555\")\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Sessions.Imports.StartAsync(\"11111111-2222-3333-4444-555555555555\");\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ]
      }
    },
    "/v3/session/imports/{importId}/pause/": {
      "post": {
        "summary": "Einen Import-Job anhalten",
        "description": "Einen Import in der Warteschlange oder einen laufenden Import anhalten.",
        "operationId": "post_v3_session_imports_pause",
        "x-didit-sdk": {
          "resource": "sessions.imports",
          "method": "pause",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Sessions"
        ],
        "parameters": [
          {
            "name": "importId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Der Import-Job.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SessionImportJob"
                }
              }
            }
          },
          "400": {
            "description": "Der Job befindet sich nicht in einem Zustand, auf den diese Aktion anwendbar ist."
          },
          "403": {
            "description": "Fehlender, ungültiger oder widerrufener API-Schlüssel, oder der Aufrufer kann keine Verifizierungen für diese Anwendung importieren.",
            "content": {
              "application/json": {
                "examples": {
                  "Forbidden": {
                    "value": {
                      "detail": "You do not have permission to perform this action."
                    }
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "x-codeSamples": [
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.sessions.imports.pause(\n    \"11111111-2222-3333-4444-555555555555\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.sessions.imports.pause(\"11111111-2222-3333-4444-555555555555\");\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Sessions.Imports.Pause(ctx, \"11111111-2222-3333-4444-555555555555\")\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.sessions().imports().pause(\"11111111-2222-3333-4444-555555555555\");\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->sessions->imports->pause('11111111-2222-3333-4444-555555555555');\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.sessions.imports.pause(\"11111111-2222-3333-4444-555555555555\")\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Sessions.Imports.PauseAsync(\"11111111-2222-3333-4444-555555555555\");\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ]
      }
    },
    "/v3/session/imports/{importId}/resume/": {
      "post": {
        "summary": "Einen Importauftrag fortsetzen",
        "description": "Einen von Ihnen pausierten Import fortsetzen. Ein durch das Rate-Limit des Anbieters pausierter Auftrag wird automatisch fortgesetzt.",
        "operationId": "post_v3_session_imports_resume",
        "x-didit-sdk": {
          "resource": "sessions.imports",
          "method": "resume",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Sessions"
        ],
        "parameters": [
          {
            "name": "importId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Der Import-Job.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SessionImportJob"
                }
              }
            }
          },
          "400": {
            "description": "Der Job befindet sich nicht in einem Zustand, auf den diese Aktion anwendbar ist."
          },
          "403": {
            "description": "Fehlender, ungültiger oder widerrufener API-Schlüssel, oder der Aufrufer kann keine Verifizierungen für diese Anwendung importieren.",
            "content": {
              "application/json": {
                "examples": {
                  "Forbidden": {
                    "value": {
                      "detail": "You do not have permission to perform this action."
                    }
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "x-codeSamples": [
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.sessions.imports.resume(\n    \"11111111-2222-3333-4444-555555555555\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.sessions.imports.resume(\"11111111-2222-3333-4444-555555555555\");\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Sessions.Imports.Resume(ctx, \"11111111-2222-3333-4444-555555555555\")\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.sessions().imports().resume(\"11111111-2222-3333-4444-555555555555\");\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->sessions->imports->resume('11111111-2222-3333-4444-555555555555');\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.sessions.imports.resume(\"11111111-2222-3333-4444-555555555555\")\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Sessions.Imports.ResumeAsync(\"11111111-2222-3333-4444-555555555555\");\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ]
      }
    },
    "/v3/session/imports/{importId}/cancel/": {
      "post": {
        "summary": "Einen Import-Job abbrechen",
        "description": "Einen Import abbrechen. Was bereits importiert wurde, bleibt bestehen; die hochgeladene Datei und der Schlüssel werden gelöscht.",
        "operationId": "post_v3_session_imports_cancel",
        "x-didit-sdk": {
          "resource": "sessions.imports",
          "method": "cancel",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Sessions"
        ],
        "parameters": [
          {
            "name": "importId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Der Import-Job.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SessionImportJob"
                }
              }
            }
          },
          "400": {
            "description": "Der Job befindet sich nicht in einem Zustand, auf den diese Aktion anwendbar ist."
          },
          "403": {
            "description": "Fehlender, ungültiger oder widerrufener API-Schlüssel, oder der Aufrufer kann keine Verifizierungen für diese Anwendung importieren.",
            "content": {
              "application/json": {
                "examples": {
                  "Forbidden": {
                    "value": {
                      "detail": "You do not have permission to perform this action."
                    }
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "x-codeSamples": [
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.sessions.imports.cancel(\n    \"11111111-2222-3333-4444-555555555555\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.sessions.imports.cancel(\"11111111-2222-3333-4444-555555555555\");\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Sessions.Imports.Cancel(ctx, \"11111111-2222-3333-4444-555555555555\")\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.sessions().imports().cancel(\"11111111-2222-3333-4444-555555555555\");\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->sessions->imports->cancel('11111111-2222-3333-4444-555555555555');\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.sessions.imports.cancel(\"11111111-2222-3333-4444-555555555555\")\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Sessions.Imports.CancelAsync(\"11111111-2222-3333-4444-555555555555\");\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ]
      }
    },
    "/v3/session/imports/{importId}/retry/": {
      "post": {
        "summary": "Migration wiederholen",
        "description": "Führt eine Migration, die beendet wurde, erneut als neuen Auftrag mit einem neuen Schlüssel aus (der alte wurde gelöscht). Dabei bleiben Anbieter, Workflow, Region, Status-Mapping und die Auswahl der Gesichtsvorlagen erhalten; alles, was sich bereits in Didit befindet, wird übersprungen.",
        "operationId": "post_v3_session_imports_retry",
        "x-didit-sdk": {
          "resource": "sessions.imports",
          "method": "retry",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Sessions"
        ],
        "parameters": [
          {
            "name": "importId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "required": false,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "properties": {
                  "credentials": {
                    "type": "object",
                    "additionalProperties": {
                      "type": "string"
                    },
                    "description": "Der schreibgeschützte Schlüssel des Anbieters mit den von `credential_fields` aufgelisteten Feldnamen. Im Ruhezustand verschlüsselt, wird niemals zurückgegeben und nach Abschluss des Imports gelöscht. Senden Sie ihn als JSON-String in multipart."
                  },
                  "file": {
                    "type": "string",
                    "format": "binary",
                    "description": "Erneut die Datensatz-IDs oder die Exportdatei für die Provider `api_ids` und `export_file`."
                  }
                }
              },
              "example": {
                "credentials": {
                  "app_token": "YOUR_PROVIDER_APP_TOKEN",
                  "secret_key": "YOUR_PROVIDER_SECRET_KEY"
                }
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Der neue Import-Job.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SessionImportJob"
                }
              }
            }
          },
          "400": {
            "description": "Keine Migration, nicht beendet oder der Anbieter hat den Schlüssel abgelehnt."
          },
          "403": {
            "description": "Fehlender, ungültiger oder widerrufener API-Schlüssel, oder der Aufrufer kann keine Verifizierungen für diese Anwendung importieren.",
            "content": {
              "application/json": {
                "examples": {
                  "Forbidden": {
                    "value": {
                      "detail": "You do not have permission to perform this action."
                    }
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "x-codeSamples": [
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.sessions.imports.retry(\n    \"11111111-2222-3333-4444-555555555555\",\n    credentials={\"app_token\": \"YOUR_PROVIDER_APP_TOKEN\", \"secret_key\": \"YOUR_PROVIDER_SECRET_KEY\"},\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.sessions.imports.retry(\"11111111-2222-3333-4444-555555555555\", {\n  credentials: { app_token: \"YOUR_PROVIDER_APP_TOKEN\", secret_key: \"YOUR_PROVIDER_SECRET_KEY\" },\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Sessions.Imports.Retry(ctx, \"11111111-2222-3333-4444-555555555555\", didit.SessionsImportsRetryParams{\n\tCredentials: didit.Some(map[string]string{\"app_token\": \"YOUR_PROVIDER_APP_TOKEN\", \"secret_key\": \"YOUR_PROVIDER_SECRET_KEY\"}),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import java.util.Map;\nimport me.didit.Didit;\nimport me.didit.types.SessionsImportsRetryParams;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.sessions().imports().retry(\"11111111-2222-3333-4444-555555555555\", SessionsImportsRetryParams.builder()\n        .credentials(Map.of(\"app_token\", \"YOUR_PROVIDER_APP_TOKEN\", \"secret_key\", \"YOUR_PROVIDER_SECRET_KEY\"))\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->sessions->imports->retry('11111111-2222-3333-4444-555555555555', [\n    'credentials' => ['app_token' => 'YOUR_PROVIDER_APP_TOKEN', 'secret_key' => 'YOUR_PROVIDER_SECRET_KEY'],\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.sessions.imports.retry(\n  \"11111111-2222-3333-4444-555555555555\",\n  credentials: { app_token: \"YOUR_PROVIDER_APP_TOKEN\", secret_key: \"YOUR_PROVIDER_SECRET_KEY\" }\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Collections.Generic;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Sessions.Imports.RetryAsync(\"11111111-2222-3333-4444-555555555555\", new SessionsImportsRetryParams\n{\n    Credentials = new Dictionary<string, string> { [\"app_token\"] = \"YOUR_PROVIDER_APP_TOKEN\", [\"secret_key\"] = \"YOUR_PROVIDER_SECRET_KEY\" },\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ]
      }
    },
    "/v3/import-jobs/": {
      "get": {
        "summary": "Importaufträge auflisten",
        "description": "Jeder Import der Anwendung in einheitlicher Form: Verifizierungsimporte und Migrationen, Personen und Unternehmen.",
        "operationId": "get_v3_import_jobs_list",
        "x-didit-sdk": {
          "resource": "sessions.imports",
          "method": "list_jobs",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Sessions"
        ],
        "parameters": [
          {
            "name": "scope",
            "in": "query",
            "schema": {
              "type": "string",
              "enum": [
                "all",
                "sessions",
                "users",
                "businesses"
              ],
              "default": "all"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 50
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Import-Jobs, neueste zuerst.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "results": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/ImportJobSummary"
                      }
                    },
                    "counts": {
                      "type": "object",
                      "properties": {
                        "all": {
                          "type": "integer"
                        },
                        "running_and_waiting": {
                          "type": "integer"
                        },
                        "needs_attention": {
                          "type": "integer"
                        },
                        "done": {
                          "type": "integer"
                        }
                      }
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Fehlender, ungültiger oder widerrufener API-Schlüssel, oder der Aufrufer kann keine Verifizierungen für diese Anwendung importieren.",
            "content": {
              "application/json": {
                "examples": {
                  "Forbidden": {
                    "value": {
                      "detail": "You do not have permission to perform this action."
                    }
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "x-codeSamples": [
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.sessions.imports.list_jobs()\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.sessions.imports.listJobs();\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Sessions.Imports.ListJobs(ctx, didit.SessionsImportsListJobsParams{})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.sessions().imports().listJobs();\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->sessions->imports->listJobs();\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.sessions.imports.list_jobs\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Sessions.Imports.ListJobsAsync();\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ]
      }
    },
    "/v3/import-jobs/active/": {
      "get": {
        "summary": "Aktive Import-Jobs auflisten",
        "description": "Was ausgeführt wird oder wartet, sowie was gerade abgeschlossen wurde, für eine Fortschrittsanzeige.",
        "operationId": "get_v3_import_jobs_active",
        "x-didit-sdk": {
          "resource": "sessions.imports",
          "method": "list_active_jobs",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Sessions"
        ],
        "responses": {
          "200": {
            "description": "Aktive Import-Jobs.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "results": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/ImportJobSummary"
                      }
                    },
                    "running": {
                      "type": "integer"
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Fehlender, ungültiger oder widerrufener API-Schlüssel, oder der Aufrufer kann keine Verifizierungen für diese Anwendung importieren.",
            "content": {
              "application/json": {
                "examples": {
                  "Forbidden": {
                    "value": {
                      "detail": "You do not have permission to perform this action."
                    }
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "x-codeSamples": [
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.sessions.imports.list_active_jobs()\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.sessions.imports.listActiveJobs();\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Sessions.Imports.ListActiveJobs(ctx)\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.sessions().imports().listActiveJobs();\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->sessions->imports->listActiveJobs();\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.sessions.imports.list_active_jobs\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Sessions.Imports.ListActiveJobsAsync();\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ]
      }
    },
    "/v3/organization/{organization_id}/application/{application_id}/transactions/delete/": {
      "delete": {
        "summary": "Transaktionen im Batch löschen",
        "description": "Eine oder mehrere Transaktionen dauerhaft löschen. Wählen Sie diese über `transaction_uuids` aus oder löschen Sie jede Transaktion in der Anwendung mit `delete_all: true`.\n\nEine gelöschte Transaktion wird zusammen mit den Datensätzen entfernt, die ausschließlich zu ihr gehören: ihre Parteien, Tags, Notizen, Zahlungsmethoden-Verknüpfungen, Dokumente und jede gespeicherte Version ihrer Dateien, Regelausführungen, Alerts, Anbieterergebnisse, Netzwerk-Snapshot und Travel-Rule-Daten. Fälle, Personen und Unternehmen bleiben erhalten; ihre Verknüpfung mit der gelöschten Transaktion wird entfernt. Entwürfe behördlicher Berichte führen sie nicht mehr auf und werden ohne sie neu erstellt. Das Löschen ist dauerhaft und unwiderruflich; es gibt keinen Endpoint zum Rückgängigmachen.\n\nFalls eine ausgewählte Transaktion in einem finalisierten behördlichen Bericht aufgeführt ist, wird die gesamte Anfrage mit `409` abgelehnt und nichts gelöscht. Der Body verwendet `code: in_filed_report` und benennt jede Transaktion sowie die Berichte, in denen sie aufgeführt ist. Löschen Sie diese Berichte und wiederholen Sie die Anfrage anschließend.",
        "operationId": "batch_delete_transactions",
        "x-didit-sdk": {
          "resource": "transactions",
          "method": "batch_delete",
          "auth": "api_key",
          "server": true,
          "scope": "application"
        },
        "tags": [
          "Transactions"
        ],
        "parameters": [
          {
            "name": "organization_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "UUID der Organisation."
          },
          {
            "name": "application_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Anwendungs-UUID."
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "oneOf": [
                  {
                    "title": "Selected transactions",
                    "required": [
                      "transaction_uuids"
                    ],
                    "properties": {
                      "transaction_uuids": {
                        "type": "array",
                        "items": {
                          "type": "string",
                          "format": "uuid"
                        },
                        "description": "Zu löschende Didit-Transaktions-UUIDs. Erforderlich, sofern `delete_all` nicht true ist.",
                        "minItems": 1
                      },
                      "delete_all": {
                        "type": "boolean",
                        "enum": [
                          false
                        ],
                        "default": false,
                        "description": "Weglassen oder `false` senden, wenn Sie Transaktionen über `transaction_uuids` auswählen."
                      }
                    }
                  },
                  {
                    "title": "All transactions",
                    "required": [
                      "delete_all"
                    ],
                    "properties": {
                      "delete_all": {
                        "type": "boolean",
                        "enum": [
                          true
                        ],
                        "description": "Jede Transaktion in der Anwendung löschen. `transaction_uuids` wird ignoriert."
                      },
                      "transaction_uuids": {
                        "type": "array",
                        "items": {
                          "type": "string",
                          "format": "uuid"
                        },
                        "description": "Wird ignoriert, wenn `delete_all` true ist."
                      }
                    }
                  }
                ]
              },
              "examples": {
                "Selected transactions": {
                  "value": {
                    "transaction_uuids": [
                      "abcdef12-3456-7890-abcd-ef1234567890",
                      "12345678-90ab-cdef-1234-567890abcdef"
                    ]
                  }
                },
                "All transactions": {
                  "value": {
                    "delete_all": true
                  }
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl (selected transactions)",
            "source": "curl -X DELETE 'https://verification.didit.me/v3/organization/11111111-2222-3333-4444-555555555555/application/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/transactions/delete/' \\\n  -H 'x-api-key: YOUR_API_KEY' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\"transaction_uuids\": [\"abcdef12-3456-7890-abcd-ef1234567890\"]}'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\nclient = Didit()\n\nclient.transactions.batch_delete(\n    body={\n        \"transaction_uuids\": [\"abcdef12-3456-7890-abcd-ef1234567890\", \"12345678-90ab-cdef-1234-567890abcdef\"],\n    },\n)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nconst didit = new Didit();\n\nawait didit.transactions.batchDelete({\n  transaction_uuids: [\"abcdef12-3456-7890-abcd-ef1234567890\", \"12345678-90ab-cdef-1234-567890abcdef\"],\n});"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import java.util.List;\nimport me.didit.Didit;\nimport me.didit.types.TransactionsBatchDeleteParams;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nDidit client = new Didit();\n\nclient.transactions().batchDelete(TransactionsBatchDeleteParams.builder()\n        .putAdditionalProperty(\"transaction_uuids\", List.of(\"abcdef12-3456-7890-abcd-ef1234567890\", \"12345678-90ab-cdef-1234-567890abcdef\"))\n        .build());"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\n$didit = new DiditClient();\n\n$didit->transactions->batchDelete([\n    'transaction_uuids' => ['abcdef12-3456-7890-abcd-ef1234567890', '12345678-90ab-cdef-1234-567890abcdef'],\n]);"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n# and DIDIT_APPLICATION_ID.\ndidit = Didit::Client.new\n\ndidit.transactions.batch_delete(\n  body: {\n    transaction_uuids: [\"abcdef12-3456-7890-abcd-ef1234567890\", \"12345678-90ab-cdef-1234-567890abcdef\"],\n  }\n)"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing Didit;\n\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nusing var client = new DiditClient();\n\nawait client.Transactions.BatchDeleteAsync(new TransactionsBatchDeleteParams\n{\n    TransactionUuids = new string[] { \"abcdef12-3456-7890-abcd-ef1234567890\", \"12345678-90ab-cdef-1234-567890abcdef\" },\n});"
          }
        ],
        "responses": {
          "204": {
            "description": "Ausgewählte Transaktionen gelöscht."
          },
          "400": {
            "description": "Es wurde kein Transaktionsselektor angegeben.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "transaction_uuids": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      }
                    }
                  }
                },
                "example": {
                  "transaction_uuids": [
                    "This field is required unless delete_all is true."
                  ]
                }
              }
            }
          },
          "403": {
            "description": "Der API-Schlüssel kann keine Transaktionen löschen. Der Endpoint erfordert `write:transactions`.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          },
          "409": {
            "description": "Mindestens eine ausgewählte Transaktion ist in einem finalisierten regulatorischen Bericht aufgeführt. Es wird nichts gelöscht.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/InFiledReportError"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/v3/travel-rule/networks/": {
      "get": {
        "summary": "Travel Rule-Netzwerke abrufen",
        "description": "Lesen Sie für diese Anwendung den tatsächlichen Status jedes Netzwerks aus: ob es über Ihre eigene Mitgliedschaft oder über die von Didit sendet und warum es dies noch nicht kann. Gibt auch den Due-Diligence-Fragebogen und Ihre Teilnehmer zurück. Der Lesevorgang erstellt nichts.",
        "operationId": "getTravelRuleNetworks",
        "x-didit-sdk": {
          "resource": "travel_rule.networks",
          "method": "retrieve",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Travel Rule"
        ],
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X GET https://verification.didit.me/v3/travel-rule/networks/ \\\n  -H 'x-api-key: YOUR_API_KEY'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.travel_rule.networks.retrieve()\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.travelRule.networks.retrieve();\nconsole.log(result);"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.travelRule().networks().retrieve();\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->travelRule->networks->retrieve();\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.travel_rule.networks.retrieve\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.TravelRule.Networks.RetrieveAsync();\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "responses": {
          "200": {
            "description": "Netzwerkstatus, Fragebogen und Teilnehmer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TravelRuleNetworksOverview"
                },
                "examples": {
                  "Before the questionnaire": {
                    "value": {
                      "platform_networks_enabled": false,
                      "questionnaire": {
                        "status": "draft",
                        "answers": {},
                        "submitted_at": null,
                        "reviewed_at": null,
                        "review_note": "",
                        "history": [],
                        "updated_at": null
                      },
                      "participants": [],
                      "networks": {
                        "gtr": {
                          "rail": "GTR",
                          "mode": "unavailable",
                          "state": "didit_onboarding",
                          "reason": "didit_membership_not_live",
                          "platform_available": false,
                          "connected": false,
                          "participant": null,
                          "vasps_reachable": 0,
                          "routed_30d": 0
                        },
                        "trust": {
                          "rail": "TRUST",
                          "mode": "unavailable",
                          "state": "unavailable",
                          "reason": "own_membership_only",
                          "platform_available": false,
                          "connected": false,
                          "participant": null,
                          "vasps_reachable": 0,
                          "routed_30d": 0
                        },
                        "verifyvasp": {
                          "rail": "VERIFYVASP",
                          "mode": "unavailable",
                          "state": "didit_onboarding",
                          "reason": "didit_membership_not_live",
                          "platform_available": false,
                          "connected": false,
                          "participant": null,
                          "vasps_reachable": 0,
                          "routed_30d": 0
                        },
                        "sygna": {
                          "rail": "SYGNA",
                          "mode": "unavailable",
                          "state": "didit_onboarding",
                          "reason": "didit_membership_not_live",
                          "platform_available": false,
                          "connected": false,
                          "participant": null,
                          "vasps_reachable": 0,
                          "routed_30d": 0
                        }
                      }
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Fehlender oder ungültiger API-Schlüssel."
          }
        }
      }
    },
    "/v3/travel-rule/networks/questionnaire/": {
      "get": {
        "summary": "Netzwerk-Fragebogen abrufen",
        "description": "Den Didit-Netzwerk-Due-Diligence-Fragebogen für diese Anwendung, dessen Status und die Prüfnotiz von Didit abrufen. Eine Anwendung, für die noch nie einer gespeichert wurde, gibt einen leeren Entwurf zurück.",
        "operationId": "getTravelRuleNetworkQuestionnaire",
        "x-didit-sdk": {
          "resource": "travel_rule.networks",
          "method": "retrieve_questionnaire",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Travel Rule"
        ],
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X GET https://verification.didit.me/v3/travel-rule/networks/questionnaire/ \\\n  -H 'x-api-key: YOUR_API_KEY'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.travel_rule.networks.retrieve_questionnaire()\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.travelRule.networks.retrieveQuestionnaire();\nconsole.log(result);"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.travelRule().networks().retrieveQuestionnaire();\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->travelRule->networks->retrieveQuestionnaire();\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.travel_rule.networks.retrieve_questionnaire\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.TravelRule.Networks.RetrieveQuestionnaireAsync();\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "responses": {
          "200": {
            "description": "Der Fragebogen.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TravelRuleNetworkQuestionnaire"
                }
              }
            }
          },
          "401": {
            "description": "Fehlender oder ungültiger API-Schlüssel."
          }
        }
      },
      "put": {
        "summary": "Antworten auf den Netzwerk-Fragebogen speichern",
        "description": "Speichern Sie Antworten auf den Fragebogen, während er sich im Status draft oder changes_requested befindet. Das Speichern erfolgt teilweise: Antworten, die Sie nicht senden, bleiben erhalten.",
        "operationId": "updateTravelRuleNetworkQuestionnaire",
        "x-didit-sdk": {
          "resource": "travel_rule.networks",
          "method": "update_questionnaire",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Travel Rule"
        ],
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X PUT https://verification.didit.me/v3/travel-rule/networks/questionnaire/ \\\n  -H 'x-api-key: YOUR_API_KEY' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\"legal_name\": \"Example VASP Ltd\", \"incorporation_country\": \"ES\", \"aml_ctf_policy_attested\": true}'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.travel_rule.networks.update_questionnaire(\n    legal_name=\"Example VASP Ltd\",\n    incorporation_country=\"ES\",\n    aml_ctf_policy_attested=True,\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.travelRule.networks.updateQuestionnaire({\n  legal_name: \"Example VASP Ltd\",\n  incorporation_country: \"ES\",\n  aml_ctf_policy_attested: true,\n});\nconsole.log(result);"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\nimport me.didit.types.TravelRuleNetworkQuestionnaireAnswers;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.travelRule().networks().updateQuestionnaire(TravelRuleNetworkQuestionnaireAnswers.builder()\n        .legalName(\"Example VASP Ltd\")\n        .incorporationCountry(\"ES\")\n        .amlCtfPolicyAttested(true)\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->travelRule->networks->updateQuestionnaire([\n    'legal_name' => 'Example VASP Ltd',\n    'incorporation_country' => 'ES',\n    'aml_ctf_policy_attested' => true,\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.travel_rule.networks.update_questionnaire(\n  legal_name: \"Example VASP Ltd\",\n  incorporation_country: \"ES\",\n  aml_ctf_policy_attested: true\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.TravelRule.Networks.UpdateQuestionnaireAsync(new TravelRuleNetworkQuestionnaireAnswers\n{\n    LegalName = \"Example VASP Ltd\",\n    IncorporationCountry = \"ES\",\n    AmlCtfPolicyAttested = true,\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TravelRuleNetworkQuestionnaireAnswers"
              },
              "example": {
                "legal_name": "Example VASP Ltd",
                "incorporation_country": "ES",
                "aml_ctf_policy_attested": true
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Der Fragebogen mit den zusammengeführten Antworten.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TravelRuleNetworkQuestionnaire"
                }
              }
            }
          },
          "400": {
            "description": "Validierungsfehler, aufgeschlüsselt nach Feld."
          },
          "401": {
            "description": "Fehlender oder ungültiger API-Schlüssel."
          },
          "403": {
            "description": "Der Netzwerkzugang über die Mitgliedschaft von Didit ist noch nicht freigeschaltet.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string"
                    },
                    "code": {
                      "type": "string",
                      "enum": [
                        "travel_rule_platform_networks_disabled"
                      ]
                    }
                  }
                }
              }
            }
          },
          "409": {
            "description": "Der Fragebogen liegt bei Didit oder ist entschieden: Er kann nur geändert werden, solange er draft oder changes_requested ist.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string"
                    },
                    "code": {
                      "type": "string",
                      "enum": [
                        "travel_rule_questionnaire_not_editable"
                      ]
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/v3/travel-rule/networks/questionnaire/submit/": {
      "post": {
        "summary": "Netzwerkfragebogen übermitteln",
        "description": "Senden Sie den gespeicherten Fragebogen zur Prüfung an Didit. Die gespeicherten Antworten müssen vollständig sein: jedes Feld außer lei und data_protection_contact_email, wobei die drei Attestierungen wahr sein müssen. Didit genehmigt ihn, fordert Änderungen an (bearbeiten und erneut einreichen) oder lehnt ihn ab. Netzwerke, die Sie angefordert haben, während er ausstehend war, werden nach der Genehmigung an deren Onboarding übergeben.",
        "operationId": "submitTravelRuleNetworkQuestionnaire",
        "x-didit-sdk": {
          "resource": "travel_rule.networks",
          "method": "submit_questionnaire",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Travel Rule"
        ],
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X POST https://verification.didit.me/v3/travel-rule/networks/questionnaire/submit/ \\\n  -H 'x-api-key: YOUR_API_KEY'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.travel_rule.networks.submit_questionnaire()\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.travelRule.networks.submitQuestionnaire();\nconsole.log(result);"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.travelRule().networks().submitQuestionnaire();\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->travelRule->networks->submitQuestionnaire();\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.travel_rule.networks.submit_questionnaire\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.TravelRule.Networks.SubmitQuestionnaireAsync();\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "responses": {
          "200": {
            "description": "Der übermittelte Fragebogen.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TravelRuleNetworkQuestionnaire"
                }
              }
            }
          },
          "400": {
            "description": "Die gespeicherten Antworten sind unvollständig oder ungültig, aufgeschlüsselt nach Feld."
          },
          "401": {
            "description": "Fehlender oder ungültiger API-Schlüssel."
          },
          "403": {
            "description": "Der Netzwerkzugang über die Mitgliedschaft von Didit ist noch nicht freigeschaltet.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string"
                    },
                    "code": {
                      "type": "string",
                      "enum": [
                        "travel_rule_platform_networks_disabled"
                      ]
                    }
                  }
                }
              }
            }
          },
          "409": {
            "description": "Der Fragebogen liegt bei Didit oder ist entschieden: Er kann nur geändert werden, solange er draft oder changes_requested ist.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string"
                    },
                    "code": {
                      "type": "string",
                      "enum": [
                        "travel_rule_questionnaire_not_editable"
                      ]
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/v3/travel-rule/networks/{network}/request/": {
      "post": {
        "summary": "Ein Travel-Rule-Netzwerk anfragen",
        "description": "Den anwendungseigenen Teilnehmer in einem Netzwerk anfordern, in dem Didit Mitglied ist (GTR oder Sygna). Ohne genehmigten Fragebogen wartet der Teilnehmer darauf (questionnaire_pending); mit genehmigtem Fragebogen geht er in das Onboarding des Netzwerks über (submitted_to_network) und wird aktiv, sobald das Netzwerk ihm einen Code zuweist. Idempotent: Ein ausstehender, im Onboarding befindlicher oder aktiver Teilnehmer wird unverändert zurückgegeben. Falls das Netzwerk die Registrierung abgelehnt hat (last_error ist gesetzt), wird durch erneutes Anfordern ein Wiederholungsversuch gestartet. TRUST und VerifyVASP sind nur über Ihre eigene Mitgliedschaft erreichbar: TRUST nimmt Mitglieder pro VASP auf, und eine VerifyVASP-Enklave bedient eine einzige VASP-ID.",
        "operationId": "requestTravelRuleNetworkAccess",
        "x-didit-sdk": {
          "resource": "travel_rule.networks",
          "method": "request_access",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Travel Rule"
        ],
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "parameters": [
          {
            "name": "network",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "enum": [
                "gtr",
                "sygna"
              ]
            },
            "description": "Das Netzwerk, dem über die Didit-Mitgliedschaft beigetreten werden soll."
          }
        ],
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X POST https://verification.didit.me/v3/travel-rule/networks/gtr/request/ \\\n  -H 'x-api-key: YOUR_API_KEY'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.travel_rule.networks.request_access(\n    \"your-network\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.travelRule.networks.requestAccess(\"your-network\");\nconsole.log(result);"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.travelRule().networks().requestAccess(\"your-network\");\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->travelRule->networks->requestAccess('your-network');\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.travel_rule.networks.request_access(\"your-network\")\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.TravelRule.Networks.RequestAccessAsync(\"your-network\");\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "responses": {
          "200": {
            "description": "Ihr Teilnehmer im Netzwerk.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TravelRuleNetworkParticipant"
                }
              }
            }
          },
          "400": {
            "description": "Unbekanntes Netzwerk, ein Netzwerk, das Didit nicht unterstützt (verbinden Sie Ihre eigene Mitgliedschaft), oder eine Sandbox-Anwendung.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string"
                    },
                    "code": {
                      "type": "string",
                      "enum": [
                        "travel_rule_network_own_membership_only",
                        "travel_rule_network_sandbox_application"
                      ]
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Fehlender oder ungültiger API-Schlüssel."
          },
          "403": {
            "description": "Der Netzwerkzugang über die Mitgliedschaft von Didit ist noch nicht freigeschaltet.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string"
                    },
                    "code": {
                      "type": "string",
                      "enum": [
                        "travel_rule_platform_networks_disabled"
                      ]
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/v3/address-validation/": {
      "post": {
        "summary": "Eine Adresse validieren",
        "description": "Bestätigen Sie, dass eine Adresse existiert, und erhalten Sie sie normalisiert zurück: ihre Zustellzeilen, Komponenten und Koordinaten. Dies bestätigt ausschließlich die Adresse; es verknüpft die Adresse niemals mit einer Person.\n\n**Anfrage.** Senden Sie die Adresse in einer einzigen Zeile (`address`) oder als strukturierte Felder (`address_line_1` und optional `address_line_2`, `city`, `region`, `postal_code`), niemals beides, und stets ihr `country` (ISO 3166-1 Alpha-2 oder Alpha-3).\n\n**Ergebnis.** `address_validation.status` ist `verified` (bis zum Gebäude bestätigt), `partially_verified` (nur bis zur Straße oder höher bestätigt), `not_verified` (nur die Region oder Stadt stimmte überein oder gar nichts) oder `unavailable` (die Validierung konnte nicht ausgeführt werden). Der HTTP-Status ist `200` für jede abgeschlossene Anfrage, einschließlich `unavailable`; wiederholen Sie eine Anfrage mit dem Ergebnis `unavailable` später.\n\n**Abrechnung.** Ein Aufruf in der Produktionsumgebung kostet $0.10 pro validierter Adresse. Ein `unavailable`-Ergebnis wird nicht berechnet. Außer dem Nutzungsprotokoll wird nichts gespeichert: Es wird keine Sitzung erstellt und das Ergebnis wird nur in dieser Antwort zurückgegeben.\n\n**Sandbox.** Sandbox-Schlüssel validieren die Anfrage und geben immer ein deterministisches `verified`-Ergebnis zurück, das die gesendete Adresse widerspiegelt, ohne Credits zu verbrauchen.\n\n**Authentifizierung.** Senden Sie den API-Schlüssel Ihrer Anwendung in `x-api-key`. Fehlende oder ungültige Anmeldedaten geben `403` zurück – diese API gibt niemals `401` zurück.\n\n**Rate-Limit.** Geteiltes Schreibbudget von 300 Anfragen pro Minute pro API-Schlüssel über POST/PATCH/DELETE-Endpoints hinweg (Transaktionserstellungen und Ereignis-Ingestion haben ein separates Budget von 600).",
        "operationId": "post_v3_address_validation",
        "x-didit-sdk": {
          "resource": "address_validation",
          "method": "validate",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Standalone APIs"
        ],
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X POST https://verification.didit.me/v3/address-validation/ \\\n  -H 'x-api-key: YOUR_API_KEY' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\n    \"address_line_1\": \"1600 Amphitheatre Pkwy\",\n    \"city\": \"Mountain View\",\n    \"region\": \"CA\",\n    \"postal_code\": \"94043\",\n    \"country\": \"US\"\n  }'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.address_validation.validate(\n    address_line_1=\"1600 Amphitheatre Pkwy\",\n    city=\"Mountain View\",\n    region=\"CA\",\n    postal_code=\"94043\",\n    country=\"US\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.addressValidation.validate({\n  address_line_1: \"1600 Amphitheatre Pkwy\",\n  city: \"Mountain View\",\n  region: \"CA\",\n  postal_code: \"94043\",\n  country: \"US\",\n});\nconsole.log(result);"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\nimport me.didit.types.AddressValidationRequest;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.addressValidation().validate(AddressValidationRequest.builder()\n        .addressLine1(\"1600 Amphitheatre Pkwy\")\n        .city(\"Mountain View\")\n        .region(\"CA\")\n        .postalCode(\"94043\")\n        .country(\"US\")\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->addressValidation->validate([\n    'address_line_1' => '1600 Amphitheatre Pkwy',\n    'city' => 'Mountain View',\n    'region' => 'CA',\n    'postal_code' => '94043',\n    'country' => 'US',\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.address_validation.validate(\n  address_line_1: \"1600 Amphitheatre Pkwy\",\n  city: \"Mountain View\",\n  region: \"CA\",\n  postal_code: \"94043\",\n  country: \"US\"\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.AddressValidation.ValidateAsync(new AddressValidationRequest\n{\n    AddressLine1 = \"1600 Amphitheatre Pkwy\",\n    City = \"Mountain View\",\n    Region = \"CA\",\n    PostalCode = \"94043\",\n    Country = \"US\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AddressValidationRequest"
              },
              "examples": {
                "Structured": {
                  "summary": "Strukturierte Adressfelder",
                  "value": {
                    "address_line_1": "1600 Amphitheatre Pkwy",
                    "city": "Mountain View",
                    "region": "CA",
                    "postal_code": "94043",
                    "country": "US"
                  }
                },
                "One line": {
                  "summary": "Die vollständige Adresse in einer Zeile",
                  "value": {
                    "address": "Paseo de la Castellana 259, 28046 Madrid",
                    "country": "ES"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Die Validierung wurde abgeschlossen. Prüfen Sie `address_validation.status`; HTTP ist bei einer abgeschlossenen Anfrage immer `200`.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AddressValidationResponse"
                },
                "examples": {
                  "Verified": {
                    "summary": "Eine echte Adresse, bis zum Gebäude bestätigt",
                    "value": {
                      "request_id": "6f7d2c1e-1c5a-4a1e-9b8f-2a1f0f4b9c3d",
                      "address_validation": {
                        "status": "verified",
                        "verification_level": "premise",
                        "address": {
                          "address_line_1": "1600 Amphitheatre Pkwy",
                          "address_line_2": null,
                          "city": "Mountain View",
                          "region": "CA",
                          "postal_code": "94043-1351",
                          "country": "US"
                        },
                        "formatted_address": "1600 Amphitheatre Pkwy, Mountain View CA 94043-1351",
                        "latitude": 37.422022,
                        "longitude": -122.08429
                      },
                      "created_at": "2026-10-27T11:20:00.000000+00:00"
                    }
                  },
                  "Not verified": {
                    "summary": "Eine erfundene Straße: Nur die Stadt stimmte überein",
                    "value": {
                      "request_id": "0b9e3f4a-6c2d-4e8b-a1f7-5d3c2b1a0e9f",
                      "address_validation": {
                        "status": "not_verified",
                        "verification_level": "locality",
                        "address": {
                          "address_line_1": "Calle Inventada Que No Existe 99999 28046",
                          "address_line_2": null,
                          "city": "Madrid",
                          "region": "Madrid",
                          "postal_code": null,
                          "country": "ES"
                        },
                        "formatted_address": "Calle Inventada Que No Existe 99999 28046, Madrid, MADRID, SPAIN",
                        "latitude": 40.42603054,
                        "longitude": -3.68645331
                      },
                      "created_at": "2026-10-27T11:21:00.000000+00:00"
                    }
                  },
                  "Unavailable": {
                    "summary": "Die Validierung konnte nicht ausgeführt werden; nicht berechnet",
                    "value": {
                      "request_id": "3c1b2a0f-9e8d-4c7b-b6a5-1f0e9d8c7b6a",
                      "address_validation": {
                        "status": "unavailable",
                        "verification_level": null,
                        "address": null,
                        "formatted_address": null,
                        "latitude": null,
                        "longitude": null
                      },
                      "created_at": "2026-10-27T11:22:00.000000+00:00"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/AddressValidationValidationError"
          },
          "403": {
            "$ref": "#/components/responses/AddressValidationPermissionDenied"
          },
          "429": {
            "$ref": "#/components/responses/RateLimitedWrite"
          }
        }
      }
    },
    "/v3/travel-rule/wallet-proofs/": {
      "get": {
        "summary": "Screenshot-Wallet-Nachweise zur Prüfung auflisten",
        "description": "Ihre Prüfungs-Warteschlange für Wallet-Eigentumsnachweise per Screenshot. Ein Screenshot ist der einzige Nachweis, den Didit nicht selbst prüfen kann: Sobald der Endbenutzer ihn über das Widget hochlädt, verbleibt er im Status PENDING, bis Sie ihn mit POST /v3/travel-rule/wallet-proofs/{proof_uuid}/decision/ genehmigen oder ablehnen. Der älteste Nachweis zuerst, sodass die Warteschlange mit dem Nachweis bearbeitet wird, der am längsten gewartet hat. Nur hochgeladene Screenshots werden angezeigt, niemals ein Nachweis, für den der Endbenutzer noch keine Datei hochgeladen hat, und niemals einer für eine Wallet, die Sie aus Ihrem Adressbuch gelöscht haben (Didit schließt diese als OWNERSHIP_CHANGED ab).",
        "operationId": "listTravelRuleWalletProofs",
        "x-didit-sdk": {
          "resource": "travel_rule.wallet_proofs",
          "method": "list",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Travel Rule"
        ],
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "parameters": [
          {
            "name": "status",
            "in": "query",
            "description": "Welche Nachweise aufgelistet werden sollen. Standardmäßig PENDING, also diejenigen, über die noch entschieden werden muss.",
            "schema": {
              "type": "string",
              "enum": [
                "PENDING",
                "VERIFIED",
                "REJECTED",
                "EXPIRED"
              ],
              "default": "PENDING"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "schema": {
              "type": "integer",
              "default": 50,
              "minimum": 1
            }
          },
          {
            "name": "offset",
            "in": "query",
            "schema": {
              "type": "integer",
              "default": 0,
              "minimum": 0
            }
          }
        ],
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl https://verification.didit.me/v3/travel-rule/wallet-proofs/?status=PENDING \\\n  -H 'x-api-key: YOUR_API_KEY'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nfor item in client.travel_rule.wallet_proofs.list():\n    print(item)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nfor await (const item of didit.travelRule.walletProofs.list()) {\n  console.log(item);\n}"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nfor (var item : client.travelRule().walletProofs().list()) {\n    System.out.println(item);\n}"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\nforeach ($didit->travelRule->walletProofs->list() as $item) {\n    print_r($item->toArray());\n}"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\ndidit.travel_rule.wallet_proofs.list.auto_paging_each do |item|\n  puts item.to_h\nend"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nawait foreach (var item in await client.TravelRule.WalletProofs.ListAsync())\n{\n    Console.WriteLine(JsonSerializer.Serialize(item));\n}"
          }
        ],
        "responses": {
          "200": {
            "description": "Paginierte Screenshot-Nachweise. Die Anzahl ist bis 100 exakt und darüber auf 100 begrenzt.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "count": {
                      "type": "integer"
                    },
                    "next": {
                      "type": "string",
                      "nullable": true
                    },
                    "previous": {
                      "type": "string",
                      "nullable": true
                    },
                    "results": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/TravelRuleWalletProofReview"
                      }
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Unbekannter Status."
          },
          "401": {
            "description": "Fehlender oder ungültiger x-api-key."
          },
          "403": {
            "description": "Dem Aufrufer fehlt die Berechtigung für Transaktionen."
          }
        }
      }
    },
    "/v3/travel-rule/wallet-proofs/{proof_uuid}/decision/": {
      "post": {
        "summary": "Einen Screenshot-Wallet-Nachweis genehmigen oder ablehnen",
        "description": "Entscheiden Sie über einen Screenshot-Nachweis aus Ihrer Prüfwarteschlange. approve verifiziert den Nachweis sowie den Adressbucheintrag und wendet die Eigentümerstruktur auf den Transfer an, für den die Widget-Sitzung erstellt wurde, genau wie eine verifizierte Signatur. Ein Screenshot bestätigt niemals einen Transfer, den ein anderer Didit-Kunde über die INTERNAL-Schiene gesendet hat: Dies erfordert eine signierte Nachricht oder eine Testeinzahlung. reject schließt den Nachweis als REJECTED mit dem failure_reason REVIEW_REJECTED ab; der Endbenutzer kann einen neuen Nachweis über das Widget starten. Die Notiz verbleibt beim Nachweis.",
        "operationId": "decideTravelRuleWalletProof",
        "x-didit-sdk": {
          "resource": "travel_rule.wallet_proofs",
          "method": "decide",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Travel Rule"
        ],
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "parameters": [
          {
            "name": "proof_uuid",
            "in": "path",
            "required": true,
            "description": "proof_id aus der Prüfungs-Warteschlange.",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TravelRuleWalletProofDecision"
              },
              "example": {
                "decision": "approve",
                "note": "Address matches the wallet app."
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X POST https://verification.didit.me/v3/travel-rule/wallet-proofs/{proof_uuid}/decision/ \\\n  -H 'x-api-key: YOUR_API_KEY' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\"decision\": \"approve\", \"note\": \"Address matches the wallet app.\"}'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.travel_rule.wallet_proofs.decide(\n    \"11111111-2222-3333-4444-555555555555\",\n    decision=\"approve\",\n    note=\"Address matches the wallet app.\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.travelRule.walletProofs.decide(\"11111111-2222-3333-4444-555555555555\", {\n  decision: \"approve\",\n  note: \"Address matches the wallet app.\",\n});\nconsole.log(result);"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\nimport me.didit.types.TravelRuleWalletProofDecision;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.travelRule().walletProofs().decide(\"11111111-2222-3333-4444-555555555555\", TravelRuleWalletProofDecision.builder()\n        .decision(TravelRuleWalletProofDecision.Decision.of(\"approve\"))\n        .note(\"Address matches the wallet app.\")\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->travelRule->walletProofs->decide('11111111-2222-3333-4444-555555555555', [\n    'decision' => 'approve',\n    'note' => 'Address matches the wallet app.',\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.travel_rule.wallet_proofs.decide(\n  \"11111111-2222-3333-4444-555555555555\",\n  decision: \"approve\",\n  note: \"Address matches the wallet app.\"\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.TravelRule.WalletProofs.DecideAsync(\"11111111-2222-3333-4444-555555555555\", new TravelRuleWalletProofDecision\n{\n    Decision = \"approve\",\n    Note = \"Address matches the wallet app.\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "responses": {
          "200": {
            "description": "Der festgelegte Nachweis.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TravelRuleWalletProofReview"
                }
              }
            }
          },
          "400": {
            "description": "Ungültige Entscheidung oder eine Notiz, die länger als 512 Zeichen ist."
          },
          "401": {
            "description": "Fehlender oder ungültiger x-api-key."
          },
          "403": {
            "description": "Dem Aufrufer fehlt die Berechtigung für Transaktionen."
          },
          "404": {
            "description": "Kein übermittelter Screenshot-Nachweis mit dieser ID in Ihrer Anwendung."
          },
          "409": {
            "description": "Über den Nachweis wurde bereits entschieden (der Body enthält seinen Status) oder Code OWNERSHIP_CHANGED: Der Inhaber der Wallet hat sich geändert oder die Wallet wurde nach dem Erstellen der Widget-Sitzung gelöscht, sodass der Nachweis geschlossen ist und der aktuelle Inhaber einen neuen benötigt.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TravelRuleWidgetProofError"
                }
              }
            }
          }
        }
      }
    },
    "/v3/travel-rule/widget/{token}/proofs/": {
      "post": {
        "summary": "Einen Wallet-Eigentumsnachweis starten",
        "description": "Öffentlicher Endpoint, über das Widget-Sitzungs-Token adressiert, kein API-Schlüssel erforderlich: Das gehostete Widget ruft ihn auf, wenn der Endbenutzer eine Nachweismethode auswählt. Ein Proof existiert und zählt erst ab diesem Aufruf in Ihrem Proof-Funnel. Die erneute Auswahl derselben Methode gibt den bereits offenen Proof zurück (200, gleiche Challenge oder gleicher Einzahlungsbetrag), anstatt einen zweiten zu starten; die Auswahl einer anderen Methode schließt den unvollendeten als METHOD_SWITCHED, mit Ausnahme eines eingereichten Screenshots oder einer noch in Prüfung befindlichen Testeinzahlung. MESSAGE_SIGNING gibt die zu signierende Challenge zurück; SATOSHI_TEST die Einzahlungsadresse, den genauen Betrag und das Zeitfenster; SELF_DECLARATION wird sofort verifiziert (Status VERIFIED). Verifizierte Signaturformate pro Chain-Familie: EVM-Chains akzeptieren eine personal_sign-Signatur (EIP-191), hex-codiert; Bitcoin akzeptiert eine BIP-137-signmessage-Signatur (P2PKH-, P2SH-P2WPKH- und P2WPKH-Adressen) oder eine einfache BIP-322-Signatur (P2WPKH- und P2TR-Adressen), base64-codiert; Solana akzeptiert eine Ed25519-Signatur über die Challenge, base58-codiert; Tron akzeptiert eine signMessageV2-Signatur (TIP-191), hex-codiert. Eine vollständige BIP-322- oder Kapitalnachweis-Signatur oder eine Multisig-Adresse schlägt mit SIGNATURE_UNSUPPORTED_SCHEME fehl.",
        "operationId": "createTravelRuleWidgetProof",
        "x-didit-sdk": {
          "resource": "travel_rule",
          "method": "create_widget_proof",
          "auth": "public",
          "server": false
        },
        "tags": [
          "Travel Rule"
        ],
        "security": [
          {}
        ],
        "parameters": [
          {
            "name": "token",
            "in": "path",
            "required": true,
            "description": "Opakes Sitzungs-Token, das zurückgegeben wird, wenn die Widget-Sitzung erstellt wurde.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TravelRuleWidgetProofCreate"
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X POST https://verification.didit.me/v3/travel-rule/widget/{token}/proofs/ \\\n  -H 'Content-Type: application/json' \\\n  -d '{\"method\": \"MESSAGE_SIGNING\"}'"
          }
        ],
        "responses": {
          "201": {
            "description": "Ein neuer Nachweis mit Status PENDING (VERIFIED für SELF_DECLARATION).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TravelRuleWidgetProofSummary"
                }
              }
            }
          },
          "200": {
            "description": "Der für diese Methode bereits offene Nachweis, wiederaufgenommen.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TravelRuleWidgetProofSummary"
                }
              }
            }
          },
          "400": {
            "description": "Ungültiger Body, eine Wallet, die nicht zur Übertragung passt, SCREENSHOT nicht zulässig oder Code CHAIN_UNSUPPORTED, wenn die Methode auf der Chain nicht verfügbar ist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TravelRuleWidgetProofError"
                }
              }
            }
          },
          "403": {
            "description": "SELF_DECLARATION ist für diese Anwendung nicht zulässig."
          },
          "404": {
            "description": "Unbekanntes Token."
          },
          "409": {
            "description": "Code OWNERSHIP_CHANGED: Der Inhaber der Wallet hat sich geändert oder die Wallet wurde gelöscht, nachdem die Sitzung erstellt wurde; erstellen Sie eine neue Sitzung für den aktuellen Inhaber. Wird auch für SATOSHI_TEST zurückgegeben, wenn die Sitzung keine satoshi_deposit_address hat und wenn die Sitzung keine Versuche mehr übrig hat (kein Code; der Body enthält max_attempts, attempts_used und attempts_remaining 0): erstellen Sie eine neue Sitzung.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TravelRuleWidgetProofError"
                }
              }
            }
          },
          "410": {
            "description": "Die Sitzung ist abgelaufen."
          }
        }
      }
    },
    "/v3/travel-rule/widget/{token}/proofs/{proof_id}/verify/": {
      "post": {
        "summary": "Nachweis zum Wallet-Eigentum übermitteln",
        "description": "Öffentlicher Endpoint, über das Widget-Sitzungs-Token adressiert, kein API-Schlüssel erforderlich. Senden Sie die Nachweise, die die Methode des Proofs erfordert: Signatur für MESSAGE_SIGNING, txid für SATOSHI_TEST (JSON) oder eine Datei für SCREENSHOT (multipart). Jede Übermittlung zählt als Versuch. Eine Anfrage mit einer nicht verifizierbaren Signatur oder einer nicht übereinstimmenden Einzahlung wird mit 400 und einem Code beantwortet und belässt den Proof auf PENDING, damit der Endbenutzer es erneut versuchen kann. Bei einer erkannten, aber noch nicht bestätigten Einzahlung wird die Anfrage mit 200 und dem Status PENDING beantwortet und automatisch erneut geprüft, bis das Zeitfenster abläuft. Bei einem Screenshot wird die Anfrage mit 200 und dem Status PENDING beantwortet und wartet in Ihrer Prüf-Warteschlange (GET /v3/travel-rule/wallet-proofs/). Ein EXPIRED oder REJECTED Proof wird später niemals verifiziert: Starten Sie einen neuen. Verifizierte Signaturformate pro Chain-Familie: EVM-Chains akzeptieren eine personal_sign-Signatur (EIP-191), hex-codiert; Bitcoin akzeptiert eine BIP-137-signmessage-Signatur (P2PKH-, P2SH-P2WPKH- und P2WPKH-Adressen) oder eine einfache BIP-322-Signatur (P2WPKH- und P2TR-Adressen), base64-codiert; Solana akzeptiert eine Ed25519-Signatur über die Challenge, base58-codiert; Tron akzeptiert eine signMessageV2-Signatur (TIP-191), hex-codiert. Eine vollständige BIP-322- oder Kapitalnachweis-Signatur oder eine Multisig-Adresse schlägt mit SIGNATURE_UNSUPPORTED_SCHEME fehl.",
        "operationId": "verifyTravelRuleWidgetProof",
        "x-didit-sdk": {
          "resource": "travel_rule",
          "method": "verify_widget_proof",
          "auth": "public",
          "server": false
        },
        "tags": [
          "Travel Rule"
        ],
        "security": [
          {}
        ],
        "parameters": [
          {
            "name": "token",
            "in": "path",
            "required": true,
            "description": "Opakes Sitzungs-Token, das zurückgegeben wird, wenn die Widget-Sitzung erstellt wurde.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "proof_id",
            "in": "path",
            "required": true,
            "description": "proof_id, die beim Starten des Nachweises zurückgegeben wurde.",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "signature": {
                    "type": "string",
                    "description": "MESSAGE_SIGNING: die Signatur der Wallet über die Challenge des Nachweises."
                  },
                  "txid": {
                    "type": "string",
                    "description": "SATOSHI_TEST: Die Transaktions-ID der Testeinzahlung."
                  }
                }
              }
            },
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "required": [
                  "file"
                ],
                "properties": {
                  "file": {
                    "type": "string",
                    "format": "binary",
                    "description": "SCREENSHOT: Ein Bild, das die Wallet in der Wallet-App des Endbenutzers zeigt."
                  }
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X POST https://verification.didit.me/v3/travel-rule/widget/{token}/proofs/{proof_id}/verify/ \\\n  -H 'Content-Type: application/json' \\\n  -d '{\"signature\": \"0x...\"}'"
          }
        ],
        "responses": {
          "200": {
            "description": "VERIFIED oder noch PENDING (ein Screenshot, der auf eine Prüfung wartet, eine Einzahlung, die noch nicht indexiert oder noch nicht bestätigt ist, mit dem Code DEPOSIT_NOT_FOUND oder DEPOSIT_UNCONFIRMED).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TravelRuleWidgetProofVerifyResult"
                }
              }
            }
          },
          "400": {
            "description": "Fehlender Nachweis; ein fehlgeschlagener Versuch, der den Nachweis auf PENDING belässt, damit der Endbenutzer es erneut versuchen kann (Code SIGNATURE_INVALID, SIGNATURE_UNSUPPORTED_SCHEME oder DEPOSIT_LOOKUP_FAILED); oder eine Testeinzahlung, die den Nachweis ablehnt (Code DEPOSIT_MISMATCH, DEPOSIT_STALE oder TXID_REUSED, Status REJECTED, mit den Versuchszählern der Sitzung): Die erneute Auswahl einer Methode startet einen neuen Nachweis, solange attempts_remaining größer als 0 ist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TravelRuleWidgetProofError"
                }
              }
            }
          },
          "404": {
            "description": "Unbekanntes Token oder kein solcher Nachweis in dieser Sitzung vorhanden."
          },
          "409": {
            "description": "Code OWNERSHIP_CHANGED (der Nachweis wird damit geschlossen); ein geschlossener Nachweis (REJECTED oder EXPIRED) mit seinem Status, dem Code, mit dem er geschlossen wurde, und den Versuchszahlen der Sitzung: Wählen Sie erneut eine Methode, um einen neuen Nachweis zu starten; oder ein SELF_DECLARATION-Nachweis, der beim Start verifiziert wird.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TravelRuleWidgetProofError"
                }
              }
            }
          },
          "410": {
            "description": "Die Sitzung ist abgelaufen, oder Code WINDOW_EXPIRED, wenn das Zeitfenster für den Satoshi-Test geschlossen wurde.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TravelRuleWidgetProofError"
                }
              }
            }
          }
        }
      }
    },
    "/v3/id-verification/wallets/verifications/{request_id}/response/": {
      "post": {
        "operationId": "submit_wallet_verification_response",
        "x-didit-sdk": {
          "resource": "id_wallets",
          "method": "submit_verification_response",
          "auth": "api_key",
          "server": true
        },
        "description": "Wallets der Digital Credentials API (Google Wallet): Senden Sie das, was die Wallet an Ihre Seite oder App zurückgegeben hat, für eine Verifizierung, deren next_action request_digital_credential ist. Didit entschlüsselt es, prüft die Signatur des Ausstellers anhand der vertrauenswürdigen Root-Zertifikate der Aussteller, jeden zurückgegebenen Wert anhand seines signierten Digests und die Gerätesignatur über Ihren Origin und diese Anfrage und entscheidet dann über die Verifizierung: verifiziert (einmalig abgerechnet) oder abgelehnt mit dem Fehlercode. Einmalige Verwendung: Eine zweite Übermittlung gibt die entschiedene Verifizierung zurück.",
        "summary": "Wallet-Antwort übermitteln",
        "parameters": [
          {
            "in": "path",
            "name": "request_id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Die vom Start-Endpoint zurückgegebene request_id.",
            "required": true
          }
        ],
        "tags": [
          "Digital ID wallets"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DigitalIdWalletApiWalletDigitalCredentialResponseRequest"
              },
              "example": {
                "response": {
                  "protocol": "openid4vp-v1-signed",
                  "data": {
                    "response": "<compact JWE returned by the wallet>"
                  }
                }
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/DigitalIdWalletApiWalletDigitalCredentialResponseRequest"
              },
              "example": {
                "response": {
                  "protocol": "openid4vp-v1-signed",
                  "data": {
                    "response": "<compact JWE returned by the wallet>"
                  }
                }
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/DigitalIdWalletApiWalletDigitalCredentialResponseRequest"
              },
              "example": {
                "response": {
                  "protocol": "openid4vp-v1-signed",
                  "data": {
                    "response": "<compact JWE returned by the wallet>"
                  }
                }
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationResponse"
                },
                "example": {
                  "request_id": "00000000-0000-4000-8000-000000000001",
                  "wallet_verification": {
                    "wallet": {
                      "id": "google_wallet",
                      "name": "Google Wallet",
                      "issuing_authority": "Google Wallet (ID pass) and US state issuers (mobile driving licence)"
                    },
                    "country": "USA",
                    "status": "Approved",
                    "outcome": "verified",
                    "error": null,
                    "interaction": "digital_credentials",
                    "simulated": false,
                    "expires_at": "2026-01-01T10:10:00Z",
                    "next_action": null,
                    "identity": {
                      "full_name": "Alex Example",
                      "first_name": "Alex",
                      "last_name": "Example",
                      "date_of_birth": "1990-01-31",
                      "nationality": "USA",
                      "issuing_state": "USA"
                    },
                    "attributes": {
                      "document_number": "X0000000",
                      "document_expiry_date": "2030-01-31"
                    },
                    "level_of_assurance": "substantial",
                    "verified_at": "2026-01-01T10:01:00Z",
                    "signature_valid": true,
                    "credential_type": "person_identification"
                  },
                  "vendor_data": "your-customer-reference",
                  "metadata": {
                    "reference": "example"
                  },
                  "created_at": "2026-01-01T10:00:00Z"
                }
              }
            },
            "description": ""
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiClientCredentialsForbiddenErrorMessage"
                }
              }
            },
            "description": "Fehlende Anmeldedaten (x-api-key oder Authorization: Bearer)."
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationError"
                }
              }
            },
            "description": "Fehler not_found: Keine Wallet-Verifizierung dieser Anwendung hat diese request_id."
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationStartBadRequest"
                }
              }
            },
            "description": "Feldvalidierungsfehler ({field: [messages]})."
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationError"
                }
              }
            },
            "description": "Fehler not_a_digital_credentials_wallet: Diese Verifizierung akzeptiert keine Wallet-Antwort."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationError"
                }
              }
            },
            "description": "Fehler wallet_not_configured: Diese Umgebung kann die Wallet nicht verifizieren."
          }
        },
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "cURL",
            "source": "curl --request POST \\\n  --url https://verification.didit.me/v3/id-verification/wallets/verifications/REQUEST_ID/response/ \\\n  --header 'x-api-key: YOUR_API_KEY' \\\n  --header 'Content-Type: application/json' \\\n  --data '{\n  \"response\": {\n    \"protocol\": \"openid4vp-v1-signed\",\n    \"data\": {\n      \"response\": \"<compact JWE returned by the wallet>\"\n    }\n  }\n}'"
          }
        ]
      }
    },
    "/v3/id-verification/wallets/google-wallet/": {
      "post": {
        "operationId": "start_google_wallet_wallet_verification",
        "x-didit-sdk": {
          "resource": "id_wallets",
          "method": "start_google_wallet",
          "auth": "api_key",
          "server": true
        },
        "description": "Starten Sie eine Google-Wallet-Anmeldung (Google Wallet (ID-Pass) und Aussteller in US-Bundesstaaten (mobiler Führerschein); USA, GBR, BRA, SGP, TWN) ohne Workflow. Die Abrechnung erfolgt einmalig, nur wenn die Identität verifiziert wurde. Die Antwort enthält next_action.type=request_digital_credential mit einer Anfrage, die Didit für Ihre Anwendung signiert hat und die nur von origin aus verwendet werden kann. Übergeben Sie dort bei einer Benutzeraktion next_action.digital_credentials.request an navigator.credentials.get({digital: ...}) (oder an den Android Credential Manager als GetDigitalCredentialOption requestJson) und senden Sie anschließend die Rückgabe der Wallet per POST an /v3/id-verification/wallets/verifications/{request_id}/response/. Der Browser bietet einen eigenen QR-Code an, wenn sich die Wallet auf einem anderen Gerät befindet. Sandbox-Anwendungen erhalten eine deterministische Simulation (simulated: true), die niemals den Anbieter kontaktiert.",
        "summary": "Google Wallet-Verifizierung starten",
        "parameters": [
          {
            "in": "header",
            "name": "Idempotency-Key",
            "schema": {
              "type": "string"
            },
            "description": "Optionaler Schlüssel zur Wiederholungssicherheit (max. 255 Zeichen). Ein erneuter Versuch mit demselben Schlüssel, derselben Wallet und demselben Body gibt die ursprüngliche Verifizierung zurück, ohne eine zweite Anmeldung zu starten; derselbe Schlüssel mit einer anderen Wallet oder einem anderen Body gibt 409 idempotency_key_reused zurück."
          }
        ],
        "tags": [
          "Digital ID wallets"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DigitalIdWalletApiGoogleWalletWalletVerificationStartRequest"
              },
              "example": {
                "country": "USA",
                "vendor_data": "your-customer-reference",
                "metadata": {
                  "reference": "example"
                },
                "origin": "https://app.example.com"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/DigitalIdWalletApiGoogleWalletWalletVerificationStartRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/DigitalIdWalletApiGoogleWalletWalletVerificationStartRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationResponse"
                },
                "example": {
                  "request_id": "00000000-0000-4000-8000-000000000001",
                  "wallet_verification": {
                    "wallet": {
                      "id": "google_wallet",
                      "name": "Google Wallet",
                      "issuing_authority": "Google Wallet (ID pass) and US state issuers (mobile driving licence)"
                    },
                    "country": "USA",
                    "status": "Not Finished",
                    "outcome": "pending",
                    "error": null,
                    "interaction": "digital_credentials",
                    "simulated": false,
                    "expires_at": "2026-01-01T10:10:00Z",
                    "next_action": {
                      "type": "request_digital_credential",
                      "digital_credentials": {
                        "protocol": "openid4vp-v1-signed",
                        "request": {
                          "requests": [
                            {
                              "protocol": "openid4vp-v1-signed",
                              "data": {
                                "request": "<compact JWS signed by Didit>"
                              }
                            }
                          ]
                        }
                      }
                    },
                    "identity": null,
                    "attributes": null,
                    "level_of_assurance": null,
                    "verified_at": null,
                    "signature_valid": null,
                    "credential_type": "person_identification"
                  },
                  "vendor_data": "your-customer-reference",
                  "metadata": {
                    "reference": "example"
                  },
                  "created_at": "2026-01-01T10:00:00Z"
                }
              }
            },
            "description": ""
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationStartBadRequest"
                }
              }
            },
            "description": "Feldvalidierungsfehler ({field: [messages]}) oder Fehler return_url_invalid, return_url_not_allowed, origin_invalid, origin_not_allowed, invalid_personal_code, invalid_phone_number oder idempotency_key_invalid."
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationStartForbidden"
                }
              }
            },
            "description": "Fehlende Anmeldedaten ({detail}) oder Fehler wallet_unavailable, insufficient_credits oder contract_rate_missing."
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationError"
                }
              }
            },
            "description": "Fehler idempotency_key_reused oder idempotency_key_in_progress (mit Retry-After)."
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationError"
                }
              }
            },
            "description": "Fehler wallet_provider_unavailable: Der Anbieter konnte nicht gestartet werden; es wurde nichts erstellt."
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationError"
                }
              }
            },
            "description": "Fehler wallet_not_configured: Diese Umgebung kann die Wallet nicht erreichen."
          }
        },
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "cURL",
            "source": "curl --request POST \\\n  --url https://verification.didit.me/v3/id-verification/wallets/google-wallet/ \\\n  --header 'x-api-key: YOUR_API_KEY' \\\n  --header 'Idempotency-Key: your-unique-attempt-key' \\\n  --header 'Content-Type: application/json' \\\n  --data '{\n  \"country\": \"USA\",\n  \"vendor_data\": \"your-customer-reference\",\n  \"metadata\": {\n    \"reference\": \"example\"\n  },\n  \"origin\": \"https://app.example.com\"\n}'"
          }
        ],
        "x-didit-wallet-id": "google_wallet"
      }
    },
    "/v3/session/{sessionId}/kyb/documents/": {
      "post": {
        "summary": "KYB-Dokumente zu einer Sitzung hochladen",
        "description": "Ein oder mehrere Unternehmensdokumente (Satzung, Gesellschafterliste, Handelsregisterauszug, ...) für den Schritt „KYB-Dokumente“ einer Sitzung zur Unternehmensverifizierung (KYB) hochladen, und zwar direkt von Ihrem eigenen Server statt über die gehostete Seite. Didit führt die gehostete Pipeline aus: Komprimierung, OCR, Prüfungen auf Manipulation und dokumentenübergreifende Abgleiche sowie Dokumentgruppierung; die Sitzung wird fortgeführt, sobald die erforderlichen Dokumentgruppen erfüllt sind. Für diesen Schritt fällt unabhängig von der Anzahl der gesendeten Dateien eine Pauschalgebühr an. Die Sitzung muss geöffnet sein und sich im Schritt „KYB-Dokumente“ befinden, und das im Registerschritt ausgewählte Unternehmen muss existieren. Rufen Sie die in den Dokumenten genannten Personen mit `GET /v3/session/{sessionId}/kyb/extracted-parties/` ab. Erfordert `write:businesses`.",
        "operationId": "post_v3_session_kyb_documents",
        "x-didit-sdk": {
          "resource": "sessions",
          "method": "upload_kyb_documents",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Sessions"
        ],
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "parameters": [
          {
            "name": "sessionId",
            "in": "path",
            "required": true,
            "description": "UUID der Sitzung zur Unternehmensverifizierung (KYB). Sie muss zu der Anwendung des API-Schlüssels gehören.",
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "33333333-4444-5555-6666-777777777777"
            }
          },
          {
            "name": "node_id",
            "in": "query",
            "required": false,
            "description": "Workflow-Knoten des KYB-Schritts. Nur erforderlich, wenn der Workflow mehr als einen KYB-Knoten enthält; standardmäßig verwendet Didit den sitzungseigenen Knoten.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "required": [
                  "documents"
                ],
                "properties": {
                  "documents": {
                    "type": "array",
                    "items": {
                      "type": "string",
                      "format": "binary"
                    },
                    "description": "Hochzuladende Dateien: JPG, JPEG, PNG, TIFF, WEBP, PDF oder ZIP-Archive dieser Dateien. PDFs bis zu 50 MB, Fotos bis zu 6 MB vor der Komprimierung."
                  },
                  "document_passwords": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    },
                    "description": "Ein Eintrag pro Datei in `documents`, in derselben Reihenfolge: das Passwort eines geschützten PDFs, leer bei jeder anderen Datei."
                  },
                  "document_group": {
                    "type": "string",
                    "enum": [
                      "LEGAL_PRESENCE",
                      "COMPANY_DETAILS",
                      "OWNERSHIP_STRUCTURE",
                      "REPRESENTATIVES_AUTHORIZATION"
                    ],
                    "description": "Erforderliche Dokumentengruppe, auf die dieser Upload antwortet."
                  },
                  "locale": {
                    "type": "string",
                    "maxLength": 10,
                    "description": "Gebietsschema zur Übersetzung der Antwort des nächsten Schritts."
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Dokumente verarbeitet. Wenn jede erforderliche Gruppe erfüllt ist, schreitet die Sitzung voran und `next_step` benennt den nächsten Schritt; andernfalls verbleibt sie beim Schritt Documents und `document_groups` sowie `document_answer` geben an, was noch fehlt.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "valid": {
                      "type": "boolean"
                    },
                    "next_step": {
                      "type": "string",
                      "nullable": true,
                      "description": "Schritt, in dem sich die Sitzung nach dem Upload befindet."
                    },
                    "kyb_status": {
                      "type": "string",
                      "description": "Status der Unternehmensprüfung."
                    },
                    "document_answer": {
                      "type": "object",
                      "additionalProperties": true,
                      "description": "Ergebnis pro hochgeladenem Dokument und verbleibende Uploads."
                    }
                  },
                  "additionalProperties": true
                },
                "example": {
                  "valid": true,
                  "next_step": "KYB_KEY_PEOPLE",
                  "kyb_status": "In Progress"
                }
              }
            }
          },
          "400": {
            "description": "Ein Dokument wurde abgelehnt (Manipulation, unlesbar oder nicht unterstützt) oder die Sitzung hat noch kein KYB-Unternehmen. Wiederholen Sie den Vorgang mit einer anderen Datei, solange noch Versuche verbleiben.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string",
                      "description": "Lesbare Fehlermeldung."
                    }
                  }
                },
                "example": {
                  "message": "No KYB company found. Submit company data first."
                }
              }
            }
          },
          "402": {
            "description": "Die Organisation hat keinen Credit mehr für den Dokumentenschritt übrig.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string",
                      "description": "Lesbare Fehlermeldung."
                    }
                  }
                },
                "example": {
                  "detail": "Insufficient credits."
                }
              }
            }
          },
          "401": {
            "description": "Der API-Schlüssel mit eingeschränktem Geltungsbereich ist abgelaufen. Dies ist der einzige Fall, der `401` zurückgibt: Ein fehlender, ungültiger oder widerrufener Schlüssel gibt `403` zurück.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string",
                      "description": "Lesbare Fehlermeldung."
                    }
                  }
                },
                "examples": {
                  "Expired key": {
                    "summary": "Das Ablaufdatum des Schlüssels ist überschritten",
                    "value": {
                      "detail": "This API key has expired."
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Authentifizierungs- oder Autorisierungsfehler. Ein fehlender Schlüssel gibt `403` zurück, ebenso wie der Schlüssel einer anderen Anwendung, ein berechtigungsbeschränkter Schlüssel ohne die für diesen Endpoint erforderliche Berechtigung sowie eine Anfrage von außerhalb der IP-Allowlist des Schlüssels; ein falscher, widerrufener oder abgelaufener Schlüssel gibt `401` zurück. Unterscheiden Sie diese anhand von `detail`.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string",
                      "description": "Lesbare Fehlermeldung."
                    }
                  }
                },
                "examples": {
                  "Missing or invalid credentials": {
                    "summary": "Kein x-api-key-Header vorhanden oder die Validierung des Schlüssels ist fehlgeschlagen",
                    "value": {
                      "detail": "Authentication credentials were not provided or are invalid."
                    }
                  },
                  "Other application": {
                    "summary": "Ein gültiger Schlüssel, der zu einer anderen Anwendung als die Sitzung gehört",
                    "value": {
                      "detail": "You do not have permission to perform this action."
                    }
                  },
                  "Scoped key without decisions write": {
                    "summary": "Dem Schlüssel mit eingeschränktem Berechtigungsumfang fehlt decisions: write",
                    "value": {
                      "detail": "This API key has no write access to decisions."
                    }
                  },
                  "IP not allowed": {
                    "summary": "Anfrage von außerhalb der IP-Allowlist des Schlüssels",
                    "value": {
                      "detail": "This API key can't be used from this IP address."
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Die Sitzung existiert nicht, wurde gelöscht, gehört zu einer anderen Anwendung oder liegt außerhalb der Beschränkungen eines Scoped Keys; kein Detail unterscheidet diese Fälle.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string",
                      "description": "Lesbare Fehlermeldung."
                    }
                  }
                },
                "example": {
                  "detail": "Session not found."
                }
              }
            }
          },
          "409": {
            "description": "Die Sitzung ist abgeschlossen (`kyb_session_not_writable`) oder befindet sich nicht im Schritt für KYB-Dokumente (`kyb_step_mismatch`, wobei `next_step` den aktuellen Schritt angibt).",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string",
                      "description": "Lesbare Fehlermeldung."
                    },
                    "code": {
                      "type": "string"
                    },
                    "next_step": {
                      "type": "string"
                    }
                  }
                },
                "example": {
                  "detail": "The session is not on the step this operation completes.",
                  "code": "kyb_step_mismatch",
                  "next_step": "KYB_REGISTRY"
                }
              }
            }
          },
          "429": {
            "description": "Rate-Limit überschritten: 300 Schreibanfragen (POST, PATCH, DELETE) pro Minute pro API-Schlüssel. Warten Sie `Retry-After` Sekunden vor einem Wiederholungsversuch; die `X-RateLimit-*`-Header zeigen das Budget an.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string",
                      "description": "Lesbare Fehlermeldung."
                    }
                  }
                },
                "examples": {
                  "Rate limited": {
                    "summary": "Budget für die aktuelle Minute erschöpft",
                    "value": {
                      "detail": "Write request rate limit exceeded. You can make up to 300 requests per minute."
                    }
                  }
                }
              }
            },
            "headers": {
              "Retry-After": {
                "description": "Sekunden, die vor einem Wiederholungsversuch gewartet werden müssen.",
                "schema": {
                  "type": "integer",
                  "minimum": 1,
                  "example": 30
                }
              }
            }
          },
          "503": {
            "$ref": "#/components/responses/DocumentProcessingBusy"
          }
        },
        "x-codeSamples": [
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.sessions.upload_kyb_documents(\n    \"33333333-4444-5555-6666-777777777777\",\n    documents=[open(\"document.pdf\", \"rb\")],\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit, { fileFromPath } from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.sessions.uploadKybDocuments(\"33333333-4444-5555-6666-777777777777\", {\n  documents: [await fileFromPath(\"document.pdf\")],\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Sessions.UploadKYBDocuments(ctx, \"33333333-4444-5555-6666-777777777777\", didit.SessionsUploadKYBDocumentsParams{\n\tDocuments: []didit.File{didit.FileFromPath(\"document.pdf\")},\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import java.nio.file.Path;\nimport java.util.List;\nimport me.didit.Didit;\nimport me.didit.types.SessionsUploadKybDocumentsParams;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.sessions().uploadKybDocuments(\"33333333-4444-5555-6666-777777777777\", SessionsUploadKybDocumentsParams.builder()\n        .documents(List.of(Path.of(\"document.pdf\")))\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\nuse Didit\\File;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->sessions->uploadKybDocuments('33333333-4444-5555-6666-777777777777', [\n    'documents' => [File::fromPath('document.pdf')],\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.sessions.upload_kyb_documents(\n  \"33333333-4444-5555-6666-777777777777\",\n  documents: [Pathname(\"document.pdf\")]\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Sessions.UploadKybDocumentsAsync(\"33333333-4444-5555-6666-777777777777\", new SessionsUploadKybDocumentsParams\n{\n    Documents = new FileUpload[] { FileUpload.FromPath(\"document.pdf\") },\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ]
      }
    },
    "/v3/session/{sessionId}/kyb/extracted-parties/": {
      "get": {
        "summary": "In den hochgeladenen Dokumenten genannte Parteien auflisten",
        "description": "Gibt die Gesellschafter und Geschäftsführer zurück, die in den für diese KYB-Sitzung hochgeladenen Dokumenten genannt werden, zusammengeführt pro Person und den Dokumenten zugeordnet, in denen sie genannt wurden. Zeigen Sie diese Ihrem Antragsteller zur Bestätigung an und deklarieren Sie sie anschließend über die Endpoints für Partei-Entwürfe. Eine Spanne bleibt eine Spanne: `ownership_percent.text` behält die wörtliche Angabe bei und `min` / `max` die daraus ausgelesenen Zahlen. Niemand wird hier als UBO gekennzeichnet; dies wird erst bei der Übermittlung der Parteien anhand der Rolleneinstellungen und der Eigentums-Schwellenwerte des Workflows festgelegt. Dieselbe Liste ist in der Sitzungsentscheidung als `document_verifications[].extracted_parties` enthalten. Erfordert `read:businesses` oder `read:sessions`.",
        "operationId": "get_v3_session_kyb_extracted_parties",
        "x-didit-sdk": {
          "resource": "sessions",
          "method": "list_kyb_extracted_parties",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Sessions"
        ],
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "parameters": [
          {
            "name": "sessionId",
            "in": "path",
            "required": true,
            "description": "UUID der Sitzung zur Unternehmensverifizierung (KYB). Sie muss zu der Anwendung des API-Schlüssels gehören.",
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "33333333-4444-5555-6666-777777777777"
            }
          },
          {
            "name": "node_id",
            "in": "query",
            "required": false,
            "description": "Workflow-Knoten des KYB-Schritts. Nur erforderlich, wenn der Workflow mehr als einen KYB-Knoten enthält; standardmäßig verwendet Didit den sitzungseigenen Knoten.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "In den aktuellen Dokumenten genannte Parteien.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "parties",
                    "document_count"
                  ],
                  "properties": {
                    "parties": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "name": {
                            "type": "string"
                          },
                          "entity_type": {
                            "type": "string",
                            "enum": [
                              "person",
                              "company"
                            ]
                          },
                          "first_name": {
                            "type": "string",
                            "nullable": true
                          },
                          "last_name": {
                            "type": "string",
                            "nullable": true
                          },
                          "appointment_date": {
                            "type": "string",
                            "nullable": true
                          },
                          "designation": {
                            "type": "string",
                            "nullable": true
                          },
                          "roles": {
                            "type": "array",
                            "items": {
                              "type": "object",
                              "properties": {
                                "role": {
                                  "type": "string",
                                  "enum": [
                                    "director",
                                    "non_executive_director",
                                    "secretary",
                                    "chairman",
                                    "ubo",
                                    "shareholder",
                                    "representative",
                                    "founder",
                                    "legal_advisor",
                                    "authorized_signatory",
                                    "trustee",
                                    "beneficiary",
                                    "settlor",
                                    "protector",
                                    "company_officer",
                                    "investor",
                                    "other"
                                  ]
                                },
                                "ownership_percent": {
                                  "type": "object",
                                  "properties": {
                                    "text": {
                                      "type": "string",
                                      "nullable": true,
                                      "description": "Der Eigentumsanteil genau wie im Dokument angegeben, wie beispielsweise `25-50%`, `>50%` oder `NO EXHIBE`."
                                    },
                                    "min": {
                                      "type": "number",
                                      "nullable": true,
                                      "description": "Niedrigere aus `text` ausgelesene Zahl; null, wenn keine angegeben ist."
                                    },
                                    "max": {
                                      "type": "number",
                                      "nullable": true,
                                      "description": "Aus `text` ausgelesene obere Zahl; null, wenn keine angegeben ist."
                                    }
                                  }
                                }
                              }
                            }
                          },
                          "documents": {
                            "type": "array",
                            "description": "Die hochgeladenen Dokumente, in denen diese Partei genannt wurde.",
                            "items": {
                              "type": "object",
                              "properties": {
                                "document_uuid": {
                                  "type": "string",
                                  "format": "uuid"
                                },
                                "document_type": {
                                  "type": "string",
                                  "nullable": true
                                },
                                "document_subtype": {
                                  "type": "string",
                                  "nullable": true
                                },
                                "original_filename": {
                                  "type": "string",
                                  "nullable": true
                                },
                                "status": {
                                  "type": "string",
                                  "nullable": true
                                }
                              }
                            }
                          }
                        }
                      },
                      "description": "Die Gesellschafter und Geschäftsführer, die in den hochgeladenen Dokumenten genannt sind, pro Person zusammengeführt. Niemand wird hier als wirtschaftlich Berechtigter (UBO) gekennzeichnet: Dies wird entschieden, wenn die Parteien übermittelt werden."
                    },
                    "document_count": {
                      "type": "integer",
                      "description": "Anzahl der hochgeladenen Dokumente, aus denen die Liste ausgelesen wurde."
                    },
                    "node_id": {
                      "type": "string",
                      "nullable": true
                    }
                  }
                },
                "example": {
                  "parties": [
                    {
                      "name": "Ana Lopez",
                      "entity_type": "person",
                      "first_name": "Ana",
                      "last_name": "Lopez",
                      "appointment_date": null,
                      "designation": "Administrador unico",
                      "roles": [
                        {
                          "role": "shareholder",
                          "ownership_percent": {
                            "text": "60%",
                            "min": 60,
                            "max": 60
                          }
                        }
                      ],
                      "documents": [
                        {
                          "document_uuid": "0a3f1e2c-7c2f-4a1b-9d55-2f8d2a5d6b41",
                          "document_type": "OWNERSHIP_STRUCTURE",
                          "document_subtype": "ARTICLES_OF_INCORPORATION",
                          "original_filename": "acta_constitutiva.pdf",
                          "status": "Approved"
                        }
                      ]
                    }
                  ],
                  "document_count": 1,
                  "node_id": "node_kyb_documents"
                }
              }
            }
          },
          "401": {
            "description": "Der API-Schlüssel mit eingeschränktem Geltungsbereich ist abgelaufen. Dies ist der einzige Fall, der `401` zurückgibt: Ein fehlender, ungültiger oder widerrufener Schlüssel gibt `403` zurück.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string",
                      "description": "Lesbare Fehlermeldung."
                    }
                  }
                },
                "examples": {
                  "Expired key": {
                    "summary": "Das Ablaufdatum des Schlüssels ist überschritten",
                    "value": {
                      "detail": "This API key has expired."
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Authentifizierungs- oder Autorisierungsfehler. Ein fehlender Schlüssel gibt `403` zurück, ebenso wie der Schlüssel einer anderen Anwendung, ein berechtigungsbeschränkter Schlüssel ohne die für diesen Endpoint erforderliche Berechtigung sowie eine Anfrage von außerhalb der IP-Allowlist des Schlüssels; ein falscher, widerrufener oder abgelaufener Schlüssel gibt `401` zurück. Unterscheiden Sie diese anhand von `detail`.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string",
                      "description": "Lesbare Fehlermeldung."
                    }
                  }
                },
                "examples": {
                  "Missing or invalid credentials": {
                    "summary": "Kein x-api-key-Header vorhanden oder die Validierung des Schlüssels ist fehlgeschlagen",
                    "value": {
                      "detail": "Authentication credentials were not provided or are invalid."
                    }
                  },
                  "Other application": {
                    "summary": "Ein gültiger Schlüssel, der zu einer anderen Anwendung als die Sitzung gehört",
                    "value": {
                      "detail": "You do not have permission to perform this action."
                    }
                  },
                  "Scoped key without decisions write": {
                    "summary": "Dem Schlüssel mit eingeschränktem Berechtigungsumfang fehlt decisions: write",
                    "value": {
                      "detail": "This API key has no write access to decisions."
                    }
                  },
                  "IP not allowed": {
                    "summary": "Anfrage von außerhalb der IP-Allowlist des Schlüssels",
                    "value": {
                      "detail": "This API key can't be used from this IP address."
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Die Sitzung existiert nicht, wurde gelöscht, gehört zu einer anderen Anwendung oder liegt außerhalb der Beschränkungen eines Scoped Keys; kein Detail unterscheidet diese Fälle.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string",
                      "description": "Lesbare Fehlermeldung."
                    }
                  }
                },
                "example": {
                  "detail": "Session not found."
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.sessions.list_kyb_extracted_parties(\n    \"33333333-4444-5555-6666-777777777777\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.sessions.listKybExtractedParties(\"33333333-4444-5555-6666-777777777777\");\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Sessions.ListKYBExtractedParties(ctx, \"33333333-4444-5555-6666-777777777777\", didit.SessionsListKYBExtractedPartiesParams{})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.sessions().listKybExtractedParties(\"33333333-4444-5555-6666-777777777777\");\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->sessions->listKybExtractedParties('33333333-4444-5555-6666-777777777777');\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.sessions.list_kyb_extracted_parties(\"33333333-4444-5555-6666-777777777777\")\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Sessions.ListKybExtractedPartiesAsync(\"33333333-4444-5555-6666-777777777777\");\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ]
      }
    },
    "/v3/session/{sessionId}/kyb/parties/drafts/": {
      "get": {
        "summary": "Entwürfe für KYB-Beteiligte auflisten",
        "description": "Parteien auflisten, die Sie für diese KYB-Sitzung vorbereiten, die ältesten zuerst. Ein Entwurf ist keine deklarierte Partei: Er erscheint weder in der Entscheidung noch in der Konsole und erstellt keine Verifizierungssitzung, bis Sie ihn mit `POST /v3/session/{sessionId}/kyb/parties/submit/` einreichen. Erfordert `write:businesses`.",
        "operationId": "get_v3_session_kyb_party_drafts",
        "x-didit-sdk": {
          "resource": "sessions",
          "method": "list_kyb_party_drafts",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Sessions"
        ],
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "parameters": [
          {
            "name": "sessionId",
            "in": "path",
            "required": true,
            "description": "UUID der Sitzung zur Unternehmensverifizierung (KYB). Sie muss zu der Anwendung des API-Schlüssels gehören.",
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "33333333-4444-5555-6666-777777777777"
            }
          },
          {
            "name": "node_id",
            "in": "query",
            "required": false,
            "description": "Workflow-Knoten des KYB-Schritts. Nur erforderlich, wenn der Workflow mehr als einen KYB-Knoten enthält; standardmäßig verwendet Didit den sitzungseigenen Knoten.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Die gespeicherten Entwürfe.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "parties": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "required": [
                          "draft_id",
                          "created_at",
                          "updated_at",
                          "party"
                        ],
                        "properties": {
                          "draft_id": {
                            "type": "string",
                            "format": "uuid"
                          },
                          "created_at": {
                            "type": "string",
                            "format": "date-time"
                          },
                          "updated_at": {
                            "type": "string",
                            "format": "date-time"
                          },
                          "party": {
                            "type": "object",
                            "required": [
                              "entity_type",
                              "nationality"
                            ],
                            "properties": {
                              "entity_type": {
                                "type": "string",
                                "enum": [
                                  "person",
                                  "company"
                                ],
                                "description": "Gibt an, ob die Partei eine Einzelperson oder ein Unternehmen ist."
                              },
                              "full_name": {
                                "type": "string",
                                "maxLength": 255,
                                "description": "Vollständiger Name einer Person. Übergeben Sie diesen oder `first_name` und `last_name`."
                              },
                              "first_name": {
                                "type": "string",
                                "maxLength": 128
                              },
                              "last_name": {
                                "type": "string",
                                "maxLength": 128
                              },
                              "role": {
                                "type": "string",
                                "enum": [
                                  "director",
                                  "non_executive_director",
                                  "secretary",
                                  "chairman",
                                  "ubo",
                                  "shareholder",
                                  "representative",
                                  "founder",
                                  "legal_advisor",
                                  "authorized_signatory",
                                  "trustee",
                                  "beneficiary",
                                  "settlor",
                                  "protector",
                                  "company_officer",
                                  "investor",
                                  "other"
                                ],
                                "description": "Rolle, die die Partei innehat. Austauschbar mit `roles`; wenn beide übermittelt werden, werden sie zusammengeführt."
                              },
                              "roles": {
                                "type": "array",
                                "items": {
                                  "type": "string",
                                  "enum": [
                                    "director",
                                    "non_executive_director",
                                    "secretary",
                                    "chairman",
                                    "ubo",
                                    "shareholder",
                                    "representative",
                                    "founder",
                                    "legal_advisor",
                                    "authorized_signatory",
                                    "trustee",
                                    "beneficiary",
                                    "settlor",
                                    "protector",
                                    "company_officer",
                                    "investor",
                                    "other"
                                  ]
                                },
                                "description": "Jede Rolle, die die Partei innehat. Eine Person benötigt mindestens eine Rolle (hier oder in `role`)."
                              },
                              "position": {
                                "type": "string",
                                "maxLength": 128,
                                "description": "Berufsbezeichnung einer Person."
                              },
                              "date_of_birth": {
                                "type": "string",
                                "format": "date",
                                "nullable": true
                              },
                              "company_name": {
                                "type": "string",
                                "maxLength": 255,
                                "description": "Name einer Unternehmenspartei. Erforderlich, wenn `entity_type` `company` ist."
                              },
                              "registration_number": {
                                "type": "string",
                                "maxLength": 100,
                                "description": "Registernummer einer Unternehmenspartei."
                              },
                              "email": {
                                "type": "string",
                                "format": "email",
                                "description": "Wohin der Verifizierungslink gesendet wird. Erforderlich, wenn die Partei die Verifizierung abschließen muss, was von den Rolleneinstellungen und Eigentümerstruktur-Schwellenwerten des Workflows abhängt."
                              },
                              "ownership_percent": {
                                "type": "number",
                                "nullable": true,
                                "description": "Anteil am Unternehmen, den die Partei besitzt."
                              },
                              "nationality": {
                                "type": "string",
                                "maxLength": 100,
                                "description": "Staatsangehörigkeit einer Person oder Gründungsland eines Unternehmens. Erforderlich für jede Partei."
                              },
                              "phone_number": {
                                "type": "string",
                                "maxLength": 32
                              },
                              "custom_fields": {
                                "type": "object",
                                "additionalProperties": true,
                                "description": "Vom Workflow definierte Zusatzfelder."
                              },
                              "skip_verification": {
                                "type": "boolean",
                                "default": false,
                                "description": "Anfordern, die Verifizierung dieser Partei zu überspringen. Wird nur berücksichtigt, wenn die Rolle der Partei das Überspringen in den Einstellungen für Schlüsselpersonen des Workflows zulässt."
                              }
                            }
                          }
                        }
                      }
                    },
                    "node_id": {
                      "type": "string",
                      "nullable": true
                    }
                  }
                },
                "example": {
                  "parties": [
                    {
                      "draft_id": "5b0d7a52-9d3e-4f0c-8c6a-0e5f3a1b2c4d",
                      "created_at": "2026-10-31T10:00:00Z",
                      "updated_at": "2026-10-31T10:00:00Z",
                      "party": {
                        "entity_type": "person",
                        "first_name": "Ana",
                        "last_name": "Lopez",
                        "roles": [
                          "ubo",
                          "director"
                        ],
                        "ownership_percent": 60,
                        "nationality": "MEX",
                        "email": "ana.lopez@example.com",
                        "date_of_birth": "1984-06-12"
                      }
                    }
                  ],
                  "node_id": "node_kyb_key_people"
                }
              }
            }
          },
          "401": {
            "description": "Der API-Schlüssel mit eingeschränktem Geltungsbereich ist abgelaufen. Dies ist der einzige Fall, der `401` zurückgibt: Ein fehlender, ungültiger oder widerrufener Schlüssel gibt `403` zurück.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string",
                      "description": "Lesbare Fehlermeldung."
                    }
                  }
                },
                "examples": {
                  "Expired key": {
                    "summary": "Das Ablaufdatum des Schlüssels ist überschritten",
                    "value": {
                      "detail": "This API key has expired."
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Authentifizierungs- oder Autorisierungsfehler. Ein fehlender Schlüssel gibt `403` zurück, ebenso wie der Schlüssel einer anderen Anwendung, ein berechtigungsbeschränkter Schlüssel ohne die für diesen Endpoint erforderliche Berechtigung sowie eine Anfrage von außerhalb der IP-Allowlist des Schlüssels; ein falscher, widerrufener oder abgelaufener Schlüssel gibt `401` zurück. Unterscheiden Sie diese anhand von `detail`.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string",
                      "description": "Lesbare Fehlermeldung."
                    }
                  }
                },
                "examples": {
                  "Missing or invalid credentials": {
                    "summary": "Kein x-api-key-Header vorhanden oder die Validierung des Schlüssels ist fehlgeschlagen",
                    "value": {
                      "detail": "Authentication credentials were not provided or are invalid."
                    }
                  },
                  "Other application": {
                    "summary": "Ein gültiger Schlüssel, der zu einer anderen Anwendung als die Sitzung gehört",
                    "value": {
                      "detail": "You do not have permission to perform this action."
                    }
                  },
                  "Scoped key without decisions write": {
                    "summary": "Dem Schlüssel mit eingeschränktem Berechtigungsumfang fehlt decisions: write",
                    "value": {
                      "detail": "This API key has no write access to decisions."
                    }
                  },
                  "IP not allowed": {
                    "summary": "Anfrage von außerhalb der IP-Allowlist des Schlüssels",
                    "value": {
                      "detail": "This API key can't be used from this IP address."
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Die Sitzung existiert nicht, wurde gelöscht, gehört zu einer anderen Anwendung oder liegt außerhalb der Beschränkungen eines Scoped Keys; kein Detail unterscheidet diese Fälle.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string",
                      "description": "Lesbare Fehlermeldung."
                    }
                  }
                },
                "example": {
                  "detail": "Session not found."
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.sessions.list_kyb_party_drafts(\n    \"33333333-4444-5555-6666-777777777777\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.sessions.listKybPartyDrafts(\"33333333-4444-5555-6666-777777777777\");\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Sessions.ListKYBPartyDrafts(ctx, \"33333333-4444-5555-6666-777777777777\", didit.SessionsListKYBPartyDraftsParams{})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.sessions().listKybPartyDrafts(\"33333333-4444-5555-6666-777777777777\");\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->sessions->listKybPartyDrafts('33333333-4444-5555-6666-777777777777');\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.sessions.list_kyb_party_drafts(\"33333333-4444-5555-6666-777777777777\")\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Sessions.ListKybPartyDraftsAsync(\"33333333-4444-5555-6666-777777777777\");\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ]
      },
      "post": {
        "summary": "KYB-Beteiligtenentwurf erstellen",
        "description": "Eine Partei (eine Person oder ein Unternehmen) zu der Liste hinzufügen, die Sie für diese KYB-Sitzung vorbereiten. Es gelten dieselben Felder und Regeln wie für die gehostete Schlüsselpersonen-Seite: Eine Person benötigt `full_name` oder `first_name` und `last_name`, mindestens eine Rolle und eine Staatsangehörigkeit; ein Unternehmen benötigt `company_name` und das Gründungsland in `nationality`. Bis zum Aufruf von `POST /v3/session/{sessionId}/kyb/parties/submit/` wird nichts deklariert oder in Rechnung gestellt. Erfordert `write:businesses`.",
        "operationId": "post_v3_session_kyb_party_drafts",
        "x-didit-sdk": {
          "resource": "sessions",
          "method": "create_kyb_party_draft",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Sessions"
        ],
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "parameters": [
          {
            "name": "sessionId",
            "in": "path",
            "required": true,
            "description": "UUID der Sitzung zur Unternehmensverifizierung (KYB). Sie muss zu der Anwendung des API-Schlüssels gehören.",
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "33333333-4444-5555-6666-777777777777"
            }
          },
          {
            "name": "node_id",
            "in": "query",
            "required": false,
            "description": "Workflow-Knoten des KYB-Schritts. Nur erforderlich, wenn der Workflow mehr als einen KYB-Knoten enthält; standardmäßig verwendet Didit den sitzungseigenen Knoten.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "entity_type",
                  "nationality"
                ],
                "properties": {
                  "entity_type": {
                    "type": "string",
                    "enum": [
                      "person",
                      "company"
                    ],
                    "description": "Gibt an, ob die Partei eine Einzelperson oder ein Unternehmen ist."
                  },
                  "full_name": {
                    "type": "string",
                    "maxLength": 255,
                    "description": "Vollständiger Name einer Person. Übergeben Sie diesen oder `first_name` und `last_name`."
                  },
                  "first_name": {
                    "type": "string",
                    "maxLength": 128
                  },
                  "last_name": {
                    "type": "string",
                    "maxLength": 128
                  },
                  "role": {
                    "type": "string",
                    "enum": [
                      "director",
                      "non_executive_director",
                      "secretary",
                      "chairman",
                      "ubo",
                      "shareholder",
                      "representative",
                      "founder",
                      "legal_advisor",
                      "authorized_signatory",
                      "trustee",
                      "beneficiary",
                      "settlor",
                      "protector",
                      "company_officer",
                      "investor",
                      "other"
                    ],
                    "description": "Rolle, die die Partei innehat. Austauschbar mit `roles`; wenn beide übermittelt werden, werden sie zusammengeführt."
                  },
                  "roles": {
                    "type": "array",
                    "items": {
                      "type": "string",
                      "enum": [
                        "director",
                        "non_executive_director",
                        "secretary",
                        "chairman",
                        "ubo",
                        "shareholder",
                        "representative",
                        "founder",
                        "legal_advisor",
                        "authorized_signatory",
                        "trustee",
                        "beneficiary",
                        "settlor",
                        "protector",
                        "company_officer",
                        "investor",
                        "other"
                      ]
                    },
                    "description": "Jede Rolle, die die Partei innehat. Eine Person benötigt mindestens eine Rolle (hier oder in `role`)."
                  },
                  "position": {
                    "type": "string",
                    "maxLength": 128,
                    "description": "Berufsbezeichnung einer Person."
                  },
                  "date_of_birth": {
                    "type": "string",
                    "format": "date",
                    "nullable": true
                  },
                  "company_name": {
                    "type": "string",
                    "maxLength": 255,
                    "description": "Name einer Unternehmenspartei. Erforderlich, wenn `entity_type` `company` ist."
                  },
                  "registration_number": {
                    "type": "string",
                    "maxLength": 100,
                    "description": "Registernummer einer Unternehmenspartei."
                  },
                  "email": {
                    "type": "string",
                    "format": "email",
                    "description": "Wohin der Verifizierungslink gesendet wird. Erforderlich, wenn die Partei die Verifizierung abschließen muss, was von den Rolleneinstellungen und Eigentümerstruktur-Schwellenwerten des Workflows abhängt."
                  },
                  "ownership_percent": {
                    "type": "number",
                    "nullable": true,
                    "description": "Anteil am Unternehmen, den die Partei besitzt."
                  },
                  "nationality": {
                    "type": "string",
                    "maxLength": 100,
                    "description": "Staatsangehörigkeit einer Person oder Gründungsland eines Unternehmens. Erforderlich für jede Partei."
                  },
                  "phone_number": {
                    "type": "string",
                    "maxLength": 32
                  },
                  "custom_fields": {
                    "type": "object",
                    "additionalProperties": true,
                    "description": "Vom Workflow definierte Zusatzfelder."
                  },
                  "skip_verification": {
                    "type": "boolean",
                    "default": false,
                    "description": "Anfordern, die Verifizierung dieser Partei zu überspringen. Wird nur berücksichtigt, wenn die Rolle der Partei das Überspringen in den Einstellungen für Schlüsselpersonen des Workflows zulässt."
                  }
                }
              },
              "example": {
                "entity_type": "person",
                "first_name": "Ana",
                "last_name": "Lopez",
                "roles": [
                  "ubo",
                  "director"
                ],
                "ownership_percent": 60,
                "nationality": "MEX",
                "email": "ana.lopez@example.com",
                "date_of_birth": "1984-06-12"
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Entwurf erstellt.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "draft_id",
                    "created_at",
                    "updated_at",
                    "party"
                  ],
                  "properties": {
                    "draft_id": {
                      "type": "string",
                      "format": "uuid"
                    },
                    "created_at": {
                      "type": "string",
                      "format": "date-time"
                    },
                    "updated_at": {
                      "type": "string",
                      "format": "date-time"
                    },
                    "party": {
                      "type": "object",
                      "required": [
                        "entity_type",
                        "nationality"
                      ],
                      "properties": {
                        "entity_type": {
                          "type": "string",
                          "enum": [
                            "person",
                            "company"
                          ],
                          "description": "Gibt an, ob die Partei eine Einzelperson oder ein Unternehmen ist."
                        },
                        "full_name": {
                          "type": "string",
                          "maxLength": 255,
                          "description": "Vollständiger Name einer Person. Übergeben Sie diesen oder `first_name` und `last_name`."
                        },
                        "first_name": {
                          "type": "string",
                          "maxLength": 128
                        },
                        "last_name": {
                          "type": "string",
                          "maxLength": 128
                        },
                        "role": {
                          "type": "string",
                          "enum": [
                            "director",
                            "non_executive_director",
                            "secretary",
                            "chairman",
                            "ubo",
                            "shareholder",
                            "representative",
                            "founder",
                            "legal_advisor",
                            "authorized_signatory",
                            "trustee",
                            "beneficiary",
                            "settlor",
                            "protector",
                            "company_officer",
                            "investor",
                            "other"
                          ],
                          "description": "Rolle, die die Partei innehat. Austauschbar mit `roles`; wenn beide übermittelt werden, werden sie zusammengeführt."
                        },
                        "roles": {
                          "type": "array",
                          "items": {
                            "type": "string",
                            "enum": [
                              "director",
                              "non_executive_director",
                              "secretary",
                              "chairman",
                              "ubo",
                              "shareholder",
                              "representative",
                              "founder",
                              "legal_advisor",
                              "authorized_signatory",
                              "trustee",
                              "beneficiary",
                              "settlor",
                              "protector",
                              "company_officer",
                              "investor",
                              "other"
                            ]
                          },
                          "description": "Jede Rolle, die die Partei innehat. Eine Person benötigt mindestens eine Rolle (hier oder in `role`)."
                        },
                        "position": {
                          "type": "string",
                          "maxLength": 128,
                          "description": "Berufsbezeichnung einer Person."
                        },
                        "date_of_birth": {
                          "type": "string",
                          "format": "date",
                          "nullable": true
                        },
                        "company_name": {
                          "type": "string",
                          "maxLength": 255,
                          "description": "Name einer Unternehmenspartei. Erforderlich, wenn `entity_type` `company` ist."
                        },
                        "registration_number": {
                          "type": "string",
                          "maxLength": 100,
                          "description": "Registernummer einer Unternehmenspartei."
                        },
                        "email": {
                          "type": "string",
                          "format": "email",
                          "description": "Wohin der Verifizierungslink gesendet wird. Erforderlich, wenn die Partei die Verifizierung abschließen muss, was von den Rolleneinstellungen und Eigentümerstruktur-Schwellenwerten des Workflows abhängt."
                        },
                        "ownership_percent": {
                          "type": "number",
                          "nullable": true,
                          "description": "Anteil am Unternehmen, den die Partei besitzt."
                        },
                        "nationality": {
                          "type": "string",
                          "maxLength": 100,
                          "description": "Staatsangehörigkeit einer Person oder Gründungsland eines Unternehmens. Erforderlich für jede Partei."
                        },
                        "phone_number": {
                          "type": "string",
                          "maxLength": 32
                        },
                        "custom_fields": {
                          "type": "object",
                          "additionalProperties": true,
                          "description": "Vom Workflow definierte Zusatzfelder."
                        },
                        "skip_verification": {
                          "type": "boolean",
                          "default": false,
                          "description": "Anfordern, die Verifizierung dieser Partei zu überspringen. Wird nur berücksichtigt, wenn die Rolle der Partei das Überspringen in den Einstellungen für Schlüsselpersonen des Workflows zulässt."
                        }
                      }
                    }
                  }
                },
                "example": {
                  "draft_id": "5b0d7a52-9d3e-4f0c-8c6a-0e5f3a1b2c4d",
                  "created_at": "2026-10-31T10:00:00Z",
                  "updated_at": "2026-10-31T10:00:00Z",
                  "party": {
                    "entity_type": "person",
                    "first_name": "Ana",
                    "last_name": "Lopez",
                    "roles": [
                      "ubo",
                      "director"
                    ],
                    "ownership_percent": 60,
                    "nationality": "MEX",
                    "email": "ana.lopez@example.com",
                    "date_of_birth": "1984-06-12"
                  }
                }
              }
            }
          },
          "400": {
            "description": "Ein Feld der Partei ist ungültig oder ein Pflichtfeld fehlt.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string",
                      "description": "Lesbare Fehlermeldung."
                    }
                  }
                },
                "example": {
                  "non_field_errors": [
                    "Person parties require at least one role."
                  ]
                }
              }
            }
          },
          "401": {
            "description": "Der API-Schlüssel mit eingeschränktem Geltungsbereich ist abgelaufen. Dies ist der einzige Fall, der `401` zurückgibt: Ein fehlender, ungültiger oder widerrufener Schlüssel gibt `403` zurück.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string",
                      "description": "Lesbare Fehlermeldung."
                    }
                  }
                },
                "examples": {
                  "Expired key": {
                    "summary": "Das Ablaufdatum des Schlüssels ist überschritten",
                    "value": {
                      "detail": "This API key has expired."
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Authentifizierungs- oder Autorisierungsfehler. Ein fehlender Schlüssel gibt `403` zurück, ebenso wie der Schlüssel einer anderen Anwendung, ein berechtigungsbeschränkter Schlüssel ohne die für diesen Endpoint erforderliche Berechtigung sowie eine Anfrage von außerhalb der IP-Allowlist des Schlüssels; ein falscher, widerrufener oder abgelaufener Schlüssel gibt `401` zurück. Unterscheiden Sie diese anhand von `detail`.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string",
                      "description": "Lesbare Fehlermeldung."
                    }
                  }
                },
                "examples": {
                  "Missing or invalid credentials": {
                    "summary": "Kein x-api-key-Header vorhanden oder die Validierung des Schlüssels ist fehlgeschlagen",
                    "value": {
                      "detail": "Authentication credentials were not provided or are invalid."
                    }
                  },
                  "Other application": {
                    "summary": "Ein gültiger Schlüssel, der zu einer anderen Anwendung als die Sitzung gehört",
                    "value": {
                      "detail": "You do not have permission to perform this action."
                    }
                  },
                  "Scoped key without decisions write": {
                    "summary": "Dem Schlüssel mit eingeschränktem Berechtigungsumfang fehlt decisions: write",
                    "value": {
                      "detail": "This API key has no write access to decisions."
                    }
                  },
                  "IP not allowed": {
                    "summary": "Anfrage von außerhalb der IP-Allowlist des Schlüssels",
                    "value": {
                      "detail": "This API key can't be used from this IP address."
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Die Sitzung existiert nicht, wurde gelöscht, gehört zu einer anderen Anwendung oder liegt außerhalb der Beschränkungen eines Scoped Keys; kein Detail unterscheidet diese Fälle.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string",
                      "description": "Lesbare Fehlermeldung."
                    }
                  }
                },
                "example": {
                  "detail": "Session not found."
                }
              }
            }
          },
          "409": {
            "description": "Die Sitzung ist abgeschlossen (`kyb_session_not_writable`).",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string",
                      "description": "Lesbare Fehlermeldung."
                    },
                    "code": {
                      "type": "string"
                    }
                  }
                },
                "example": {
                  "detail": "This verification session is no longer accepting changes.",
                  "code": "kyb_session_not_writable"
                }
              }
            }
          },
          "429": {
            "description": "Rate-Limit überschritten: 300 Schreibanfragen (POST, PATCH, DELETE) pro Minute pro API-Schlüssel. Warten Sie `Retry-After` Sekunden vor einem Wiederholungsversuch; die `X-RateLimit-*`-Header zeigen das Budget an.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string",
                      "description": "Lesbare Fehlermeldung."
                    }
                  }
                },
                "examples": {
                  "Rate limited": {
                    "summary": "Budget für die aktuelle Minute erschöpft",
                    "value": {
                      "detail": "Write request rate limit exceeded. You can make up to 300 requests per minute."
                    }
                  }
                }
              }
            },
            "headers": {
              "Retry-After": {
                "description": "Sekunden, die vor einem Wiederholungsversuch gewartet werden müssen.",
                "schema": {
                  "type": "integer",
                  "minimum": 1,
                  "example": 30
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.sessions.create_kyb_party_draft(\n    \"33333333-4444-5555-6666-777777777777\",\n    entity_type=\"person\",\n    first_name=\"Ana\",\n    last_name=\"Lopez\",\n    roles=[\"ubo\", \"director\"],\n    date_of_birth=\"1984-06-12\",\n    email=\"ana.lopez@example.com\",\n    ownership_percent=60.0,\n    nationality=\"MEX\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.sessions.createKybPartyDraft(\"33333333-4444-5555-6666-777777777777\", {\n  entity_type: \"person\",\n  first_name: \"Ana\",\n  last_name: \"Lopez\",\n  roles: [\"ubo\", \"director\"],\n  date_of_birth: \"1984-06-12\",\n  email: \"ana.lopez@example.com\",\n  ownership_percent: 60.0,\n  nationality: \"MEX\",\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Sessions.CreateKYBPartyDraft(ctx, \"33333333-4444-5555-6666-777777777777\", didit.SessionsCreateKYBPartyDraftParams{\n\tEntityType:       \"person\",\n\tFirstName:        didit.String(\"Ana\"),\n\tLastName:         didit.String(\"Lopez\"),\n\tRoles:            didit.Some([]didit.SessionsCreateKYBPartyDraftParamsRoles{\"ubo\", \"director\"}),\n\tDateOfBirth:      didit.String(\"1984-06-12\"),\n\tEmail:            didit.String(\"ana.lopez@example.com\"),\n\tOwnershipPercent: didit.Float(60.0),\n\tNationality:      \"MEX\",\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import java.time.LocalDate;\nimport java.util.List;\nimport me.didit.Didit;\nimport me.didit.types.SessionsCreateKybPartyDraftParams;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.sessions().createKybPartyDraft(\"33333333-4444-5555-6666-777777777777\", SessionsCreateKybPartyDraftParams.builder()\n        .entityType(SessionsCreateKybPartyDraftParams.EntityType.of(\"person\"))\n        .firstName(\"Ana\")\n        .lastName(\"Lopez\")\n        .roles(List.of(SessionsCreateKybPartyDraftParams.Roles.of(\"ubo\"), SessionsCreateKybPartyDraftParams.Roles.of(\"director\")))\n        .dateOfBirth(LocalDate.parse(\"1984-06-12\"))\n        .email(\"ana.lopez@example.com\")\n        .ownershipPercent(60.0)\n        .nationality(\"MEX\")\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->sessions->createKybPartyDraft('33333333-4444-5555-6666-777777777777', [\n    'entity_type' => 'person',\n    'first_name' => 'Ana',\n    'last_name' => 'Lopez',\n    'roles' => ['ubo', 'director'],\n    'date_of_birth' => '1984-06-12',\n    'email' => 'ana.lopez@example.com',\n    'ownership_percent' => 60.0,\n    'nationality' => 'MEX',\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.sessions.create_kyb_party_draft(\n  \"33333333-4444-5555-6666-777777777777\",\n  entity_type: \"person\",\n  first_name: \"Ana\",\n  last_name: \"Lopez\",\n  roles: [\"ubo\", \"director\"],\n  date_of_birth: \"1984-06-12\",\n  email: \"ana.lopez@example.com\",\n  ownership_percent: 60.0,\n  nationality: \"MEX\"\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Sessions.CreateKybPartyDraftAsync(\"33333333-4444-5555-6666-777777777777\", new SessionsCreateKybPartyDraftParams\n{\n    EntityType = \"person\",\n    FirstName = \"Ana\",\n    LastName = \"Lopez\",\n    Roles = new SessionsCreateKybPartyDraftParamsRoles[] { \"ubo\", \"director\" },\n    DateOfBirth = \"1984-06-12\",\n    Email = \"ana.lopez@example.com\",\n    OwnershipPercent = 60.0,\n    Nationality = \"MEX\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ]
      }
    },
    "/v3/session/{sessionId}/kyb/parties/drafts/{draftId}/": {
      "patch": {
        "summary": "Entwurf einer KYB-Partei bearbeiten",
        "description": "Felder des Entwurfs einer Partei ändern. Die Bearbeitung wird mit dem gespeicherten Entwurf zusammengeführt und die zusammengeführte Partei als Ganzes validiert, sodass eine Bearbeitung, die die Partei unvollständig hinterlassen würde, abgelehnt wird. Das Ändern von `first_name` oder `last_name` ersetzt den gespeicherten vollständigen Namen. Erfordert `write:businesses`.",
        "operationId": "patch_v3_session_kyb_party_draft",
        "x-didit-sdk": {
          "resource": "sessions",
          "method": "update_kyb_party_draft",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Sessions"
        ],
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "parameters": [
          {
            "name": "sessionId",
            "in": "path",
            "required": true,
            "description": "UUID der Sitzung zur Unternehmensverifizierung (KYB). Sie muss zu der Anwendung des API-Schlüssels gehören.",
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "33333333-4444-5555-6666-777777777777"
            }
          },
          {
            "name": "draftId",
            "in": "path",
            "required": true,
            "description": "UUID des Entwurfs der Partei (`draft_id`, die bei der Erstellung zurückgegeben wurde).",
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "5b0d7a52-9d3e-4f0c-8c6a-0e5f3a1b2c4d"
            }
          },
          {
            "name": "node_id",
            "in": "query",
            "required": false,
            "description": "Workflow-Knoten des KYB-Schritts. Nur erforderlich, wenn der Workflow mehr als einen KYB-Knoten enthält; standardmäßig verwendet Didit den sitzungseigenen Knoten.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "description": "Jede beliebige Teilmenge der Parteifelder. Die Bearbeitung wird mit dem gespeicherten Entwurf zusammengeführt und die zusammengeführte Partei als Ganzes validiert, sodass ein Entwurf, der vor einer Bearbeitung übermittelt werden konnte, auch danach noch übermittelt werden kann.",
                "properties": {
                  "entity_type": {
                    "type": "string",
                    "enum": [
                      "person",
                      "company"
                    ],
                    "description": "Gibt an, ob die Partei eine Einzelperson oder ein Unternehmen ist."
                  },
                  "full_name": {
                    "type": "string",
                    "maxLength": 255,
                    "description": "Vollständiger Name einer Person. Übergeben Sie diesen oder `first_name` und `last_name`."
                  },
                  "first_name": {
                    "type": "string",
                    "maxLength": 128
                  },
                  "last_name": {
                    "type": "string",
                    "maxLength": 128
                  },
                  "role": {
                    "type": "string",
                    "enum": [
                      "director",
                      "non_executive_director",
                      "secretary",
                      "chairman",
                      "ubo",
                      "shareholder",
                      "representative",
                      "founder",
                      "legal_advisor",
                      "authorized_signatory",
                      "trustee",
                      "beneficiary",
                      "settlor",
                      "protector",
                      "company_officer",
                      "investor",
                      "other"
                    ],
                    "description": "Rolle, die die Partei innehat. Austauschbar mit `roles`; wenn beide übermittelt werden, werden sie zusammengeführt."
                  },
                  "roles": {
                    "type": "array",
                    "items": {
                      "type": "string",
                      "enum": [
                        "director",
                        "non_executive_director",
                        "secretary",
                        "chairman",
                        "ubo",
                        "shareholder",
                        "representative",
                        "founder",
                        "legal_advisor",
                        "authorized_signatory",
                        "trustee",
                        "beneficiary",
                        "settlor",
                        "protector",
                        "company_officer",
                        "investor",
                        "other"
                      ]
                    },
                    "description": "Jede Rolle, die die Partei innehat. Eine Person benötigt mindestens eine Rolle (hier oder in `role`)."
                  },
                  "position": {
                    "type": "string",
                    "maxLength": 128,
                    "description": "Berufsbezeichnung einer Person."
                  },
                  "date_of_birth": {
                    "type": "string",
                    "format": "date",
                    "nullable": true
                  },
                  "company_name": {
                    "type": "string",
                    "maxLength": 255,
                    "description": "Name einer Unternehmenspartei. Erforderlich, wenn `entity_type` `company` ist."
                  },
                  "registration_number": {
                    "type": "string",
                    "maxLength": 100,
                    "description": "Registernummer einer Unternehmenspartei."
                  },
                  "email": {
                    "type": "string",
                    "format": "email",
                    "description": "Wohin der Verifizierungslink gesendet wird. Erforderlich, wenn die Partei die Verifizierung abschließen muss, was von den Rolleneinstellungen und Eigentümerstruktur-Schwellenwerten des Workflows abhängt."
                  },
                  "ownership_percent": {
                    "type": "number",
                    "nullable": true,
                    "description": "Anteil am Unternehmen, den die Partei besitzt."
                  },
                  "nationality": {
                    "type": "string",
                    "maxLength": 100,
                    "description": "Staatsangehörigkeit einer Person oder Gründungsland eines Unternehmens. Erforderlich für jede Partei."
                  },
                  "phone_number": {
                    "type": "string",
                    "maxLength": 32
                  },
                  "custom_fields": {
                    "type": "object",
                    "additionalProperties": true,
                    "description": "Vom Workflow definierte Zusatzfelder."
                  },
                  "skip_verification": {
                    "type": "boolean",
                    "default": false,
                    "description": "Anfordern, die Verifizierung dieser Partei zu überspringen. Wird nur berücksichtigt, wenn die Rolle der Partei das Überspringen in den Einstellungen für Schlüsselpersonen des Workflows zulässt."
                  }
                }
              },
              "example": {
                "ownership_percent": 55
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Entwurf aktualisiert.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "draft_id",
                    "created_at",
                    "updated_at",
                    "party"
                  ],
                  "properties": {
                    "draft_id": {
                      "type": "string",
                      "format": "uuid"
                    },
                    "created_at": {
                      "type": "string",
                      "format": "date-time"
                    },
                    "updated_at": {
                      "type": "string",
                      "format": "date-time"
                    },
                    "party": {
                      "type": "object",
                      "required": [
                        "entity_type",
                        "nationality"
                      ],
                      "properties": {
                        "entity_type": {
                          "type": "string",
                          "enum": [
                            "person",
                            "company"
                          ],
                          "description": "Gibt an, ob die Partei eine Einzelperson oder ein Unternehmen ist."
                        },
                        "full_name": {
                          "type": "string",
                          "maxLength": 255,
                          "description": "Vollständiger Name einer Person. Übergeben Sie diesen oder `first_name` und `last_name`."
                        },
                        "first_name": {
                          "type": "string",
                          "maxLength": 128
                        },
                        "last_name": {
                          "type": "string",
                          "maxLength": 128
                        },
                        "role": {
                          "type": "string",
                          "enum": [
                            "director",
                            "non_executive_director",
                            "secretary",
                            "chairman",
                            "ubo",
                            "shareholder",
                            "representative",
                            "founder",
                            "legal_advisor",
                            "authorized_signatory",
                            "trustee",
                            "beneficiary",
                            "settlor",
                            "protector",
                            "company_officer",
                            "investor",
                            "other"
                          ],
                          "description": "Rolle, die die Partei innehat. Austauschbar mit `roles`; wenn beide übermittelt werden, werden sie zusammengeführt."
                        },
                        "roles": {
                          "type": "array",
                          "items": {
                            "type": "string",
                            "enum": [
                              "director",
                              "non_executive_director",
                              "secretary",
                              "chairman",
                              "ubo",
                              "shareholder",
                              "representative",
                              "founder",
                              "legal_advisor",
                              "authorized_signatory",
                              "trustee",
                              "beneficiary",
                              "settlor",
                              "protector",
                              "company_officer",
                              "investor",
                              "other"
                            ]
                          },
                          "description": "Jede Rolle, die die Partei innehat. Eine Person benötigt mindestens eine Rolle (hier oder in `role`)."
                        },
                        "position": {
                          "type": "string",
                          "maxLength": 128,
                          "description": "Berufsbezeichnung einer Person."
                        },
                        "date_of_birth": {
                          "type": "string",
                          "format": "date",
                          "nullable": true
                        },
                        "company_name": {
                          "type": "string",
                          "maxLength": 255,
                          "description": "Name einer Unternehmenspartei. Erforderlich, wenn `entity_type` `company` ist."
                        },
                        "registration_number": {
                          "type": "string",
                          "maxLength": 100,
                          "description": "Registernummer einer Unternehmenspartei."
                        },
                        "email": {
                          "type": "string",
                          "format": "email",
                          "description": "Wohin der Verifizierungslink gesendet wird. Erforderlich, wenn die Partei die Verifizierung abschließen muss, was von den Rolleneinstellungen und Eigentümerstruktur-Schwellenwerten des Workflows abhängt."
                        },
                        "ownership_percent": {
                          "type": "number",
                          "nullable": true,
                          "description": "Anteil am Unternehmen, den die Partei besitzt."
                        },
                        "nationality": {
                          "type": "string",
                          "maxLength": 100,
                          "description": "Staatsangehörigkeit einer Person oder Gründungsland eines Unternehmens. Erforderlich für jede Partei."
                        },
                        "phone_number": {
                          "type": "string",
                          "maxLength": 32
                        },
                        "custom_fields": {
                          "type": "object",
                          "additionalProperties": true,
                          "description": "Vom Workflow definierte Zusatzfelder."
                        },
                        "skip_verification": {
                          "type": "boolean",
                          "default": false,
                          "description": "Anfordern, die Verifizierung dieser Partei zu überspringen. Wird nur berücksichtigt, wenn die Rolle der Partei das Überspringen in den Einstellungen für Schlüsselpersonen des Workflows zulässt."
                        }
                      }
                    }
                  }
                },
                "example": {
                  "draft_id": "5b0d7a52-9d3e-4f0c-8c6a-0e5f3a1b2c4d",
                  "created_at": "2026-10-31T10:00:00Z",
                  "updated_at": "2026-10-31T10:00:00Z",
                  "party": {
                    "entity_type": "person",
                    "first_name": "Ana",
                    "last_name": "Lopez",
                    "roles": [
                      "ubo",
                      "director"
                    ],
                    "ownership_percent": 55,
                    "nationality": "MEX",
                    "email": "ana.lopez@example.com",
                    "date_of_birth": "1984-06-12"
                  }
                }
              }
            }
          },
          "400": {
            "description": "Die zusammengeführte Partei ist ungültig.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string",
                      "description": "Lesbare Fehlermeldung."
                    }
                  }
                },
                "example": {
                  "non_field_errors": [
                    "Person parties require at least one role."
                  ]
                }
              }
            }
          },
          "401": {
            "description": "Der API-Schlüssel mit eingeschränktem Geltungsbereich ist abgelaufen. Dies ist der einzige Fall, der `401` zurückgibt: Ein fehlender, ungültiger oder widerrufener Schlüssel gibt `403` zurück.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string",
                      "description": "Lesbare Fehlermeldung."
                    }
                  }
                },
                "examples": {
                  "Expired key": {
                    "summary": "Das Ablaufdatum des Schlüssels ist überschritten",
                    "value": {
                      "detail": "This API key has expired."
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Authentifizierungs- oder Autorisierungsfehler. Ein fehlender Schlüssel gibt `403` zurück, ebenso wie der Schlüssel einer anderen Anwendung, ein berechtigungsbeschränkter Schlüssel ohne die für diesen Endpoint erforderliche Berechtigung sowie eine Anfrage von außerhalb der IP-Allowlist des Schlüssels; ein falscher, widerrufener oder abgelaufener Schlüssel gibt `401` zurück. Unterscheiden Sie diese anhand von `detail`.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string",
                      "description": "Lesbare Fehlermeldung."
                    }
                  }
                },
                "examples": {
                  "Missing or invalid credentials": {
                    "summary": "Kein x-api-key-Header vorhanden oder die Validierung des Schlüssels ist fehlgeschlagen",
                    "value": {
                      "detail": "Authentication credentials were not provided or are invalid."
                    }
                  },
                  "Other application": {
                    "summary": "Ein gültiger Schlüssel, der zu einer anderen Anwendung als die Sitzung gehört",
                    "value": {
                      "detail": "You do not have permission to perform this action."
                    }
                  },
                  "Scoped key without decisions write": {
                    "summary": "Dem Schlüssel mit eingeschränktem Berechtigungsumfang fehlt decisions: write",
                    "value": {
                      "detail": "This API key has no write access to decisions."
                    }
                  },
                  "IP not allowed": {
                    "summary": "Anfrage von außerhalb der IP-Allowlist des Schlüssels",
                    "value": {
                      "detail": "This API key can't be used from this IP address."
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Die Sitzung oder der Entwurf existiert nicht, oder die Sitzung liegt außerhalb der Anwendung des Schlüssels bzw. der Beschränkungen eines Scoped Keys.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string",
                      "description": "Lesbare Fehlermeldung."
                    }
                  }
                },
                "example": {
                  "detail": "Session not found."
                }
              }
            }
          },
          "409": {
            "description": "Die Sitzung ist abgeschlossen (`kyb_session_not_writable`).",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string",
                      "description": "Lesbare Fehlermeldung."
                    },
                    "code": {
                      "type": "string"
                    }
                  }
                },
                "example": {
                  "detail": "This verification session is no longer accepting changes.",
                  "code": "kyb_session_not_writable"
                }
              }
            }
          },
          "429": {
            "description": "Rate-Limit überschritten: 300 Schreibanfragen (POST, PATCH, DELETE) pro Minute pro API-Schlüssel. Warten Sie `Retry-After` Sekunden vor einem Wiederholungsversuch; die `X-RateLimit-*`-Header zeigen das Budget an.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string",
                      "description": "Lesbare Fehlermeldung."
                    }
                  }
                },
                "examples": {
                  "Rate limited": {
                    "summary": "Budget für die aktuelle Minute erschöpft",
                    "value": {
                      "detail": "Write request rate limit exceeded. You can make up to 300 requests per minute."
                    }
                  }
                }
              }
            },
            "headers": {
              "Retry-After": {
                "description": "Sekunden, die vor einem Wiederholungsversuch gewartet werden müssen.",
                "schema": {
                  "type": "integer",
                  "minimum": 1,
                  "example": 30
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.sessions.update_kyb_party_draft(\n    \"33333333-4444-5555-6666-777777777777\",\n    \"5b0d7a52-9d3e-4f0c-8c6a-0e5f3a1b2c4d\",\n    ownership_percent=55.0,\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.sessions.updateKybPartyDraft(\n  \"33333333-4444-5555-6666-777777777777\",\n  \"5b0d7a52-9d3e-4f0c-8c6a-0e5f3a1b2c4d\",\n  {\n    ownership_percent: 55.0,\n  },\n);\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Sessions.UpdateKYBPartyDraft(ctx, \"33333333-4444-5555-6666-777777777777\", \"5b0d7a52-9d3e-4f0c-8c6a-0e5f3a1b2c4d\", didit.SessionsUpdateKYBPartyDraftParams{\n\tOwnershipPercent: didit.Float(55.0),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\nimport me.didit.types.SessionsUpdateKybPartyDraftParams;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.sessions().updateKybPartyDraft(\"33333333-4444-5555-6666-777777777777\", \"5b0d7a52-9d3e-4f0c-8c6a-0e5f3a1b2c4d\", SessionsUpdateKybPartyDraftParams.builder()\n        .ownershipPercent(55.0)\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->sessions->updateKybPartyDraft('33333333-4444-5555-6666-777777777777', '5b0d7a52-9d3e-4f0c-8c6a-0e5f3a1b2c4d', [\n    'ownership_percent' => 55.0,\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.sessions.update_kyb_party_draft(\n  \"33333333-4444-5555-6666-777777777777\",\n  \"5b0d7a52-9d3e-4f0c-8c6a-0e5f3a1b2c4d\",\n  ownership_percent: 55.0\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Sessions.UpdateKybPartyDraftAsync(\"33333333-4444-5555-6666-777777777777\", \"5b0d7a52-9d3e-4f0c-8c6a-0e5f3a1b2c4d\", new SessionsUpdateKybPartyDraftParams\n{\n    OwnershipPercent = 55.0,\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ]
      },
      "delete": {
        "summary": "Einen Entwurf einer KYB-Partei löschen",
        "description": "Einen Parteientwurf verwerfen. Deklarierte Parteien sind nicht betroffen. Erfordert `write:businesses`.",
        "operationId": "delete_v3_session_kyb_party_draft",
        "x-didit-sdk": {
          "resource": "sessions",
          "method": "delete_kyb_party_draft",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Sessions"
        ],
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "parameters": [
          {
            "name": "sessionId",
            "in": "path",
            "required": true,
            "description": "UUID der Sitzung zur Unternehmensverifizierung (KYB). Sie muss zu der Anwendung des API-Schlüssels gehören.",
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "33333333-4444-5555-6666-777777777777"
            }
          },
          {
            "name": "draftId",
            "in": "path",
            "required": true,
            "description": "UUID des Entwurfs der Partei (`draft_id`, die bei der Erstellung zurückgegeben wurde).",
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "5b0d7a52-9d3e-4f0c-8c6a-0e5f3a1b2c4d"
            }
          },
          {
            "name": "node_id",
            "in": "query",
            "required": false,
            "description": "Workflow-Knoten des KYB-Schritts. Nur erforderlich, wenn der Workflow mehr als einen KYB-Knoten enthält; standardmäßig verwendet Didit den sitzungseigenen Knoten.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "204": {
            "description": "Entwurf gelöscht. Kein Body."
          },
          "401": {
            "description": "Der API-Schlüssel mit eingeschränktem Geltungsbereich ist abgelaufen. Dies ist der einzige Fall, der `401` zurückgibt: Ein fehlender, ungültiger oder widerrufener Schlüssel gibt `403` zurück.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string",
                      "description": "Lesbare Fehlermeldung."
                    }
                  }
                },
                "examples": {
                  "Expired key": {
                    "summary": "Das Ablaufdatum des Schlüssels ist überschritten",
                    "value": {
                      "detail": "This API key has expired."
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Authentifizierungs- oder Autorisierungsfehler. Ein fehlender Schlüssel gibt `403` zurück, ebenso wie der Schlüssel einer anderen Anwendung, ein berechtigungsbeschränkter Schlüssel ohne die für diesen Endpoint erforderliche Berechtigung sowie eine Anfrage von außerhalb der IP-Allowlist des Schlüssels; ein falscher, widerrufener oder abgelaufener Schlüssel gibt `401` zurück. Unterscheiden Sie diese anhand von `detail`.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string",
                      "description": "Lesbare Fehlermeldung."
                    }
                  }
                },
                "examples": {
                  "Missing or invalid credentials": {
                    "summary": "Kein x-api-key-Header vorhanden oder die Validierung des Schlüssels ist fehlgeschlagen",
                    "value": {
                      "detail": "Authentication credentials were not provided or are invalid."
                    }
                  },
                  "Other application": {
                    "summary": "Ein gültiger Schlüssel, der zu einer anderen Anwendung als die Sitzung gehört",
                    "value": {
                      "detail": "You do not have permission to perform this action."
                    }
                  },
                  "Scoped key without decisions write": {
                    "summary": "Dem Schlüssel mit eingeschränktem Berechtigungsumfang fehlt decisions: write",
                    "value": {
                      "detail": "This API key has no write access to decisions."
                    }
                  },
                  "IP not allowed": {
                    "summary": "Anfrage von außerhalb der IP-Allowlist des Schlüssels",
                    "value": {
                      "detail": "This API key can't be used from this IP address."
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Die Sitzung oder der Entwurf existiert nicht, oder die Sitzung liegt außerhalb der Anwendung des Schlüssels bzw. der Beschränkungen eines Scoped Keys.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string",
                      "description": "Lesbare Fehlermeldung."
                    }
                  }
                },
                "example": {
                  "detail": "Session not found."
                }
              }
            }
          },
          "409": {
            "description": "Die Sitzung ist abgeschlossen (`kyb_session_not_writable`).",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string",
                      "description": "Lesbare Fehlermeldung."
                    },
                    "code": {
                      "type": "string"
                    }
                  }
                },
                "example": {
                  "detail": "This verification session is no longer accepting changes.",
                  "code": "kyb_session_not_writable"
                }
              }
            }
          },
          "429": {
            "description": "Rate-Limit überschritten: 300 Schreibanfragen (POST, PATCH, DELETE) pro Minute pro API-Schlüssel. Warten Sie `Retry-After` Sekunden vor einem Wiederholungsversuch; die `X-RateLimit-*`-Header zeigen das Budget an.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string",
                      "description": "Lesbare Fehlermeldung."
                    }
                  }
                },
                "examples": {
                  "Rate limited": {
                    "summary": "Budget für die aktuelle Minute erschöpft",
                    "value": {
                      "detail": "Write request rate limit exceeded. You can make up to 300 requests per minute."
                    }
                  }
                }
              }
            },
            "headers": {
              "Retry-After": {
                "description": "Sekunden, die vor einem Wiederholungsversuch gewartet werden müssen.",
                "schema": {
                  "type": "integer",
                  "minimum": 1,
                  "example": 30
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nclient.sessions.delete_kyb_party_draft(\n    \"33333333-4444-5555-6666-777777777777\",\n    \"5b0d7a52-9d3e-4f0c-8c6a-0e5f3a1b2c4d\",\n)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nawait didit.sessions.deleteKybPartyDraft(\n  \"33333333-4444-5555-6666-777777777777\",\n  \"5b0d7a52-9d3e-4f0c-8c6a-0e5f3a1b2c4d\",\n);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nif err := client.Sessions.DeleteKYBPartyDraft(ctx, \"33333333-4444-5555-6666-777777777777\", \"5b0d7a52-9d3e-4f0c-8c6a-0e5f3a1b2c4d\", didit.SessionsDeleteKYBPartyDraftParams{}); err != nil {\n\tlog.Fatal(err)\n}"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nclient.sessions().deleteKybPartyDraft(\"33333333-4444-5555-6666-777777777777\", \"5b0d7a52-9d3e-4f0c-8c6a-0e5f3a1b2c4d\");"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$didit->sessions->deleteKybPartyDraft('33333333-4444-5555-6666-777777777777', '5b0d7a52-9d3e-4f0c-8c6a-0e5f3a1b2c4d');"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\ndidit.sessions.delete_kyb_party_draft(\n  \"33333333-4444-5555-6666-777777777777\",\n  \"5b0d7a52-9d3e-4f0c-8c6a-0e5f3a1b2c4d\"\n)"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nawait client.Sessions.DeleteKybPartyDraftAsync(\"33333333-4444-5555-6666-777777777777\", \"5b0d7a52-9d3e-4f0c-8c6a-0e5f3a1b2c4d\");"
          }
        ]
      }
    },
    "/v3/session/{sessionId}/kyb/parties/submit/": {
      "post": {
        "summary": "Entwürfe der KYB-Beteiligten übermitteln",
        "description": "Deklarieren Sie die gespeicherten Entwürfe als Schlüsselpersonen des Unternehmens. Dies ist der gehostete Schritt „Schlüsselpersonen“ unter Ihrem API-Schlüssel: Didit entscheidet anhand der Rolleneinstellungen und Schwellenwerte für die Eigentümerstruktur des Workflows, welche Parteien verifiziert werden müssen, erstellt für jede von ihnen eine individuelle KYC-Sitzung (oder eine KYB-Subsitzung für einen juristischen Eigentümer), versendet die vom Workflow geforderten E-Mails und bringt die Sitzung voran. Jede untergeordnete Sitzung wird wie im gehosteten Ablauf abgerechnet. Die Entwürfe werden verbraucht. Ein erneuter Aufruf nach erfolgreicher Übermittlung ändert nichts und antwortet mit `200` mit `already_submitted: true` sowie den bereits vorhandenen Parteien. Die Sitzung muss sich im Schritt „Schlüsselpersonen“ befinden. Senden Sie die `kyc_session_url` jeder Person an diese oder binden Sie sie ein. Erfordert `write:businesses`.",
        "operationId": "post_v3_session_kyb_parties_submit",
        "x-didit-sdk": {
          "resource": "sessions",
          "method": "submit_kyb_parties",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Sessions"
        ],
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "parameters": [
          {
            "name": "sessionId",
            "in": "path",
            "required": true,
            "description": "UUID der Sitzung zur Unternehmensverifizierung (KYB). Sie muss zu der Anwendung des API-Schlüssels gehören.",
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "33333333-4444-5555-6666-777777777777"
            }
          },
          {
            "name": "node_id",
            "in": "query",
            "required": false,
            "description": "Workflow-Knoten des KYB-Schritts. Nur erforderlich, wenn der Workflow mehr als einen KYB-Knoten enthält; standardmäßig verwendet Didit den sitzungseigenen Knoten.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "locale": {
                    "type": "string",
                    "maxLength": 10,
                    "description": "Gebietsschema zur Übersetzung der Antwort des Schritts, zu dem die Sitzung übergeht."
                  }
                }
              },
              "example": {
                "locale": "es"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Deklarierte (oder bereits deklarierte) Parteien.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "valid": {
                      "type": "boolean"
                    },
                    "next_step": {
                      "type": "string",
                      "nullable": true,
                      "description": "Schritt, in dem sich die Sitzung befindet."
                    },
                    "status": {
                      "type": "string",
                      "description": "Status der Unternehmenssitzung."
                    },
                    "advanced": {
                      "type": "boolean",
                      "description": "`true`, wenn dieser Aufruf die Parteien deklariert und die Sitzung weitergeführt hat."
                    },
                    "already_submitted": {
                      "type": "boolean",
                      "description": "`true`, wenn die Parteien durch einen früheren Aufruf deklariert worden waren."
                    },
                    "kyb_key_people_status": {
                      "type": "string"
                    },
                    "parties": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/KYBKeyPeopleParty"
                      }
                    }
                  }
                },
                "example": {
                  "valid": true,
                  "next_step": "FINISHED",
                  "status": "In Progress",
                  "advanced": true,
                  "already_submitted": false,
                  "kyb_key_people_status": "In Progress",
                  "parties": []
                }
              }
            }
          },
          "402": {
            "description": "Die Organisation hat keinen Credit mehr für die untergeordneten Verifizierungssitzungen übrig.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string",
                      "description": "Lesbare Fehlermeldung."
                    }
                  }
                },
                "example": {
                  "detail": "Insufficient credits."
                }
              }
            }
          },
          "401": {
            "description": "Der API-Schlüssel mit eingeschränktem Geltungsbereich ist abgelaufen. Dies ist der einzige Fall, der `401` zurückgibt: Ein fehlender, ungültiger oder widerrufener Schlüssel gibt `403` zurück.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string",
                      "description": "Lesbare Fehlermeldung."
                    }
                  }
                },
                "examples": {
                  "Expired key": {
                    "summary": "Das Ablaufdatum des Schlüssels ist überschritten",
                    "value": {
                      "detail": "This API key has expired."
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Authentifizierungs- oder Autorisierungsfehler. Ein fehlender Schlüssel gibt `403` zurück, ebenso wie der Schlüssel einer anderen Anwendung, ein berechtigungsbeschränkter Schlüssel ohne die für diesen Endpoint erforderliche Berechtigung sowie eine Anfrage von außerhalb der IP-Allowlist des Schlüssels; ein falscher, widerrufener oder abgelaufener Schlüssel gibt `401` zurück. Unterscheiden Sie diese anhand von `detail`.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string",
                      "description": "Lesbare Fehlermeldung."
                    }
                  }
                },
                "examples": {
                  "Missing or invalid credentials": {
                    "summary": "Kein x-api-key-Header vorhanden oder die Validierung des Schlüssels ist fehlgeschlagen",
                    "value": {
                      "detail": "Authentication credentials were not provided or are invalid."
                    }
                  },
                  "Other application": {
                    "summary": "Ein gültiger Schlüssel, der zu einer anderen Anwendung als die Sitzung gehört",
                    "value": {
                      "detail": "You do not have permission to perform this action."
                    }
                  },
                  "Scoped key without decisions write": {
                    "summary": "Dem Schlüssel mit eingeschränktem Berechtigungsumfang fehlt decisions: write",
                    "value": {
                      "detail": "This API key has no write access to decisions."
                    }
                  },
                  "IP not allowed": {
                    "summary": "Anfrage von außerhalb der IP-Allowlist des Schlüssels",
                    "value": {
                      "detail": "This API key can't be used from this IP address."
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Die Sitzung existiert nicht, wurde gelöscht, gehört zu einer anderen Anwendung oder liegt außerhalb der Beschränkungen eines Scoped Keys; kein Detail unterscheidet diese Fälle.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string",
                      "description": "Lesbare Fehlermeldung."
                    }
                  }
                },
                "example": {
                  "detail": "Session not found."
                }
              }
            }
          },
          "409": {
            "description": "`kyb_no_party_drafts`: Es gibt nichts zu übermitteln. `kyb_parties_already_submitted`: Entwürfe wurden hinzugefügt, nachdem die Parteien deklariert wurden. `kyb_step_mismatch`: Die Sitzung befindet sich nicht im Schritt für Schlüsselpersonen (`next_step` benennt den aktuellen Schritt). `kyb_session_not_writable`: Die Sitzung ist abgeschlossen.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string",
                      "description": "Lesbare Fehlermeldung."
                    },
                    "code": {
                      "type": "string"
                    },
                    "next_step": {
                      "type": "string"
                    }
                  }
                },
                "example": {
                  "detail": "There are no draft parties to submit.",
                  "code": "kyb_no_party_drafts"
                }
              }
            }
          },
          "429": {
            "description": "Rate-Limit überschritten: 300 Schreibanfragen (POST, PATCH, DELETE) pro Minute pro API-Schlüssel. Warten Sie `Retry-After` Sekunden vor einem Wiederholungsversuch; die `X-RateLimit-*`-Header zeigen das Budget an.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string",
                      "description": "Lesbare Fehlermeldung."
                    }
                  }
                },
                "examples": {
                  "Rate limited": {
                    "summary": "Budget für die aktuelle Minute erschöpft",
                    "value": {
                      "detail": "Write request rate limit exceeded. You can make up to 300 requests per minute."
                    }
                  }
                }
              }
            },
            "headers": {
              "Retry-After": {
                "description": "Sekunden, die vor einem Wiederholungsversuch gewartet werden müssen.",
                "schema": {
                  "type": "integer",
                  "minimum": 1,
                  "example": 30
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.sessions.submit_kyb_parties(\n    \"33333333-4444-5555-6666-777777777777\",\n    locale=\"es\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.sessions.submitKybParties(\"33333333-4444-5555-6666-777777777777\", {\n  locale: \"es\",\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Sessions.SubmitKYBParties(ctx, \"33333333-4444-5555-6666-777777777777\", didit.SessionsSubmitKYBPartiesParams{\n\tLocale: didit.String(\"es\"),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\nimport me.didit.types.SessionsSubmitKybPartiesParams;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.sessions().submitKybParties(\"33333333-4444-5555-6666-777777777777\", SessionsSubmitKybPartiesParams.builder()\n        .locale(\"es\")\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->sessions->submitKybParties('33333333-4444-5555-6666-777777777777', [\n    'locale' => 'es',\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.sessions.submit_kyb_parties(\n  \"33333333-4444-5555-6666-777777777777\",\n  locale: \"es\"\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Sessions.SubmitKybPartiesAsync(\"33333333-4444-5555-6666-777777777777\", new SessionsSubmitKybPartiesParams\n{\n    Locale = \"es\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ]
      }
    },
    "/v3/session/{sessionId}/files-export/": {
      "post": {
        "summary": "Alle Dateien einer Sitzung exportieren",
        "description": "Die Vorbereitung einer ZIP-Datei mit jedem Bild, Video und Dokument einer Benutzerverifizierungs- (KYC) oder Unternehmensverifizierungs-Sitzung (KYB) in Originalqualität starten: Die Dateien werden so in der ZIP gespeichert, wie sie erfasst wurden, und niemals erneut komprimiert. Liefert mit `202` den Export zurück; lesen Sie ihn mit `GET /v3/session/{sessionId}/files-export/{exportId}/` aus, bis `status` `READY` lautet, und laden Sie dann `download_url` herunter. Während ein Export derselben Sitzung noch vorbereitet wird, wird dieser Export anstelle eines neuen zurückgegeben.\n\nDie ZIP-Datei wird 24 Stunden nach ihrer Fertigstellung gelöscht und sofort, wenn die Sitzung gelöscht wird. Eine gelöschte Sitzung kann nicht exportiert werden. Jeder Export und jeder ausgegebene Download-Link wird im Audit-Log der Sitzung protokolliert. Ein berechtigungsbeschränkter API-Schlüssel benötigt `media: read` und `decisions: read`; ein Konsolenbenutzer benötigt die Berechtigung zum Lesen von Sitzungen.",
        "operationId": "post_v3_session_files_export",
        "x-didit-sdk": {
          "resource": "sessions",
          "method": "export_files",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Sessions"
        ],
        "parameters": [
          {
            "name": "sessionId",
            "in": "path",
            "required": true,
            "description": "UUID der Verifizierungssitzung (die von `POST /v3/session/` zurückgegebene `session_id`). Akzeptiert Sitzungs-IDs sowohl für die Benutzerverifizierung (KYC) als auch für die Unternehmensverifizierung (KYB). Eine gelöschte Sitzung gibt `404` zurück.",
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "11111111-2222-3333-4444-555555555555"
            }
          }
        ],
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X POST 'https://verification.didit.me/v3/session/11111111-2222-3333-4444-555555555555/files-export/' \\\n  -H 'x-api-key: YOUR_API_KEY'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.sessions.export_files(\n    \"11111111-2222-3333-4444-555555555555\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.sessions.exportFiles(\"11111111-2222-3333-4444-555555555555\");\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Sessions.ExportFiles(ctx, \"11111111-2222-3333-4444-555555555555\")\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.sessions().exportFiles(\"11111111-2222-3333-4444-555555555555\");\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->sessions->exportFiles('11111111-2222-3333-4444-555555555555');\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.sessions.export_files(\"11111111-2222-3333-4444-555555555555\")\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Sessions.ExportFilesAsync(\"11111111-2222-3333-4444-555555555555\");\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "responses": {
          "202": {
            "description": "Der Export wird vorbereitet.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SessionFilesExport"
                },
                "example": {
                  "export_id": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee",
                  "session_id": "11111111-2222-3333-4444-555555555555",
                  "status": "PENDING",
                  "file_count": null,
                  "size_bytes": null,
                  "download_url": null,
                  "expires_at": null,
                  "error": null,
                  "created_at": "2026-10-29T12:00:03Z",
                  "completed_at": null
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/v3/session/{sessionId}/files-export/{exportId}/": {
      "get": {
        "summary": "Export von Sitzungsdateien abrufen",
        "description": "Fortschritt eines mit `POST /v3/session/{sessionId}/files-export/` gestarteten Exports. Sobald der `status` `READY` lautet, ist `download_url` eine signierte URL der ZIP-Datei, die für kurze Zeit gültig bleibt; rufen Sie den Export erneut ab, um bis `expires_at` eine neue zu erhalten. Jeder Abruf, der einen Download-Link ausgibt, wird in das Audit-Log der Sitzung geschrieben. Ein Export einer gelöschten Sitzung gibt `404` zurück.",
        "operationId": "get_v3_session_files_export",
        "x-didit-sdk": {
          "resource": "sessions",
          "method": "get_files_export",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Sessions"
        ],
        "parameters": [
          {
            "name": "sessionId",
            "in": "path",
            "required": true,
            "description": "UUID der Verifizierungssitzung (die von `POST /v3/session/` zurückgegebene `session_id`). Akzeptiert Sitzungs-IDs sowohl für die Benutzerverifizierung (KYC) als auch für die Unternehmensverifizierung (KYB). Eine gelöschte Sitzung gibt `404` zurück.",
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "11111111-2222-3333-4444-555555555555"
            }
          },
          {
            "name": "exportId",
            "in": "path",
            "required": true,
            "description": "Die von `POST /v3/session/{sessionId}/files-export/` zurückgegebene `export_id`.",
            "schema": {
              "type": "string",
              "format": "uuid",
              "example": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee"
            }
          }
        ],
        "x-codeSamples": [
          {
            "lang": "curl",
            "label": "curl",
            "source": "curl -X GET 'https://verification.didit.me/v3/session/11111111-2222-3333-4444-555555555555/files-export/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/' \\\n  -H 'x-api-key: YOUR_API_KEY'"
          },
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.sessions.get_files_export(\n    \"11111111-2222-3333-4444-555555555555\",\n    \"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.sessions.getFilesExport(\n  \"11111111-2222-3333-4444-555555555555\",\n  \"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\",\n);\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Sessions.GetFilesExport(ctx, \"11111111-2222-3333-4444-555555555555\", \"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\")\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.sessions().getFilesExport(\"11111111-2222-3333-4444-555555555555\", \"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\");\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->sessions->getFilesExport('11111111-2222-3333-4444-555555555555', 'aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee');\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.sessions.get_files_export(\n  \"11111111-2222-3333-4444-555555555555\",\n  \"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\"\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.Sessions.GetFilesExportAsync(\"11111111-2222-3333-4444-555555555555\", \"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\");\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ],
        "responses": {
          "200": {
            "description": "Der Export.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SessionFilesExport"
                },
                "example": {
                  "export_id": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee",
                  "session_id": "11111111-2222-3333-4444-555555555555",
                  "status": "READY",
                  "file_count": 9,
                  "size_bytes": 18734120,
                  "download_url": "https://storage.example.com/session/11111111-2222-3333-4444-555555555555/files-export/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/session-42-files.zip?X-Amz-Signature=...",
                  "expires_at": "2026-10-30T12:00:41Z",
                  "error": null,
                  "created_at": "2026-10-29T12:00:03Z",
                  "completed_at": "2026-10-29T12:00:41Z"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/v3/travel-rule/unmatched/": {
      "get": {
        "summary": "Nicht zugeordnete Travel Rule-Einzahlungen auflisten",
        "description": "Eingehende Einzahlungen, die noch auf die Travel-Rule-Daten des auftraggebenden VASP warten: Ihr Transfer ist `AWAITING_COUNTERPARTY`, `NOT_ENOUGH_COUNTERPARTY_DATA` oder `COUNTERPARTY_VASP_NOT_FOUND`, ihnen ist keine empfangene Nachricht zugeordnet und niemand hat sie manuell abgeglichen. Die Zeilen und Filter sind dieselben wie in `GET /v3/travel-rule/transfers/`, die neuesten zuerst, paginiert mit `limit` (Standard 50) und `offset`. Ordnen Sie eine Einzahlung der vom auftraggebenden VASP gesendeten Nachricht mit `POST /v3/travel-rule/unmatched/{transaction_uuid}/match/` zu.",
        "operationId": "listUnmatchedTravelRuleDeposits",
        "x-didit-sdk": {
          "resource": "travel_rule.unmatched_deposits",
          "method": "list",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Travel Rule"
        ],
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "parameters": [
          {
            "name": "direction",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "INBOUND, OUTBOUND oder beides durch Kommas getrennt. Groß-/Kleinschreibung wird beachtet."
          },
          {
            "name": "status",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "Ein oder mehrere Transferstatus, kommagetrennt."
          },
          {
            "name": "rail",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "Einer oder mehrere der Werte INTERNAL, TRP, GTR, TRUST, VERIFYVASP, SYGNA, EMAIL, TEST_VASP, kommagetrennt."
          },
          {
            "name": "kind",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "withdrawal, deposit oder message, kommagetrennt."
          },
          {
            "name": "currency",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "Die Währung der Transaktion, ohne Berücksichtigung der Groß-/Kleinschreibung."
          },
          {
            "name": "start_date",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "date"
            },
            "description": "Transfers, die an oder nach diesem Tag (UTC) erstellt wurden, YYYY-MM-DD."
          },
          {
            "name": "end_date",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "date"
            },
            "description": "Transfers, die an oder vor diesem Tag (UTC) erstellt wurden, YYYY-MM-DD."
          },
          {
            "name": "counterparty",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Die `id` eines Verzeichniseintrags oder Didit-Netzwerkmitglieds aus GET /v3/travel-rule/vasps/: Ihre Übertragungen mit dieser Gegenpartei. Bei einem Wert, der keine gültige ID ist, wird 400 zurückgegeben."
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 1000000
            },
            "description": "Seitengröße, Standardwert 50."
          },
          {
            "name": "offset",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 0,
              "maximum": 1000000
            },
            "description": "Zu überspringende Zeilen."
          }
        ],
        "responses": {
          "200": {
            "description": "Eine Seite mit nicht zugeordneten Einzahlungen.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "count": {
                      "type": "integer"
                    },
                    "next": {
                      "type": "string",
                      "nullable": true
                    },
                    "previous": {
                      "type": "string",
                      "nullable": true
                    },
                    "results": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/TravelRuleTransferRow"
                      }
                    }
                  }
                },
                "example": {
                  "count": 1,
                  "next": null,
                  "previous": null,
                  "results": [
                    {
                      "id": "7d3a1c55-0b9e-4d52-8a3c-1f6e2b9d4a08",
                      "transaction_id": "c41f9b2e-5a8d-4e0c-9f17-3b6d8a2e5c91",
                      "txn_id": "dep-2026-10-20-0007",
                      "txn_date": "2026-10-19T08:41:12Z",
                      "kind": "deposit",
                      "direction": "INBOUND",
                      "status": "AWAITING_COUNTERPARTY",
                      "rail": "TRP",
                      "asset": "ETH",
                      "amount": "1.25",
                      "originator_vasp": "",
                      "beneficiary_vasp": "Example Counterparty VASP",
                      "originator_wallet": "0x77ccff0cc624a53cd8b8d8703ced826710211ec7",
                      "beneficiary_wallet": "0xede2d7e4f5b097e6391ab6bbcf2f47a53f4778cb",
                      "originator_memo": "",
                      "beneficiary_memo": "",
                      "originator_wallet_type": "vasp",
                      "beneficiary_wallet_type": "vasp",
                      "matched_transaction_id": null,
                      "deadline_at": null,
                      "created_at": "2026-10-19T08:41:13Z"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "Ein Filterwert ist ungültig.",
            "content": {
              "application/json": {
                "example": {
                  "start_date": [
                    "Use the YYYY-MM-DD format."
                  ]
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          }
        },
        "x-codeSamples": [
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nfor item in client.travel_rule.unmatched_deposits.list():\n    print(item)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nfor await (const item of didit.travelRule.unmatchedDeposits.list()) {\n  console.log(item);\n}"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\niter := client.TravelRule.UnmatchedDeposits.ListAutoPaging(ctx, didit.TravelRuleUnmatchedDepositsListParams{})\nfor iter.Next() {\n\tfmt.Printf(\"%+v\\n\", iter.Current())\n}\nif err := iter.Err(); err != nil {\n\tlog.Fatal(err)\n}"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nfor (var item : client.travelRule().unmatchedDeposits().list()) {\n    System.out.println(item);\n}"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\nforeach ($didit->travelRule->unmatchedDeposits->list() as $item) {\n    print_r($item->toArray());\n}"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\ndidit.travel_rule.unmatched_deposits.list.auto_paging_each do |item|\n  puts item.to_h\nend"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nawait foreach (var item in await client.TravelRule.UnmatchedDeposits.ListAsync())\n{\n    Console.WriteLine(JsonSerializer.Serialize(item));\n}"
          }
        ]
      }
    },
    "/v3/travel-rule/unmatched/{transaction_uuid}/match/": {
      "post": {
        "summary": "Eine Einzahlung nach der Travel Rule einer empfangenen Nachricht zuordnen",
        "operationId": "matchUnmatchedTravelRuleDeposit",
        "x-didit-sdk": {
          "resource": "travel_rule.unmatched_deposits",
          "method": "match",
          "auth": "api_key",
          "server": true
        },
        "tags": [
          "Travel Rule"
        ],
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "description": "Verknüpfen Sie eine eingehende Einzahlung, die noch auf Auftraggeberdaten wartet, mit der Travel-Rule-Nachricht, die der auftraggebende VASP dafür gesendet hat. Die Einzahlung übernimmt die Auftraggeberdaten, den Gegenpartei-VASP und den Zahlungsweg der Nachricht, und beide Transfers protokollieren den Abgleich auf ihren Zeitleisten. `transaction_uuid` ist die `transaction_id` der Einzahlung aus `GET /v3/travel-rule/unmatched/`. `transaction_id` im Body ist die `transaction_id` der empfangenen Nachricht aus einer Zeile von `GET /v3/travel-rule/transfers/?kind=message`; die eigene `id` des Transfers wird nicht gefunden. Die Nachricht muss sich auf dasselbe Asset wie die Einzahlung beziehen. Eine in der Console gelöschte Einzahlung oder Nachricht antwortet mit `404`; eine, die bereits weiterverarbeitet wurde (zugeordnet oder nicht mehr wartend), antwortet mit `409`.",
        "parameters": [
          {
            "name": "transaction_uuid",
            "in": "path",
            "required": true,
            "description": "Die `transaction_id` der nicht zugeordneten Einzahlung.",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TravelRuleManualMatchRequest"
              },
              "example": {
                "transaction_id": "e90a4d7b-1c2f-4b83-a6d5-8f0e3c1b7a24"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Beide Transfers nach dem Abgleich.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TravelRuleManualMatchResponse"
                },
                "example": {
                  "deposit": {
                    "id": "7d3a1c55-0b9e-4d52-8a3c-1f6e2b9d4a08",
                    "transaction_id": "c41f9b2e-5a8d-4e0c-9f17-3b6d8a2e5c91",
                    "txn_id": "dep-2026-10-20-0007",
                    "txn_date": "2026-10-19T08:41:12Z",
                    "kind": "deposit",
                    "direction": "INBOUND",
                    "status": "AWAITING_COUNTERPARTY",
                    "rail": "TRP",
                    "asset": "ETH",
                    "amount": "1.25",
                    "originator_vasp": "Example Counterparty VASP",
                    "beneficiary_vasp": "Example Counterparty VASP",
                    "originator_wallet": "0x77ccff0cc624a53cd8b8d8703ced826710211ec7",
                    "beneficiary_wallet": "0xede2d7e4f5b097e6391ab6bbcf2f47a53f4778cb",
                    "originator_memo": "",
                    "beneficiary_memo": "",
                    "originator_wallet_type": "vasp",
                    "beneficiary_wallet_type": "vasp",
                    "matched_transaction_id": "e90a4d7b-1c2f-4b83-a6d5-8f0e3c1b7a24",
                    "deadline_at": null,
                    "created_at": "2026-10-19T08:41:13Z"
                  },
                  "message": {
                    "id": "2b8e6f10-9c3a-47d1-b5e2-0a4c7d9f3e66",
                    "transaction_id": "e90a4d7b-1c2f-4b83-a6d5-8f0e3c1b7a24",
                    "txn_id": "msg-2026-10-20-0003",
                    "txn_date": "2026-10-19T08:41:12Z",
                    "kind": "message",
                    "direction": "INBOUND",
                    "status": "COMPLETED",
                    "rail": "TRP",
                    "asset": "ETH",
                    "amount": "1.25",
                    "originator_vasp": "Origin CASP SL",
                    "beneficiary_vasp": "Example Counterparty VASP",
                    "originator_wallet": "0x77ccff0cc624a53cd8b8d8703ced826710211ec7",
                    "beneficiary_wallet": "0xede2d7e4f5b097e6391ab6bbcf2f47a53f4778cb",
                    "originator_memo": "",
                    "beneficiary_memo": "",
                    "originator_wallet_type": "vasp",
                    "beneficiary_wallet_type": "vasp",
                    "matched_transaction_id": null,
                    "deadline_at": "2026-10-21T08:41:13Z",
                    "created_at": "2026-10-19T08:41:13Z"
                  }
                }
              }
            }
          },
          "400": {
            "description": "Validierungsfehler: `transaction_id` fehlt, ist die Einzahlung selbst, ist keine empfangene Travel Rule-Nachricht oder bezieht sich auf ein anderes Asset als die Einzahlung; oder die Transaktion im Pfad ist keine eingehende Einzahlung.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string"
                    }
                  }
                },
                "examples": {
                  "Error": {
                    "value": {
                      "transaction_id": [
                        "The travel rule message is for a different asset than the deposit."
                      ]
                    }
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "description": "Unbekannte Einzahlung oder Nachricht, oder eine davon wurde gelöscht.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string"
                    }
                  }
                },
                "example": {
                  "detail": "No TravelRuleTransfer matches the given query."
                }
              }
            }
          },
          "409": {
            "description": "Die Einzahlung wartet nicht mehr auf Auftraggeberdaten oder die Nachricht ist bereits einer Einzahlung zugeordnet.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "detail": {
                      "type": "string"
                    }
                  }
                },
                "examples": {
                  "Error": {
                    "value": {
                      "detail": "This deposit is no longer waiting for originator data."
                    }
                  }
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "python",
            "label": "Python",
            "source": "from didit import Didit\n\n# Reads DIDIT_API_KEY.\nclient = Didit()\n\nresult = client.travel_rule.unmatched_deposits.match(\n    \"11111111-2222-3333-4444-555555555555\",\n    transaction_id=\"e90a4d7b-1c2f-4b83-a6d5-8f0e3c1b7a24\",\n)\nprint(result)"
          },
          {
            "lang": "javascript",
            "label": "Node.js",
            "source": "import Didit from \"@didit-protocol/sdk-node\";\n\n// Reads DIDIT_API_KEY.\nconst didit = new Didit();\n\nconst result = await didit.travelRule.unmatchedDeposits.match(\"11111111-2222-3333-4444-555555555555\", {\n  transaction_id: \"e90a4d7b-1c2f-4b83-a6d5-8f0e3c1b7a24\",\n});\nconsole.log(result);"
          },
          {
            "lang": "go",
            "label": "Go",
            "source": "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.TravelRule.UnmatchedDeposits.Match(ctx, \"11111111-2222-3333-4444-555555555555\", didit.TravelRuleManualMatchRequest{\n\tTransactionID: \"e90a4d7b-1c2f-4b83-a6d5-8f0e3c1b7a24\",\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
          },
          {
            "lang": "java",
            "label": "Java",
            "source": "import me.didit.Didit;\nimport me.didit.types.TravelRuleManualMatchRequest;\n\n// Reads DIDIT_API_KEY.\nDidit client = new Didit();\n\nvar result = client.travelRule().unmatchedDeposits().match(\"11111111-2222-3333-4444-555555555555\", TravelRuleManualMatchRequest.builder()\n        .transactionId(\"e90a4d7b-1c2f-4b83-a6d5-8f0e3c1b7a24\")\n        .build());\nSystem.out.println(result);"
          },
          {
            "lang": "php",
            "label": "PHP",
            "source": "<?php\n\nrequire 'vendor/autoload.php';\n\nuse Didit\\DiditClient;\n\n// Reads DIDIT_API_KEY.\n$didit = new DiditClient();\n\n$result = $didit->travelRule->unmatchedDeposits->match('11111111-2222-3333-4444-555555555555', [\n    'transaction_id' => 'e90a4d7b-1c2f-4b83-a6d5-8f0e3c1b7a24',\n]);\nprint_r($result->toArray());"
          },
          {
            "lang": "ruby",
            "label": "Ruby",
            "source": "require \"didit\"\n\n# Reads DIDIT_API_KEY.\ndidit = Didit::Client.new\n\nresult = didit.travel_rule.unmatched_deposits.match(\n  \"11111111-2222-3333-4444-555555555555\",\n  transaction_id: \"e90a4d7b-1c2f-4b83-a6d5-8f0e3c1b7a24\"\n)\nputs result.to_h"
          },
          {
            "lang": "csharp",
            "label": ".NET",
            "source": "using System;\nusing System.Text.Json;\nusing Didit;\n\n// Reads DIDIT_API_KEY.\nusing var client = new DiditClient();\n\nvar result = await client.TravelRule.UnmatchedDeposits.MatchAsync(\"11111111-2222-3333-4444-555555555555\", new TravelRuleManualMatchRequest\n{\n    TransactionId = \"e90a4d7b-1c2f-4b83-a6d5-8f0e3c1b7a24\",\n});\nConsole.WriteLine(JsonSerializer.Serialize(result));"
          }
        ]
      }
    }
  },
  "components": {
    "schemas": {
      "DocumentAIDetectedCode": {
        "type": "object",
        "required": [
          "type",
          "page_number",
          "position",
          "x",
          "y",
          "width",
          "height",
          "page_width",
          "page_height",
          "raw_payload",
          "parsed_payload"
        ],
        "properties": {
          "type": {
            "type": "string",
            "description": "Erkannte Symbologie, zum Beispiel `QR_CODE`, `CODE_128`, `EAN_13`, `DATA_MATRIX` oder `PDF_417`."
          },
          "page_number": {
            "type": "integer",
            "minimum": 1,
            "description": "1-basierte Seitennummer."
          },
          "position": {
            "type": "array",
            "nullable": true,
            "description": "Erkanntes Polygon in Pixelkoordinaten der gerenderten Seite. `null`, wenn keine verlässliche Position verfügbar ist.",
            "items": {
              "type": "array",
              "minItems": 2,
              "maxItems": 2,
              "items": {
                "type": "integer"
              }
            }
          },
          "x": {
            "type": "integer",
            "nullable": true,
            "description": "Linke Kante der Bounding-Box in Pixeln der gerenderten Seite."
          },
          "y": {
            "type": "integer",
            "nullable": true,
            "description": "Oberer Rand des Begrenzungsrahmens in Pixeln der gerenderten Seite."
          },
          "width": {
            "type": "integer",
            "nullable": true,
            "description": "Breite der Bounding-Box in Pixeln der gerenderten Seite."
          },
          "height": {
            "type": "integer",
            "nullable": true,
            "description": "Höhe der Bounding-Box in Pixeln der gerenderten Seite."
          },
          "page_width": {
            "type": "integer",
            "description": "Gerenderte Seitenbreite in Pixeln."
          },
          "page_height": {
            "type": "integer",
            "description": "Gerenderte Seitenhöhe in Pixeln."
          },
          "raw_payload": {
            "type": "string",
            "description": "Unverarbeitete Decoder-Payload als Base64-String, falls verfügbar; andernfalls ein leerer String."
          },
          "parsed_payload": {
            "nullable": true,
            "description": "Dekodierte Zeichenkette oder strukturierter Wert. `null`, wenn der Code gefunden wurde, aber nicht dekodiert werden konnte."
          }
        }
      },
      "SessionImportJob": {
        "type": "object",
        "required": [
          "uuid",
          "status",
          "import_type",
          "source_format",
          "source_filename",
          "total_rows",
          "processed_rows",
          "created_count",
          "updated_count",
          "skipped_count",
          "failed_count"
        ],
        "properties": {
          "uuid": {
            "type": "string",
            "format": "uuid",
            "description": "ID des Import-Jobs. Verwenden Sie diesen Wert, um den Fortschritt abzufragen und Zeilenfehler abzurufen."
          },
          "status": {
            "type": "string",
            "enum": [
              "PENDING",
              "PROCESSING",
              "COMPLETED",
              "FAILED",
              "PAUSED",
              "CANCELLED",
              "READY"
            ]
          },
          "import_type": {
            "type": "string",
            "enum": [
              "user_verification",
              "business_verification",
              "status_rules",
              "transactions"
            ]
          },
          "source_format": {
            "type": "string",
            "enum": [
              "csv",
              "ndjson"
            ]
          },
          "source_filename": {
            "type": "string"
          },
          "total_rows": {
            "type": "integer",
            "format": "int64"
          },
          "processed_rows": {
            "type": "integer",
            "format": "int64"
          },
          "checkpoint_row": {
            "type": "integer",
            "format": "int64"
          },
          "created_count": {
            "type": "integer",
            "format": "int64"
          },
          "updated_count": {
            "type": "integer",
            "format": "int64"
          },
          "skipped_count": {
            "type": "integer",
            "format": "int64"
          },
          "failed_count": {
            "type": "integer",
            "format": "int64"
          },
          "total_media_bytes": {
            "type": "integer",
            "format": "int64"
          },
          "last_error": {
            "type": "string",
            "nullable": true
          },
          "created_at": {
            "type": "string",
            "format": "date-time"
          },
          "updated_at": {
            "type": "string",
            "format": "date-time"
          },
          "started_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "completed_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "state": {
            "type": "string",
            "enum": [
              "ready",
              "queued",
              "running",
              "paused",
              "completed",
              "errors",
              "failed",
              "cancelled"
            ],
            "description": "Der Status des Jobs, wie er in der Konsole angezeigt wird; `errors` ist ein abgeschlossener Job mit abgelehnten Zeilen."
          },
          "source": {
            "type": "string",
            "enum": [
              "file",
              "api",
              "provider"
            ]
          },
          "provider": {
            "type": "string",
            "description": "Migrationsquelle; leer bei einem Datei- oder API-Import."
          },
          "provider_options": {
            "type": "object"
          },
          "credential_hint": {
            "type": "string",
            "description": "Die ersten Zeichen des Schlüssels, den die Migration enthält. Der Schlüssel selbst wird niemals zurückgegeben."
          },
          "credentials_expires_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "resumes_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "description": "Wenn ein durch das Rate-Limit des Anbieters pausierter Auftrag von selbst fortgesetzt wird."
          },
          "status_mapping": {
            "type": "object",
            "additionalProperties": {
              "type": "string"
            }
          },
          "is_dry_run": {
            "type": "boolean"
          },
          "dry_run_summary": {
            "type": "object",
            "description": "Was ein Testlauf ergeben hat: `total`, `by_status`, `already_in_didit`, `same_person`, `not_finished`, `failed`, `unmapped_statuses`."
          },
          "face_templates_enabled": {
            "type": "boolean"
          },
          "lawful_basis_confirmed_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "not_finished_count": {
            "type": "integer",
            "format": "int64"
          },
          "same_person_count": {
            "type": "integer",
            "format": "int64"
          },
          "face_templates_count": {
            "type": "integer",
            "format": "int64"
          },
          "face_duplicates_count": {
            "type": "integer",
            "format": "int64"
          },
          "face_blocklist_hits_count": {
            "type": "integer",
            "format": "int64"
          },
          "created_by_name": {
            "type": "string",
            "nullable": true
          },
          "created_by_email": {
            "type": "string",
            "nullable": true
          }
        }
      },
      "SessionImportError": {
        "type": "object",
        "required": [
          "uuid",
          "row_number",
          "error",
          "raw_row"
        ],
        "properties": {
          "uuid": {
            "type": "string",
            "format": "uuid"
          },
          "row_number": {
            "type": "integer",
            "format": "int64"
          },
          "external_id": {
            "type": "string",
            "nullable": true
          },
          "error": {
            "type": "string"
          },
          "raw_row": {
            "type": "object",
            "additionalProperties": true
          },
          "created_at": {
            "type": "string",
            "format": "date-time"
          }
        }
      },
      "BrandingCustomizationUpdate": {
        "type": "object",
        "description": "Body für partielle Branding-Aktualisierung. Geben Sie nur die Felder an, die Sie ändern möchten. Hex-Farben akzeptieren `#RRGGBB` oder `#RRGGBBAA`. Benutzerdefinierte Domain und White-Label-E-Mail werden hier nicht akzeptiert.",
        "properties": {
          "color_primary": {
            "type": "string",
            "description": "Farbe für Überschriften / primären Text."
          },
          "color_secondary": {
            "type": "string",
            "description": "Absatz-/sekundäre Textfarbe."
          },
          "color_background": {
            "type": "string",
            "description": "Seitenhintergrundfarbe."
          },
          "color_panel": {
            "type": "string",
            "description": "Panel-/Akzentfarbe."
          },
          "color_panel_10": {
            "type": "string",
            "description": "Panelfarbe bei 10 % Deckkraft."
          },
          "color_on_panel_1": {
            "type": "string",
            "description": "Farbe des Hilfetextes auf Panels."
          },
          "color_on_panel_2": {
            "type": "string",
            "description": "Pill- / Badge-Farbe auf Panels."
          },
          "color_on_background": {
            "type": "string",
            "description": "Textfarbe auf Hintergrund."
          },
          "color_button_1": {
            "type": "string",
            "description": "Farbe des primären Buttons."
          },
          "color_button_2": {
            "type": "string",
            "description": "Farbe der sekundären Schaltfläche."
          },
          "color_button_text_1": {
            "type": "string",
            "description": "Textfarbe des primären Buttons."
          },
          "color_button_text_2": {
            "type": "string",
            "description": "Textfarbe der sekundären Schaltfläche."
          },
          "color_pill_text": {
            "type": "string",
            "description": "Textfarbe für Badges, Eingabefelder und Auswahlelemente."
          },
          "border_radius_panel": {
            "type": "integer",
            "minimum": 0,
            "description": "Panel-Eckenradius in Pixeln."
          },
          "border_radius_buttons": {
            "type": "integer",
            "minimum": 0,
            "description": "Eckenradius der Schaltfläche in Pixeln."
          },
          "font_family": {
            "type": "string",
            "description": "Google-Font-Familienname (z. B. `Inter`, `AR One Sans`)."
          },
          "font_weight": {
            "type": "string",
            "description": "Für die ausgewählte Schriftfamilie verfügbare Schriftstärke (z. B. `regular`, `500`, `700`)."
          },
          "app_public_name": {
            "type": "string",
            "nullable": true,
            "description": "Öffentlicher Name, der im Verifizierungsablauf angezeigt wird."
          },
          "privacy_policy_url": {
            "type": "string",
            "nullable": true,
            "description": "Dem Endbenutzer angezeigte Datenschutzrichtlinien-URL."
          },
          "skip_welcome_screen": {
            "type": "boolean",
            "description": "Den anfänglichen Willkommensbildschirm überspringen."
          },
          "disable_login_with_didit": {
            "type": "boolean",
            "description": "Als Gast fortfahren, anstatt den Bildschirm zur Anmeldung mit Didit anzuzeigen. Kann nicht wieder auf `false` gesetzt werden, solange eine benutzerdefinierte Domain konfiguriert ist (400)."
          },
          "hide_progress_bar": {
            "type": "boolean",
            "description": "Fortschrittsleiste während des Ablaufs ausblenden."
          },
          "callback_seconds": {
            "type": "integer",
            "minimum": 0,
            "description": "Verzögerung (Sekunden) vor der Weiterleitung zur Callback-URL."
          },
          "delete_logo_square": {
            "type": "boolean",
            "description": "Wenn `true`, wird das aktuelle quadratische Logo entfernt."
          },
          "delete_logo_rectangular": {
            "type": "boolean",
            "description": "Wenn `true`, wird das aktuelle rechteckige Logo entfernt."
          },
          "delete_logo_rectangular_dark": {
            "type": "boolean",
            "description": "Wenn `true`, wird das aktuelle Dark-Mode-Logo entfernt, und `logo_rectangular_dark` lautet dann `null`. Wenn dieselbe Multipart-Anfrage auch `image_rectangular_dark` hochlädt, hat der Upload Vorrang."
          },
          "delete_favicon": {
            "type": "boolean",
            "description": "Wenn `true`, wird das aktuelle Favicon entfernt."
          }
        }
      },
      "BrandingCustomization": {
        "type": "object",
        "description": "White-Label-Branding für eine Anwendung: Farben, Schriftarten, Radien, Logo-URLs und UI/UX-Optionen. Logo-URLs sind schreibgeschützt (legen Sie diese durch das Hochladen von Bildern fest). Eine benutzerdefinierte Domain und White-Label-E-Mail sind nicht enthalten.",
        "properties": {
          "color_primary": {
            "type": "string"
          },
          "color_secondary": {
            "type": "string"
          },
          "color_background": {
            "type": "string"
          },
          "color_panel": {
            "type": "string"
          },
          "color_panel_10": {
            "type": "string"
          },
          "color_on_panel_1": {
            "type": "string"
          },
          "color_on_panel_2": {
            "type": "string"
          },
          "color_on_background": {
            "type": "string"
          },
          "color_button_1": {
            "type": "string"
          },
          "color_button_2": {
            "type": "string"
          },
          "color_button_text_1": {
            "type": "string"
          },
          "color_button_text_2": {
            "type": "string"
          },
          "color_pill_text": {
            "type": "string"
          },
          "border_radius_panel": {
            "type": "integer"
          },
          "border_radius_buttons": {
            "type": "integer"
          },
          "font_family": {
            "type": "string"
          },
          "font_weight": {
            "type": "string"
          },
          "font_url": {
            "type": "string",
            "nullable": true,
            "description": "Schreibgeschützt. Aufgelöste Google Fonts-Stylesheet-URL für die ausgewählte Schriftfamilie."
          },
          "logo_square": {
            "type": "string",
            "nullable": true,
            "description": "Schreibgeschützte URL des quadratischen Logos. Hochladen über `image_square`."
          },
          "logo_rectangular": {
            "type": "string",
            "nullable": true,
            "description": "Schreibgeschützte URL des rechteckigen Logos. Hochladen über `image_rectangular`."
          },
          "logo_rectangular_dark": {
            "type": "string",
            "format": "uri",
            "nullable": true,
            "description": "Schreibgeschützt. Temporäre signierte URL des rechteckigen Logos für den Dark Mode, dargestellt auf dunklem Hintergrund. `null`, wenn kein dunkles Logo festgelegt ist oder rechteckige Logos für Ihr Konto nicht angezeigt werden. Hochladen über `image_rectangular_dark`."
          },
          "favicon": {
            "type": "string",
            "nullable": true,
            "description": "Schreibgeschützte URL des Favicons. Hochladen über `image_favicon`."
          },
          "app_public_name": {
            "type": "string",
            "nullable": true
          },
          "privacy_policy_url": {
            "type": "string",
            "nullable": true
          },
          "skip_welcome_screen": {
            "type": "boolean"
          },
          "disable_login_with_didit": {
            "type": "boolean"
          },
          "hide_progress_bar": {
            "type": "boolean"
          },
          "callback_seconds": {
            "type": "integer"
          }
        }
      },
      "WebhookEvent": {
        "type": "string",
        "description": "Name des unterstützten Webhook-Ereignisses. Verwenden Sie genau diese Zeichenfolgen in `subscribed_events`; nicht unterstützte Werte werden abgelehnt.",
        "enum": [
          "status.updated",
          "data.updated",
          "user.status.updated",
          "user.data.updated",
          "business.status.updated",
          "business.data.updated",
          "activity.created",
          "transaction.created",
          "transaction.status.updated",
          "travel_rule.status.updated",
          "workflow.compliance_changed",
          "transaction_rule_suggestions.created",
          "auth.signup",
          "auth.login",
          "auth.login_failed",
          "auth.password_reset_requested",
          "auth.password_reset_completed",
          "auth.mfa_changed",
          "auth.new_device",
          "auth.account_locked",
          "investigator.report.ready",
          "investigator.decision.automated",
          "investigator.decision.overridden",
          "investigator.decision.contested",
          "investigator.question.raised",
          "investigator.automation.paused",
          "investigator.rfi.answered",
          "investigator.rfi.overdue",
          "investigator.drift.detected",
          "investigator.sla.breached",
          "investigator.qa.failed",
          "investigator.external.report.ready"
        ]
      },
      "WebhookSubscribedEvents": {
        "type": "array",
        "description": "Ereignisfilter für dieses Webhook-Ziel. Didit stellt nur Webhooks zu, deren Ereignistyp exakt mit einem dieser Werte übereinstimmt – es gibt kein Wildcard-Abonnement. Beim Senden muss die Liste mindestens ein gültiges Ereignis enthalten (ein explizites `[]` wird mit 400 abgelehnt); ein Ziel mit leerer Liste (Feld bei der Erstellung weggelassen) empfängt nichts. Bei einer Aktualisierung wird die Liste vollständig ersetzt, niemals zusammengeführt.",
        "minItems": 1,
        "uniqueItems": true,
        "items": {
          "$ref": "#/components/schemas/WebhookEvent"
        },
        "example": [
          "status.updated",
          "data.updated"
        ]
      },
      "PhoneVerificationSendResponse": {
        "type": "object",
        "properties": {
          "request_id": {
            "type": "string",
            "format": "uuid",
            "description": "Sitzungs-ID der Verifizierung. Ein `Retry`-Sendevorgang gibt dieselbe `request_id` wie der ursprüngliche Sendevorgang zurück. Diese ID erscheint in der Business Console, wird von einem finalisierten `POST /v3/phone/check/` erneut zurückgegeben und kann an `GET /v3/session/{sessionId}/decision/` übergeben werden."
          },
          "status": {
            "type": "string",
            "enum": [
              "Success",
              "Retry",
              "Blocked"
            ],
            "description": "`Success` — OTP an eine neue Verifizierung gesendet. `Retry` — OTP für die ausstehende Verifizierung erneut gesendet, die durch einen vorherigen Versand erstellt wurde. `Blocked` — die Anti-Fraud-Schicht hat das Senden verweigert; die Verifizierung wird sofort als `Declined` abgeschlossen und es wird nichts abgerechnet."
          },
          "reason": {
            "type": "string",
            "nullable": true,
            "description": "Warum ein Versand den Status `Blocked` hatte (z. B. `repeated_attempts`, `suspicious`, `spam`). `null` bei `Success` und `Retry`."
          },
          "vendor_data": {
            "type": "string",
            "nullable": true,
            "description": "Rückgabe der in der Sitzung gespeicherten `vendor_data` (aus dem ersten Senden)."
          },
          "metadata": {
            "type": "object",
            "nullable": true,
            "description": "Rückgabe der in der Sitzung gespeicherten `metadata` (aus dem ersten Senden)."
          }
        }
      },
      "PhoneVerificationCheckResponse": {
        "type": "object",
        "properties": {
          "request_id": {
            "type": "string",
            "format": "uuid",
            "description": "Bei `Approved`/`Declined`: die Sitzungs-ID der zugeordneten Verifizierung – identisch mit der von `POST /v3/phone/send/` zurückgegebenen `request_id`. Bei `Failed` und `Expired or Not Found`: eine zufällige einmalige UUID, die später nicht nachgeschlagen werden kann."
          },
          "status": {
            "type": "string",
            "enum": [
              "Approved",
              "Declined",
              "Failed",
              "Expired or Not Found"
            ],
            "description": "`Approved` — korrekter Code, kein zur Ablehnung führendes Risiko. `Declined` — endgültig: Ein zur Ablehnung führendes Risiko lag vor oder das Kontingent an Versuchen (3) wurde aufgebraucht. `Failed` — falscher Code, verbleibende Versuche vorhanden. `Expired or Not Found` — keine ausstehende Verifizierung für diese Nummer in den letzten 5 Minuten."
          },
          "message": {
            "type": "string",
            "description": "Lesbare Erklärung des Ergebnisses, einschließlich der verbleibenden Anzahl von Versuchen nach einem falschen Code."
          },
          "phone": {
            "type": "object",
            "nullable": true,
            "description": "Vollständiger Telefonbericht. Nur bei endgültigen Ergebnissen vorhanden (nicht null) (`Approved`/`Declined`); `null` bei `Failed` und nicht vorhanden bei `Expired or Not Found`.",
            "properties": {
              "status": {
                "type": "string",
                "enum": [
                  "Approved",
                  "Declined",
                  "In Review",
                  "Not Finished",
                  "Expired"
                ],
                "description": "Endgültiger Status der Telefonverifizierung. Entspricht dem übergeordneten `status` für abgeschlossene Prüfungen."
              },
              "phone_number_prefix": {
                "type": "string",
                "description": "Ländervorwahl mit vorangestelltem `+` (z. B. `+1`).",
                "example": "+1"
              },
              "phone_number": {
                "type": "string",
                "description": "Nationale Rufnummer ohne Ländervorwahl.",
                "example": "4155552671"
              },
              "full_number": {
                "type": "string",
                "description": "Vollständige Nummer im E.164-Format.",
                "example": "+14155552671"
              },
              "country_code": {
                "type": "string",
                "nullable": true,
                "description": "ISO 3166-1-Alpha-2-Land der Nummer.",
                "example": "US"
              },
              "country_name": {
                "type": "string",
                "description": "Vollständiger Ländername, abgeleitet aus `country_code`.",
                "example": "United States"
              },
              "carrier": {
                "type": "object",
                "description": "Netzwerk, über das die Nummer aktuell betrieben wird, aus der beim Abschluss durchgeführten Netzbetreiberabfrage.",
                "properties": {
                  "name": {
                    "type": "string",
                    "description": "Name des Mobilfunkanbieters. Leere Zeichenkette, wenn die Abfrage ihn nicht identifizieren konnte."
                  },
                  "type": {
                    "type": "string",
                    "description": "Durch die Abfrage gemeldeter Leitungstyp: `mobile`, `fixed_line`, `voip`, `isp`, `vpn`, `toll_free`, `premium_rate`, `pager`, `payphone`, `satellite`, `service`, `shared_cost`, `short_codes_commercial`, `calling_cards`, `local_rate`, `universal_access`, `voice_mail`, `other` oder `unknown`."
                  }
                }
              },
              "is_disposable": {
                "type": "boolean",
                "description": "`true`, wenn die Nummer zu einem temporären/Burner-Nummern-Dienst gehört."
              },
              "is_virtual": {
                "type": "boolean",
                "description": "`true`, wenn der Leitungstyp virtuell ist (`voip`, `isp` oder `vpn`)."
              },
              "verification_method": {
                "type": "string",
                "description": "Kanal, der das OTP nach Bestätigung der Zustellung tatsächlich zugestellt hat (z. B. `whatsapp`, `sms`); bis dahin der angeforderte Kanal."
              },
              "verification_attempts": {
                "type": "integer",
                "description": "Anzahl der OTP-Sendungen für diese Verifizierung (1, oder 2 nach einem Wiederholungsversuch)."
              },
              "verified_at": {
                "type": "string",
                "format": "date-time",
                "nullable": true,
                "description": "Wann der korrekte Code eingegeben wurde. `null`, wenn die Verifizierung nie genehmigt wurde."
              },
              "warnings": {
                "type": "array",
                "description": "Während der Verifizierung erfasste Risikowarnungen (Duplikat, Einwegnummer, VoIP, Versuche überschritten, Sperrliste usw.). Leeres Array, wenn keine vorhanden sind.",
                "items": {
                  "type": "object",
                  "properties": {
                    "feature": {
                      "type": "string",
                      "description": "Funktion, die die Warnung erzeugt hat. Hier immer `PHONE`."
                    },
                    "risk": {
                      "type": "string",
                      "description": "Maschinenlesbarer Risiko-Code."
                    },
                    "additional_data": {
                      "type": "object",
                      "nullable": true,
                      "description": "Risikospezifischer Kontext (z. B. die ID der duplizierten Sitzung bei Duplikatsrisiken). `null`, wenn das Risiko keine zusätzlichen Daten enthält."
                    },
                    "log_type": {
                      "type": "string",
                      "enum": [
                        "error",
                        "warning",
                        "information"
                      ],
                      "description": "Schweregrad. `error`-Risiken führen zur Ablehnung der Verifizierung, `warning` markiert sie zur Prüfung, `information` wird erfasst, ohne den Status zu beeinflussen."
                    },
                    "short_description": {
                      "type": "string",
                      "description": "Für Menschen lesbare einzeilige Zusammenfassung des Risikos."
                    },
                    "long_description": {
                      "type": "string",
                      "description": "Lesbare Erklärung des Risikos."
                    }
                  }
                }
              },
              "lifecycle": {
                "type": "array",
                "description": "Chronologischer Audit-Trail der Verifizierung. Der Ereignis-`type` ist einer von `PHONE_VERIFICATION_MESSAGE_SENT`, `PHONE_VERIFICATION_RETRY_MESSAGE_SENT`, `PHONE_VERIFICATION_BLOCKED`, `PHONE_DELIVERY_DELIVERED`, `PHONE_DELIVERY_UNDELIVERABLE`, `VALID_CODE_ENTERED`, `INVALID_CODE_ENTERED`, `PHONE_VERIFICATION_APPROVED`, `PHONE_VERIFICATION_DECLINED`, `PHONE_VERIFICATION_IN_REVIEW`, `PHONE_VERIFICATION_EXPIRED`.",
                "items": {
                  "type": "object",
                  "properties": {
                    "type": {
                      "type": "string",
                      "description": "Ereignistyp."
                    },
                    "timestamp": {
                      "type": "string",
                      "format": "date-time",
                      "description": "Wann das Ereignis stattgefunden hat."
                    },
                    "details": {
                      "type": "object",
                      "nullable": true,
                      "description": "Ereignisspezifische Payload. Sende-Ereignisse: `{status, reason, channel, actual_channel}` (`actual_channel` wird ausgefüllt, sobald die Zustellung bestätigt ist). Zustellungs-Ereignisse: `{channel, status}`. Code-Eingabe-Ereignisse: `{code_tried, status}`. Finale Status-Ereignisse: `null` oder `{reason}`, wenn abgelehnt oder in Prüfung."
                    },
                    "fee": {
                      "type": "number",
                      "description": "Für dieses Ereignis abgerechneter USD-Betrag. Nur bei Sendeereignissen ungleich null (der Zustellpreis); 0 bei Code-Eingaben, Zustellbestätigungen und Statusereignissen."
                    }
                  }
                }
              },
              "matches": {
                "type": "array",
                "description": "Andere Sitzungen Ihrer Anwendung (KYC, KYB oder API), bei denen dieselbe Telefonnummer von einem anderen Benutzer (anderes `vendor_data`) verwendet wurde. Bis zu 5 Einträge, ein synthetischer Sperrlistentreffer für einen Listeneintrag an erster Stelle, sofern vorhanden (sitzungsbasierte Treffer behalten die Abfragereihenfolge bei). Leeres Array, wenn keine Treffer vorliegen.",
                "items": {
                  "type": "object",
                  "properties": {
                    "session_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "Sitzungs-ID der anderen Verifizierung, die diese Telefonnummer verwendet hat."
                    },
                    "session_number": {
                      "type": "integer",
                      "description": "Benutzerfreundliche fortlaufende Nummer dieser Sitzung."
                    },
                    "vendor_data": {
                      "type": "string",
                      "nullable": true,
                      "description": "`vendor_data` dieser Sitzung."
                    },
                    "verification_date": {
                      "type": "string",
                      "description": "Wann diese Sitzung erstellt wurde (`YYYY-MM-DDTHH:MM:SSZ`)."
                    },
                    "phone_number": {
                      "type": "string",
                      "description": "Die übereinstimmende Telefonnummer."
                    },
                    "status": {
                      "type": "string",
                      "description": "Status dieser Sitzung (z. B. `Approved`, `Declined`, `In Progress`)."
                    },
                    "is_blocklisted": {
                      "type": "boolean",
                      "description": "Gibt an, ob die Telefonnummer auf der Sperrliste Ihrer Anwendung steht."
                    },
                    "api_service": {
                      "type": "string",
                      "nullable": true,
                      "description": "Für Sitzungen vom API-Typ: die eigenständige API, die sie erstellt hat (z. B. `PHONE_VERIFICATION`); `null` für reguläre Verifizierungssitzungen."
                    },
                    "source": {
                      "type": "string",
                      "description": "Wo die Übereinstimmung gefunden wurde. Normalerweise `session`; ein Sperrlisten-Treffer über einen Organisationslisteneintrag stellt eine synthetische Übereinstimmung mit `source: \"list_entry\"` und Nullwerten für `session_id`/`session_number` voran."
                    }
                  }
                }
              },
              "phone_social": {
                "$ref": "#/components/schemas/PhoneSocialFootprint"
              },
              "phone_intelligence": {
                "allOf": [
                  {
                    "$ref": "#/components/schemas/PhoneIntelligence"
                  }
                ],
                "description": "Telefon-Intelligence-Signale. Nur vorhanden, wenn bei der Prüfung `enable_enrichment` auf `true` gesetzt war."
              }
            }
          },
          "vendor_data": {
            "type": "string",
            "nullable": true,
            "description": "`vendor_data` der Sitzung der übereinstimmenden Verifizierung. `null` bei `Expired or Not Found`."
          },
          "metadata": {
            "type": "object",
            "nullable": true,
            "description": "`metadata` der Sitzung der zugeordneten Verifizierung. `null` bei `Expired or Not Found`."
          },
          "created_at": {
            "type": "string",
            "format": "date-time",
            "description": "Zeitstempel dieser Prüfungsantwort."
          }
        }
      },
      "EmailVerificationSendResponse": {
        "type": "object",
        "properties": {
          "request_id": {
            "type": "string",
            "format": "uuid",
            "description": "Sitzungs-ID der Verifizierung. Ein `Retry`-Sendevorgang gibt dieselbe `request_id` wie der ursprüngliche Sendevorgang zurück. Diese ID erscheint in der Business Console, wird von einem finalisierten `POST /v3/email/check/` erneut zurückgegeben und kann an `GET /v3/session/{sessionId}/decision/` übergeben werden."
          },
          "status": {
            "type": "string",
            "enum": [
              "Success",
              "Retry",
              "Undeliverable"
            ],
            "description": "`Success` — OTP per E-Mail an eine neue Verifizierung gesendet (abgerechnet). `Retry` — neuer OTP per E-Mail für die ausstehende Verifizierung gesendet, die durch einen vorherigen Versand erstellt wurde (kostenlos). `Undeliverable` — die Adresse hat die Zustellbarkeitsvalidierung nicht bestanden oder die Nachricht konnte nicht gesendet werden; die Verifizierung wird sofort als `Declined` abgeschlossen und es wird nichts abgerechnet."
          },
          "reason": {
            "type": "string",
            "nullable": true,
            "enum": [
              "email_can_not_be_delivered",
              null
            ],
            "description": "`email_can_not_be_delivered`, wenn `status` `Undeliverable` ist; andernfalls `null`."
          },
          "vendor_data": {
            "type": "string",
            "nullable": true,
            "description": "Rückgabe der in der Sitzung gespeicherten `vendor_data` (aus dem ersten Senden)."
          },
          "metadata": {
            "type": "object",
            "nullable": true,
            "description": "Rückgabe der in der Sitzung gespeicherten `metadata` (aus dem ersten Senden)."
          }
        }
      },
      "EmailVerificationCheckResponse": {
        "type": "object",
        "properties": {
          "request_id": {
            "type": "string",
            "format": "uuid",
            "description": "Bei `Approved`/`Declined`: die Sitzungs-ID der zugeordneten Verifizierung – identisch mit der von `POST /v3/email/send/` zurückgegebenen `request_id`. Bei `Failed` und `Expired or Not Found`: eine zufällige einmalige UUID, die später nicht nachgeschlagen werden kann."
          },
          "status": {
            "type": "string",
            "enum": [
              "Approved",
              "Declined",
              "Failed",
              "Expired or Not Found"
            ],
            "description": "`Approved` — korrekter Code, kein zur Ablehnung führendes Risiko. `Declined` — endgültig: Ein zur Ablehnung führendes Risiko lag vor oder das Kontingent an Versuchen (3) wurde aufgebraucht. `Failed` — falscher Code, verbleibende Versuche vorhanden. `Expired or Not Found` — keine ausstehende Verifizierung für diese Adresse in den letzten 5 Minuten."
          },
          "message": {
            "type": "string",
            "description": "Lesbare Erklärung des Ergebnisses, einschließlich der verbleibenden Anzahl von Versuchen nach einem falschen Code."
          },
          "email": {
            "type": "object",
            "nullable": true,
            "description": "Vollständiger E-Mail-Bericht. Nur bei finalisierten Ergebnissen (`Approved`/`Declined`) vorhanden (nicht null); `null` bei `Failed` und nicht vorhanden bei `Expired or Not Found`.",
            "properties": {
              "status": {
                "type": "string",
                "enum": [
                  "Approved",
                  "Declined",
                  "In Review",
                  "Not Finished",
                  "Expired"
                ],
                "description": "Endgültiger Status der E-Mail-Verifizierung. Entspricht dem übergeordneten `status` für abgeschlossene Prüfungen."
              },
              "email": {
                "type": "string",
                "format": "email",
                "description": "Die verifizierte E-Mail-Adresse.",
                "example": "alice@example.com"
              },
              "is_breached": {
                "type": "boolean",
                "description": "`true`, wenn die Adresse in bekannten Datenpannen vorkommt (Abfrage von Datenpannen-Erkenntnissen bei Abschluss ausgeführt)."
              },
              "breaches": {
                "type": "array",
                "description": "Bis zu 5 der neuesten bekannten Datenlecks, die diese Adresse enthalten. Leeres Array (oder weggelassen), wenn `is_breached` den Wert `false` hat.",
                "items": {
                  "type": "object",
                  "properties": {
                    "name": {
                      "type": "string",
                      "description": "Breach-Identifikator."
                    },
                    "domain": {
                      "type": "string",
                      "description": "Domain des von der Sicherheitsverletzung betroffenen Dienstes."
                    },
                    "breach_date": {
                      "type": "string",
                      "format": "date",
                      "description": "Datum, an dem der Verstoß auftrat."
                    },
                    "breach_emails_count": {
                      "type": "integer",
                      "description": "Gesamtzahl der bei der Datenpanne offengelegten Konten."
                    },
                    "description": {
                      "type": "string",
                      "description": "Lesbare Beschreibung der Verletzung (kann HTML-Markup enthalten)."
                    },
                    "logo_path": {
                      "type": "string",
                      "description": "URL des Logos des von einer Datenschutzverletzung betroffenen Dienstes."
                    },
                    "data_classes": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      },
                      "description": "Kategorien offengelegter Daten in snake_case (z. B. `email_addresses`, `passwords`)."
                    },
                    "is_verified": {
                      "type": "boolean",
                      "description": "Gibt an, ob das Datenleck als legitim verifiziert wurde."
                    }
                  }
                }
              },
              "is_disposable": {
                "type": "boolean",
                "description": "`true`, wenn die Domain zu einem bekannten Anbieter von Wegwerf-/Temporär-E-Mails gehört."
              },
              "is_undeliverable": {
                "type": "boolean",
                "description": "`true`, wenn die Adresse keine E-Mails empfangen kann (fehlgeschlagene Syntax- oder DNS/MX-Validierung oder die Nachricht wurde unzustellbar zurückgewiesen)."
              },
              "verification_attempts": {
                "type": "integer",
                "description": "Anzahl der OTP-Sendungen für diese Verifizierung (1, oder 2 nach einem Wiederholungsversuch)."
              },
              "verified_at": {
                "type": "string",
                "format": "date-time",
                "nullable": true,
                "description": "Wann der korrekte Code eingegeben wurde. `null`, wenn die Verifizierung nie genehmigt wurde."
              },
              "warnings": {
                "type": "array",
                "description": "Während der Verifizierung erfasste Risikowarnungen (Duplikat, kompromittiert, Einwegadresse, unzustellbar, Versuche überschritten, Sperrliste usw.). Leeres Array, wenn keine vorhanden sind.",
                "items": {
                  "type": "object",
                  "properties": {
                    "feature": {
                      "type": "string",
                      "description": "Funktion, die die Warnung erzeugt hat. Hier immer `EMAIL`."
                    },
                    "risk": {
                      "type": "string",
                      "description": "Maschinenlesbarer Risiko-Code."
                    },
                    "additional_data": {
                      "type": "object",
                      "nullable": true,
                      "description": "Risikospezifischer Kontext (z. B. die ID der duplizierten Sitzung bei Duplikatsrisiken). `null`, wenn das Risiko keine zusätzlichen Daten enthält."
                    },
                    "log_type": {
                      "type": "string",
                      "enum": [
                        "error",
                        "warning",
                        "information"
                      ],
                      "description": "Schweregrad. `error`-Risiken führen zur Ablehnung der Verifizierung, `warning` markiert sie zur Prüfung, `information` wird erfasst, ohne den Status zu beeinflussen."
                    },
                    "short_description": {
                      "type": "string",
                      "description": "Für Menschen lesbare einzeilige Zusammenfassung des Risikos."
                    },
                    "long_description": {
                      "type": "string",
                      "description": "Lesbare Erklärung des Risikos."
                    }
                  }
                }
              },
              "lifecycle": {
                "type": "array",
                "description": "Chronologischer Audit-Trail der Verifizierung. Der Ereignis-`type` ist einer von `EMAIL_VERIFICATION_MESSAGE_SENT`, `EMAIL_VERIFICATION_RETRY_MESSAGE_SENT`, `VALID_CODE_ENTERED`, `INVALID_CODE_ENTERED`, `EMAIL_VERIFICATION_APPROVED`, `EMAIL_VERIFICATION_DECLINED`, `EMAIL_VERIFICATION_IN_REVIEW`, `EMAIL_VERIFICATION_EXPIRED`.",
                "items": {
                  "type": "object",
                  "properties": {
                    "type": {
                      "type": "string",
                      "description": "Ereignistyp."
                    },
                    "timestamp": {
                      "type": "string",
                      "format": "date-time",
                      "description": "Wann das Ereignis stattgefunden hat."
                    },
                    "details": {
                      "type": "object",
                      "nullable": true,
                      "description": "Ereignisspezifische Payload. Sende-Ereignisse: `{status, reason}`. Code-Eingabe-Ereignisse: `{code_tried, status}`. Finale Status-Ereignisse: `null` oder `{reason}`, wenn abgelehnt oder in Prüfung."
                    },
                    "fee": {
                      "type": "number",
                      "description": "Für dieses Ereignis abgerechneter USD-Betrag. Nur beim ersten erfolgreichen Senden ungleich null; 0 bei Wiederholungsversuchen, Code-Eingaben und Statusereignissen."
                    }
                  }
                }
              },
              "matches": {
                "type": "array",
                "description": "Andere Sitzungen Ihrer Anwendung (KYC, KYB oder API), bei denen dieselbe E-Mail-Adresse von einem anderen Benutzer verwendet wurde (unterschiedliche `vendor_data`). Bis zu 5 Einträge; ein synthetischer Sperrlisten-Treffer aus einem Listeneintrag wird vorangestellt, falls vorhanden (und nur, wenn keine aus einer Sitzung abgeleitete, auf der Sperrliste stehende E-Mail existiert) – aus Sitzungen abgeleitete Treffer behalten die Reihenfolge nach created_at bei. Leeres Array, wenn keine Treffer vorliegen.",
                "items": {
                  "type": "object",
                  "properties": {
                    "session_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "Sitzungs-ID der anderen Verifizierung, die diese E-Mail-Adresse verwendet hat."
                    },
                    "session_number": {
                      "type": "integer",
                      "description": "Benutzerfreundliche fortlaufende Nummer dieser Sitzung."
                    },
                    "vendor_data": {
                      "type": "string",
                      "nullable": true,
                      "description": "`vendor_data` dieser Sitzung."
                    },
                    "verification_date": {
                      "type": "string",
                      "description": "Wann diese Sitzung erstellt wurde (`YYYY-MM-DDTHH:MM:SSZ`)."
                    },
                    "email": {
                      "type": "string",
                      "description": "Die übereinstimmende E-Mail-Adresse."
                    },
                    "status": {
                      "type": "string",
                      "description": "Status dieser Sitzung (z. B. `Approved`, `Declined`, `In Progress`)."
                    },
                    "is_blocklisted": {
                      "type": "boolean",
                      "description": "Gibt an, ob die E-Mail-Adresse auf der Sperrliste Ihrer Anwendung steht."
                    },
                    "api_service": {
                      "type": "string",
                      "nullable": true,
                      "description": "Für Sitzungen vom API-Typ: die eigenständige API, die sie erstellt hat (z. B. `PHONE_VERIFICATION`); `null` für reguläre Verifizierungssitzungen."
                    },
                    "source": {
                      "type": "string",
                      "description": "Wo die Übereinstimmung gefunden wurde. Normalerweise `session`; ein Sperrlisten-Treffer über einen Organisationslisteneintrag stellt eine synthetische Übereinstimmung mit `source: \"list_entry\"` und Nullwerten für `session_id`/`session_number` voran."
                    }
                  }
                }
              },
              "email_social": {
                "$ref": "#/components/schemas/EmailSocialFootprint"
              },
              "email_intelligence": {
                "allOf": [
                  {
                    "$ref": "#/components/schemas/EmailIntelligence"
                  }
                ],
                "description": "E-Mail-Intelligence-Signale. Nur vorhanden, wenn `enable_enrichment` bei der Prüfung `true` war."
              }
            }
          },
          "vendor_data": {
            "type": "string",
            "nullable": true,
            "description": "`vendor_data` der Sitzung der übereinstimmenden Verifizierung. `null` bei `Expired or Not Found`."
          },
          "metadata": {
            "type": "object",
            "nullable": true,
            "description": "`metadata` der Sitzung der zugeordneten Verifizierung. `null` bei `Expired or Not Found`."
          },
          "created_at": {
            "type": "string",
            "format": "date-time",
            "description": "Zeitstempel dieser Prüfungsantwort."
          }
        }
      },
      "WorkflowListItem": {
        "type": "object",
        "description": "Eine Workflow-Version in der Listenansicht.",
        "properties": {
          "uuid": {
            "type": "string",
            "format": "uuid",
            "description": "Versionsspezifische UUID. Verwenden Sie sie als `{settings_uuid}` zum Abrufen, Aktualisieren und Löschen und als `workflow_id` beim Erstellen von Sitzungen."
          },
          "workflow_id": {
            "type": "string",
            "format": "uuid",
            "description": "Stabile Gruppen-ID, die von jeder Version desselben Workflows geteilt wird. Entspricht `uuid` für Version 1."
          },
          "workflow_label": {
            "type": "string",
            "description": "Anzeigename für den Workflow."
          },
          "workflow_type": {
            "type": "string",
            "nullable": true,
            "description": "Basistyp für einfache Workflows: `kyc`, `kyb`, `adaptive_age_verification`, `biometric_authentication` usw. `null` für graphbasierte Workflows ohne KYB-Funktion."
          },
          "is_default": {
            "type": "boolean",
            "description": "Gibt an, ob dies der Standard-Workflow für neue Sitzungen ist."
          },
          "is_archived": {
            "type": "boolean"
          },
          "is_white_label_enabled": {
            "type": "boolean",
            "description": "Gibt an, ob White-Label-Anpassungen für Sitzungen gelten, die mit diesem Workflow erstellt wurden."
          },
          "total_price": {
            "type": "number",
            "description": "Festpreis pro Verifizierung in USD (JSON-Zahl, schließt Funktionen mit variablen Preisen wie DATABASE_VALIDATION und PHONE_VERIFICATION aus)."
          },
          "min_price": {
            "type": "number",
            "description": "Günstigster Festpreis über alle Workflow-Graph-Pfade hinweg in USD."
          },
          "max_price": {
            "type": "number",
            "description": "Höchster Festpreis über alle Pfade des Workflow-Graphen in USD."
          },
          "features": {
            "type": "string",
            "description": "Aktivierte Funktionen als einzelner, mit `\" + \"` verbundener String, z. B. `\"OCR + LIVENESS + FACE_MATCH\"`. Teilen Sie ihn anhand von `\" + \"` auf, um eine Liste zu erhalten."
          },
          "is_simple_workflow": {
            "type": "boolean",
            "description": "True, wenn der Workflow keinen benutzerdefinierten Workflow-Graphen hat."
          },
          "is_editable": {
            "type": "boolean",
            "description": "Wahr, wenn diese Version ein `draft` ist (Entwürfe können direkt bearbeitet werden; veröffentlichte Versionen sind in der Console unveränderlich)."
          },
          "workflow_url": {
            "type": "string",
            "format": "uri",
            "description": "Öffentliche teilbare Verifizierungs-URL für diesen Workflow (`https://verify.didit.me/u/<token>`)."
          },
          "max_retry_attempts": {
            "type": "integer",
            "description": "Maximale Anzahl an Wiederholungsversuchen, die nach einer abgelehnten Verifizierung zulässig sind (0-10)."
          },
          "retry_window_days": {
            "type": "integer",
            "nullable": true,
            "description": "Gleitendes Zeitfenster in Tagen zur Zählung der Wiederholungsversuche (1-365). `null` = Limit für den gesamten Zeitraum."
          },
          "session_expiration_time": {
            "type": "integer",
            "description": "Sekunden, bis eine nicht abgeschlossene Sitzung abläuft (3600-2419200)."
          },
          "version": {
            "type": "integer",
            "description": "Versionsnummer innerhalb der `workflow_id`-Gruppe, beginnend bei 1."
          },
          "status": {
            "type": "string",
            "enum": [
              "draft",
              "published"
            ],
            "description": "Versionsstatus. Neue Sitzungen verwenden die neueste `published`-Version einer Gruppe."
          },
          "has_draft": {
            "type": "boolean",
            "description": "True, wenn eine beliebige Version in dieser `workflow_id`-Gruppe derzeit ein Entwurf ist."
          },
          "created_by": {
            "type": "object",
            "nullable": true,
            "description": "Wer diese Version erstellt hat: `{name, email, type}`, wobei `type` entweder `user` (Konsolenbenutzer, `email` gesetzt) oder `api_key` (`name` ist die Client-ID, `email` ist null) ist. `null`, wenn kein Ersteller erfasst wurde.",
            "properties": {
              "name": {
                "type": "string"
              },
              "email": {
                "type": "string",
                "nullable": true
              },
              "type": {
                "type": "string",
                "enum": [
                  "user",
                  "api_key"
                ]
              }
            }
          },
          "updated_at": {
            "type": "string",
            "format": "date-time"
          }
        }
      },
      "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)."
          }
        }
      },
      "SimpleWorkflowUpdateRequest": {
        "type": "object",
        "description": "Workflow-Metadaten aktualisieren oder die gesamte lineare Liste der Funktionen ersetzen. STRIKTE Feld-Whitelist: Jeder hier nicht aufgeführte Schlüssel wird mit 400 abgewiesen.",
        "properties": {
          "workflow_label": {
            "type": "string",
            "maxLength": 50,
            "description": "Anzeigename für den Workflow (max. 50 Zeichen)."
          },
          "is_default": {
            "type": "boolean",
            "description": "Legen Sie diesen Workflow als Standard für neue Sitzungen fest."
          },
          "status": {
            "type": "string",
            "enum": [
              "draft",
              "published"
            ],
            "description": "Steuert die Versionierung. Weglassen, um die aktuelle Version direkt zu aktualisieren (Entwürfe werden automatisch veröffentlicht). `published` bei einer bereits veröffentlichten Version erstellt und gibt eine NEUE Version zurück. `draft` ist nur gültig, solange die Version noch ein Entwurf ist."
          },
          "features": {
            "type": "array",
            "minItems": 1,
            "description": "Falls angegeben, ersetzt dies die vollständige Funktionsreihenfolge und -konfiguration.",
            "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."
          },
          "is_desktop_allowed": {
            "type": "boolean",
            "description": "Ermöglicht die Ausführung des Verifizierungs-Workflows in Desktop-Browsern."
          },
          "max_retry_attempts": {
            "type": "integer",
            "minimum": 0,
            "maximum": 10,
            "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,
            "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,
            "description": "Maximale Anzahl an Liveness-Übermittlungen pro Sitzung. 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,
            "description": "Maximale Anzahl an Gesichtsabgleich-Übermittlungen pro Sitzung. 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,
            "description": "Sekunden, bis eine nicht abgeschlossene Sitzung abläuft. Mindestens 1 Stunde (3600), maximal 4 Wochen (2419200)."
          }
        }
      },
      "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."
          }
        }
      },
      "ReviewItem": {
        "type": "object",
        "description": "Ein Eintrag im Prüfungs-/Aktivitäts-Feed einer Sitzung. Statusänderungen enthalten `previous_status`, `new_status`, `previous_value`, `new_value` und `changed_fields`; Kommentare enthalten `comment` und (bei Kommentaren aus der Console) `mentioned_emails`; die übrigen Felder sind `null` oder leer, wenn sie für den Aktivitätstyp nicht zutreffen.",
        "properties": {
          "uuid": {
            "type": "string",
            "format": "uuid",
            "description": "Eindeutige Kennung dieses Feed-Eintrags.",
            "example": "de0561bc-5583-4409-9171-1a31a4c8a5f4"
          },
          "activity_type": {
            "type": "string",
            "enum": [
              "COMMENT",
              "STATUS_UPDATED",
              "KYC_DATA_UPDATED",
              "POA_DATA_UPDATED",
              "FILE_ADDED",
              "FILE_REMOVED",
              "AML_ONGOING_MATCH",
              "AML_STATUS_UPDATED",
              "AML_HIT_STATUS_UPDATED",
              "KYB_DATA_UPDATED",
              "KYB_DOCUMENT_UPLOADED",
              "TAG_ADDED",
              "TAG_REMOVED",
              "FEATURE_OVERRIDE_PENDING",
              "FEATURE_OVERRIDE_APPLIED",
              "FEATURE_OVERRIDE_CANCELLED"
            ],
            "description": "Welche Art von Aktivität dieser Eintrag aufzeichnet. `STATUS_UPDATED`-Zeilen stammen aus manuellen Entscheidungen (`PATCH /v3/session/{session_id}/update-status/`) und aus über `POST …/reviews/` hinzugefügten Einträgen (die standardmäßig diesen Typ haben, selbst wenn kein Status erfasst wird). `COMMENT`-Zeilen stammen von Console-Prüfern; Aufrufe der Detailseite in der Console werden ebenfalls als `COMMENT`-Zeilen gespeichert und mit `metadata.system_event = \"DETAIL_VIEWED\"` markiert. Die übrigen Typen verfolgen Datenbearbeitungen, Dateiänderungen, Tags und AML-Überwachungsaktivitäten. STATUS_UPDATED-Zeilen werden auch von System-Akteuren geschrieben (z. B. laufende AML-Überwachung mit actor_type SYSTEM und automatische Aktualisierungen des Funktionsstatus), nicht nur durch den Update-Status-Endpoint und manuelle Prüfungsbeiträge. `FEATURE_OVERRIDE_PENDING`, `FEATURE_OVERRIDE_APPLIED` und `FEATURE_OVERRIDE_CANCELLED` zeichnen ein Überschreiben des Status einer Prüfung auf (`PATCH /v3/session/{session_id}/features/{node_id}/update-status/`): angefordert, um auf den Abschluss des Ablaufs zu warten, angewendet oder abgebrochen. Sie enthalten den Status der Prüfung in `previous_value` / `new_value` (`{\"status\": ...}`), belassen `previous_status` und `new_status` auf `null` und benennen das Überschreiben in `metadata` (`feature_override_id`, `node_id`, `feature_model`, `forced`, `state`, `cancel_reason`). Der Eintrag für die Anfrage enthält den `comment` des Prüfers; ein Überschreiben, das angewendet wird, wenn der Ablauf abgeschlossen ist, wird mit dem `actor_type` `SYSTEM` erfasst.",
            "example": "STATUS_UPDATED"
          },
          "actor_display": {
            "type": "string",
            "description": "Lesbare Autorenbezeichnung, aufgelöst in folgender Reihenfolge: vollständiger Name des Akteurs → Kennung des Console-Kontos → lokaler Teil von `actor_email` → `\"API Client\"` (für `API_KEY`-Akteure) → `\"System\"` (für `SYSTEM`-Akteure) → `\"Unknown\"`. Über `POST …/reviews/` erstellte Einträge zeigen immer `\"Unknown\"` an, da dieser Endpoint keine Akteurzuordnung erfasst.",
            "example": "API Client"
          },
          "actor_email": {
            "type": "string",
            "nullable": true,
            "description": "E-Mail des Console-Benutzers, der die Aktion ausgeführt hat. `null` für API-Schlüssel- und System-Akteure.",
            "example": null
          },
          "actor_type": {
            "type": "string",
            "enum": [
              "API_KEY",
              "CONSOLE_USER",
              "SYSTEM"
            ],
            "description": "Wer die Aktion durchgeführt hat: ein API-Schlüssel, ein Benutzer der Konsole oder Didit selbst (`SYSTEM`, z. B. laufende AML-Überwachung). Über `POST …/reviews/` erstellte Einträge erhalten unabhängig vom Aufrufer den Standardwert `CONSOLE_USER`.",
            "example": "API_KEY"
          },
          "new_status": {
            "type": "string",
            "nullable": true,
            "enum": [
              "Not Started",
              "In Progress",
              "Approved",
              "Declined",
              "In Review",
              "Expired",
              "Abandoned",
              "Kyc Expired",
              "Resubmitted",
              "Awaiting User"
            ],
            "description": "Durch diesen Eintrag erfasster Sitzungsstatus (für Statusaktualisierungen). `null` bei Kommentaren und Datenänderungseinträgen.",
            "example": "Approved"
          },
          "previous_status": {
            "type": "string",
            "nullable": true,
            "enum": [
              "Not Started",
              "In Progress",
              "Approved",
              "Declined",
              "In Review",
              "Expired",
              "Abandoned",
              "Kyc Expired",
              "Resubmitted",
              "Awaiting User"
            ],
            "description": "Status, den die Sitzung vor der Änderung hatte. Ausgefüllt bei `STATUS_UPDATED`-Einträgen, die vom Update-Status-Endpoint geschrieben wurden; `null` bei Einträgen, die über `POST …/reviews/` hinzugefügt wurden. Auch bei systemgenerierten STATUS_UPDATED-Zeilen ausgefüllt.",
            "example": "In Review"
          },
          "comment": {
            "type": "string",
            "nullable": true,
            "description": "An den Eintrag angehängte Freitext-Notiz oder `null`.",
            "example": "Document re-checked manually; address matches."
          },
          "mentioned_emails": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "email"
            },
            "description": "Console-Benutzer, die im Kommentar per `@email` erwähnt wurden. Immer leer für Einträge, die über diese API erstellt wurden – die Verarbeitung von Erwähnungen ist eine reine Console-Funktion.",
            "example": []
          },
          "previous_value": {
            "type": "object",
            "nullable": true,
            "description": "Snapshot der geänderten Daten vor der Aktion, z. B. `{\"status\": \"In Review\"}` bei einer Statusänderung. `null`, wenn nichts geändert wurde.",
            "example": {
              "status": "In Review"
            }
          },
          "new_value": {
            "type": "object",
            "nullable": true,
            "description": "Snapshot der geänderten Daten nach der Aktion, z. B. `{\"status\": \"Approved\"}`. `null`, wenn nichts geändert wurde.",
            "example": {
              "status": "Approved"
            }
          },
          "changed_fields": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Namen der durch diese Aktivität geänderten Felder (z. B. `[\"status\"]`). Leer bei Kommentaren und bei Einträgen, die über `POST …/reviews/` hinzugefügt wurden.",
            "example": [
              "status"
            ]
          },
          "metadata": {
            "type": "object",
            "nullable": true,
            "description": "Zusätzlicher Kontext für systemgenerierte Einträge. Detailseitenaufrufe in der Console enthalten `{\"system_event\": \"DETAIL_VIEWED\", \"detail_type\": \"verification\"}`, damit sie aus der Benachrichtigungslogik herausgefiltert werden können. Ein `COMMENT`, der vom Autor in der Console bearbeitet wurde, enthält `edited_at`, den ISO-8601-Zeitstempel der letzten Bearbeitung (`comment` und `mentioned_emails` enthalten dann den bearbeiteten Text und die Erwähnungen). `null` bei gewöhnlichen Einträgen.",
            "example": null
          },
          "created_at": {
            "type": "string",
            "format": "date-time",
            "description": "Wann der Eintrag geschrieben wurde, ISO 8601 UTC.",
            "example": "2026-06-12T00:19:31.918735Z"
          }
        }
      },
      "QuestionnaireListItem": {
        "type": "object",
        "description": "Eine Fragebogenversion in der Listenansicht.",
        "properties": {
          "uuid": {
            "type": "string",
            "format": "uuid",
            "description": "Versionsspezifische UUID. Verwenden Sie sie als `{questionnaire_uuid}` zum Abrufen, Aktualisieren und Löschen sowie als `questionnaire_uuid` in der QUESTIONNAIRE-Funktionskonfiguration eines Workflows."
          },
          "title": {
            "type": "string"
          },
          "description": {
            "type": "string",
            "nullable": true
          },
          "languages": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "default_language": {
            "type": "string"
          },
          "is_active": {
            "type": "boolean"
          },
          "is_simple_questionnaire": {
            "type": "boolean",
            "description": "True für lineare Fragebögen, die über diese API erstellt wurden; false für graphbasierte Fragebögen, die in der Konsole erstellt wurden."
          },
          "created_at": {
            "type": "string",
            "format": "date-time"
          },
          "updated_at": {
            "type": "string",
            "format": "date-time"
          },
          "question_types": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Elementtypen der beantwortbaren Fragen in Großbuchstaben in der Reihenfolge ihrer Erstellung (z. B. `SHORT_TEXT`, `MULTIPLE_CHOICE`, `FILE_UPLOAD`). Strukturelle `SECTION_HEADER`- und `SEPARATOR`-Elemente sind ausgeschlossen. Ein Eintrag pro Frage, Werte können sich also wiederholen."
          },
          "workflow_names": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Namen von Workflows, die diesen Fragebogen verwenden. Derzeit an diesem Endpoint immer `[]` (wird nur in der Konsolenauflistung ausgefüllt)."
          },
          "questionnaire_group_id": {
            "type": "string",
            "format": "uuid",
            "description": "Stabile Kennung, die alle Versionen desselben Fragebogens gruppiert."
          },
          "version": {
            "type": "integer",
            "description": "Versionsnummer innerhalb der Gruppe, beginnend bei 1."
          },
          "status": {
            "type": "string",
            "enum": [
              "draft",
              "published"
            ]
          },
          "published_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "description": "Wann diese Version veröffentlicht wurde. `null` für Entwürfe."
          },
          "is_editable": {
            "type": "boolean",
            "description": "Wahr, wenn diese Version ein `draft` ist."
          }
        }
      },
      "SimpleQuestionnaireRequest": {
        "type": "object",
        "description": "Erstellen Sie einen einfachen linearen Fragebogen. Die API wandelt `form_elements` intern in den Fragebogen-Graphen um.",
        "required": [
          "title",
          "languages",
          "form_elements"
        ],
        "properties": {
          "title": {
            "type": "string",
            "description": "Interner Name für den Fragebogen."
          },
          "description": {
            "type": "string",
            "nullable": true
          },
          "languages": {
            "type": "array",
            "description": "In jeder Bezeichnung enthaltene Sprachen. Muss `en` enthalten.",
            "items": {
              "type": "string"
            },
            "example": [
              "en"
            ]
          },
          "default_language": {
            "type": "string",
            "description": "Standardsprache. Muss in `languages` enthalten sein.",
            "example": "en"
          },
          "is_active": {
            "type": "boolean",
            "default": true
          },
          "status": {
            "type": "string",
            "enum": [
              "draft",
              "published"
            ],
            "description": "Lassen Sie dieses Feld weg, um einen veröffentlichten Fragebogen zu erstellen, der für Workflows bereit ist."
          },
          "form_elements": {
            "type": "array",
            "minItems": 1,
            "description": "Fragen in der genauen Reihenfolge, in der Benutzer sie sehen sollen. Verzweigungen und bedingte Felder werden nicht unterstützt.",
            "items": {
              "$ref": "#/components/schemas/SimpleQuestionnaireElement"
            }
          }
        }
      },
      "SimpleQuestionnaireUpdateRequest": {
        "type": "object",
        "description": "Fragebogen-Metadaten aktualisieren oder die vollständige lineare Liste von `form_elements` ersetzen.",
        "properties": {
          "title": {
            "type": "string"
          },
          "description": {
            "type": "string",
            "nullable": true
          },
          "languages": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "default_language": {
            "type": "string"
          },
          "is_active": {
            "type": "boolean"
          },
          "status": {
            "type": "string",
            "enum": [
              "draft",
              "published"
            ]
          },
          "form_elements": {
            "type": "array",
            "minItems": 1,
            "description": "Falls angegeben, ersetzt dies die vollständige lineare Fragenliste.",
            "items": {
              "$ref": "#/components/schemas/SimpleQuestionnaireElement"
            }
          }
        }
      },
      "SimpleQuestionnaireElement": {
        "type": "object",
        "required": [
          "element_type",
          "label"
        ],
        "properties": {
          "id": {
            "type": "string",
            "description": "Optionale stabile Fragen-ID. Wenn sie weggelassen wird, generiert die API `q1`, `q2` usw. Verwenden Sie zur besseren Lesbarkeit Kleinbuchstaben, Zahlen und Unterstriche.",
            "example": "source_of_funds"
          },
          "element_type": {
            "type": "string",
            "description": "Fragetyp. Die API akzeptiert diese Werte in Kleinbuchstaben und deren Entsprechungen in Großbuchstaben.",
            "enum": [
              "short_text",
              "long_text",
              "dropdown",
              "single_choice",
              "multiple_choice",
              "number",
              "image",
              "file_upload",
              "time",
              "email",
              "address",
              "phone",
              "country",
              "date_picker",
              "consent",
              "section_header",
              "separator",
              "heading",
              "paragraph"
            ]
          },
          "label": {
            "type": "object",
            "description": "Fragebezeichnung nach Sprachcode, zum Beispiel `{ \"en\": \"Source of funds\" }`.",
            "additionalProperties": {
              "type": "string"
            }
          },
          "description": {
            "type": "object",
            "nullable": true,
            "additionalProperties": {
              "type": "string"
            }
          },
          "placeholder": {
            "type": "object",
            "nullable": true,
            "additionalProperties": {
              "type": "string"
            }
          },
          "is_required": {
            "type": "boolean",
            "default": false
          },
          "options": {
            "type": "array",
            "description": "Für `dropdown`, `single_choice` und `multiple_choice` verwenden. Wenn `value` weggelassen wird, generiert die API einen Wert aus der Optionsbezeichnung.",
            "items": {
              "type": "object",
              "required": [
                "label"
              ],
              "properties": {
                "value": {
                  "type": "string"
                },
                "label": {
                  "type": "object",
                  "additionalProperties": {
                    "type": "string"
                  }
                }
              }
            }
          },
          "max_files": {
            "type": "integer",
            "minimum": 1,
            "maximum": 5,
            "description": "Mit `file_upload` oder `image` verwenden."
          },
          "validation": {
            "type": "object",
            "nullable": true,
            "description": "Optionale Formatvalidierung für `short_text`, `long_text` oder `number`. Wird erzwungen, während der Benutzer das Feld ausfüllt (er kann nicht fortfahren, bis die Validierung erfolgreich ist), und bei der Übermittlung von der API erneut geprüft.",
            "properties": {
              "pattern": {
                "type": "string",
                "description": "Regulärer Ausdruck (ECMA-262-Teilmenge), mit dem der Wert vollständig übereinstimmen muss. Für `short_text` und `long_text`. Keine ^/$-Anker hinzufügen; der gesamte Wert wird abgeglichen."
              },
              "min_length": {
                "type": "integer",
                "minimum": 0,
                "description": "Mindestanzahl von Zeichen. Für `short_text` und `long_text`."
              },
              "max_length": {
                "type": "integer",
                "minimum": 0,
                "description": "Maximale Zeichenanzahl. Für `short_text` und `long_text`."
              },
              "min": {
                "type": "number",
                "description": "Numerischer Mindestwert. Für `number`."
              },
              "max": {
                "type": "number",
                "description": "Maximaler numerischer Wert. Für `number`."
              },
              "error_message": {
                "type": "object",
                "description": "Übersetzte Nachricht, die bei fehlgeschlagener Validierung angezeigt wird, nach Sprachcode geschlüsselt.",
                "additionalProperties": {
                  "type": "string"
                }
              }
            }
          }
        }
      },
      "QuestionnaireDetail": {
        "type": "object",
        "description": "Vollständige Fragebogendetails, die von den Endpoints GET, POST (Erstellen) und PATCH (Aktualisieren) zurückgegeben werden.",
        "properties": {
          "questionnaire_id": {
            "type": "string",
            "format": "uuid",
            "description": "Eindeutige Kennung des Fragebogens. Verwenden Sie diese ID, wenn Sie aus einem Workflow oder in nachfolgenden Update-/Löschanfragen auf den Fragebogen verweisen."
          },
          "title": {
            "type": "string"
          },
          "description": {
            "type": "string",
            "nullable": true
          },
          "languages": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "default_language": {
            "type": "string"
          },
          "is_active": {
            "type": "boolean"
          },
          "is_simple_questionnaire": {
            "type": "boolean"
          },
          "graph": {
            "type": "object",
            "description": "Graphstruktur mit start_node und nodes-Map."
          },
          "sections": {
            "type": "array",
            "description": "In Abschnitte gruppierter Fragebogeninhalt (aus dem Graph abgeleitet).",
            "items": {
              "type": "object"
            }
          },
          "questionnaire_group_id": {
            "type": "string",
            "format": "uuid",
            "description": "Stabile Kennung, die alle Versionen desselben Fragebogens gruppiert."
          },
          "version": {
            "type": "integer"
          },
          "status": {
            "type": "string",
            "enum": [
              "draft",
              "published"
            ]
          },
          "published_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "is_editable": {
            "type": "boolean",
            "description": "True, wenn der Fragebogen noch direkt bearbeitet werden kann (Entwurfsversionen)."
          }
        }
      },
      "UserListItem": {
        "type": "object",
        "description": "Ein verifizierter Benutzer.",
        "properties": {
          "didit_internal_id": {
            "type": "string",
            "format": "uuid",
            "description": "Didits stabile interne UUID für diesen Benutzer."
          },
          "vendor_data": {
            "type": "string",
            "nullable": true,
            "description": "Ihre eindeutige Kennung für diesen Benutzer (beim Erstellen von Sitzungen übergeben). Dies kann null sein, wenn keine Vendor-Kennung angegeben wurde."
          },
          "display_name": {
            "type": "string",
            "nullable": true,
            "description": "Von Ihnen festgelegter benutzerdefinierter Anzeigename"
          },
          "full_name": {
            "type": "string",
            "nullable": true,
            "description": "Aus verifizierten Dokumenten extrahierter vollständiger Name"
          },
          "date_of_birth": {
            "type": "string",
            "format": "date",
            "nullable": true
          },
          "effective_name": {
            "type": "string",
            "nullable": true,
            "description": "Bester verfügbarer Name: display_name, falls gesetzt, andernfalls full_name"
          },
          "status": {
            "type": "string",
            "enum": [
              "ACTIVE",
              "FLAGGED",
              "BLOCKED"
            ],
            "description": "Lebenszyklusstatus des Benutzerdatensatzes (KEIN Sitzungsstatus). `ACTIVE` ist der Standard, `FLAGGED` markiert den Benutzer für manuelle Prüfung, `BLOCKED` verhindert neue Sitzungen für dieses `vendor_data`."
          },
          "portrait_image_url": {
            "type": "string",
            "nullable": true,
            "description": "Vorsignierte URL des Porträtfotos des Benutzers (läuft nach wenigen Stunden ab)"
          },
          "session_count": {
            "type": "integer",
            "description": "Gesamtzahl der Verifizierungssitzungen für diesen Benutzer"
          },
          "approved_count": {
            "type": "integer",
            "description": "Anzahl der genehmigten Sitzungen"
          },
          "declined_count": {
            "type": "integer",
            "description": "Anzahl der abgelehnten Sitzungen"
          },
          "in_review_count": {
            "type": "integer",
            "description": "Anzahl der Sitzungen in Prüfung"
          },
          "issuing_states": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "ISO 3166-1-Alpha-3-Codes der Ausstellungsländer, die auf den genehmigten Ausweisdokumenten dieses Benutzers gefunden wurden, z. B. `[\"USA\", \"ESP\"]`. Leeres Array, wenn keine vorhanden sind."
          },
          "approved_emails": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Verifizierte E-Mail-Adressen, die aus den genehmigten Sitzungen dieses Benutzers erfasst wurden, z. B. `[\"john@example.com\"]`."
          },
          "approved_phones": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Verifizierte Telefonnummern, die aus den genehmigten Sitzungen dieses Benutzers erfasst wurden, z. B. `[\"+14155551234\"]`."
          },
          "features": {
            "type": "object",
            "description": "Aggregierter Status pro Funktion über alle Sitzungen dieses Benutzers hinweg. Mögliche Schlüssel: `ID_VERIFICATION`, `NFC`, `LIVENESS`, `FACE_MATCH`, `POA`, `QUESTIONNAIRE`, `EMAIL_VERIFICATION`, `PHONE`, `AML`, `IP_ANALYSIS`, `AGE_ESTIMATION`, `DATABASE_VALIDATION`. Mögliche Werte: `Approved`, `Declined`, `In Review`, `Not Finished`, `Resub Requested`."
          },
          "features_list": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "feature": {
                  "type": "string"
                },
                "status": {
                  "type": "string"
                }
              }
            },
            "description": "Dieselben Daten wie `features`, als geordnetes Array von `{feature, status}`-Objekten."
          },
          "last_session_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "description": "Zeitstempel der letzten Sitzung"
          },
          "first_session_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "description": "Zeitstempel der ersten Sitzung"
          },
          "last_activity_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "description": "Zeitstempel der letzten Aktivität bei diesem Benutzer (Sitzung, Transaktion, Statusänderung, Datenbearbeitung usw.)."
          },
          "tags": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "uuid": {
                  "type": "string",
                  "format": "uuid"
                },
                "name": {
                  "type": "string"
                },
                "color": {
                  "type": "string"
                }
              }
            },
            "description": "Diesem Benutzer zugewiesene Tags"
          },
          "created_at": {
            "type": "string",
            "format": "date-time"
          }
        }
      },
      "BlocklistItem": {
        "type": "object",
        "properties": {
          "type": {
            "type": "string",
            "enum": [
              "face",
              "document",
              "phone",
              "email"
            ]
          },
          "session_id": {
            "type": "string",
            "format": "uuid"
          },
          "session_number": {
            "type": "integer"
          },
          "blocklisted_at": {
            "type": "string",
            "format": "date-time"
          },
          "face_image": {
            "type": "string",
            "nullable": true
          },
          "document_type": {
            "type": "string",
            "nullable": true
          },
          "document_number": {
            "type": "string",
            "nullable": true
          },
          "phone_number": {
            "type": "string",
            "nullable": true
          },
          "email": {
            "type": "string",
            "nullable": true
          }
        }
      },
      "UserDetailItem": {
        "type": "object",
        "description": "Vollständige Benutzerdetails. Erweitert UserListItem um Metadaten, Kommentare und updated_at.",
        "allOf": [
          {
            "$ref": "#/components/schemas/UserListItem"
          },
          {
            "type": "object",
            "properties": {
              "metadata": {
                "type": "object",
                "description": "Benutzerdefiniertes Metadaten-JSON, das Sie diesem Benutzer angehängt haben. Standardmäßig `{}`."
              },
              "tags": {
                "type": "array",
                "description": "Tag-Zuweisungen. HINWEIS: Bei Detailantworten ist jeder Eintrag ein Tag-*Link*-Objekt (`{uuid, tag: {...}, added_by_email, added_by_name, created_at}`), anders als die flache Struktur `{uuid, name, color}`, die bei Listenantworten verwendet wird.",
                "items": {
                  "type": "object",
                  "properties": {
                    "uuid": {
                      "type": "string",
                      "format": "uuid",
                      "description": "UUID der Tag-Zuweisung (nicht des Tags selbst)."
                    },
                    "tag": {
                      "type": "object",
                      "properties": {
                        "uuid": {
                          "type": "string",
                          "format": "uuid"
                        },
                        "name": {
                          "type": "string"
                        },
                        "color": {
                          "type": "string"
                        },
                        "description": {
                          "type": "string",
                          "nullable": true
                        },
                        "source": {
                          "type": "string",
                          "enum": [
                            "didit",
                            "custom"
                          ]
                        },
                        "created_at": {
                          "type": "string",
                          "format": "date-time"
                        },
                        "updated_at": {
                          "type": "string",
                          "format": "date-time"
                        }
                      }
                    },
                    "added_by_email": {
                      "type": "string",
                      "nullable": true
                    },
                    "added_by_name": {
                      "type": "string",
                      "nullable": true
                    },
                    "created_at": {
                      "type": "string",
                      "format": "date-time"
                    }
                  }
                }
              },
              "comments": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "uuid": {
                      "type": "string",
                      "format": "uuid"
                    },
                    "comment_type": {
                      "type": "string",
                      "enum": [
                        "COMMENT",
                        "STATUS_CHANGED",
                        "METADATA_UPDATED",
                        "TAG_ADDED",
                        "TAG_REMOVED",
                        "PROFILE_UPDATED"
                      ]
                    },
                    "comment": {
                      "type": "string",
                      "nullable": true
                    },
                    "actor_email": {
                      "type": "string",
                      "nullable": true
                    },
                    "actor_name": {
                      "type": "string",
                      "nullable": true
                    },
                    "previous_status": {
                      "type": "string",
                      "nullable": true,
                      "enum": [
                        "ACTIVE",
                        "FLAGGED",
                        "BLOCKED",
                        null
                      ]
                    },
                    "new_status": {
                      "type": "string",
                      "nullable": true,
                      "enum": [
                        "ACTIVE",
                        "FLAGGED",
                        "BLOCKED",
                        null
                      ]
                    },
                    "previous_value": {
                      "type": "object",
                      "nullable": true,
                      "description": "Vorherige Feldwerte für PROFILE_UPDATED-Einträge."
                    },
                    "new_value": {
                      "type": "object",
                      "nullable": true,
                      "description": "Neue Feldwerte für PROFILE_UPDATED-Einträge."
                    },
                    "changed_fields": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      },
                      "description": "Namen der Felder, die durch einen PROFILE_UPDATED-Eintrag geändert wurden."
                    },
                    "metadata": {
                      "type": "object",
                      "nullable": true
                    },
                    "mentioned_emails": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      }
                    },
                    "created_at": {
                      "type": "string",
                      "format": "date-time"
                    }
                  }
                },
                "description": "Aktivitätsprotokoll und Kommentare für diesen Benutzer (Statusänderungen, Profilbearbeitungen, manuelle Notizen)."
              },
              "updated_at": {
                "type": "string",
                "format": "date-time"
              }
            }
          }
        ]
      },
      "BusinessListItem": {
        "type": "object",
        "description": "Ein verifiziertes Unternehmen.",
        "properties": {
          "didit_internal_id": {
            "type": "string",
            "format": "uuid",
            "description": "Didits stabile interne UUID für dieses Unternehmen."
          },
          "vendor_data": {
            "type": "string",
            "nullable": true,
            "description": "Ihre eindeutige Kennung für dieses Unternehmen (beim Erstellen von Sitzungen übergeben). Dies kann null sein, wenn keine Vendor-Kennung angegeben wurde."
          },
          "display_name": {
            "type": "string",
            "nullable": true,
            "description": "Von Ihnen festgelegter benutzerdefinierter Anzeigename"
          },
          "legal_name": {
            "type": "string",
            "nullable": true,
            "description": "Offizieller juristischer Name aus dem Register oder manueller Eingabe"
          },
          "registration_number": {
            "type": "string",
            "nullable": true,
            "description": "Unternehmensregister- oder Gründungsnummer"
          },
          "country_code": {
            "type": "string",
            "nullable": true,
            "description": "Gründungsland (ISO 3166-1 Alpha-2, z. B. `GB`, `US`)."
          },
          "effective_name": {
            "type": "string",
            "nullable": true,
            "description": "Bester verfügbarer Name: display_name, falls gesetzt, andernfalls legal_name"
          },
          "status": {
            "type": "string",
            "enum": [
              "ACTIVE",
              "FLAGGED",
              "BLOCKED"
            ],
            "description": "Lebenszyklusstatus des Unternehmensdatensatzes (KEIN Sitzungsstatus). `ACTIVE` ist der Standard, `FLAGGED` markiert ihn für manuelle Prüfung, `BLOCKED` verhindert neue Sitzungen für dieses `vendor_data`."
          },
          "session_count": {
            "type": "integer",
            "description": "Gesamtzahl der Verifizierungssitzungen für dieses Unternehmen"
          },
          "approved_count": {
            "type": "integer",
            "description": "Anzahl der genehmigten Sitzungen"
          },
          "declined_count": {
            "type": "integer",
            "description": "Anzahl der abgelehnten Sitzungen"
          },
          "in_review_count": {
            "type": "integer",
            "description": "Anzahl der Sitzungen in Prüfung"
          },
          "features": {
            "type": "object",
            "description": "Aggregierter Status pro Funktion über alle KYB-Sitzungen dieses Unternehmens hinweg. Derzeit ist der einzige Schlüssel `KYB` (der Status der Unternehmensprüfung im Register). Mögliche Werte: `Approved`, `Declined`, `In Review`, `Not Finished`, `Resub Requested`."
          },
          "features_list": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "feature": {
                  "type": "string"
                },
                "status": {
                  "type": "string"
                }
              }
            },
            "description": "Dieselben Daten wie `features`, als geordnetes Array von `{feature, status}`-Objekten."
          },
          "last_session_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "description": "Zeitstempel der letzten Sitzung"
          },
          "first_session_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "description": "Zeitstempel der ersten Sitzung"
          },
          "last_activity_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "description": "Zeitstempel der letzten Aktivität (Statusänderung, Sitzungsaktualisierung usw.)"
          },
          "tags": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "uuid": {
                  "type": "string",
                  "format": "uuid"
                },
                "name": {
                  "type": "string"
                },
                "color": {
                  "type": "string"
                }
              }
            },
            "description": "Diesem Unternehmen zugewiesene Tags"
          },
          "created_at": {
            "type": "string",
            "format": "date-time"
          }
        }
      },
      "BusinessDetailItem": {
        "type": "object",
        "description": "Vollständige Unternehmensdetails. Erweitert BusinessListItem um Metadaten und updated_at.",
        "allOf": [
          {
            "$ref": "#/components/schemas/BusinessListItem"
          },
          {
            "type": "object",
            "properties": {
              "metadata": {
                "type": "object",
                "description": "Benutzerdefiniertes Metadaten-JSON, das Sie diesem Unternehmen angehängt haben. Standardmäßig `{}`."
              },
              "updated_at": {
                "type": "string",
                "format": "date-time"
              }
            }
          }
        ]
      },
      "TransactionDetail": {
        "type": "object",
        "description": "Vollständiger Überwachungsdatensatz für eine Transaktion, wie von `GET /v3/transactions/{transaction_id}/` und `POST /v3/transactions/` zurückgegeben.",
        "properties": {
          "uuid": {
            "type": "string",
            "format": "uuid",
            "description": "Stabiler Transaktionsbezeichner von Didit. Als `{transaction_id}` für Folgeaufrufe verwenden."
          },
          "environment": {
            "type": "string",
            "enum": [
              "live",
              "sandbox"
            ],
            "description": "Umgebung der Anwendung, zu der die Transaktion gehört. Eine `sandbox`-Transaktion wird gespeichert, aber niemals ausgewertet, gescreent, benachrichtigt oder abgerechnet, sodass ihre leeren `rule_runs` „nicht ausgewertet“ bedeuten."
          },
          "transaction_number": {
            "type": "integer",
            "description": "Fortlaufende Transaktionsnummer innerhalb der Anwendung, wie in der Console angezeigt (z. B. `4123`)."
          },
          "txn_id": {
            "type": "string",
            "description": "Die `transaction_id`, die Sie bei der Erstellung angegeben haben (max. 128 Zeichen). Eindeutig pro Anwendung."
          },
          "txn_date": {
            "type": "string",
            "format": "date-time",
            "description": "Wann die Transaktion stattgefunden hat (aus `transaction_at`; standardmäßig der Übermittlungszeitpunkt)."
          },
          "zone_id": {
            "type": "string",
            "nullable": true,
            "description": "Beim Erstellen angegebene IANA-Zeitzonenkennung."
          },
          "transaction_type": {
            "type": "string",
            "description": "Kategorie auf oberster Ebene wie gespeichert: `finance`, `kyc`, `travelRule`, `userPlatformEvent`, `gamblingBet`, `gamblingLimitChange`, `gamblingBonusChange`, `auditTrailEvent`. Beachten Sie, dass mehrteilige Werte in camelCase zurückgegeben werden, selbst wenn sie in snake_case übermittelt wurden."
          },
          "action_type": {
            "type": "string",
            "description": "Untertyp innerhalb der Kategorie (z. B. `deposit`, `withdrawal`, `transfer`). Standardmäßig die Kategorie, falls nicht angegeben."
          },
          "direction": {
            "type": "string",
            "enum": [
              "INBOUND",
              "OUTBOUND"
            ],
            "description": "Richtung relativ zur betreffenden Entität. Wird unabhängig von der übermittelten Schreibweise in Großbuchstaben gespeichert (bei der Eingabe werden `in`/`out`/`inbound`/`outbound` akzeptiert)."
          },
          "status": {
            "type": "string",
            "enum": [
              "APPROVED",
              "IN_REVIEW",
              "DECLINED",
              "AWAITING_USER"
            ],
            "description": "Aktuelles Überwachungsergebnis. Transaktionen werden als `APPROVED` erstellt; Regeln können sie synchron auf `IN_REVIEW`/`DECLINED` umstellen."
          },
          "source": {
            "type": "string",
            "enum": [
              "LIVE",
              "IMPORTED"
            ],
            "description": "Wie der Datensatz entstanden ist: `LIVE` für Transaktionen, die über die API oder das SDK übermittelt wurden, `IMPORTED` für Transaktionen, die über den Import in der Konsole geladen wurden."
          },
          "amount": {
            "type": "string",
            "description": "Transaktionsbetrag als Dezimalstring ohne nachgestellte Nullen (z. B. `\"1500\"`, `\"0.5\"`, `\"0.123456789012345678\"`). Bis zu 18 Dezimalstellen."
          },
          "currency": {
            "type": "string",
            "description": "Währungscode von `amount`. Jeder alphabetische ISO-4217-Code wird akzeptiert (z. B. `EUR`, `USD`, `NGN`), ebenso wie ein Krypto-Asset-Symbol (z. B. `BTC`). Bevorzugen Sie einen aktuell im Umlauf befindlichen Code. Nicht jeder akzeptierte Code verfügt über einen Wechselkurs: Wenn für den Code keiner verfügbar ist (beispielsweise die ISO-Verrechnungseinheit `XSU` oder ein Krypto-Symbol, für das Didit keine Kurse bereitstellt), schlägt die automatische Konvertierung fehl und `preferred_currency_amount` wird als null zurückgegeben, es sei denn, die Anfrage enthielt einen vorkonvertierten Wert für `amount_in_default_currency`."
          },
          "currency_type": {
            "type": "string",
            "nullable": true,
            "description": "`fiat` oder `crypto`, wie in `currency_kind` übermittelt."
          },
          "amount_in_default_currency": {
            "type": "string",
            "nullable": true,
            "description": "Von Ihnen übermittelter, vorab umgerechneter Betrag als Dezimal-String ohne nachgestellte Nullen."
          },
          "default_currency_code": {
            "type": "string",
            "nullable": true
          },
          "preferred_currency_amount": {
            "type": "string",
            "nullable": true,
            "description": "`amount` umgerechnet in die bevorzugte Währung der Anwendung, sofern verfügbar."
          },
          "preferred_currency_code": {
            "type": "string",
            "nullable": true
          },
          "payment_details": {
            "type": "string",
            "nullable": true,
            "description": "Freitext-Zahlungsreferenz oder -Verwendungszweck aus der Übermittlung."
          },
          "payment_txn_id": {
            "type": "string",
            "nullable": true,
            "description": "Externe Zahlungssystem-Referenz (z. B. Blockchain-Transaktions-Hash) aus `payment_reference_id`."
          },
          "score": {
            "type": "integer",
            "description": "Durch Regeln kumulierter Risiko-Score (typischerweise 0–100). Höher = riskanter."
          },
          "severity": {
            "type": "string",
            "nullable": true,
            "enum": [
              "UNKNOWN",
              "LOW",
              "MEDIUM",
              "HIGH",
              "CRITICAL"
            ],
            "description": "Kategorische Risikoschwere, festgelegt durch Regeln/Anbieter (`UNKNOWN`, `LOW`, `MEDIUM`, `HIGH`, `CRITICAL`). `null`, bis ein Wert festgelegt wird."
          },
          "decision_reason_code": {
            "type": "string",
            "nullable": true,
            "description": "Maschinenlesbarer Grund für den aktuellen `status`."
          },
          "decision_reason_label": {
            "type": "string",
            "nullable": true,
            "description": "Lesbare Bezeichnung für `decision_reason_code`."
          },
          "vendor_data": {
            "type": "string",
            "nullable": true,
            "description": "Bequemlichkeitskopie der `vendor_data` des Antragstellers."
          },
          "metadata": {
            "type": "object",
            "description": "Snapshot der Payloads von `subject` und `counterparty`, wie sie zum Zeitpunkt der Erstellung übermittelt wurden."
          },
          "props": {
            "type": "object",
            "description": "Die `custom_properties`, die Sie bei der Erstellung angegeben haben. Jeder Schlüssel kann in Regelbedingungen als `custom_values.<key>` adressiert werden."
          },
          "tags": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "uuid": {
                  "type": "string",
                  "format": "uuid"
                },
                "name": {
                  "type": "string"
                },
                "color": {
                  "type": "string"
                },
                "description": {
                  "type": "string",
                  "nullable": true
                },
                "source": {
                  "type": "string",
                  "enum": [
                    "didit",
                    "custom"
                  ],
                  "description": "Gibt an, ob das Tag eine Didit-Voreinstellung oder ein benutzerdefiniertes Tag ist."
                }
              }
            },
            "description": "An die Transaktion angehängte Tags (manuell oder durch Regeln)."
          },
          "parties": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "uuid": {
                  "type": "string",
                  "format": "uuid"
                },
                "role": {
                  "type": "string",
                  "enum": [
                    "APPLICANT",
                    "REMITTER",
                    "BENEFICIARY",
                    "COUNTERPARTY"
                  ],
                  "description": "Rolle der Partei. Der Erstellungs-Endpoint weist `APPLICANT` (das Subjekt) und `COUNTERPARTY` zu."
                },
                "entity_type": {
                  "type": "string",
                  "enum": [
                    "individual",
                    "company",
                    "external",
                    "unhostedWallet"
                  ]
                },
                "kind": {
                  "type": "string",
                  "enum": [
                    "USER",
                    "BUSINESS",
                    "EXTERNAL"
                  ],
                  "description": "`USER`/`BUSINESS`-Parteien verweisen über `vendor_data` zurück auf eine Didit-eigene Entität. Hinter `EXTERNAL`-Parteien steht keine Didit-Entität."
                },
                "vendor_data": {
                  "type": "string",
                  "nullable": true,
                  "description": "Ihre interne Benutzer-/Unternehmenskennung."
                },
                "full_name": {
                  "type": "string",
                  "nullable": true
                },
                "first_name": {
                  "type": "string",
                  "nullable": true
                },
                "last_name": {
                  "type": "string",
                  "nullable": true
                },
                "country_code": {
                  "type": "string",
                  "nullable": true,
                  "description": "Ländercode aus der übermittelten `address.country` (üblicherweise ISO 3166-1 Alpha-3)."
                },
                "dob": {
                  "type": "string",
                  "format": "date",
                  "nullable": true,
                  "description": "Geburtsdatum aus dem übermittelten `date_of_birth`."
                },
                "address": {
                  "type": "object",
                  "description": "Adressobjekt wie übermittelt. `{}` bei Auslassung."
                },
                "institution_info": {
                  "type": "object",
                  "description": "Details zur Institution wie übermittelt. `{}`, wenn sie weggelassen wurden."
                },
                "device": {
                  "type": "object",
                  "description": "Normalisierter Gerätekontext, einschließlich serverseitiger IP-Anreicherung unter network_context (Geolokalisierung, VPN-/Rechenzentrums-Flags), wenn eine IP angegeben wurde.",
                  "properties": {
                    "fingerprint": {
                      "type": "string",
                      "description": "Eindeutiger Geräte-Fingerabdruck."
                    },
                    "persistent_device_id": {
                      "type": "string",
                      "description": "Stabiler sitzungsübergreifender Geräteidentifikator (v2-Fingerprint-Schema)."
                    },
                    "user_agent": {
                      "type": "string",
                      "description": "User-Agent-String des Browsers oder der App."
                    },
                    "browser_family": {
                      "type": "string",
                      "description": "Browser-Familie (z. B. Chrome, Firefox, Safari)."
                    },
                    "browser_version": {
                      "type": "string",
                      "description": "Browser-Versions-String."
                    },
                    "platform": {
                      "type": "string",
                      "description": "Plattform-Identifikator (web, ios, android, macos, windows, linux)."
                    },
                    "os_family": {
                      "type": "string",
                      "description": "Betriebssystemfamilie (z. B. iOS, Android, Windows)."
                    },
                    "os_version": {
                      "type": "string",
                      "description": "Versionszeichenfolge des Betriebssystems."
                    },
                    "accept_language": {
                      "type": "string",
                      "description": "Wert des Accept-Language-Headers."
                    },
                    "session_id": {
                      "type": "string",
                      "description": "Sitzungskennung (in Metadaten gespeichert)."
                    },
                    "session_age_ms": {
                      "type": "number",
                      "description": "Sitzungsalter in Millisekunden."
                    },
                    "network_context": {
                      "type": "object",
                      "description": "Netzwerkkontext mit IP-Adresse und Geolokalisierung.",
                      "properties": {
                        "ip_address": {
                          "type": "string",
                          "description": "Client-Adresse."
                        },
                        "ip_country_code": {
                          "type": "string",
                          "description": "Per Geo-IP aufgelöstes Land der IP-Adresse (ISO 3166-1 alpha-3)."
                        },
                        "latitude": {
                          "type": "number",
                          "description": "Geografische Breite der IP-Adresse."
                        },
                        "longitude": {
                          "type": "number",
                          "description": "Geografische Länge der IP-Adresse."
                        }
                      }
                    }
                  }
                },
                "external_party_snapshot": {
                  "type": "object",
                  "nullable": true,
                  "description": "Eingefrorene Kopie der Parteidaten für `EXTERNAL`-Parteien. `null`, solange die Partei mit einem Didit-Benutzer oder -Unternehmen verknüpft ist."
                }
              }
            },
            "description": "Transaktionsparteien (Antragsteller, Gegenpartei)."
          },
          "payment_methods": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "uuid": {
                  "type": "string",
                  "format": "uuid"
                },
                "payment_method_type": {
                  "type": "string",
                  "enum": [
                    "bank_card",
                    "bank_account",
                    "e_wallet",
                    "crypto_wallet",
                    "unhosted_wallet",
                    "other"
                  ]
                },
                "label": {
                  "type": "string",
                  "nullable": true
                },
                "fingerprint": {
                  "type": "string",
                  "nullable": true,
                  "description": "SHA-256 über `type:account_id:issuing_country` — stabiler Identifikator, um die Wiederverwendung desselben Instruments zuzuordnen."
                },
                "account_id": {
                  "type": "string",
                  "nullable": true,
                  "description": "Kontokennung (IBAN, Adresse, Karten-Token, …)."
                },
                "issuing_country": {
                  "type": "string",
                  "nullable": true
                },
                "owner_kind": {
                  "type": "string",
                  "enum": [
                    "USER",
                    "BUSINESS",
                    "EXTERNAL"
                  ]
                },
                "vendor_data": {
                  "type": "string",
                  "nullable": true,
                  "description": "Ihre Kennung für den Benutzer bzw. das Unternehmen, dem die Ressource gehört."
                },
                "owner_name": {
                  "type": "string",
                  "nullable": true
                },
                "institution_info": {
                  "type": "object"
                },
                "details": {
                  "type": "object",
                  "description": "Unverarbeitetes `payment_method`-Objekt wie übermittelt."
                },
                "external_owner_snapshot": {
                  "type": "object",
                  "nullable": true
                },
                "role": {
                  "type": "string",
                  "enum": [
                    "SOURCE",
                    "DESTINATION",
                    "FUNDING",
                    "BENEFICIARY"
                  ],
                  "description": "Wie diese Methode in der Transaktion verwendet wurde. Der Endpoint zum Erstellen weist `SOURCE`/`DESTINATION` basierend auf der Richtung zu (ausgehend: Subjekt = SOURCE; eingehend: Subjekt = DESTINATION)."
                }
              }
            },
            "description": "Mit der Transaktion verknüpfte Zahlungsmethoden."
          },
          "documents": {
            "type": "array",
            "description": "Dateien, die der Transaktion über die Konsole angehängt wurden. `[]`, wenn keine vorhanden sind.",
            "items": {
              "type": "object",
              "properties": {
                "uuid": {
                  "type": "string",
                  "format": "uuid"
                },
                "label": {
                  "type": "string",
                  "nullable": true
                },
                "note": {
                  "type": "string",
                  "nullable": true
                },
                "uploaded_by": {
                  "type": "string",
                  "nullable": true
                },
                "created_at": {
                  "type": "string",
                  "format": "date-time"
                },
                "files": {
                  "type": "array",
                  "items": {
                    "type": "object",
                    "properties": {
                      "uuid": {
                        "type": "string",
                        "format": "uuid"
                      },
                      "file_url": {
                        "type": "string",
                        "format": "uri",
                        "nullable": true,
                        "description": "Kurzlebige signierte Download-URL; rufen Sie sie bei Bedarf ab, anstatt sie zu speichern."
                      },
                      "original_filename": {
                        "type": "string",
                        "nullable": true
                      },
                      "file_size": {
                        "type": "integer",
                        "nullable": true
                      }
                    }
                  }
                }
              }
            }
          },
          "activities": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "uuid": {
                  "type": "string",
                  "format": "uuid"
                },
                "activity_type": {
                  "type": "string",
                  "description": "Z. B. `TRANSACTION_CREATED`, `TRANSACTION_NOTE_ADDED`, `TRANSACTION_STATUS_CHANGED`."
                },
                "source": {
                  "type": "string"
                },
                "status": {
                  "type": "string",
                  "nullable": true
                },
                "title": {
                  "type": "string",
                  "nullable": true
                },
                "description": {
                  "type": "string",
                  "nullable": true
                },
                "metadata": {
                  "type": "object"
                },
                "occurred_at": {
                  "type": "string",
                  "format": "date-time"
                }
              }
            },
            "description": "Einträge im Aktivitätsprotokoll (Erstellung, Notizen, manuelle Prüfungen, Statusänderungen)."
          },
          "alerts": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "uuid": {
                  "type": "string",
                  "format": "uuid"
                },
                "title": {
                  "type": "string"
                },
                "description": {
                  "type": "string",
                  "nullable": true
                },
                "severity": {
                  "type": "string",
                  "enum": [
                    "UNKNOWN",
                    "LOW",
                    "MEDIUM",
                    "HIGH",
                    "CRITICAL"
                  ]
                },
                "status": {
                  "type": "string",
                  "enum": [
                    "OPEN",
                    "INVESTIGATING",
                    "AWAITING_USER",
                    "PENDING_SAR",
                    "SAR_FILED",
                    "RESOLVED",
                    "DISMISSED"
                  ]
                },
                "source": {
                  "type": "string",
                  "enum": [
                    "RULE",
                    "PROVIDER",
                    "MANUAL"
                  ]
                },
                "metadata": {
                  "type": "object"
                },
                "created_at": {
                  "type": "string",
                  "format": "date-time"
                },
                "due_at": {
                  "type": "string",
                  "format": "date-time",
                  "nullable": true
                }
              }
            },
            "description": "Aktuell immer leer. Ein offener Alert ist eine Transaktion mit dem Status `IN_REVIEW` oder `AWAITING_USER`."
          },
          "rule_runs": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "uuid": {
                  "type": "string",
                  "format": "uuid"
                },
                "rule": {
                  "type": "string",
                  "format": "uuid",
                  "description": "UUID der Regel, die ausgeführt wurde."
                },
                "rule_title": {
                  "type": "string"
                },
                "rule_description": {
                  "type": "string",
                  "nullable": true
                },
                "rule_category": {
                  "type": "string"
                },
                "matched": {
                  "type": "boolean",
                  "description": "Gibt an, ob die Bedingungen der Regel auf diese Transaktion zutrafen. Ein Durchlauf wird nur für übereinstimmende Regeln aufgezeichnet, daher tragen Live-Auswertungen immer `true`."
                },
                "is_test": {
                  "type": "boolean",
                  "description": "True, wenn die Regel im TEST-Modus ausgeführt wurde (keine Auswirkung auf Status/Score)."
                },
                "mode": {
                  "type": "string",
                  "enum": [
                    "ACTIVE",
                    "DISABLED",
                    "TEST"
                  ]
                },
                "severity": {
                  "type": "string",
                  "nullable": true
                },
                "score_delta": {
                  "type": "integer",
                  "description": "Score, der durch die `add_score`-Aktionen dieser Regel hinzugefügt wurde."
                },
                "status_target": {
                  "type": "string",
                  "nullable": true,
                  "description": "Status, der durch eine `change_status`-Aktion festgelegt wurde, falls vorhanden."
                },
                "action_summary": {
                  "type": "string",
                  "nullable": true,
                  "description": "Zusammenfassung der von der Regel ausgeführten Aktionen, getrennt durch `; ` (z. B. `score +30; change_status:IN_REVIEW; add_tag:high_risk_country`). Bestandteile: `score +N`, `change_status:<STATUS>`, `add_tag:<name>`, `add_note`, `add_to_list`, `open_case`. `null`, wenn die Regel keine Aktion ausgeführt hat."
                },
                "metadata": {
                  "type": "object",
                  "description": "Evaluierungsdetails: `scope_match`, `conditions[]` und `aggregations[]`. Jeder Bedingungseintrag enthält `field`, `operator`, `expected_value`, den aus der Transaktion gelesenen `current_value`, `matched`, `group_index` und `group_logic`. Jeder Aggregationseintrag (Velocity / Anzahl / Summe) enthält `metric`, `field`, `operator`, `expected_value`, den berechneten Wert `computed_value`, auf den das Aggregat ausgewertet wurde, `window`, `filters`, `matched` und `sample_references`; verzögerte asynchrone Aggregationen weisen `computed_value: null` und `deferred: true` auf. Eine verschachtelte Bedingungsgruppe ist ein Eintrag in `conditions[]` mit `operator` `any_of` oder `all_of`, `field` null und den Ergebnissen ihrer Elemente unter ihren eigenen `conditions`."
                },
                "created_at": {
                  "type": "string",
                  "format": "date-time"
                }
              }
            },
            "description": "Ausführungsergebnisse pro Regel – welche Regel ausgelöst wurde und mit welcher Auswirkung auf den Score."
          },
          "provider_results": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "uuid": {
                  "type": "string",
                  "format": "uuid"
                },
                "provider": {
                  "type": "string"
                },
                "result_type": {
                  "type": "string",
                  "enum": [
                    "FIAT_MONITORING",
                    "WALLET_SCREENING",
                    "TRANSACTION_SCREENING",
                    "TRAVEL_RULE",
                    "NETWORK_GRAPH",
                    "CUSTOM"
                  ]
                },
                "status": {
                  "type": "string"
                },
                "severity": {
                  "type": "string",
                  "nullable": true
                },
                "score": {
                  "type": "integer"
                },
                "summary": {
                  "type": "string",
                  "nullable": true
                },
                "payload": {
                  "type": "object",
                  "description": "Unverarbeitete Antwort-Payload des Anbieters."
                },
                "created_at": {
                  "type": "string",
                  "format": "date-time"
                }
              }
            },
            "description": "Unverarbeitete Provider-Payloads (AML-Screening, Blockchain-Analysen usw.)."
          },
          "travel_rule": {
            "nullable": true,
            "allOf": [
              {
                "$ref": "#/components/schemas/TransactionTravelRule"
              }
            ],
            "description": "Travel Rule-Transfer oder -Prüfung. Wird ausgefüllt, wenn `travel_rule_details` übermittelt wurde, sowie wenn Travel Rule aktiviert ist und die Transaktion mit `transaction_category: travelRule` erstellt wurde (Didit initiiert den Austausch selbst, auch ohne `travel_rule_details`). `null`, wenn kein Transfer oder keine Prüfung existiert. Bei einem eingehenden Transfer bleiben `originator_data` und `beneficiary_data` der Gegenpartei maskiert (`data_masked: true`), bis die Wallet-Inhaberschaft bestätigt ist."
          },
          "network_snapshot": {
            "type": "object",
            "nullable": true,
            "description": "Graph-Snapshot verknüpfter Transaktionen/Parteien, der von der Regel-Engine verwendet wird. Entweder der mit der Transaktion übermittelte `network_snapshot` oder der Graph, den Didit aus einem erfolgreichen AML-Wallet-Screening erstellt (der einen übermittelten ersetzt). `null`, wenn keines von beiden existiert.",
            "properties": {
              "uuid": {
                "type": "string",
                "format": "uuid"
              },
              "nodes": {
                "type": "array",
                "items": {
                  "type": "object"
                }
              },
              "edges": {
                "type": "array",
                "items": {
                  "type": "object"
                }
              },
              "metrics": {
                "type": "object"
              }
            }
          },
          "remediation": {
            "type": "object",
            "nullable": true,
            "description": "Korrektursitzung, die dem Benutzer angeboten wird, wenn eine erneute Verifizierung erforderlich ist. Abgelöst durch `action_required`, den kanonischen Block; aus Gründen der Abwärtskompatibilität beibehalten.",
            "properties": {
              "session_id": {
                "type": "string"
              },
              "session_token": {
                "type": "string"
              },
              "url": {
                "type": "string",
                "format": "uri"
              },
              "status": {
                "type": "string"
              }
            }
          },
          "action_required": {
            "type": "object",
            "nullable": true,
            "description": "Ausstehende Endbenutzer-Aktion, die zum Abschluss dieser Transaktion erforderlich ist, oder null, wenn keine vorhanden ist. Die Didit-SDKs starten die Aktion standardmäßig automatisch und aktualisieren die Transaktion nach deren Abschluss. Zwei Varianten, unterschieden durch `type`: `verification_session` (eine gehostete Verifizierungssitzung, die durch eine Regelaktion erstellt wurde) und `wallet_ownership` (eine Sitzung des Wallet-Ownership-Widgets, die für einen Travel-Rule-Transfer automatisch erstellt wurde, der einen Nachweis der Wallet-Kontrolle benötigt, gesteuert durch die Travel-Rule-Einstellung `auto_wallet_verification`). Wenn beide zutreffen könnten, hat `wallet_ownership` Vorrang, da sie den Travel-Rule-Austausch blockiert.",
            "oneOf": [
              {
                "$ref": "#/components/schemas/TransactionVerificationSessionAction"
              },
              {
                "$ref": "#/components/schemas/TransactionWalletOwnershipAction"
              }
            ],
            "discriminator": {
              "propertyName": "type",
              "mapping": {
                "verification_session": "#/components/schemas/TransactionVerificationSessionAction",
                "wallet_ownership": "#/components/schemas/TransactionWalletOwnershipAction"
              }
            }
          },
          "cost_breakdown": {
            "type": "object",
            "nullable": true,
            "description": "Kosten dieser Transaktion: `total_price` und `items`, eine pro Belastung, jeweils mit `usage_type`, `price`, `details` und `created_at`. Eine erneute Überprüfung derselben Transaktion ist ein neues Element."
          }
        }
      },
      "TravelRuleSettingsDetail": {
        "type": "object",
        "properties": {
          "is_enabled": {
            "type": "boolean",
            "description": "Gibt an, ob der verwaltete Travel-Rule-Verhandlungsablauf für ausgehende `travelRule`-Transaktionen bei dieser Anwendung aktiv ist."
          },
          "jurisdiction": {
            "type": "string",
            "maxLength": 8,
            "description": "Der Jurisdiktionscode der Betriebsjurisdiktion Ihres VASP. Standardmäßig `\"EU\"`. Didit ordnet ihn dem Regime zu, das auf Ihren Travel-Rule-Transaktionen als `travel_rule_regime` vermerkt wird (beispielsweise wird `EU` oder der Code eines EU-Mitgliedstaats zu `eu`), worauf Transaktionsregeln aufbauen können. Andere Didit-Kunden sehen diesen als Ihre Jurisdiktion im VASP-Verzeichnis, sobald das Didit-Netzwerk Ihr Profil auflistet."
          },
          "name_matching_strictness": {
            "type": "string",
            "enum": [
              "NONE",
              "STRICT",
              "CONTAINS",
              "DEFAULT",
              "FUZZY"
            ],
            "description": "Wie genau die Namen der Begünstigten übereinstimmen müssen, bevor ein Transfer COMPLETED erreichen kann. `CONTAINS` akzeptiert einen Namen, dessen Wörter alle im anderen vorkommen."
          },
          "confirmation_timeout_hours": {
            "type": "integer",
            "minimum": 1,
            "description": "Stunden, die ein Transfer mit dem Status AWAITING_COUNTERPARTY unbestätigt bleiben darf, bevor der periodische Sweeper ihn ablaufen lässt. Standard: 48."
          },
          "timeout_outcome": {
            "type": "string",
            "enum": [
              "HOLD",
              "REJECT",
              "PROCEED"
            ],
            "description": "Was mit der zugrunde liegenden Transaktion passiert, wenn ein Transfer abläuft. Standard HOLD. sunrise_policy und non_responsive_policy haben Vorrang, wenn sie zutreffen und festgelegt sind."
          },
          "threshold_amount": {
            "type": "string",
            "description": "Dezimal-Zeichenkette in der Standardwährung Ihrer Anwendung. Mindesttransferbetrag, der einen verwalteten Austausch auslöst; Transfers darunter werden direkt als NOT_APPLICABLE aufgelöst. Didit vergleicht den in Ihre Standardwährung umgerechneten Transaktionsbetrag oder den von Ihnen gesendeten `amount_in_default_currency`; wenn kein umgerechneter Betrag verfügbar ist, gilt der Schwellenwert nicht. Standardwert ist \"0.00\" (die EU-TFR sieht keinen Mindestbetrag vor)."
          },
          "ownership_validation_mode": {
            "type": "string",
            "enum": [
              "FULL",
              "SIMPLIFIED",
              "AUTOMATED"
            ],
            "description": "Wie viel Nachweis für die Eigentümerschaft einer Wallet erforderlich ist. `FULL` erfordert immer einen Nachweis (signierte Nachricht, Testeinzahlung oder geprüfter Screenshot), niemals das Wort des Endbenutzers. `SIMPLIFIED` akzeptiert eine Eigenerklärung unterhalb von `simplified_validation_threshold` und einen Nachweis darüber. `AUTOMATED` lässt das Adressbuch und frühere Nachweise eigenständig antworten, einschließlich Eigenerklärungen, solange `allow_self_declaration` wahr ist. Standardwert `AUTOMATED`."
          },
          "simplified_validation_threshold": {
            "type": "string",
            "description": "Dezimal-Zeichenkette, Standardwert \"0.00\". Im Modus `SIMPLIFIED` akzeptiert ein Transfer unterhalb dieses Betrags (in der Schwellenwertwährung) eine Eigenerklärung. Ein Transfer ohne Betrag in dieser Währung gilt als darüberliegend."
          },
          "data_sharing_fields": {
            "$ref": "#/components/schemas/TravelRuleDataSharingFields"
          },
          "matching_rules": {
            "$ref": "#/components/schemas/TravelRuleMatchingRules"
          },
          "legal_name": {
            "type": "string",
            "description": "Der rechtliche Name Ihres VASP. Erforderlich (nicht leer), um is_enabled auf true zu setzen."
          },
          "lei": {
            "type": "string",
            "description": "Ihr Legal Entity Identifier, angezeigt im VASP-Verzeichnis."
          },
          "compliance_email": {
            "type": "string",
            "format": "email",
            "description": "Compliance-Kontakt-E-Mail für Ihr VASP-Profil. Das Didit-Netzwerk listet Ihr Profil erst auf, sobald diese Adresse über einen per E-Mail gesendeten Link bestätigt wurde (POST /v3/travel-rule/settings/compliance-email/confirmation/); eine Änderung erfordert eine erneute Bestätigung."
          },
          "is_discoverable": {
            "type": "boolean",
            "description": "Gibt an, ob Ihr VASP-Profil im Didit-Netzwerk gelistet werden kann: für andere Didit-Kunden unter GET /v3/travel-rule/vasps/ auffindbar und über die Schiene INTERNAL erreichbar. Die Listung erfordert außerdem eine aktive Anwendung, aktivierte Travel Rule, einen offiziellen Firmennamen und eine bestätigte Compliance-E-Mail; didit_network gibt an, welche Voraussetzungen fehlen. Standardmäßig true."
          },
          "inbound_auto_accept": {
            "type": "boolean",
            "description": "Wenn true, wird eine eingehende TRP-Anfrage, deren Begünstigten-Wallet ein verifizierter Adressbucheintrag mit übereinstimmendem Namen ist, automatisch genehmigt. Wenn false, verbleibt diese Anfrage im Status ON_HOLD, bis Sie sie über den Eigentums-Endpoint genehmigen oder ablehnen. Transfers über die INTERNAL-Rail sowie After-Deposit-Transfers sind davon nicht betroffen. Standardmäßig true."
          },
          "allow_self_declaration": {
            "type": "boolean",
            "description": "Wenn true, bietet das Wallet-Ownership-Widget eine Selbsterklärung als Fallback-Nachweismethode an. Standardmäßig true."
          },
          "allow_screenshot_proof": {
            "type": "boolean",
            "description": "Wenn true, bietet das Wallet-Ownership-Widget den Upload von Screenshots als Methode für den Eigentumsnachweis an. Standardmäßig true."
          },
          "auto_wallet_verification": {
            "type": "boolean",
            "description": "Wenn true, wird beim Übermitteln eines ausgehenden Travel-Rule-Transfers, der einen Endbenutzer-Nachweis der Wallet-Kontrolle erfordert, automatisch eine an die Transaktion gebundene Wallet-Ownership-Widget-Sitzung generiert und im action_required-Block der Transaktion bereitgestellt. Standardmäßig true."
          },
          "vasp_attribution_enabled": {
            "type": "boolean",
            "description": "Wenn true, wird ein ausgehender Travel-Rule-Transfer, den keine Rail routen kann, mittels Blockchain-Analysen zugeordnet: Die Ziel-Wallet wird dem Eigentümer-VASP zugeordnet, die Entität wird auf dem Transfer sowie im VASP-Verzeichnis erfasst und die Rails werden einmalig mit dem zugeordneten Namen erneut ausgeführt. Standardmäßig true."
          },
          "counterparty_screening_enabled": {
            "type": "boolean",
            "description": "Opt-in-Screening auf Sanktionen und negative Medienberichte von VASPs der Gegenpartei, abgerechnet pro Screening zum Preis für Unternehmens-AML-Screening. Wenn aktiviert, prüft Didit die Gegenpartei, die ein ausgehender Transfer erreicht (wobei ein Screening wiederverwendet wird, das jünger als 30 Tage ist), und Sie können einen über POST /v3/travel-rule/vasps/{vasp_id}/screening/ screenen. Standardmäßig false: Es wird nichts geprüft oder abgerechnet."
          },
          "sunrise_policy": {
            "type": "string",
            "enum": [
              "",
              "HOLD",
              "REJECT",
              "PROCEED"
            ],
            "description": "Auswirkung eines abgelaufenen Transfers auf dessen Transaktion, wenn die Gegenpartei ein Verzeichniseintrag in einer Rechtsordnung unter sunrise_jurisdictions ist, die die Travel Rule noch nicht durchsetzt: HOLD verschiebt sie zur Prüfung, REJECT lehnt sie ab, PROCEED belässt ihren Status unverändert. Leer (Standardwert) folgt timeout_outcome. Gilt vor non_responsive_policy."
          },
          "sunrise_jurisdictions": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "readOnly": true,
            "description": "Schreibgeschützt. Die Länder (ISO 3166 Alpha-2), die Didit als in einer Travel Rule-Sunrise-Periode befindlich behandelt, in der die sunrise_policy gilt. Derzeit CO, KH und VN. Jede andere Rechtsordnung sowie eine leere oder unbekannte Angabe folgt dem timeout_outcome."
          },
          "non_responsive_policy": {
            "type": "string",
            "enum": [
              "",
              "HOLD",
              "REJECT",
              "PROCEED"
            ],
            "description": "Auswirkung eines abgelaufenen Transfers auf dessen Transaktion, wenn die Gegenpartei ein Verzeichniseintrag ist, dessen Reaktionsfähigkeit UNRESPONSIVE ist: HOLD, REJECT oder PROCEED, wie bei timeout_outcome. Leer (Standardwert) folgt timeout_outcome. sunrise_policy gilt zuerst, wenn beides zutrifft."
          },
          "travel_address": {
            "type": "string",
            "description": "Schreibgeschützt. Die eigene Travel Address Ihres VASP – der kodierte eingehende TRP-Anfrage-Endpoint, über den andere VASPs Sie erreichen. Leer, solange `is_enabled` den Wert false hat."
          },
          "disabled_networks": {
            "type": "array",
            "items": {
              "type": "string",
              "enum": [
                "GTR",
                "TRUST",
                "VERIFYVASP",
                "SYGNA"
              ]
            },
            "description": "Netzwerke, die von der Plattform-Mitgliedschaft abgemeldet wurden. Dies deaktiviert weder Ihre verknüpften eigenen Mitgliedschaften noch stellt es nicht verfügbare Netzwerke bereit.",
            "default": []
          },
          "networks": {
            "type": "object",
            "readOnly": true,
            "description": "Pro Netzwerk, wie diese Anwendung senden würde und warum sie es nicht kann. Kein Netzwerk, einschließlich GTR, ist standardmäßig enthalten: Ein Netzwerk ist über Ihre eigene verknüpfte Mitgliedschaft erreichbar oder über die Mitgliedschaft von Didit, sobald die Mitgliedschaft von Didit in diesem Netzwerk aktiv ist und Ihr eigener Teilnehmer darauf aktiv ist. Keine Live-Prüfung von Status oder Zustellung.",
            "properties": {
              "gtr": {
                "$ref": "#/components/schemas/TravelRuleNetworkState"
              },
              "trust": {
                "$ref": "#/components/schemas/TravelRuleNetworkState"
              },
              "verifyvasp": {
                "$ref": "#/components/schemas/TravelRuleNetworkState"
              },
              "sygna": {
                "$ref": "#/components/schemas/TravelRuleNetworkState"
              }
            }
          },
          "didit_network": {
            "type": "object",
            "readOnly": true,
            "description": "Gibt an, ob das Didit-Netzwerk Ihr VASP-Profil listet, sodass andere Didit-Kunden es im Verzeichnis finden und über die INTERNAL-Schiene erreichen können, sowie jede Bedingung, die noch fehlt.",
            "properties": {
              "listed": {
                "type": "boolean"
              },
              "missing": {
                "type": "array",
                "items": {
                  "type": "string",
                  "enum": [
                    "travel_rule_off",
                    "sandbox_application",
                    "not_discoverable",
                    "legal_name_missing",
                    "compliance_email_missing",
                    "compliance_email_unconfirmed",
                    "excluded_by_staff",
                    "internal_organization"
                  ]
                },
                "description": "Leer, wenn gelistet. compliance_email_unconfirmed: Senden Sie die Bestätigung mit POST /v3/travel-rule/settings/compliance-email/confirmation/ und öffnen Sie den per E-Mail gesendeten Link. excluded_by_staff: Didit hat die Anwendung als Test-, Demo- oder interne Anwendung markiert."
              },
              "compliance_email_confirmed": {
                "type": "boolean",
                "description": "Gibt an, ob die aktuelle compliance_email über den per E-Mail gesendeten Link bestätigt wurde."
              }
            }
          }
        }
      },
      "TravelRuleSettingsUpdate": {
        "type": "object",
        "properties": {
          "is_enabled": {
            "type": "boolean"
          },
          "legal_name": {
            "type": "string",
            "maxLength": 255
          },
          "lei": {
            "type": "string",
            "maxLength": 20
          },
          "jurisdiction": {
            "type": "string",
            "maxLength": 8
          },
          "name_matching_strictness": {
            "type": "string",
            "enum": [
              "NONE",
              "STRICT",
              "CONTAINS",
              "DEFAULT",
              "FUZZY"
            ],
            "description": "`CONTAINS` akzeptiert einen Namen, dessen Wörter alle im anderen vorkommen."
          },
          "confirmation_timeout_hours": {
            "type": "integer",
            "minimum": 1
          },
          "timeout_outcome": {
            "type": "string",
            "enum": [
              "HOLD",
              "REJECT",
              "PROCEED"
            ]
          },
          "compliance_email": {
            "type": "string",
            "format": "email",
            "description": "Compliance-Kontakt-E-Mail für Ihr VASP-Profil. Das Didit-Netzwerk listet Ihr Profil erst auf, sobald diese Adresse über einen per E-Mail gesendeten Link bestätigt wurde (POST /v3/travel-rule/settings/compliance-email/confirmation/); eine Änderung erfordert eine erneute Bestätigung."
          },
          "is_discoverable": {
            "type": "boolean",
            "description": "Gibt an, ob Ihr VASP-Profil im Didit-Netzwerk gelistet werden kann: für andere Didit-Kunden unter GET /v3/travel-rule/vasps/ auffindbar und über die Schiene INTERNAL erreichbar. Die Listung erfordert außerdem eine aktive Anwendung, aktivierte Travel Rule, einen offiziellen Firmennamen und eine bestätigte Compliance-E-Mail; didit_network gibt an, welche Voraussetzungen fehlen. Standardmäßig true."
          },
          "threshold_amount": {
            "type": "string",
            "description": "Dezimal-Zeichenkette, null oder größer, in der Standardwährung Ihrer Anwendung. Mindesttransferbetrag, der einen verwalteten Austausch auslöst."
          },
          "ownership_validation_mode": {
            "type": "string",
            "enum": [
              "FULL",
              "SIMPLIFIED",
              "AUTOMATED"
            ],
            "description": "Siehe das Antwortfeld mit demselben Namen."
          },
          "simplified_validation_threshold": {
            "type": "string",
            "description": "Dezimal-Zeichenkette, 0 oder höher."
          },
          "data_sharing_fields": {
            "allOf": [
              {
                "$ref": "#/components/schemas/TravelRuleDataSharingFields"
              }
            ],
            "description": "Zusammengeführt pro Entitätstyp: Ein Entitätstyp, den Sie weglassen, behält seine aktuelle Auswahl. Eine Auswahl, die die Auftraggeber-Pflichten Ihres `jurisdiction`-Regimes (EU TFR oder FATF-Empfehlung 16) nicht erfüllen kann, einschließlich einer leeren Liste, wird mit `400` abgewiesen."
          },
          "matching_rules": {
            "allOf": [
              {
                "$ref": "#/components/schemas/TravelRuleMatchingRules"
              }
            ],
            "description": "Zusammengeführt pro Entitätstyp und pro Feld darin. Ein Feld, das für diesen Entitätstyp nicht verglichen wird (beispielsweise `date_of_birth` für `company`), wird mit `400` abgewiesen."
          },
          "inbound_auto_accept": {
            "type": "boolean"
          },
          "allow_self_declaration": {
            "type": "boolean"
          },
          "allow_screenshot_proof": {
            "type": "boolean",
            "description": "Wenn true, bietet das Wallet-Ownership-Widget den Upload von Screenshots als Methode für den Eigentumsnachweis an. Standardmäßig true."
          },
          "auto_wallet_verification": {
            "type": "boolean"
          },
          "vasp_attribution_enabled": {
            "type": "boolean"
          },
          "counterparty_screening_enabled": {
            "type": "boolean",
            "description": "Opt-in-Screening auf Sanktionen und negative Medienberichte von VASPs der Gegenpartei, abgerechnet pro Screening zum Preis für Unternehmens-AML-Screening. Wenn aktiviert, prüft Didit die Gegenpartei, die ein ausgehender Transfer erreicht (wobei ein Screening wiederverwendet wird, das jünger als 30 Tage ist), und Sie können einen über POST /v3/travel-rule/vasps/{vasp_id}/screening/ screenen. Standardmäßig false: Es wird nichts geprüft oder abgerechnet."
          },
          "sunrise_policy": {
            "type": "string",
            "enum": [
              "",
              "HOLD",
              "REJECT",
              "PROCEED"
            ],
            "description": "HOLD, REJECT, PROCEED oder leer, um timeout_outcome zu folgen. Siehe das gleichnamige Antwortfeld."
          },
          "non_responsive_policy": {
            "type": "string",
            "enum": [
              "",
              "HOLD",
              "REJECT",
              "PROCEED"
            ],
            "description": "HOLD, REJECT, PROCEED oder leer, um timeout_outcome zu folgen. Siehe das gleichnamige Antwortfeld."
          },
          "disabled_networks": {
            "type": "array",
            "items": {
              "type": "string",
              "enum": [
                "GTR",
                "TRUST",
                "VERIFYVASP",
                "SYGNA"
              ]
            },
            "description": "Netzwerke, die von der Plattform-Mitgliedschaft abgemeldet wurden. Dies deaktiviert weder Ihre verknüpften eigenen Mitgliedschaften noch stellt es nicht verfügbare Netzwerke bereit.",
            "default": []
          }
        },
        "description": "Alle Felder optional; PUT wendet eine partielle Aktualisierung an."
      },
      "WalletAddressEntry": {
        "type": "object",
        "properties": {
          "uuid": {
            "type": "string",
            "format": "uuid"
          },
          "address": {
            "type": "string",
            "description": "Die Adresse; `\"\"` für einen Eintrag, der nur anhand seines Hashs importiert wurde. Eindeutig pro Anwendung, Netzwerk und Memo, wobei die Adresse ohne Berücksichtigung der Groß-/Kleinschreibung verglichen wird. Nachdem Sie einen Eintrag gelöscht haben, können Sie dieselbe Adresse erneut registrieren."
          },
          "chain": {
            "type": "string",
            "description": "Chain-Token für die Adresse, zum Beispiel `ETH` oder `BTC`. Wenn Didit einen Transfer weiterleitet oder registriert, gleicht es Adressbucheinträge anhand der Adresse ab und, wenn der Transfer eine Chain enthält, auch anhand dieses Werts, unabhängig von Groß-/Kleinschreibung. Die Chain eines Transfers ist `beneficiary_data.chain`, ausgefüllt aus der Krypto-Chain der Transaktion oder dem Währungssymbol (zum Beispiel `ETH`), wenn Sie sie nicht senden, oder die `chain` einer Registrierung nach der Einzahlung; verwenden Sie daher überall denselben Token. Ein Eintrag mit leerer Chain stimmt mit jeder Chain überein. Ein auf Bitcoin registrierter Lightning-Zahlungsempfänger (eine Knoten-ID oder eine Lightning-Adresse) wird in Kleinbuchstaben unter `LIGHTNING` gespeichert, wo Lightning-Transfers abgeglichen werden. Bekannte Chains werden unter einer kanonischen Kennung gespeichert, unabhängig von der Schreibweise, die Sie senden: „ethereum“, „Ethereum“ und „ERC20“ werden alle als ETH gespeichert, „BNB Smart Chain“ und „BEP20“ als BNB, „tron“ als TRX. Ein unbekannter Chain-Name wird unverändert beibehalten."
          },
          "holder_vendor_data": {
            "type": "string",
            "description": "Ihre interne Kennung für den Inhaber."
          },
          "holder_name": {
            "type": "string",
            "description": "Name des Wallet-Inhabers, der für den Abgleich des Begünstigtennamens verwendet wird."
          },
          "entity_type": {
            "type": "string",
            "description": "Freitext, standardmäßig \"individual\"."
          },
          "is_ownership_verified": {
            "type": "boolean",
            "description": "Schreibgeschützt. Gibt an, ob das Eigentum an dieser Adresse nachgewiesen wurde."
          },
          "created_at": {
            "type": "string",
            "format": "date-time"
          },
          "travel_address": {
            "type": "string",
            "description": "Die Travel Address des VASP der Gegenpartei für diese Wallet, falls bekannt. Ermöglicht Didit, die Transfers dieses Begünstigten über die TRP-Schiene für die von TRP unterstützten Assets (BTC, ETH und USDC auf einem angegebenen Netzwerk) weiterzuleiten."
          },
          "address_hash": {
            "type": "string",
            "description": "Schreibgeschützt. SHA-256 der Adresse in Kleinbuchstaben, als hexadezimale Zeichenkette in Kleinbuchstaben. Ein Eintrag, der nur über seinen Hash importiert wurde, wird darüber abgeglichen."
          },
          "memo": {
            "type": "string",
            "description": "Das Destination-Tag oder Memo, das Teil der Wallet in einem Memo-Netzwerk ist (XRP, XLM, EOS, ATOM, HBAR); `\"\"` für die gesamte Adresse. Ein Eintrag mit einem Memo stimmt nur mit Überweisungen überein, die dieses Memo angeben; ein Eintrag ohne Memo stimmt mit der gesamten Adresse überein."
          },
          "receiving_travel_address": {
            "type": "string",
            "readOnly": true,
            "description": "Ihre wallet-spezifische Travel Address für diese Wallet: Geben Sie sie an den sendenden VASP weiter, damit dessen TRP-Anfrage diese Wallet benennt. Leer für eine Wallet, die als die eines anderen VASP erfasst ist, solange Travel Rule deaktiviert ist und bevor Ihr VASP-Profil gespeichert wird."
          }
        }
      },
      "WalletAddressEntryCreate": {
        "type": "object",
        "required": [
          "address"
        ],
        "properties": {
          "address": {
            "type": "string",
            "maxLength": 128,
            "description": "Die Adresse. Eine XRP-X-Adresse wird als klassische Adresse und Tag gespeichert, sodass sie Transfers zugeordnet werden kann, die eine der beiden Formen nennen."
          },
          "chain": {
            "type": "string",
            "maxLength": 32,
            "description": "Chain-Token für die Adresse, zum Beispiel `ETH` oder `BTC`. Wenn Didit einen Transfer routet oder registriert, gleicht es Adressbucheinträge anhand der Adresse und – sofern der Transfer eine Chain enthält – auch anhand dieses Werts ab (Groß-/Kleinschreibung wird ignoriert). Die Chain eines Transfers ist `beneficiary_data.chain`, ausgefüllt anhand der Krypto-Chain der Transaktion oder des Währungssymbols (zum Beispiel `ETH`), falls Sie dies nicht übermitteln, oder das `chain`-Feld einer Registrierung nach der Einzahlung. Verwenden Sie daher überall dasselbe Token. Ein Eintrag mit leerer Chain stimmt mit jeder Chain überein. Bekannte Chains werden unter einer kanonischen Kennung gespeichert, unabhängig von der übermittelten Schreibweise: \"ethereum\", \"Ethereum\" und \"ERC20\" werden alle als ETH gespeichert, \"BNB Smart Chain\" und \"BEP20\" als BNB, \"tron\" als TRX. Ein unbekannter Chain-Name wird wie angegeben beibehalten."
          },
          "holder_vendor_data": {
            "type": "string",
            "maxLength": 255
          },
          "holder_name": {
            "type": "string",
            "maxLength": 255
          },
          "entity_type": {
            "type": "string",
            "default": "individual",
            "maxLength": 16
          },
          "self_declared": {
            "type": "boolean",
            "default": false,
            "description": "Nur schreibbar. Wenn true, wird der Eintrag bereits über einen SELF_DECLARATION-Nachweis zur Eigentümerschaft verifiziert erstellt. Gibt 400 zurück, wenn `allow_self_declaration` in Ihren Travel Rule-Einstellungen deaktiviert ist."
          },
          "travel_address": {
            "type": "string",
            "description": "Optional. Die Travel Address des VASP der Gegenpartei für diese Wallet, die das TRP-Routing für die von TRP unterstützten Assets (BTC, ETH und USDC auf einem benannten Netzwerk) ermöglicht. Eine ungültige Travel Address gibt 400 zurück.",
            "maxLength": 512
          },
          "memo": {
            "type": "string",
            "maxLength": 256,
            "description": "Optional. Das Destination-Tag oder Memo, das Teil der Wallet ist. XRP: ein Destination-Tag, eine Ganzzahl von 0 bis 4294967295 (eine JSON-Zahl wird akzeptiert). XLM: ein Text-Memo von bis zu 28 Bytes, eine 64-Bit-ID oder ein 32-Byte-Hash in Hex. EOS: bis zu 256 Bytes. ATOM: bis zu 256 Zeichen. HBAR: bis zu 100 Bytes. Bitcoin-, EVM-, Solana-, Tron-, Litecoin-, Bitcoin Cash-, Dogecoin- und Lightning-Wallets unterstützen kein Memo: die Angabe eines Memos führt zu einem `400`. Alias: `destinationTag` oder `destination_tag`."
          }
        }
      },
      "WalletAddressEntryUpdate": {
        "type": "object",
        "properties": {
          "holder_name": {
            "type": "string",
            "maxLength": 255
          },
          "holder_vendor_data": {
            "type": "string",
            "maxLength": 255
          },
          "entity_type": {
            "type": "string",
            "maxLength": 16
          },
          "travel_address": {
            "type": "string",
            "maxLength": 512
          }
        },
        "description": "PATCH ist eine partielle Aktualisierung; die Antwort gibt nur holder_name, holder_vendor_data, entity_type, travel_address, receiving_travel_address, label und owner_type zurück."
      },
      "TravelRuleTransferDetail": {
        "type": "object",
        "description": "Vollständiges Transfer-Objekt, das von den Endpoints zur Eigentümerbestätigung und zum Abschließen/Abbrechen zurückgegeben wird. Solange das Wallet-Eigentum eines eingehenden Transfers unbestätigt ist, werden `originator_data` und `beneficiary_data` der Gegenpartei maskiert zurückgegeben (der erste Buchstabe jedes Wortes bleibt erhalten; Wallet, Chain und VASP-Routing bleiben lesbar) und `data_masked` ist true.",
        "properties": {
          "uuid": {
            "type": "string",
            "format": "uuid"
          },
          "status": {
            "type": "string",
            "enum": [
              "AWAITING_COUNTERPARTY",
              "ON_HOLD",
              "COMPLETED",
              "FINISHED",
              "CANCELLED",
              "EXPIRED",
              "COUNTERPARTY_MISMATCHED_DATA",
              "COUNTERPARTY_VASP_NOT_FOUND",
              "COUNTERPARTY_VASP_NOT_REACHABLE",
              "UNCONFIRMED_OWNERSHIP",
              "COUNTERPARTY_VASP_GENERAL_DECLINE",
              "NOT_ENOUGH_COUNTERPARTY_DATA",
              "NOT_APPLICABLE"
            ]
          },
          "direction": {
            "type": "string",
            "enum": [
              "INBOUND",
              "OUTBOUND"
            ]
          },
          "rail": {
            "type": "string",
            "nullable": true,
            "enum": [
              "INTERNAL",
              "TRP",
              "GTR",
              "TRUST",
              "VERIFYVASP",
              "SYGNA",
              "EMAIL",
              "TEST_VASP",
              null
            ],
            "description": "Die Schiene (Rail), über die der Transfer geroutet wurde, oder null, wenn keine Schiene ausgewählt wurde (z. B. unterhalb des Schwellenwerts, eine selbstverwahrte Gegenpartei-Wallet, eine Registrierung nach Einzahlung oder keine erreichbare Gegenpartei). INTERNAL bedeutet, dass beide Seiten Didit-Anwendungen sind; EMAIL bedeutet, dass die Gegenpartei über einen per E-Mail gesendeten Abhol-Link erreicht wurde. TEST_VASP bedeutet, dass der Didit Test VASP den Sandbox-Transfer beantwortet hat. Über GTR, VERIFYVASP und SYGNA liest Didit die Antwort der Gegenpartei aus der Antwort des Netzwerks oder durch Abrufen alle 5 Minuten. TRUST sendet nur, sodass ein TRUST-Transfer auf AWAITING_COUNTERPARTY bleibt, bis er abläuft. Eine Netzwerk-Schiene wird nur verwendet, wenn Sie Ihre eigene Mitgliedschaft für dieses Netzwerk verknüpft haben. Sie wird nach der Rückgabe der Antwort auf die Transaktionserstellung ausgewählt, weshalb sie in dieser Antwort null ist."
          },
          "protocol": {
            "type": "string",
            "nullable": true
          },
          "ivms_version": {
            "type": "string",
            "example": "ivms101.2023"
          },
          "required": {
            "type": "boolean"
          },
          "ownership_confirmed": {
            "type": "boolean",
            "nullable": true
          },
          "deadline_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "timeline": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "status": {
                  "type": "string"
                },
                "at": {
                  "type": "string",
                  "format": "date-time"
                },
                "detail": {
                  "type": "string"
                },
                "name_match": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/TravelRuleNameMatch"
                    }
                  ],
                  "nullable": true,
                  "description": "Der Namensabgleich, über den dieser Eintrag entschieden hat, neben `detail`. Fehlt bei Einträgen, bei denen kein Name verglichen wurde."
                },
                "reason": {
                  "type": "string",
                  "description": "Nur beim Eintrag eines Übergangs vorhanden, der durch eine fehlgeschlagene Zustellung verursacht wurde: `email_undeliverable` oder `delivery_failed`, der Wert, den `reason` des Transfers meldet."
                }
              }
            }
          },
          "counterparty_vasp": {
            "type": "object",
            "nullable": true,
            "properties": {
              "name": {
                "type": "string"
              },
              "lei": {
                "type": "string"
              },
              "dd_score": {
                "type": "integer",
                "description": "Due-Diligence-Score von 0 bis 100, wobei ein höherer Wert besser ist. Gleiche Skala wie im VASP-Verzeichnis."
              },
              "dd_score_breakdown": {
                "type": "object",
                "description": "Beiträge pro Komponente zu dd_score, ein Objekt pro Komponente wie im VASP-Verzeichnis (jurisdiction, verification, protocol, lei, history, essentials, responsiveness), jeweils {points, max, reason, detail}. {}, bis die Gegenpartei bewertet wurde.",
                "additionalProperties": {
                  "type": "object",
                  "properties": {
                    "points": {
                      "type": "number",
                      "description": "Für diese Komponente vergebene Punkte."
                    },
                    "max": {
                      "type": "integer",
                      "description": "Maximale Punktzahl, die diese Komponente vergeben kann."
                    },
                    "reason": {
                      "type": "string",
                      "description": "Maschinenlesbarer Code der Entscheidung der Komponente."
                    },
                    "detail": {
                      "type": "string",
                      "description": "Für Menschen lesbare Begründung für die vergebenen Punkte."
                    }
                  }
                }
              },
              "dd_assessed_at": {
                "type": "string",
                "format": "date-time",
                "nullable": true,
                "description": "Wann die Due-Diligence-Bewertung zuletzt durchgeführt wurde. Null, bis die Gegenpartei bewertet wurde."
              }
            }
          },
          "originator_data": {
            "type": "object",
            "description": "Auftraggeber-Partei. Bei einer eingehenden Überweisung werden die Werte der Gegenpartei maskiert, bis die Eigentümerstruktur bestätigt ist."
          },
          "beneficiary_data": {
            "type": "object",
            "description": "Begünstigter. Bei eingehenden Übertragungen werden die Werte der Gegenpartei maskiert, bis die Eigentümerschaft bestätigt ist."
          },
          "name_match": {
            "allOf": [
              {
                "$ref": "#/components/schemas/TravelRuleNameMatch"
              }
            ],
            "nullable": true,
            "description": "Der Namensabgleich, der über die Überweisung entschieden hat, oder null, bis einer ausgeführt wurde. Solange die Parteien maskiert sind und auf der Kopie des anderen Kunden eines INTERNAL-Austauschs, werden `transfer_name`, `compared_name`, `matched_names` und `mismatched_names` ausgeblendet. `score` und `matched` können voneinander abweichen: `matched` richtet sich nach der Strenge, `score` ist die Ähnlichkeit der beiden vollständigen Namen."
          },
          "data_match": {
            "$ref": "#/components/schemas/TravelRuleDataMatch"
          },
          "mismatched_fields": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Kürzel für `data_match.mismatched_fields`. Leer, wenn keine Unterschiede vorliegen."
          },
          "data_unmasked": {
            "$ref": "#/components/schemas/TravelRuleDataUnmasked"
          },
          "data_masked": {
            "type": "boolean",
            "description": "Wahr, solange die personenbezogenen Daten der Gegenpartei in dieser Antwort maskiert sind."
          },
          "created_at": {
            "type": "string",
            "format": "date-time"
          },
          "delivery": {
            "nullable": true,
            "allOf": [
              {
                "$ref": "#/components/schemas/TravelRuleDelivery"
              }
            ],
            "description": "Status der neuesten Nachricht, die dieser Transfer der anderen Seite schuldet. Null, wenn der Transfer nie eine geschuldet hat (zum Beispiel bei einem Wert unter `threshold_amount`, bei einer deklarierten selbstverwahrten Wallet oder bei einer Sunrise-Registrierung)."
          },
          "discovery": {
            "type": "array",
            "description": "Wie Didit nach der Gegenpartei gesucht hat, ein Eintrag pro ausgeführtem Schritt. Leer, wenn keine Ermittlung stattgefunden hat, beispielsweise bei einem eingehenden Transfer.",
            "items": {
              "$ref": "#/components/schemas/TravelRuleDiscoveryStep"
            }
          },
          "reason": {
            "type": "string",
            "description": "Warum ein Transfer mit `COUNTERPARTY_VASP_NOT_FOUND` oder `COUNTERPARTY_VASP_NOT_REACHABLE` feststeckt; `\"\"` für jeden anderen Status. Eine fehlgeschlagene Zustellung bestimmt dies zuerst, ausschließlich bei `COUNTERPARTY_VASP_NOT_REACHABLE`: `email_undeliverable` (der E-Mail-Provider hat die Compliance-E-Mail abgelehnt und es bleibt keine Adresse mehr zum Ausprobieren: beim Senden, bei einer Erinnerung oder als später gemeldeter permanenter Bounce) oder `delivery_failed` (die zustellende Schiene ist endgültig fehlgeschlagen: eine Netzwerkschiene hat die Nachricht abgelehnt oder keine Wiederholungsversuche mehr übrig, ein `TRP`-Identitäts-Host hat nicht geantwortet oder der `TRP`-Host der Gegenpartei hat die Anfrage nicht akzeptiert). Andernfalls bestimmt es der `discovery`-Trace: `awaiting_end_user` (kein Schritt hat eine Gegenpartei benannt, die Didit erreichen kann), `directory_match_no_route` (ein Schritt hat einen Verzeichnis-VASP benannt, der keine Route hat), `picked_member_without_proven_wallet` (der Endbenutzer hat einen Didit-Kunden ausgewählt, der die Kontrolle über die Wallet nicht nachgewiesen hat) oder `no_directory_match`, wenn der Trace keinen anderen Grund liefert. Ein erneutes Senden bringt den Transfer voran, sodass der Grund zurückgesetzt wird. Siehe [Warum ein Transfer feststeckt](/de/transaction-monitoring/travel-rule#warum-ein-transfer-blockiert-ist)."
          },
          "next_actions": {
            "type": "array",
            "description": "Was den Transfer voranbringt; `[]` für jeden Status außer `COUNTERPARTY_VASP_NOT_FOUND` oder `COUNTERPARTY_VASP_NOT_REACHABLE`. `email_undeliverable` bietet `update_compliance_email`, dann `resend`. `delivery_failed` bietet `resend`. Ein Discovery-Grund bietet `select_counterparty_vasp`, `declare_self_hosted`, `add_vasp_hint` und `resend`.",
            "items": {
              "$ref": "#/components/schemas/TravelRuleNextAction"
            }
          },
          "chain_details": {
            "$ref": "#/components/schemas/TravelRuleChainDetails"
          }
        }
      },
      "TravelRuleOwnershipConfirmRequest": {
        "type": "object",
        "required": [
          "confirmed"
        ],
        "properties": {
          "confirmed": {
            "type": "boolean",
            "description": "true, um die Inhaberschaft zu bestätigen, false, um sie abzulehnen."
          },
          "wallet_address": {
            "type": "string",
            "default": "",
            "description": "Eingehende TRP-Transfers: die Zahlungsadresse, die Didit an das auftraggebende VASP zurückgibt, wenn Sie genehmigen. Standardmäßig die Adresse des übereinstimmenden Adressbucheintrags, danach beneficiary_data.wallet_address. Bei einem deklarierten Transfer mit selbstverwahrter Wallet, der keine Wallet der Gegenpartei benennt, die Wallet, deren Eigentümerschaft Sie verifiziert haben; ohne diese wird die Anfrage mit 400 abgelehnt. Bei anderen Transfers ignoriert."
          }
        }
      },
      "TravelRuleTransferPatchRequest": {
        "type": "object",
        "description": "Geben Sie genau eines der folgenden Elemente an: payment_txn_id (finish), action=cancel, action=resend, action=update_compliance_email mit compliance_email, action=update_originator_wallet mit wallet_address oder action=beneficiary_vasp mit beneficiary_vasp.",
        "properties": {
          "payment_txn_id": {
            "type": "string",
            "description": "Der On-Chain-Transaktions-Hash. Erfordert, dass der Transfer ein ausgehender Transfer im Status COMPLETED ist."
          },
          "action": {
            "type": "string",
            "enum": [
              "cancel",
              "resend",
              "update_compliance_email",
              "update_originator_wallet",
              "beneficiary_vasp"
            ],
            "description": "\"cancel\" bricht einen nicht-terminalen Transfer ab. \"resend\" führt das Routing für einen ausgehenden Transfer erneut aus, der im Status COUNTERPARTY_VASP_NOT_FOUND, COUNTERPARTY_VASP_NOT_REACHABLE oder NOT_ENOUGH_COUNTERPARTY_DATA feststeckt. \"update_compliance_email\" ersetzt die Compliance-E-Mail-Adresse, an die die Anfrage gesendet wird, bei einem ausgehenden Transfer in einem dieser drei Status; senden Sie danach \"resend\". \"update_originator_wallet\" erfasst die Wallet, von der die Mittel tatsächlich abgebucht wurden (`wallet_address`, `memo`). \"beneficiary_vasp\" gibt den Gegenpartei-VASP selbst an (erfordert `beneficiary_vasp`) für einen ausgehenden Transfer in einem dieser Status: Er wird an diesen VASP geroutet und erneut gesendet."
          },
          "compliance_email": {
            "type": "string",
            "format": "email",
            "maxLength": 254,
            "description": "Erforderlich bei `action: update_compliance_email`. Wird als `beneficiary_data.counterparty_vasp_email` dieses Transfers gespeichert: Es gehört ausschließlich zu diesem Transfer und wird weder einem Verzeichniseintrag noch einer Kontaktliste hinzugefügt."
          },
          "wallet_address": {
            "type": "string",
            "maxLength": 128,
            "description": "Mit `action: update_originator_wallet`: Die Wallet, von der die Mittel ausgegangen sind. Wenn die UTXO-Inputs des Transfers bekannt sind, muss sie eine davon sein."
          },
          "memo": {
            "type": "string",
            "maxLength": 256,
            "description": "Mit `action: update_originator_wallet`: Das Memo oder Tag der Wallet in einem Memo-Netzwerk. Optional."
          },
          "beneficiary_vasp": {
            "type": "string",
            "format": "uuid",
            "description": "Erforderlich bei action=beneficiary_vasp: Die `id` eines Verzeichnis-VASPs aus `GET /v3/travel-rule/vasps/`. Ihre Auswahl hat Vorrang vor jedem automatischen Erkennungsschritt, der sie niemals überschreibt."
          }
        }
      },
      "VaspDirectoryEntry": {
        "type": "object",
        "description": "Ein VASP des Verzeichnisses oder ein Mitglied des Didit-Netzwerks mit den Routen, über die Ihre Anwendung ihn erreicht. Ein Kunde ist nur dann Mitglied des Didit-Netzwerks, solange seine Anwendung live ist, seine Travel Rule aktiviert ist, sein Profil auffindbar ist, er einen juristischen Namen und eine bestätigte Compliance-E-Mail hat und Didit die Anwendung nicht als Test-, Demo- oder interne Anwendung markiert hat. Jede Zeile enthält außerdem die geteilte Due-Diligence-Bewertung (dd_score, risk_level, responsiveness, essential_checks) sowie die eigene Entscheidung, das Entity-Screening und die Fragebögen Ihrer Anwendung, die kein anderer Kunde sieht.",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "description": "Die ID des Eintrags, für GET /v3/travel-rule/vasps/{vasp_id}/."
          },
          "kind": {
            "type": "string",
            "enum": [
              "directory",
              "didit"
            ],
            "description": "directory für einen Eintrag des gemeinsamen Verzeichnisses; didit für ein Mitglied des Didit-Netzwerks."
          },
          "name": {
            "type": "string"
          },
          "lei": {
            "type": "string"
          },
          "jurisdiction": {
            "type": "string",
            "description": "ISO 3166-Ländercode, wie von der Quelle bereitgestellt."
          },
          "domains": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Die Web-Domains des VASPs. Für Didit-Netzwerkmitglieder immer leer."
          },
          "reachable": {
            "type": "boolean",
            "description": "Gibt an, ob Ihre Anwendung über eine verfügbare Route zu diesem VASP oder zu einer seiner Einheiten für eine Marke verfügt. Bei Mitgliedern des Didit-Netzwerks immer true, außer bei einer Sandbox-Anwendung, bei der jede Zeile false ist."
          },
          "aliases": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "name": {
                  "type": "string"
                },
                "kind": {
                  "type": "string",
                  "enum": [
                    "trading_name",
                    "other_legal_name",
                    "network_name",
                    "attribution",
                    "merged",
                    "staff"
                  ],
                  "description": "trading_name, other_legal_name (aus dem globalen LEI-Register), network_name (der Name in einem Travel-Rule-Netzwerk), attribution (der Entitätsname, den die Blockchain-Analyse den Wallets des VASP zuweist), merged (der Name eines Duplikateintrags, der mit diesem zusammengeführt wurde) oder staff."
                }
              }
            },
            "description": "Andere Namen, unter denen der VASP geführt wird."
          },
          "networks": {
            "type": "array",
            "items": {
              "type": "object",
              "description": "Ein aktueller Eintrag dieses VASP im Mitgliederverzeichnis eines Travel Rule-Netzwerks. Ein TRISA-Eintrag gibt an, wer der VASP auf TRISA ist; Didit hat keinen TRISA-Kanal, daher ist dies niemals eine Route.",
              "properties": {
                "network": {
                  "type": "string",
                  "enum": [
                    "GTR",
                    "TRUST",
                    "VERIFYVASP",
                    "SYGNA",
                    "TRISA"
                  ]
                },
                "code": {
                  "type": "string",
                  "description": "Die Kennung des VASPs in diesem Netzwerk."
                },
                "listed_name": {
                  "type": "string",
                  "description": "Der Name, unter dem das Netzwerk den VASP führt."
                },
                "country": {
                  "type": "string",
                  "description": "Das Land, das das Netzwerk auflistet, sofern angegeben."
                },
                "verified_at": {
                  "type": "string",
                  "format": "date-time",
                  "nullable": true,
                  "description": "Wann Didit-Mitarbeiter den Eintrag verifiziert haben. Null für Einträge, die aus einem öffentlichen Verzeichnis gelesen wurden."
                },
                "last_seen_at": {
                  "type": "string",
                  "format": "date-time",
                  "nullable": true,
                  "description": "Wann die Quelle den Eintrag zuletzt aufgeführt hat. Ein Eintrag, den die Quelle drei Wochen lang nicht aufgeführt hat, wird entfernt."
                },
                "source": {
                  "type": "string",
                  "enum": [
                    "trisa_directory",
                    "staff"
                  ],
                  "description": "Woher der Eintrag stammt: aus dem öffentlichen TRISA-Verzeichnis oder von Didit-Mitarbeitern."
                }
              }
            }
          },
          "routes": {
            "type": "array",
            "items": {
              "type": "object",
              "description": "Eine Möglichkeit, wie Ihre Anwendung Travel-Rule-Daten an diesen VASP übermitteln kann, in der Reihenfolge, in der sie vom Versand ausprobiert werden. Eine Netzwerkroute erfordert eine Mitgliedschaft in diesem Netzwerk: Ihre eigene (im Marketplace verknüpft) oder die von Didit, sobald Didit eine besitzt. Ohne diese wird die Route mit dem Grund als nicht verfügbar aufgeführt und niemals als Möglichkeit, den VASP zu erreichen.",
              "properties": {
                "rail": {
                  "type": "string",
                  "enum": [
                    "INTERNAL",
                    "TRP",
                    "GTR",
                    "TRUST",
                    "VERIFYVASP",
                    "SYGNA",
                    "EMAIL"
                  ]
                },
                "status": {
                  "type": "string",
                  "enum": [
                    "available",
                    "unavailable"
                  ]
                },
                "reason": {
                  "type": "string",
                  "enum": [
                    "",
                    "no_membership",
                    "network_switched_off",
                    "sandbox_application"
                  ],
                  "description": "Warum eine nicht verfügbare Route nicht verwendet werden kann: no_membership (weder Sie noch Didit besitzen eine Mitgliedschaft in diesem Netzwerk), network_switched_off (Sie haben dieses Netzwerk in Ihren Einstellungen deaktiviert) oder sandbox_application (eine Sandbox-Anwendung sendet nur an den Didit Test VASP, daher ist keine Route für sie verfügbar). Leer, wenn die Route verfügbar ist."
                },
                "via": {
                  "type": "string",
                  "enum": [
                    "",
                    "own_membership",
                    "didit_membership",
                    "directory",
                    "contact",
                    "didit_network"
                  ],
                  "description": "Wie eine verfügbare Route erreicht wird: own_membership oder didit_membership für ein Netzwerk-Rail, directory für einen vom Verzeichnis verifizierten TRP-Endpoint, contact für das EMAIL-Rail, didit_network für ein Didit-Netzwerkmitglied. Leer, wenn die Route nicht verfügbar ist."
                }
              }
            }
          },
          "umbrella": {
            "type": "object",
            "nullable": true,
            "description": "Die Marke, deren reguliertes Unternehmen dieser Eintrag ist. Null, wenn er nicht Teil einer solchen ist.",
            "properties": {
              "id": {
                "type": "string",
                "format": "uuid"
              },
              "name": {
                "type": "string"
              }
            }
          },
          "entities": {
            "type": "array",
            "items": {
              "type": "object",
              "description": "Eine regulierte Einheit einer Marke: die juristische Person, die einen Transfer empfängt.",
              "properties": {
                "id": {
                  "type": "string",
                  "format": "uuid"
                },
                "name": {
                  "type": "string"
                },
                "lei": {
                  "type": "string"
                },
                "jurisdiction": {
                  "type": "string"
                },
                "reachable": {
                  "type": "boolean",
                  "description": "Gibt an, ob Ihre Anwendung über eine verfügbare Route dorthin verfügt."
                }
              }
            },
            "description": "Für eine Marke: die regulierten Entitäten, die ihre Überweisungen empfangen. Eine Überweisung, die die Marke benennt, geht an die erreichbare Entität in der von ihr angegebenen Jurisdiktion (beneficiary_data.counterparty_vasp_jurisdiction), andernfalls an die Entität, die laut Blockchain-Analytics-Attribution mit der Ziel-Wallet verknüpft ist, andernfalls an die einzige erreichbare Entität, wenn keine Jurisdiktion angegeben ist. Zwischen zwei gleichermaßen passenden Entitäten wird niemals geraten."
          },
          "contacts": {
            "type": "array",
            "items": {
              "type": "object",
              "description": "Ein Compliance-Kontakt, an den der EMAIL-Kanal schreiben kann.",
              "properties": {
                "id": {
                  "type": "string",
                  "format": "uuid"
                },
                "email": {
                  "type": "string",
                  "format": "email"
                },
                "name": {
                  "type": "string"
                },
                "source": {
                  "type": "string",
                  "enum": [
                    "staff",
                    "application",
                    "learned"
                  ],
                  "description": "staff: Von Didit kuratiert; application: Von Ihrer Anwendung hinzugefügt; learned: Eine Adresse, die eine Travel-Rule-Anfrage über ihren Antwort-Link beantwortet hat."
                },
                "scope": {
                  "type": "string",
                  "enum": [
                    "platform",
                    "application"
                  ],
                  "description": "Plattform-Kontakte werden für die Überweisungen aller Didit-Kunden verwendet; Anwendungs-Kontakte sind privat für Ihre Anwendung, die nur ihre eigenen sieht."
                },
                "verified_at": {
                  "type": "string",
                  "format": "date-time",
                  "nullable": true,
                  "description": "Wann jemand an dieser Adresse eine Anfrage beantwortet hat. Null, wenn dies noch nicht geschehen ist."
                }
              }
            },
            "description": "Die Kontakte der Plattform für diesen VASP und die Ihrer eigenen Anwendung."
          },
          "dd_status": {
            "type": "string",
            "enum": [
              "NOT_STARTED",
              "IN_PROGRESS",
              "COMPLETED",
              "REJECTED"
            ],
            "description": "Didits Verifizierungsstatus des Eintrags, bewertet durch die Verifizierungskomponente von dd_score. Immer COMPLETED für ein Mitglied des Didit-Netzwerks."
          },
          "dd_score": {
            "type": "integer",
            "nullable": true,
            "minimum": 0,
            "maximum": 100,
            "description": "Der geteilte Due-Diligence-Score eines Verzeichniseintrags, 0 bis 100, wobei ein höherer Wert sicherer ist (siehe dd_score_semantic): die Summe der Punkte in dd_score_breakdown. Null für ein Didit-Netzwerkmitglied, das nicht bewertet wird. Ein Eintrag, der noch nicht bewertet wurde (dd_assessed_at null), zeigt 0 mit einem leeren risk_level; lesen Sie daher risk_level statt des Roh-Scores aus."
          },
          "reachable_rails": {
            "type": "array",
            "items": {
              "type": "string",
              "enum": [
                "INTERNAL",
                "TRP",
                "GTR",
                "TRUST",
                "VERIFYVASP",
                "SYGNA",
                "EMAIL"
              ]
            },
            "description": "Auf dem Eintrag erfasste Zahlungswege. Lesen Sie Routen, um zu sehen, was Ihre Anwendung aktuell nutzen kann."
          },
          "is_didit_customer": {
            "type": "boolean",
            "description": "true für ein Mitglied des Didit-Netzwerks (dd_status ist für diese immer COMPLETED, dd_score null und risk_level leer) und für einen Verzeichniseintrag, der mit einem Didit-Kunden verknüpft ist."
          },
          "dd_score_breakdown": {
            "type": "object",
            "description": "Ein Objekt pro Komponente von dd_score. Komponenten, ihre Gewichtung (max.) und ihre Ursachencodes: jurisdiction, 25 (jurisdiction_not_high_risk, jurisdiction_high_risk, jurisdiction_unknown); verification, 15 (dd_status_completed, dd_status_in_progress, dd_status_not_started, dd_status_rejected); protocol, 15 (native_rail, email_only, no_rail); lei, 10 (lei_valid, lei_missing); history, 10 (history, no_history); essentials, 15 (essential_checks, no_essential_checks); responsiveness, 10 (responsive, unresponsive, responsiveness_unknown). Leer für ein Mitglied des Didit-Netzwerks.",
            "additionalProperties": {
              "type": "object",
              "properties": {
                "points": {
                  "type": "number",
                  "description": "Punkte, die die Komponente beiträgt, gerundet auf eine Dezimalstelle."
                },
                "max": {
                  "type": "integer",
                  "description": "Das Gewicht der Komponente: die Punkte, die sie im besten Fall beiträgt."
                },
                "reason": {
                  "type": "string",
                  "description": "Maschinenlesbarer Code der Entscheidung der Komponente."
                },
                "detail": {
                  "type": "string",
                  "description": "Einzeilige englische Erklärung."
                }
              }
            }
          },
          "dd_assessed_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "description": "Wann dd_score, risk_level und responsiveness zuletzt berechnet wurden: nachdem ein Austausch mit dem Eintrag abgeschlossen, beendet oder abgelaufen ist, keine Übereinstimmung ergibt oder abgelehnt wird, wenn Didit den Eintrag aktualisiert oder kuratiert, und bei der wöchentlichen Verzeichnisaktualisierung. Null für ein Mitglied des Didit-Netzwerks."
          },
          "dd_score_semantic": {
            "type": "string",
            "enum": [
              "higher_is_safer"
            ],
            "description": "In welche Richtung dd_score verläuft: immer higher_is_safer."
          },
          "risk_level": {
            "type": "string",
            "enum": [
              "LOW",
              "MEDIUM",
              "HIGH",
              ""
            ],
            "description": "Das Band, in das dd_score fällt: LOW (70 oder mehr), MEDIUM (40 bis 69) oder HIGH (unter 40). Leer bei einem Didit-Netzwerkmitglied und bei einem Eintrag, der noch nicht bewertet wurde. Filtern Sie danach mit risk. Ihr eigenes als auffällig markiertes Screening ändert diesen gemeinsamen Wert niemals: Es setzt stattdessen counterparty_risk_level in Ihren Regeln auf HIGH."
          },
          "responsiveness": {
            "type": "object",
            "description": "Gibt an, ob der VASP Travel-Rule-Anfragen beantwortet: der Anteil der von Didit-Kunden in den letzten 90 Tagen an ihn gestellten Anfragen, die er beantwortet hat. Es zählen nur Anfragen, die über eine Netzwerk- oder Protokollschiene oder per E-Mail an eine geteilte Adresse (die Compliance-Adresse des Eintrags oder einen Plattformkontakt) gesendet wurden; eine Anfrage an eine von einem Kunden eingegebene Adresse oder an den privaten Kontakt eines Kunden zählt niemals. Eine abgelaufene Anfrage gilt als unbeantwortet; ein abgeschlossener Austausch, eine Ablehnung oder ein Datenkonflikt gilt als Antwort; eine stornierte Anfrage oder eine nicht erreichbare Schiene ist keines von beidem. Für ein Didit-Netzwerkmitglied immer UNKNOWN mit Zählerständen von null.",
            "properties": {
              "status": {
                "type": "string",
                "enum": [
                  "RESPONSIVE",
                  "UNRESPONSIVE",
                  "UNKNOWN"
                ],
                "description": "UNKNOWN bei weniger als 5 entschiedenen Anfragen im Zeitfenster; UNRESPONSIVE, wenn weniger als 10 Prozent davon beantwortet wurden; andernfalls RESPONSIVE."
              },
              "answered": {
                "type": "integer",
                "description": "Entschiedene Anfragen im Zeitfenster, die der VASP beantwortet hat."
              },
              "total": {
                "type": "integer",
                "description": "Entschiedene Anfragen im Zeitfenster: beantwortet plus abgelaufen."
              },
              "computed_at": {
                "type": "string",
                "format": "date-time",
                "nullable": true
              }
            }
          },
          "essential_checks": {
            "type": "object",
            "description": "Der Bericht über die grundlegenden Prüfungen eines Verzeichniseintrags, der ausschließlich aus den verifizierten Quellen der Plattform erstellt wird: Registrierung (ein offizielles Register führt den VASP: das vorläufige MiCA-Register der EU, das öffentliche TRISA-Verzeichnis oder das weltweite LEI-Register), Lizenz (eine MiCA-Genehmigung liegt vor und ist aktuell), Domain (die Domain des Eintrags stimmt mit seinem TRP-Endpoint oder der Website aus seinem Register überein) und LEI (sein LEI-Eintrag ist aktiv, ausgestellt und stimmt mit den Namen und dem Land des Eintrags überein). Die Essentials-Komponente von dd_score ist der Anteil der entschiedenen Prüfungen, die bestanden werden. Leer, bis die wöchentliche Verzeichnisaktualisierung den Eintrag erstmals prüft, und für ein Didit-Netzwerkmitglied immer leer.",
            "properties": {
              "level": {
                "type": "string",
                "enum": [
                  "essential"
                ]
              },
              "checked_at": {
                "type": "string",
                "format": "date-time"
              },
              "checks": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "id": {
                      "type": "string",
                      "enum": [
                        "registration",
                        "licence",
                        "domain",
                        "lei"
                      ]
                    },
                    "status": {
                      "type": "string",
                      "enum": [
                        "pass",
                        "fail",
                        "unknown"
                      ],
                      "description": "unknown, wenn keine hinterlegte Quelle die Prüfung entscheiden kann."
                    },
                    "reason": {
                      "type": "string",
                      "description": "Maschinenlesbarer Code der Entscheidung."
                    },
                    "detail": {
                      "type": "string",
                      "description": "Einzeilige englische Erklärung."
                    }
                  }
                }
              },
              "passed": {
                "type": "integer"
              },
              "failed": {
                "type": "integer"
              },
              "unknown": {
                "type": "integer"
              },
              "total": {
                "type": "integer"
              }
            }
          },
          "decision": {
            "allOf": [
              {
                "$ref": "#/components/schemas/TravelRuleCounterpartyDecision"
              }
            ],
            "nullable": true,
            "description": "Die Entscheidung Ihrer Anwendung über diesen VASP oder bei einer Entität ohne eigene Entscheidung die ihrer Marke (inherited_from benennt die Marke). Null, wenn keine vorhanden ist. Nur für Ihre Anwendung sichtbar."
          },
          "entity_screening": {
            "allOf": [
              {
                "$ref": "#/components/schemas/TravelRuleCounterpartyScreening"
              }
            ],
            "nullable": true,
            "description": "Das neueste Screening auf Sanktionen und negative Medienberichte dieses VASP durch Ihre Anwendung. Null, wenn Sie es nie überprüft haben. Nur für Ihre Anwendung sichtbar."
          },
          "questionnaires": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/TravelRuleCounterpartyQuestionnaire"
            },
            "description": "Die Due-Diligence-Fragebögen Ihrer Anwendung mit diesem VASP, neueste zuerst. Nur für Ihre Anwendung sichtbar."
          }
        },
        "example": {
          "id": "0d6f3c2a-6a1e-4c55-9a39-1f2b0c7d8e91",
          "kind": "directory",
          "name": "Example Counterparty VASP",
          "lei": "529900EXAMPLECPTY001",
          "jurisdiction": "DE",
          "domains": [
            "counterparty.example"
          ],
          "reachable": true,
          "aliases": [
            {
              "name": "Example Counterparty",
              "kind": "trading_name"
            }
          ],
          "networks": [
            {
              "network": "GTR",
              "code": "EXAMPLE01",
              "listed_name": "Example Counterparty VASP",
              "country": "DE",
              "verified_at": "2026-10-12T09:30:00Z",
              "last_seen_at": "2026-10-12T09:30:00Z",
              "source": "staff"
            }
          ],
          "routes": [
            {
              "rail": "GTR",
              "status": "unavailable",
              "reason": "no_membership",
              "via": ""
            },
            {
              "rail": "EMAIL",
              "status": "available",
              "reason": "",
              "via": "contact"
            }
          ],
          "umbrella": null,
          "entities": [],
          "contacts": [
            {
              "id": "6c1f9b8e-2d4a-4f7e-8b3c-5a9d0e1f2a3b",
              "email": "travelrule@counterparty.example",
              "name": "Travel Rule desk",
              "source": "staff",
              "scope": "platform",
              "verified_at": null
            }
          ],
          "dd_status": "NOT_STARTED",
          "dd_score": 62,
          "dd_score_breakdown": {
            "jurisdiction": {
              "points": 25.0,
              "max": 25,
              "reason": "jurisdiction_not_high_risk",
              "detail": "DEU is not on the high-risk jurisdiction list"
            },
            "verification": {
              "points": 3.8,
              "max": 15,
              "reason": "dd_status_not_started",
              "detail": "due diligence status NOT_STARTED"
            },
            "protocol": {
              "points": 6.0,
              "max": 15,
              "reason": "email_only",
              "detail": "reachable over the email fallback only"
            },
            "lei": {
              "points": 10.0,
              "max": 10,
              "reason": "lei_valid",
              "detail": "valid LEI on record"
            },
            "history": {
              "points": 5.0,
              "max": 10,
              "reason": "no_history",
              "detail": "no exchange history"
            },
            "essentials": {
              "points": 7.5,
              "max": 15,
              "reason": "no_essential_checks",
              "detail": "no decided essential check yet"
            },
            "responsiveness": {
              "points": 5.0,
              "max": 10,
              "reason": "responsiveness_unknown",
              "detail": "0 decided recent requests, too few to judge"
            }
          },
          "dd_assessed_at": "2026-10-12T09:30:00Z",
          "dd_score_semantic": "higher_is_safer",
          "risk_level": "MEDIUM",
          "responsiveness": {
            "status": "UNKNOWN",
            "answered": 0,
            "total": 0,
            "computed_at": "2026-10-12T09:30:00Z"
          },
          "essential_checks": {},
          "reachable_rails": [
            "GTR",
            "EMAIL"
          ],
          "is_didit_customer": false,
          "decision": {
            "decision": "APPROVED",
            "reason": "Licensed in DE, questionnaire reviewed",
            "decided_by": "",
            "updated_at": "2026-10-14T10:05:00Z",
            "inherited_from": null
          },
          "entity_screening": {
            "id": "7a1d2c3b-4e5f-4a6b-8c7d-9e0f1a2b3c4d",
            "status": "Approved",
            "total_hits": 0,
            "score": null,
            "screened_at": "2026-10-14T09:58:00Z",
            "fresh": true,
            "flagged": false
          },
          "questionnaires": [
            {
              "id": "8b7a6c5d-4e3f-4a2b-9c1d-0e9f8a7b6c5d",
              "status": "ANSWERED",
              "form_version": "1",
              "sent_to": "travelrule@counterparty.example",
              "sent_at": "2026-09-02T08:00:00Z",
              "expires_at": "2026-10-02T08:00:00Z",
              "answered_at": "2026-09-04T15:20:00Z",
              "valid_until": "2027-09-04T15:20:00Z",
              "current": true,
              "answers": {
                "legal_name": "Example Counterparty VASP, incorporated in the example jurisdiction.",
                "licensing": "Crypto-asset service provider authorised under MiCA by its national regulator, licence active.",
                "jurisdictions": "EU and EEA. We do not serve the United States.",
                "aml_program": "Written AML/CFT policy, annual independent review, last completed in March 2026.",
                "compliance_officer": "Head of Compliance, reachable at compliance@counterparty.example.",
                "sanctions_screening": "Customers at onboarding and daily; counterparties on every transfer.",
                "transaction_monitoring": "Rule-based monitoring with analyst review; suspicious activity reports filed with the FIU.",
                "travel_rule": "TRP and email; we answer requests within one business day.",
                "custody": "Segregated customer wallets held with a qualified custodian, insured.",
                "ownership": "No shareholder holds 25 percent or more; parent company Example Holding Group.",
                "record_keeping": "Five-year record-keeping for Travel Rule and transaction data, as our regulator requires.",
                "data_protection": "Encrypted at rest and in transit, stored in the EU."
              }
            }
          ]
        }
      },
      "TravelRuleCounterpartyDecision": {
        "type": "object",
        "description": "Die Entscheidung Ihrer Anwendung über einen Gegenpartei-VASP. Nur für Ihre Anwendung sichtbar: Sie ändert niemals den gemeinsam genutzten Verzeichniseintrag und ein anderer Kunde sieht sie nie. Sie wirkt sich nur über Ihre Transaktionsregeln aus (das Regelfeld counterparty_dd_status sowie die Voreinstellungen travel-rule-counterparty-blocked und travel-rule-counterparty-restricted); sie ändert niemals, wie ein Transfer weitergeleitet wird.",
        "properties": {
          "decision": {
            "type": "string",
            "enum": [
              "APPROVED",
              "RESTRICTED",
              "BLOCKED"
            ],
            "description": "APPROVED: Ihr Team hat die Gegenpartei freigegeben. RESTRICTED: Überweisungen an sie können nach Prüfung fortgesetzt werden. BLOCKED: Ihr Team hat sie abgelehnt."
          },
          "reason": {
            "type": "string",
            "maxLength": 255,
            "description": "Freitext-Begründung, die Sie angegeben haben; leer, wenn keine vorhanden ist."
          },
          "decided_by": {
            "type": "string",
            "description": "Der Konsolenbenutzer, der die Entscheidung getroffen oder zuletzt geändert hat. Leer, wenn sie durch einen API-Schlüssel getroffen wurde."
          },
          "updated_at": {
            "type": "string",
            "format": "date-time"
          },
          "inherited_from": {
            "type": "object",
            "nullable": true,
            "description": "Die Marke, deren Entscheidung dieses Unternehmen folgt, da Sie für das Unternehmen selbst keine getroffen haben. Null, wenn die Entscheidung von der Gegenpartei selbst stammt.",
            "properties": {
              "id": {
                "type": "string",
                "format": "uuid"
              },
              "name": {
                "type": "string"
              }
            }
          }
        }
      },
      "TravelRuleCounterpartyDecisionResponse": {
        "type": "object",
        "properties": {
          "decision": {
            "allOf": [
              {
                "$ref": "#/components/schemas/TravelRuleCounterpartyDecision"
              }
            ],
            "nullable": true,
            "description": "Die Entscheidung, die für die Gegenpartei Ihrer Anwendung gilt: ihre eigene oder (bei einer Entität einer Marke) die der Marke. Null, wenn keine vorhanden ist."
          }
        }
      },
      "TravelRuleCounterpartyDecisionRequest": {
        "type": "object",
        "required": [
          "decision"
        ],
        "properties": {
          "decision": {
            "type": "string",
            "enum": [
              "APPROVED",
              "RESTRICTED",
              "BLOCKED"
            ]
          },
          "reason": {
            "type": "string",
            "maxLength": 255,
            "description": "Optional. Ersetzt den vorherigen Grund; weglassen, um ihn zu löschen."
          }
        }
      },
      "TravelRuleCounterpartyScreening": {
        "type": "object",
        "description": "Ein Screening auf Sanktionen und negative Medienberichte der Gegenpartei-Entität, für Ihre Anwendung durchgeführt und ihr in Rechnung gestellt. Nur für Ihre Anwendung sichtbar: Ein anderer Kunde sieht dies niemals.",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "status": {
            "type": "string",
            "enum": [
              "Approved",
              "In Review",
              "Declined"
            ],
            "description": "Genehmigt: Kein möglicher Treffer erfordert Aufmerksamkeit. In Prüfung oder Abgelehnt: Ein möglicher Treffer bei Sanktionen oder negativen Medienberichten."
          },
          "total_hits": {
            "type": "integer",
            "description": "Wie viele mögliche Treffer das Screening zurückgegeben hat."
          },
          "score": {
            "type": "number",
            "nullable": true,
            "description": "Der höchste Risiko-Score unter den möglichen Übereinstimmungen. Null, wenn nichts übereinstimmte."
          },
          "screened_at": {
            "type": "string",
            "format": "date-time"
          },
          "fresh": {
            "type": "boolean",
            "description": "Gibt an, ob das Screening neuer als fresh_days (30 Tage) ist. Ein frisches Screening wird wiederverwendet, anstatt erneut abgerechnet zu werden."
          },
          "flagged": {
            "type": "boolean",
            "description": "true, solange das Screening aktuell ist und sein Status In Review oder Declined lautet. Solange Ihr neuestes Screening markiert ist und das Gegenpartei-Screening aktiv bleibt, ist counterparty_risk_level in Ihren Regeln HIGH."
          }
        }
      },
      "TravelRuleCounterpartyScreeningStatus": {
        "type": "object",
        "properties": {
          "enabled": {
            "type": "boolean",
            "description": "Ihre Travel-Rule-Einstellung counterparty_screening_enabled. Standardmäßig deaktiviert; solange sie deaktiviert ist, wird nichts überprüft oder abgerechnet."
          },
          "price": {
            "type": "string",
            "description": "Dezimal-Zeichenkette in USD: Kosten eines Screenings für Ihre Organisation, der Preis für das Unternehmens-AML-Screening."
          },
          "fresh_days": {
            "type": "integer",
            "description": "Wie viele Tage ein Screening aktuell bleibt und wiederverwendet wird."
          },
          "screening": {
            "allOf": [
              {
                "$ref": "#/components/schemas/TravelRuleCounterpartyScreening"
              }
            ],
            "nullable": true,
            "description": "Ihr aktuellstes Screening der Gegenpartei. Null, wenn Sie es noch nie geprüft haben."
          }
        }
      },
      "TravelRuleCounterpartyScreeningRequest": {
        "type": "object",
        "properties": {
          "refresh": {
            "type": "boolean",
            "default": false,
            "description": "true führt ein erneutes Screening durch (und rechnet erneut ab), selbst wenn ein aktuelles Screening vorliegt."
          }
        }
      },
      "TravelRuleCounterpartyScreeningResult": {
        "type": "object",
        "properties": {
          "outcome": {
            "type": "string",
            "enum": [
              "screened",
              "reused"
            ],
            "description": "screened: Ein neues Screening wurde durchgeführt und abgerechnet (201). reused: Ein aktuelles Screening wurde zurückgegeben und nicht abgerechnet (200)."
          },
          "screening": {
            "$ref": "#/components/schemas/TravelRuleCounterpartyScreening"
          }
        }
      },
      "TravelRuleCounterpartyQuestionnaire": {
        "type": "object",
        "description": "Ein Due-Diligence-Fragebogen, den Ihre Anwendung an die Gegenpartei gesendet hat: Didits Standard-Fragebogen, per E-Mail an eine hinterlegte Compliance-Adresse mit einem einmaligen Link zur Beantwortung gesendet. Nur für Ihre Anwendung sichtbar.",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "status": {
            "type": "string",
            "enum": [
              "SENT",
              "ANSWERED",
              "EXPIRED"
            ],
            "description": "SENT: Warten auf Antworten. ANSWERED: Die Gegenpartei hat jede Frage beantwortet. EXPIRED: Der Antwortlink wurde unbeantwortet geschlossen (die Frist ist abgelaufen oder ein neuerer Fragebogen hat ihn ersetzt), oder die Antworten haben valid_until überschritten."
          },
          "form_version": {
            "type": "string",
            "description": "Version des Standardfragebogens von Didit, zu dem die Antworten gehören. Derzeit 1."
          },
          "sent_to": {
            "type": "string",
            "format": "email"
          },
          "sent_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "expires_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "description": "Die Frist für die Beantwortung, 30 Tage nach dem Versenden. Danach funktioniert der Link nicht mehr."
          },
          "answered_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "valid_until": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "description": "Wie lange die Antworten aktuell bleiben: 365 Tage nach Beantwortung. Null bis zur Beantwortung."
          },
          "current": {
            "type": "boolean",
            "description": "true, solange der Fragebogen ANSWERED ist und valid_until noch nicht überschritten wurde."
          },
          "answers": {
            "type": "object",
            "additionalProperties": {
              "type": "string"
            },
            "description": "Die Antworten, geschlüsselt nach Fragen-ID: legal_name, licensing, jurisdictions, aml_program, compliance_officer, sanctions_screening, transaction_monitoring, travel_rule, custody, ownership, record_keeping, data_protection. Jede Antwort umfasst bis zu 2.000 Zeichen. Leer, bis sie beantwortet wurden."
          }
        }
      },
      "TravelRuleCounterpartyQuestionnaireRequest": {
        "type": "object",
        "properties": {
          "sent_to": {
            "type": "string",
            "format": "email",
            "description": "Optional. Eine für die Gegenpartei hinterlegte Compliance-Adresse: für einen Verzeichniseintrag dessen Compliance-Adresse oder ein Kontakt, den Ihre Anwendung sieht, für ein Mitglied des Didit-Netzwerks dessen bestätigte Compliance-E-Mail. Standard: die Adresse, an die eine Travel-Rule-E-Mail an die Gegenpartei gesendet wird (zuerst Ihr eigener Kontakt, dann ein Plattformkontakt, danach die Compliance-Adresse des Eintrags)."
          }
        }
      },
      "TravelRuleCounterpartyQuestionnaireList": {
        "type": "object",
        "properties": {
          "questionnaires": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/TravelRuleCounterpartyQuestionnaire"
            },
            "description": "Neueste zuerst."
          }
        }
      },
      "TravelRulePickupInfo": {
        "type": "object",
        "description": "Der ausstehende Austausch hinter einem per E-Mail versendeten Abhol-Link, wie auf der Antwortseite der Gegenpartei dargestellt.",
        "properties": {
          "reference": {
            "type": "string",
            "format": "uuid",
            "description": "Die UUID des Transfers, wie sie in der Konsole des sendenden VASP angezeigt wird."
          },
          "requested_at": {
            "type": "string",
            "format": "date-time"
          },
          "originator_vasp_name": {
            "type": "string"
          },
          "originator_vasp_lei": {
            "type": "string"
          },
          "recipient_vasp_name": {
            "type": "string",
            "description": "Das VASP der Gegenpartei, an das die Anfrage gerichtet ist."
          },
          "language": {
            "type": "string",
            "description": "Die Sprache der Anfrage-E-Mail und der Antwortseite, basierend auf der Jurisdiktion der Gegenpartei."
          },
          "amount": {
            "type": "string"
          },
          "currency": {
            "type": "string"
          },
          "fiat_amount": {
            "type": "string",
            "description": "Der umgerechnete Wert, den der Absender angegeben hat, oder leer."
          },
          "fiat_currency": {
            "type": "string"
          },
          "chain": {
            "type": "string"
          },
          "beneficiary_wallet": {
            "type": "string"
          },
          "status": {
            "type": "string"
          },
          "ivms_version": {
            "type": "string"
          },
          "deadline_at": {
            "type": "string",
            "format": "date-time",
            "description": "Wann der Link aufhört zu antworten."
          },
          "reminders_sent": {
            "type": "integer"
          },
          "contact": {
            "type": "string",
            "description": "Der `?contact=`-Wert des Links, zurückgegeben; leer, wenn der Link keinen enthält."
          },
          "decline_reasons": {
            "type": "array",
            "items": {
              "type": "string",
              "enum": [
                "data_mismatch",
                "not_our_customer",
                "wallet_not_hosted",
                "sanctions",
                "risk_appetite",
                "jurisdiction",
                "insufficient_data",
                "other"
              ]
            },
            "description": "Die Werte, die `decline_reason` akzeptiert."
          },
          "join_invitation": {
            "type": "object",
            "description": "Gibt an, ob die Gegenpartei über eine aktive Einladung verfügt, Didit kostenlos beizutreten. Der Einladungslink wird nur in der E-Mail an die eingeladene Adresse übermittelt, daher ist `url` hier leer.",
            "properties": {
              "eligible": {
                "type": "boolean"
              },
              "url": {
                "type": "string"
              }
            }
          },
          "originator_data": {
            "type": "object",
            "description": "Die Auftraggeberfelder, die der sendende VASP teilt (`data_sharing_fields`). Der Name und die Wallet sind immer enthalten."
          },
          "beneficiary_data": {
            "type": "object"
          },
          "ivms_request": {
            "type": "object",
            "description": "Dieselbe Anfrage als IVMS 101-Objekt. Ausgelassen, solange `data_masked` auf true steht."
          },
          "data_masked": {
            "type": "boolean",
            "description": "An diesem Endpoint immer false: Eine E-Mail-Anfrage ist ausgehend, und der eigene Benutzer des Absenders wird niemals maskiert."
          }
        }
      },
      "TravelRulePickupRespondRequest": {
        "type": "object",
        "required": [
          "decision"
        ],
        "properties": {
          "decision": {
            "type": "string",
            "enum": [
              "accept",
              "decline"
            ]
          },
          "beneficiary_name": {
            "type": "string",
            "description": "Der Name des Begünstigten gemäß Ihren Daten, verarbeitet nach der Namensregel des sendenden VASP. `ivms_response` hat Vorrang, wenn darin der Begünstigte benannt ist.",
            "maxLength": 255
          },
          "decline_reason": {
            "type": "string",
            "enum": [
              "",
              "data_mismatch",
              "not_our_customer",
              "wallet_not_hosted",
              "sanctions",
              "risk_appetite",
              "jurisdiction",
              "insufficient_data",
              "other"
            ],
            "description": "Warum Sie ablehnen. Wird in der Transfer-Timeline des sendenden VASP erfasst. Leer (Standardwert), wenn Sie keinen Grund angeben."
          },
          "decline_detail": {
            "type": "string",
            "maxLength": 512,
            "description": "Freitext; erforderlich, wenn `decision` auf `decline` und `decline_reason` auf `other` steht."
          },
          "ivms_response": {
            "type": "object",
            "description": "Ihre vollständige IVMS-101-Antwort. Der darin enthaltene Name des Begünstigten hat Vorrang vor `beneficiary_name`."
          },
          "contact": {
            "type": "string",
            "format": "uuid",
            "description": "Der Kontakt, an den der Link gesendet wurde, aus dem Wert `?contact=` des Links. Wenn der Body ihn weglässt, wird der Query-Parameter `contact` verwendet."
          }
        }
      },
      "TravelRuleInboundRequest": {
        "type": "object",
        "required": [
          "chain",
          "txid",
          "wallet_address",
          "amount",
          "currency"
        ],
        "properties": {
          "chain": {
            "type": "string",
            "description": "Chain, auf der die Einzahlung abgewickelt wurde, zum Beispiel `ETH`. Wird in Kleinbuchstaben gespeichert und ohne Berücksichtigung von Groß-/Kleinschreibung mit den Einträgen Ihres Wallet-Adressbuchs verglichen; verwenden Sie dort denselben Chain-Token.",
            "maxLength": 32
          },
          "txid": {
            "type": "string",
            "description": "On-Chain-Transaktions-Hash. Zusammen mit wallet_address dedupliziert.",
            "maxLength": 128
          },
          "wallet_address": {
            "type": "string",
            "description": "Die Ziel-Wallet, auf der Sie die Einzahlung erhalten haben. Eine XRP-X-Adresse wird in ihre klassische Adresse und ihr Tag aufgeteilt.",
            "maxLength": 128
          },
          "amount": {
            "type": "string",
            "description": "Einzahlungsbetrag als Dezimalstring, null oder größer, mit bis zu 18 Nachkommastellen."
          },
          "currency": {
            "type": "string",
            "description": "Einzahlungs-Asset, z. B. „USDC“.",
            "maxLength": 16
          },
          "originator_data": {
            "type": "object",
            "description": "Details zum Auftraggeber vom sendenden VASP, falls bekannt, als flaches Objekt wie `{\"name\": \"...\"}`. Didit liest daraus name (oder full_name), first_name, last_name und vendor_data.",
            "additionalProperties": true
          },
          "beneficiary_data": {
            "type": "object",
            "description": "Angaben zum Begünstigten (Ihr Kunde) als flaches Objekt wie `{\"name\": \"...\"}`. Didit gleicht den Namen mit dem holder_name des passenden Adressbucheintrags ab und setzt wallet_address sowie chain aus der Anfrage.",
            "additionalProperties": true
          },
          "originating_vasp": {
            "type": "object",
            "description": "Optionale Beschreibung des sendenden VASP. Sie verbleibt nur bei diesem Transfer (`metadata.originating_vasp` und der Auftraggeber-VASP des Transfers in GET /v3/travel-rule/transfers/); sie erstellt, bearbeitet oder verknüpft niemals einen gemeinsamen VASP-Verzeichniseintrag.",
            "properties": {
              "name": {
                "type": "string",
                "maxLength": 255
              },
              "lei": {
                "type": "string",
                "maxLength": 20,
                "description": "Optional. Eine gültige 20-stellige ISO-17442-LEI oder leer."
              },
              "travel_address": {
                "type": "string",
                "description": "Die Travel Address des Auftraggebers, erfasst bei diesem Transfer.",
                "maxLength": 512
              }
            }
          },
          "memo": {
            "type": "string",
            "maxLength": 256,
            "description": "Optional. Das Destination-Tag oder Memo der Einzahlung in einem Memo-Netzwerk: Bei einer geteilten Einzahlungsadresse dient es dazu, Ihre Kunden voneinander zu unterscheiden, und der Adressbucheintrag für dieses Memo wird abgeglichen. XRP: ein Destination-Tag, eine Ganzzahl von 0 bis 4294967295 (eine JSON-Zahl wird akzeptiert). XLM: ein Text-Memo von bis zu 28 Bytes, eine 64-Bit-ID oder ein 32-Byte-Hash in Hex. EOS: bis zu 256 Bytes. ATOM: bis zu 256 Zeichen. HBAR: bis zu 100 Bytes. Bitcoin-, EVM-, Solana-, Tron-, Litecoin-, Bitcoin Cash-, Dogecoin- und Lightning-Wallets unterstützen kein Memo: die Angabe eines Memos führt dort zu `400`. Alias: `destinationTag` oder `destination_tag`."
          },
          "utxo": {
            "allOf": [
              {
                "$ref": "#/components/schemas/TravelRuleUtxo"
              }
            ],
            "description": "Optional, nur UTXO-Chains. Die Inputs und Outputs der Einzahlungstransaktion: Die Wallet des Senders ist die deklarierte `originator_data.wallet_address`, andernfalls der größte Input."
          }
        }
      },
      "TravelRuleInboundResponse": {
        "type": "object",
        "properties": {
          "transaction_id": {
            "type": "string",
            "format": "uuid",
            "description": "Didit-Transaktions-UUID für die eingehende Einzahlung."
          },
          "txn_id": {
            "type": "string",
            "description": "txn_id der eingehenden Transaktion: Von Didit generiert, wenn Didit die Transaktion erstellt hat, oder Ihre eigene, wenn eine nicht beanspruchte Einzahlung wiederverwendet wurde."
          },
          "created": {
            "type": "boolean",
            "description": "true, wenn dieser Aufruf den Transfer registriert hat (HTTP 201); false, wenn bereits ein Transfer für dieselbe txid und wallet_address existierte (HTTP 200)."
          },
          "travel_rule": {
            "$ref": "#/components/schemas/TravelRuleTransferDetail"
          }
        }
      },
      "TravelRuleTestVaspInboundRequest": {
        "type": "object",
        "required": [
          "beneficiary_wallet_address"
        ],
        "properties": {
          "beneficiary_wallet_address": {
            "type": "string",
            "description": "Die Ziel-Wallet-Adresse. Der Didit Test VASP sendet an diese, abgeglichen mit Ihrem Wallet-Adressbuch auf der Blockchain des Assets. Eine Wallet ohne passenden Eintrag wird akzeptiert und die eingehende Transaktion wird als ON_HOLD verbucht."
          },
          "scenario": {
            "type": "string",
            "enum": [
              "accept",
              "name_mismatch"
            ],
            "default": "accept",
            "description": "Wie der Didit Test VASP den Begünstigten einstuft. `accept` deklariert den eigenen Namen des Inhabers; `name_mismatch` deklariert einen Namen, dem kein Inhaber zustimmt. Die Entscheidung selbst liegt immer bei Ihnen."
          },
          "chain": {
            "type": "string",
            "default": "ETH",
            "description": "Chain des Vermögenswerts."
          },
          "amount": {
            "type": "string",
            "default": "1",
            "description": "Betrag als Dezimal-String."
          },
          "currency": {
            "type": "string",
            "default": "ETH",
            "description": "Asset-Code."
          },
          "reference": {
            "type": "string",
            "description": "Optionaler Idempotenzschlüssel. Eine Wiederholung mit demselben Wert gibt den Transfer zurück, den der erste Aufruf gebucht hat."
          }
        }
      },
      "TravelRuleTestVaspInboundResponse": {
        "type": "object",
        "properties": {
          "transaction_id": {
            "type": "string",
            "format": "uuid",
            "description": "Didit-Transaktions-UUID der eingehenden Überweisung."
          },
          "txn_id": {
            "type": "string",
            "description": "Von Didit generierte txn_id."
          },
          "scenario": {
            "type": "string",
            "description": "Das ausgeführte Szenario."
          },
          "travel_rule_status": {
            "type": "string",
            "description": "Der Status, zu dem die eigene Entscheidung Ihrer Anwendung geführt hat."
          },
          "detail": {
            "type": "string",
            "description": "Warum der Transfer diesen Status erhalten hat."
          },
          "test_vasp": {
            "type": "boolean",
            "description": "Immer true: Der Absender war der Didit Test VASP."
          },
          "travel_rule": {
            "$ref": "#/components/schemas/TravelRuleTransferDetail"
          }
        }
      },
      "TravelRuleWidgetSessionCreate": {
        "type": "object",
        "properties": {
          "wallet_address": {
            "type": "string",
            "description": "Die zu verifizierende Adresse. Optional; wenn leer, muss die Adresse angegeben werden, sobald ein Nachweis gestartet wird.",
            "maxLength": 128
          },
          "chain": {
            "type": "string",
            "description": "Chain-Token für die Adresse, zum Beispiel `ETH`, `BTC` oder `SOL`. Verwenden Sie dasselbe Token wie in Ihrem Wallet-Adressbuch. Das Signieren von Nachrichten und der Satoshi-Test werden nur für eine unterstützte Chain angeboten. Der Adressbucheintrag, den der Nachweis verifiziert, speichert diesen unter seiner kanonischen Kennung (ETH, BTC, SOL, TRX).",
            "maxLength": 32
          },
          "holder_name": {
            "type": "string",
            "description": "Name des Wallet-Inhabers, der für den Abgleich des Begünstigtennamens verwendet wird.",
            "maxLength": 255
          },
          "vendor_data": {
            "type": "string",
            "description": "Ihre interne Kennung für den Inhaber, die in den erstellten Adressbucheintrag übernommen wird.",
            "maxLength": 255
          },
          "transaction_id": {
            "type": "string",
            "format": "uuid",
            "description": "Optional. Didit-Transaktions-UUID eines Travel-Rule-Transfers, der fortgeführt werden soll, wenn der Nachweis verifiziert wird.",
            "nullable": true
          },
          "satoshi_deposit_address": {
            "type": "string",
            "description": "Optional. Eine von Ihnen kontrollierte Einzahlungsadresse; ihre Angabe aktiviert die Nachweismethode SATOSHI_TEST.",
            "maxLength": 128
          },
          "callback_url": {
            "type": "string",
            "description": "Optional. Absolute http(s)-URL, zu der das Widget den Kunden nach Abschluss zurückleitet.",
            "maxLength": 512
          },
          "expires_in_minutes": {
            "type": "integer",
            "description": "Optional. Gültigkeitsdauer des erstellten Links in Minuten. Wird automatisch verlängert, um das Zeitfenster für den Satoshi-Test abzudecken, wenn SATOSHI_TEST angeboten wird.",
            "default": 60,
            "minimum": 5,
            "maximum": 10080
          }
        }
      },
      "TravelRuleWidgetSessionResponse": {
        "type": "object",
        "properties": {
          "widget_session_id": {
            "type": "string",
            "format": "uuid"
          },
          "token": {
            "type": "string",
            "description": "Opakes Sitzungs-Token, das in die Widget-URL eingebettet ist."
          },
          "url": {
            "type": "string",
            "description": "Die gehostete URL des Wallet-Eigentums-Widgets. Öffnen Sie sie unverändert im System-Browser (niemals innerhalb einer mobilen SDK-Webview)."
          },
          "expires_at": {
            "type": "string",
            "format": "date-time"
          }
        }
      },
      "TravelRuleWidgetContext": {
        "type": "object",
        "properties": {
          "vasp_name": {
            "type": "string",
            "description": "Offizieller Name aus Ihrem VASP-Profil, der dem Kunden im Widget angezeigt wird. Leer, wenn kein Profil existiert."
          },
          "wallet_address": {
            "type": "string"
          },
          "chain": {
            "type": "string",
            "description": "Die Chain, mit der die Sitzung gemintet wurde, wie von Ihnen gesendet."
          },
          "chain_family": {
            "type": "string",
            "nullable": true,
            "enum": [
              "EVM",
              "BTC",
              "SOL",
              "TRON",
              null
            ],
            "description": "Die Schlüsselfamilie hinter der Chain: EVM (Ethereum, BNB Chain, Polygon, Arbitrum, Base, Optimism, Avalanche, Linea und die anderen EVM-Chains), BTC, SOL oder TRON. Ein EVM-Schlüssel steuert dieselbe Adresse auf jeder EVM-Chain. Null, wenn auf der Chain keine Signatur verifiziert werden kann."
          },
          "holder_name": {
            "type": "string"
          },
          "allowed_methods": {
            "type": "array",
            "items": {
              "type": "string",
              "enum": [
                "MESSAGE_SIGNING",
                "SCREENSHOT",
                "SATOSHI_TEST",
                "SELF_DECLARATION"
              ]
            },
            "description": "Für diese Sitzung verfügbare Nachweismethoden. MESSAGE_SIGNING erfordert eine Chain mit einer chain_family, SATOSHI_TEST erfordert eine satoshi_deposit_address in der Sitzung und eine Chain, deren Einzahlungen Didit zurücklesen kann, SCREENSHOT erfordert die Einstellung allow_screenshot_proof und SELF_DECLARATION erfordert die Einstellung allow_self_declaration."
          },
          "transfer_status": {
            "type": "string",
            "nullable": true,
            "description": "Status des verknüpften Travel-Rule-Transfers. Null, wenn die Sitzung ohne transaction_id erstellt wurde."
          },
          "callback_url": {
            "type": "string",
            "description": "Wohin das Widget den Kunden nach Abschluss zurückleitet. Leer, wenn nicht festgelegt."
          },
          "expires_at": {
            "type": "string",
            "format": "date-time"
          },
          "completed_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "description": "Nicht null, sobald ein Nachweis verifiziert wurde."
          },
          "proofs": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/TravelRuleWidgetProofSummary"
            }
          },
          "max_attempts": {
            "type": "integer",
            "description": "Abgelehnte Wallet-Nachweise, die diese Sitzung zulässt."
          },
          "attempts_used": {
            "type": "integer",
            "description": "Bislang abgelehnte Nachweise."
          },
          "attempts_remaining": {
            "type": "integer",
            "description": "Wenn 0, antwortet das Starten eines weiteren Nachweises mit 409 und Sie erstellen eine neue Widget-Sitzung."
          },
          "customization": {
            "type": "object",
            "nullable": true,
            "description": "Die White-Label-Anpassung der Anwendung (Farben, Logo, Schriftfamilie), wenn White-Label aktiviert ist – das Widget wird mit demselben Branding wie der Verifizierungs-Workflow gerendert. Andernfalls null."
          }
        }
      },
      "TravelRuleWidgetProofSummary": {
        "type": "object",
        "properties": {
          "proof_id": {
            "type": "string",
            "format": "uuid"
          },
          "method": {
            "type": "string",
            "enum": [
              "MESSAGE_SIGNING",
              "SATOSHI_TEST",
              "SCREENSHOT",
              "SELF_DECLARATION"
            ]
          },
          "status": {
            "type": "string",
            "enum": [
              "PENDING",
              "VERIFIED",
              "REJECTED",
              "EXPIRED"
            ],
            "description": "PENDING: Der Endbenutzer hat diese Methode ausgewählt und der Nachweis ist noch nicht entschieden. Eine fehlgeschlagene Signatur oder eine Testeinzahlung, die noch nicht lesbar oder bestätigt ist, hält den Nachweis auf PENDING mit einem failure_reason, sodass der Endbenutzer es erneut versuchen kann; eine übermittelte SATOSHI_TEST-Einzahlung wird automatisch erneut geprüft, bis ihr Zeitfenster schließt, und ein übermittelter SCREENSHOT wartet auf Ihre Prüfung. VERIFIED: Die Eigentümerschaft ist nachgewiesen. REJECTED: Die Testeinzahlung ist definitiv falsch (anderer Absender, nicht der erwartete Betrag an die Einzahlungsadresse, älter als die Challenge oder eine Transaktion, die bereits eine andere Wallet nachgewiesen hat) oder Ihr Prüfer hat den Screenshot abgelehnt; failure_reason gibt den Grund an. Ein abgelehnter Nachweis ist endgültig und verbraucht einen der Versuche der Sitzung. EXPIRED: Über den Nachweis kann nicht mehr entschieden werden (Zeitfenster abgelaufen, Endbenutzer hat die Methode gewechselt, Widget-Sitzung abgelaufen oder Inhaber der Wallet hat sich geändert); failure_reason gibt den Grund an."
          },
          "wallet_address": {
            "type": "string"
          },
          "chain": {
            "type": "string",
            "description": "Kanonischer Chain-Identifikator des Adressbucheintrags, für den der Nachweis bestimmt ist, z. B. ETH, BTC, SOL, TRX."
          },
          "deposit_address": {
            "type": "string",
            "nullable": true,
            "description": "Einzahlungsadresse, an die der Kunde den Satoshi-Testbetrag senden muss. Nur bei einem SATOSHI_TEST-Nachweis vorhanden."
          },
          "expected_amount": {
            "type": "string",
            "nullable": true,
            "description": "Exakter On-Chain-Betrag in der nativen Währung der Einzahlung, mit dem die Satoshi-Test-Einzahlung übereinstimmen muss. Nur bei einem SATOSHI_TEST-Nachweis vorhanden."
          },
          "expires_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "description": "Frist für das eigene Satoshi-Testfenster dieses Nachweises. Nur bei einem SATOSHI_TEST-Nachweis vorhanden; das eigene expires_at der Widget-Sitzung wird verlängert, um dieses abzudecken, wenn SATOSHI_TEST angeboten wird."
          },
          "challenge": {
            "type": "string",
            "nullable": true,
            "description": "Von Didit ausgestellte Nachricht, die der Kunde mit seiner Wallet signiert. Nur bei einem MESSAGE_SIGNING-Nachweis vorhanden."
          },
          "rejection_reason": {
            "type": "string",
            "description": "Warum der Nachweis abgelehnt wurde, als englischer Satz für den Endbenutzer. Nur vorhanden, wenn `status` REJECTED ist; leer, wenn Ihr Prüfer einen Screenshot abgelehnt hat (Ihre Notiz verbleibt bei Ihnen)."
          },
          "created_at": {
            "type": "string",
            "format": "date-time"
          },
          "attempts": {
            "type": "integer",
            "description": "Wie oft Nachweise für diesen Beleg übermittelt wurden (Signaturen, Transaktions-IDs, Uploads)."
          },
          "failure_reason": {
            "allOf": [
              {
                "$ref": "#/components/schemas/TravelRuleWalletProofFailureReason"
              }
            ],
            "description": "Warum der letzte Versuch fehlgeschlagen ist oder warum der Nachweis geschlossen wurde. Leer, wenn nichts fehlgeschlagen ist."
          }
        }
      },
      "CaseSubject": {
        "type": "object",
        "nullable": true,
        "description": "Der einzelne Benutzer oder das Unternehmen, an den bzw. das der Fall gebunden ist.",
        "properties": {
          "type": {
            "type": "string",
            "enum": [
              "user",
              "business"
            ]
          },
          "uuid": {
            "type": "string",
            "format": "uuid"
          },
          "name": {
            "type": "string"
          },
          "external_id": {
            "type": "string",
            "nullable": true,
            "description": "Die vendor_data des Subjekts."
          },
          "country": {
            "type": "string",
            "nullable": true,
            "description": "Dreistelliger Ländercode des Subjekts (ISO 3166-1 Alpha-3) oder null, wenn unbekannt. Bei einem Unternehmen das Land der Gründung. Bei einer Person das Ausstellungsland eines Ausweisdokuments aus deren Verifizierungen; bei einer Person mit Dokumenten aus mehreren Ländern wird eines davon angezeigt, und es können ICAO-Dokumentencodes wie `XXA` vorkommen.",
            "example": "ESP"
          },
          "portrait": {
            "type": "string",
            "format": "uri",
            "nullable": true,
            "description": "Kurzlebige signierte URL des Porträtbildes der Person. Für ein Unternehmen immer null und null für eine Person ohne Porträt. Die URL läuft ab, laden Sie das Bild daher beim Lesen des Falls herunter, anstatt die URL zu speichern."
          }
        }
      },
      "CaseAssignee": {
        "type": "object",
        "nullable": true,
        "properties": {
          "uuid": {
            "type": "string",
            "format": "uuid"
          },
          "full_name": {
            "type": "string"
          },
          "email": {
            "type": "string",
            "format": "email"
          }
        }
      },
      "CaseBlueprintSummary": {
        "type": "object",
        "nullable": true,
        "properties": {
          "uuid": {
            "type": "string",
            "format": "uuid"
          },
          "name": {
            "type": "string",
            "maxLength": 24
          }
        }
      },
      "CaseContentConfig": {
        "type": "object",
        "description": "Die sechs umschaltbaren Abschnitte, die steuern, welche Tabs und Felder auf der Fallseite erscheinen. Unbekannte Abschnitte oder Schlüssel werden abgelehnt.",
        "properties": {
          "checklist": {
            "type": "object",
            "properties": {
              "enabled": {
                "type": "boolean"
              },
              "optional": {
                "type": "boolean",
                "description": "Wenn true, kann ein Fall mit unvollständigen Checklisten-Einträgen abgeschlossen werden."
              },
              "items": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "label": {
                      "type": "string",
                      "maxLength": 255
                    },
                    "order": {
                      "type": "integer"
                    }
                  }
                }
              }
            }
          },
          "aml_control": {
            "type": "object",
            "properties": {
              "enabled": {
                "type": "boolean"
              },
              "financial": {
                "type": "boolean"
              },
              "identity": {
                "type": "boolean"
              }
            }
          },
          "identity": {
            "type": "object",
            "properties": {
              "enabled": {
                "type": "boolean"
              },
              "personal_information": {
                "type": "boolean"
              },
              "applicant_tags": {
                "type": "boolean"
              },
              "contact_information": {
                "type": "boolean"
              },
              "risk_overview": {
                "type": "boolean"
              },
              "poi_documents": {
                "type": "boolean"
              },
              "poa_documents": {
                "type": "boolean"
              }
            }
          },
          "verifications": {
            "type": "object",
            "properties": {
              "enabled": {
                "type": "boolean"
              },
              "summary": {
                "type": "boolean"
              }
            }
          },
          "reporting": {
            "type": "object",
            "properties": {
              "enabled": {
                "type": "boolean"
              },
              "fiu_reports": {
                "type": "boolean"
              }
            }
          },
          "financial": {
            "type": "object",
            "properties": {
              "enabled": {
                "type": "boolean"
              },
              "payment_methods": {
                "type": "boolean"
              },
              "transactions": {
                "type": "boolean"
              }
            }
          }
        }
      },
      "CaseNote": {
        "type": "object",
        "properties": {
          "uuid": {
            "type": "string",
            "format": "uuid"
          },
          "comment": {
            "type": "string"
          },
          "actor_email": {
            "type": "string",
            "format": "email",
            "nullable": true
          },
          "actor_name": {
            "type": "string",
            "nullable": true
          },
          "mentioned_emails": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "email"
            }
          },
          "is_internal": {
            "type": "boolean"
          },
          "attachments": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "s3_key": {
                  "type": "string"
                },
                "filename": {
                  "type": "string"
                },
                "file_size": {
                  "type": "integer"
                },
                "url": {
                  "type": "string",
                  "format": "uri"
                }
              }
            }
          },
          "tags": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "created_at": {
            "type": "string",
            "format": "date-time"
          }
        }
      },
      "CaseEvent": {
        "type": "object",
        "properties": {
          "uuid": {
            "type": "string",
            "format": "uuid"
          },
          "event_type": {
            "type": "string",
            "enum": [
              "CREATED",
              "STATUS_CHANGED",
              "ASSIGNED",
              "UNASSIGNED",
              "RESOLVED",
              "REOPENED",
              "LINK_ADDED",
              "LINK_REMOVED",
              "NOTE_ADDED",
              "NOTE_PINNED",
              "NOTE_UNPINNED",
              "PRIORITY_CHANGED",
              "DUE_DATE_CHANGED",
              "TAG_ADDED",
              "TAG_REMOVED",
              "ESCALATED",
              "TRANSFERRED",
              "CHECKLIST_COMPLETED",
              "REPORT_CREATED",
              "REPORT_FINALIZED",
              "SUBMITTED_FOR_APPROVAL",
              "APPROVAL_GRANTED",
              "APPROVAL_REJECTED",
              "ENTITY_ACTION",
              "APPROVAL_INVALIDATED",
              "CUSTOMER_REQUEST",
              "STAGE_CHANGED",
              "TEAM_CHANGED",
              "CHECKER_ASSIGNED",
              "CHECKER_UNASSIGNED"
            ]
          },
          "actor_email": {
            "type": "string",
            "format": "email",
            "nullable": true
          },
          "actor_name": {
            "type": "string",
            "nullable": true
          },
          "previous_status": {
            "type": "string",
            "enum": [
              "OPEN",
              "AWAITING_USER",
              "RESOLVED"
            ],
            "nullable": true
          },
          "new_status": {
            "type": "string",
            "enum": [
              "OPEN",
              "AWAITING_USER",
              "RESOLVED"
            ],
            "nullable": true
          },
          "metadata": {
            "type": "object"
          },
          "created_at": {
            "type": "string",
            "format": "date-time"
          }
        }
      },
      "CaseLink": {
        "type": "object",
        "properties": {
          "uuid": {
            "type": "string",
            "format": "uuid"
          },
          "linked_entity_type": {
            "type": "string",
            "enum": [
              "session",
              "business_session",
              "transaction"
            ],
            "nullable": true
          },
          "linked_entity_uuid": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "linked_entity_summary": {
            "type": "object",
            "nullable": true,
            "description": "session_id/session_number/status für Sitzungs- und business_session-Links; uuid/txn_id/status für Transaktions-Links."
          },
          "created_at": {
            "type": "string",
            "format": "date-time"
          }
        }
      },
      "CaseChecklistItem": {
        "type": "object",
        "properties": {
          "uuid": {
            "type": "string",
            "format": "uuid"
          },
          "label": {
            "type": "string",
            "maxLength": 255
          },
          "is_completed": {
            "type": "boolean"
          },
          "completed_by": {
            "type": "string",
            "format": "email",
            "nullable": true
          },
          "completed_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "order": {
            "type": "integer"
          }
        }
      },
      "CaseBlueprintListItem": {
        "type": "object",
        "properties": {
          "uuid": {
            "type": "string",
            "format": "uuid"
          },
          "name": {
            "type": "string",
            "maxLength": 24
          },
          "description": {
            "type": "string",
            "nullable": true
          },
          "assignment_method": {
            "type": "string",
            "enum": [
              "MANUAL",
              "AUTOMATIC"
            ]
          },
          "assignee_pool": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid"
            }
          },
          "max_active_cases": {
            "type": "integer",
            "nullable": true
          },
          "escalation_enabled": {
            "type": "boolean"
          },
          "transfer_enabled": {
            "type": "boolean"
          },
          "require_resolution_note": {
            "type": "boolean"
          },
          "is_active": {
            "type": "boolean"
          },
          "preset_key": {
            "type": "string",
            "nullable": true
          },
          "created_at": {
            "type": "string",
            "format": "date-time"
          },
          "version": {
            "type": "integer",
            "readOnly": true
          },
          "default_deadline_hours": {
            "type": "integer",
            "nullable": true,
            "minimum": 1,
            "maximum": 8760
          }
        }
      },
      "CaseBlueprintDetail": {
        "type": "object",
        "properties": {
          "uuid": {
            "type": "string",
            "format": "uuid"
          },
          "name": {
            "type": "string",
            "maxLength": 24
          },
          "description": {
            "type": "string",
            "nullable": true
          },
          "assignment_method": {
            "type": "string",
            "enum": [
              "MANUAL",
              "AUTOMATIC"
            ]
          },
          "assignee_pool": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid"
            }
          },
          "max_active_cases": {
            "type": "integer",
            "nullable": true
          },
          "escalation_enabled": {
            "type": "boolean"
          },
          "transfer_enabled": {
            "type": "boolean"
          },
          "require_resolution_note": {
            "type": "boolean"
          },
          "is_active": {
            "type": "boolean"
          },
          "preset_key": {
            "type": "string",
            "nullable": true
          },
          "created_at": {
            "type": "string",
            "format": "date-time"
          },
          "escalation_blueprint": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "escalation_blueprint_name": {
            "type": "string",
            "nullable": true
          },
          "four_eyes_checker_blueprint": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "four_eyes_checker_blueprint_name": {
            "type": "string",
            "nullable": true
          },
          "content_config": {
            "type": "object",
            "description": "Die sechs umschaltbaren Abschnitte, die steuern, welche Tabs und Felder auf der Fallseite erscheinen. Unbekannte Abschnitte oder Schlüssel werden abgelehnt.",
            "properties": {
              "checklist": {
                "type": "object",
                "properties": {
                  "enabled": {
                    "type": "boolean"
                  },
                  "optional": {
                    "type": "boolean",
                    "description": "Wenn true, kann ein Fall mit unvollständigen Checklisten-Einträgen abgeschlossen werden."
                  },
                  "items": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "label": {
                          "type": "string",
                          "maxLength": 255
                        },
                        "order": {
                          "type": "integer"
                        }
                      }
                    }
                  }
                }
              },
              "aml_control": {
                "type": "object",
                "properties": {
                  "enabled": {
                    "type": "boolean"
                  },
                  "financial": {
                    "type": "boolean"
                  },
                  "identity": {
                    "type": "boolean"
                  }
                }
              },
              "identity": {
                "type": "object",
                "properties": {
                  "enabled": {
                    "type": "boolean"
                  },
                  "personal_information": {
                    "type": "boolean"
                  },
                  "applicant_tags": {
                    "type": "boolean"
                  },
                  "contact_information": {
                    "type": "boolean"
                  },
                  "risk_overview": {
                    "type": "boolean"
                  },
                  "poi_documents": {
                    "type": "boolean"
                  },
                  "poa_documents": {
                    "type": "boolean"
                  }
                }
              },
              "verifications": {
                "type": "object",
                "properties": {
                  "enabled": {
                    "type": "boolean"
                  },
                  "summary": {
                    "type": "boolean"
                  }
                }
              },
              "reporting": {
                "type": "object",
                "properties": {
                  "enabled": {
                    "type": "boolean"
                  },
                  "fiu_reports": {
                    "type": "boolean"
                  }
                }
              },
              "financial": {
                "type": "object",
                "properties": {
                  "enabled": {
                    "type": "boolean"
                  },
                  "payment_methods": {
                    "type": "boolean"
                  },
                  "transactions": {
                    "type": "boolean"
                  }
                }
              }
            }
          },
          "creation_sources": {
            "type": "array",
            "description": "Konnektoren, die derzeit neue Fälle in diese Vorlage leiten.",
            "items": {
              "type": "object",
              "properties": {
                "kind": {
                  "type": "string",
                  "enum": [
                    "aml",
                    "rule",
                    "workflow"
                  ]
                },
                "id": {
                  "type": "string"
                },
                "name": {
                  "type": "string"
                }
              }
            }
          },
          "receives_escalation_from": {
            "type": "array",
            "description": "Andere Blueprints, deren Eskalationsziel auf diesen verweist.",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string"
                },
                "name": {
                  "type": "string"
                }
              }
            }
          },
          "updated_at": {
            "type": "string",
            "format": "date-time"
          },
          "version": {
            "type": "integer",
            "readOnly": true
          },
          "default_deadline_hours": {
            "type": "integer",
            "nullable": true,
            "minimum": 1,
            "maximum": 8760
          }
        }
      },
      "CaseListItem": {
        "type": "object",
        "properties": {
          "uuid": {
            "type": "string",
            "format": "uuid"
          },
          "case_number": {
            "type": "string",
            "nullable": true,
            "description": "Automatisch zugewiesen, z. B. CS-0001."
          },
          "title": {
            "type": "string"
          },
          "status": {
            "type": "string",
            "enum": [
              "OPEN",
              "AWAITING_USER",
              "RESOLVED"
            ]
          },
          "resolution": {
            "type": "string",
            "enum": [
              "FALSE_POSITIVE",
              "VALID_THREAT",
              "INCONCLUSIVE",
              "REQUIREMENTS_NOT_MET",
              "REQUIREMENTS_SATISFIED"
            ],
            "nullable": true
          },
          "pending_resolution": {
            "type": "object",
            "nullable": true,
            "description": "Wird nur gesetzt, während eine 4-Augen-Auflösung auf der Checker-Vorlage bereitgestellt ist und auf Genehmigung oder Ablehnung der Genehmigung wartet.",
            "properties": {
              "resolution": {
                "type": "string",
                "enum": [
                  "FALSE_POSITIVE",
                  "VALID_THREAT",
                  "INCONCLUSIVE",
                  "REQUIREMENTS_NOT_MET",
                  "REQUIREMENTS_SATISFIED"
                ]
              },
              "resolution_notes": {
                "type": "string",
                "nullable": true
              },
              "maker_email": {
                "type": "string",
                "format": "email",
                "nullable": true,
                "description": "E-Mail des Beauftragten, der den Beschluss eingereicht hat. Null, wenn er über einen API-Schlüssel eingereicht wurde: Dieser Beschluss hat keinen erfassten Ersteller, sodass approve und reject-approval für jeden Aufrufer 403 zurückgeben."
              },
              "maker_name": {
                "type": "string",
                "nullable": true
              },
              "maker_user_id": {
                "type": "string",
                "format": "uuid",
                "nullable": true,
                "description": "Benutzer-UUID des Mitglieds, das als Beauftragter die Entscheidung eingereicht hat. Null, wenn sie über einen API-Schlüssel eingereicht wurde. Dieses Mitglied kann nicht als `checker` benannt werden."
              },
              "maker_blueprint_id": {
                "type": "string",
                "format": "uuid"
              },
              "staged_at": {
                "type": "string",
                "format": "date-time"
              }
            }
          },
          "checker": {
            "$ref": "#/components/schemas/CaseChecker"
          },
          "priority": {
            "type": "string",
            "enum": [
              "LOW",
              "MEDIUM",
              "HIGH"
            ]
          },
          "source": {
            "type": "string",
            "enum": [
              "MANUAL",
              "AML_SCREENING",
              "TRANSACTION_RULE",
              "WORKFLOW_BUILDER"
            ]
          },
          "tags": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "subject": {
            "$ref": "#/components/schemas/CaseSubject"
          },
          "assigned_to": {
            "$ref": "#/components/schemas/CaseAssignee"
          },
          "assigned_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "team": {
            "$ref": "#/components/schemas/CaseTeamSummary"
          },
          "due_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "resolved_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "created_by_email": {
            "type": "string",
            "nullable": true
          },
          "created_by_name": {
            "type": "string",
            "nullable": true
          },
          "blueprint": {
            "$ref": "#/components/schemas/CaseBlueprintSummary"
          },
          "links_count": {
            "type": "integer"
          },
          "notes_count": {
            "type": "integer"
          },
          "created_at": {
            "type": "string",
            "format": "date-time"
          },
          "updated_at": {
            "type": "string",
            "format": "date-time"
          },
          "application_id": {
            "type": "string",
            "format": "uuid"
          },
          "application_name": {
            "type": "string"
          },
          "organization_id": {
            "type": "string",
            "format": "uuid"
          },
          "organization_name": {
            "type": "string"
          }
        }
      },
      "CaseDetail": {
        "type": "object",
        "properties": {
          "uuid": {
            "type": "string",
            "format": "uuid"
          },
          "case_number": {
            "type": "string",
            "nullable": true
          },
          "title": {
            "type": "string"
          },
          "status": {
            "type": "string",
            "enum": [
              "OPEN",
              "AWAITING_USER",
              "RESOLVED"
            ]
          },
          "resolution": {
            "type": "string",
            "enum": [
              "FALSE_POSITIVE",
              "VALID_THREAT",
              "INCONCLUSIVE",
              "REQUIREMENTS_NOT_MET",
              "REQUIREMENTS_SATISFIED"
            ],
            "nullable": true
          },
          "resolution_notes": {
            "type": "string",
            "nullable": true
          },
          "priority": {
            "type": "string",
            "enum": [
              "LOW",
              "MEDIUM",
              "HIGH"
            ]
          },
          "source": {
            "type": "string",
            "enum": [
              "MANUAL",
              "AML_SCREENING",
              "TRANSACTION_RULE",
              "WORKFLOW_BUILDER"
            ]
          },
          "tags": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "subject": {
            "$ref": "#/components/schemas/CaseSubject"
          },
          "assigned_to": {
            "$ref": "#/components/schemas/CaseAssignee"
          },
          "assigned_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "team": {
            "$ref": "#/components/schemas/CaseTeamSummary"
          },
          "due_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "resolved_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "resolved_by_email": {
            "type": "string",
            "nullable": true
          },
          "pending_resolution": {
            "type": "object",
            "nullable": true,
            "description": "Wird nur gesetzt, während eine 4-Augen-Auflösung auf der Checker-Vorlage bereitgestellt ist und auf Genehmigung oder Ablehnung der Genehmigung wartet.",
            "properties": {
              "resolution": {
                "type": "string",
                "enum": [
                  "FALSE_POSITIVE",
                  "VALID_THREAT",
                  "INCONCLUSIVE",
                  "REQUIREMENTS_NOT_MET",
                  "REQUIREMENTS_SATISFIED"
                ]
              },
              "resolution_notes": {
                "type": "string",
                "nullable": true
              },
              "maker_email": {
                "type": "string",
                "format": "email",
                "nullable": true,
                "description": "E-Mail des Beauftragten, der den Beschluss eingereicht hat. Null, wenn er über einen API-Schlüssel eingereicht wurde: Dieser Beschluss hat keinen erfassten Ersteller, sodass approve und reject-approval für jeden Aufrufer 403 zurückgeben."
              },
              "maker_name": {
                "type": "string",
                "nullable": true
              },
              "maker_user_id": {
                "type": "string",
                "format": "uuid",
                "nullable": true,
                "description": "Benutzer-UUID des Mitglieds, das als Beauftragter die Entscheidung eingereicht hat. Null, wenn sie über einen API-Schlüssel eingereicht wurde. Dieses Mitglied kann nicht als `checker` benannt werden."
              },
              "maker_blueprint_id": {
                "type": "string",
                "format": "uuid"
              },
              "staged_at": {
                "type": "string",
                "format": "date-time"
              }
            }
          },
          "checker": {
            "$ref": "#/components/schemas/CaseChecker"
          },
          "metadata": {
            "type": "object"
          },
          "blueprint": {
            "$ref": "#/components/schemas/CaseBlueprintDetail"
          },
          "notes": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/CaseNote"
            },
            "description": "Neueste 50 Notizen."
          },
          "events": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/CaseEvent"
            },
            "description": "Neueste 100 Ereignisse."
          },
          "links": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/CaseLink"
            }
          },
          "links_count": {
            "type": "integer"
          },
          "notes_count": {
            "type": "integer"
          },
          "checklist_items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/CaseChecklistItem"
            }
          },
          "created_at": {
            "type": "string",
            "format": "date-time"
          },
          "updated_at": {
            "type": "string",
            "format": "date-time"
          }
        }
      },
      "ReportTemplateDetail": {
        "type": "object",
        "properties": {
          "uuid": {
            "type": "string",
            "format": "uuid"
          },
          "name": {
            "type": "string"
          },
          "jurisdiction": {
            "type": "string",
            "minLength": 2,
            "maxLength": 2,
            "description": "ISO 3166-1 Alpha-2-Ländercode."
          },
          "report_type": {
            "type": "string",
            "enum": [
              "SAR",
              "STR",
              "CTR",
              "TTR",
              "UTR",
              "IFT",
              "CBR",
              "TFR"
            ]
          },
          "report_type_display": {
            "type": "string"
          },
          "field_config": {
            "type": "object",
            "description": "Wiederverwendbare goAML-Header-Standardwerte. Pflichtfelder auf Vorlagenebene: rentity_id, submission_code und currency_code_local (3-stellig). Optional: enabled_fields (welche optionalen Berichtsblöcke enthalten sein sollen) sowie Standardwerte für reporting_person, location, reason und action. Header-Felder pro Meldung (action, submission_date, transactions, jurisdiction) werden bei der Validierung oder Fertigstellung des Berichts erzwungen, nicht in der Vorlage."
          },
          "created_at": {
            "type": "string",
            "format": "date-time"
          },
          "updated_at": {
            "type": "string",
            "format": "date-time"
          }
        }
      },
      "RegulatoryReportDetail": {
        "type": "object",
        "properties": {
          "uuid": {
            "type": "string",
            "format": "uuid"
          },
          "case_uuid": {
            "type": "string",
            "format": "uuid"
          },
          "case_number": {
            "type": "string",
            "nullable": true
          },
          "report_type": {
            "type": "string",
            "enum": [
              "SAR",
              "STR",
              "CTR",
              "TTR",
              "UTR",
              "IFT",
              "CBR",
              "TFR"
            ]
          },
          "report_type_display": {
            "type": "string"
          },
          "report_code": {
            "type": "string",
            "description": "goAML-Berichtscode, abgeleitet von report_type, z. B. STR, CTR, BCR."
          },
          "report_number": {
            "type": "string",
            "nullable": true
          },
          "status": {
            "type": "string",
            "enum": [
              "DRAFT",
              "VALIDATED",
              "FINALIZED"
            ]
          },
          "status_display": {
            "type": "string"
          },
          "jurisdiction": {
            "type": "string",
            "minLength": 2,
            "maxLength": 2
          },
          "rentity_id": {
            "type": "string",
            "nullable": true,
            "description": "Von der FIU ausgestellte ID der meldenden Einheit."
          },
          "rentity_branch": {
            "type": "string",
            "nullable": true
          },
          "submission_code": {
            "type": "string",
            "enum": [
              "E",
              "M"
            ]
          },
          "entity_reference": {
            "type": "string",
            "nullable": true
          },
          "fiu_ref_number": {
            "type": "string",
            "nullable": true
          },
          "currency_code_local": {
            "type": "string",
            "minLength": 3,
            "maxLength": 3,
            "nullable": true
          },
          "submission_date": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "reporting_person": {
            "type": "object"
          },
          "location": {
            "type": "object"
          },
          "reason": {
            "type": "string",
            "nullable": true
          },
          "action": {
            "type": "string",
            "nullable": true
          },
          "activity": {
            "type": "string",
            "nullable": true
          },
          "narrative": {
            "type": "object",
            "description": "Narrative Abschnitte zu den fünf W-Fragen.",
            "properties": {
              "who": {
                "type": "string"
              },
              "what": {
                "type": "string"
              },
              "when": {
                "type": "string"
              },
              "where": {
                "type": "string"
              },
              "why": {
                "type": "string"
              },
              "how": {
                "type": "string"
              }
            }
          },
          "report_indicators": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "included_fields": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "transactions": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid"
            }
          },
          "validation_errors": {
            "type": "array",
            "description": "Ergebnis der letzten Validierung; jeder Eintrag ist ein {field, message}-Objekt.",
            "items": {
              "type": "object",
              "properties": {
                "field": {
                  "type": "string"
                },
                "message": {
                  "type": "string"
                }
              }
            }
          },
          "validated_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "finalized_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "created_by_email": {
            "type": "string",
            "nullable": true
          },
          "created_by_name": {
            "type": "string",
            "nullable": true
          },
          "created_at": {
            "type": "string",
            "format": "date-time"
          },
          "updated_at": {
            "type": "string",
            "format": "date-time"
          }
        }
      },
      "TransactionRuleCondition": {
        "type": "object",
        "required": [
          "field",
          "operator"
        ],
        "properties": {
          "field": {
            "type": "string",
            "description": "Zu evaluierender Transaktionsfeldpfad. Kernfelder: amount, currency, direction, action_type, score, severity, transaction_type, payment_details, preferred_currency_amount (weicht auf amount_in_default_currency aus), default_currency_code, subject_country, counterparty_country, subject_vendor_data, counterparty_vendor_data, subject_device_fingerprint, counterparty_device_fingerprint, subject_browser_family, subject_browser_version, subject_platform, subject_accept_language, subject_session_age_ms, subject_ip_country, counterparty_ip_country, subject_ip_address, counterparty_ip_address, subject_payment_method_type, subject_payment_method_country, subject_payment_method_fingerprint, subject_payment_method_account_id (und die counterparty_payment_method_*-Äquivalente), travel_rule_status, travel_rule_required, travel_rule_obligations_count, counterparty_dd_status (Ihre Entscheidung zur Travel-Rule-Gegenpartei: APPROVED, RESTRICTED oder BLOCKED, wobei eine Entität der Marke folgt), counterparty_risk_level (LOW, MEDIUM oder HIGH; HIGH, solange Ihr eigenes Gegenparteien-Screening markiert ist), counterparty_jurisdiction (das Land des VASP der Gegenpartei), counterparty_responsiveness (RESPONSIVE, UNRESPONSIVE oder UNKNOWN), subject_days_since_previous_transaction, tags und custom_values.<key> für jeden Schlüssel, der in custom_properties bei der Transaktionserstellung übermittelt wurde. Ländercode-Felder akzeptieren ISO-2 oder ISO-3; beide Seiten werden vor dem Vergleich auf ISO-3 normalisiert."
          },
          "operator": {
            "type": "string",
            "enum": [
              "eq",
              "ne",
              "gt",
              "gte",
              "lt",
              "lte",
              "in",
              "not_in",
              "contains",
              "not_contains",
              "contains_any",
              "regex",
              "fuzzy_match",
              "exists",
              "is_not_empty",
              "is_not_null",
              "not_exists",
              "is_empty",
              "is_null"
            ],
            "description": "Vergleichsoperator. in/not_in prüfen die Zugehörigkeit (value kann eine Liste oder ein einzelner Skalar sein). contains/not_contains sind Substring-Prüfungen ohne Berücksichtigung der Groß-/Kleinschreibung gegen einen String-Wert. contains_any akzeptiert eine Liste von Strings und stimmt überein, wenn ein beliebiger Eintrag ein Substring des Feldwerts ohne Berücksichtigung der Groß-/Kleinschreibung ist. regex gleicht das Wertmuster mit dem Feld ab. fuzzy_match vergleicht mit dem Wert-String anhand des erforderlichen `score`-Schwellenwerts (0-100). gt/gte/lt/lte stimmen niemals überein, wenn eine der beiden Seiten fehlt. exists/is_not_empty/is_not_null (Aliase) und not_exists/is_empty/is_null (Aliase) sind Vorhandenseinsprüfungen, die `value` ignorieren."
          },
          "value": {
            "description": "Vergleichswert. Dessen Struktur hängt vom Operator und value_type ab; lassen Sie ihn bei Vorhandenseinsprüfungs-Operatoren weg. Jeder andere Operator erfordert einen Wert, der weder `null` noch eine leere Liste ist, andernfalls wird die Regel mit `400` abgelehnt. `contains_any` erfordert eine Liste von Strings, und `contains`, `not_contains` sowie `regex` erfordern einen einzelnen String."
          },
          "value_type": {
            "type": "string",
            "enum": [
              "list",
              "field",
              "relative_date"
            ],
            "description": "Optionale Interpretation des Werts. `list`: Der Wert ist eine Listen-UUID und die Einträge der Liste werden zum Vergleichswert. `field`: Der Wert ist ein anderer Feldpfad, bei dem Feld für Feld verglichen wird. `relative_date`: Der Wert ist ein Objekt für ein relatives Datum, z. B. {\"direction\": \"past\", \"unit\": \"days\", \"amount\": 30}."
          },
          "score": {
            "type": "number",
            "minimum": 0,
            "maximum": 100,
            "description": "Erforderlich, wenn operator fuzzy_match ist: der Ähnlichkeitsschwellenwert von 0-100."
          },
          "group_index": {
            "type": "integer",
            "description": "Optionale gruppierte Logik. Wenn eine Bedingung group_index enthält, bilden Bedingungen mit demselben Index eine Gruppe und die gruppierte Auswertung ersetzt evaluation_mode."
          },
          "group_logic": {
            "type": "string",
            "enum": [
              "AND",
              "OR"
            ],
            "default": "AND",
            "description": "Wie Bedingungen INNERHALB einer Gruppe kombiniert werden."
          },
          "groups_logic": {
            "type": "string",
            "enum": [
              "AND",
              "OR"
            ],
            "default": "OR",
            "description": "Wie Gruppenergebnisse GRUPPENÜBERGREIFEND kombiniert werden. Wird aus der ersten Bedingung gelesen."
          }
        },
        "description": "Eine Bedingung liest nur die ausgewertete Transaktion – sie filtert niemals das Aggregationsfenster."
      },
      "TransactionRuleAggregation": {
        "type": "object",
        "required": [
          "value"
        ],
        "properties": {
          "metric": {
            "type": "string",
            "enum": [
              "count",
              "sum",
              "max",
              "min",
              "avg",
              "distinct_count"
            ],
            "default": "count",
            "description": "Wie die übereinstimmenden historischen Transaktionen aggregiert werden. unique_count wird als Alias von distinct_count akzeptiert."
          },
          "field": {
            "type": "string",
            "default": "amount",
            "description": "Feld aggregiert nach sum/max/min/avg/distinct_count. Wird für count ignoriert."
          },
          "operator": {
            "type": "string",
            "enum": [
              "eq",
              "ne",
              "gt",
              "gte",
              "lt",
              "lte"
            ],
            "default": "eq",
            "description": "Auf die berechnete Metrik angewendeter Vergleich."
          },
          "value": {
            "type": "number",
            "description": "Schwellenwert, mit dem die berechnete Metrik verglichen wird."
          },
          "window": {
            "type": "string",
            "pattern": "^\\d+(m|h|d)$",
            "default": "1d",
            "description": "Rückblickzeitraum, der am txn_date der Transaktion endet: <N>m (MINUTEN, nicht Monate), <N>h (Stunden) oder <N>d (Tage), z. B. 30m, 24h, 7d, 30d."
          },
          "filters": {
            "type": "object",
            "additionalProperties": true,
            "description": "Grenzt ein, welche historischen Transaktionen aggregiert werden. Schlüssel sind Feldpfade aus dem Bedingungsfeldkatalog; ein Wert von „__current__“ wird zum Wert desselben Felds der ausgewerteten Transaktion aufgelöst (z. B. grenzt {\"subject_vendor_data\": \"__current__\"} das Zeitfenster auf dasselbe Subjekt ein), und ein Listenwert bedeutet Mitgliedschaft. Datensätze ohne den gruppierten Wert werden niemals zusammen gruppiert: Wenn die ausgewertete Transaktion keinen Wert für ein „__current__“-Feld aufweist (keine Gegenpartei, kein Geräte-Fingerprint), stimmt die Aggregation unabhängig von ihrem Operator nicht überein. Filter vergleichen NUR auf Gleichheit oder Mitgliedschaft – es gibt keinen lt/gte-Filter, daher kann ein Bereich wie „historische Transaktionen unter 10.000“ hier nicht ausgedrückt werden. Wenden Sie den Bereich stattdessen auf die Metrik an (Metrik max mit dem Operator lt hält jede Transaktion im Zeitfenster unter dem Schwellenwert)."
          }
        },
        "description": "Velocity-Prüfung über die historischen Transaktionen der Anwendung innerhalb des Zeitfensters. Jeder Aggregationseintrag muss übereinstimmen, damit die Regel zutrifft, unabhängig von evaluation_mode. Eine Aggregation schränkt nur das Zeitfenster ein; die zu bewertende Transaktion wird durch Scope und Bedingungen eingeschränkt. Wiederholen Sie daher direction, currency oder transaction_type in beiden Teilen, wenn die Regel diese vorsieht."
      },
      "TransactionRuleScope": {
        "type": "object",
        "properties": {
          "transaction_types": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Auf Transaktionstypen einschränken, z. B. finance, kyc, travel_rule, user_event. Leer oder fehlend = keine Einschränkung."
          },
          "directions": {
            "type": "array",
            "items": {
              "type": "string",
              "enum": [
                "INBOUND",
                "OUTBOUND"
              ]
            },
            "description": "Auf Transaktionsrichtungen einschränken (beim Schreiben ohne Berücksichtigung von Groß-/Kleinschreibung)."
          },
          "action_types": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Auf Ihre action_type-Werte einschränken, z. B. withdrawal, deposit."
          }
        },
        "description": "Für welche Transaktionen die Regel gilt. Es werden nur diese drei Schlüssel akzeptiert."
      },
      "TransactionRuleAction": {
        "oneOf": [
          {
            "$ref": "#/components/schemas/TransactionRuleActionAddScore"
          },
          {
            "$ref": "#/components/schemas/TransactionRuleActionChangeStatus"
          },
          {
            "$ref": "#/components/schemas/TransactionRuleActionAddTags"
          },
          {
            "$ref": "#/components/schemas/TransactionRuleActionAddNote"
          },
          {
            "$ref": "#/components/schemas/TransactionRuleActionAddToList"
          },
          {
            "$ref": "#/components/schemas/TransactionRuleActionOpenCase"
          }
        ],
        "discriminator": {
          "propertyName": "type",
          "mapping": {
            "add_score": "#/components/schemas/TransactionRuleActionAddScore",
            "change_status": "#/components/schemas/TransactionRuleActionChangeStatus",
            "add_tags": "#/components/schemas/TransactionRuleActionAddTags",
            "add_note": "#/components/schemas/TransactionRuleActionAddNote",
            "add_to_list": "#/components/schemas/TransactionRuleActionAddToList",
            "open_case": "#/components/schemas/TransactionRuleActionOpenCase"
          }
        },
        "description": "Eine Regelaktion. Eine Regel kann mehrere enthalten; alle werden zusammen angewendet, wenn sie zutrifft. Regeln im TEST-Modus zeichnen auf, was sie getan hätten, ohne eine Aktion anzuwenden."
      },
      "TransactionRuleCreateRequest": {
        "type": "object",
        "required": [
          "title",
          "category",
          "mode"
        ],
        "properties": {
          "title": {
            "type": "string",
            "description": "Regelname. Eindeutig pro Anwendung unter nicht gelöschten Regeln; Duplikate geben 400 zurück."
          },
          "description": {
            "type": "string",
            "nullable": true
          },
          "category": {
            "type": "string",
            "description": "Risikothema zur Gruppierung und Berichterstellung, z. B. finance, aml_ctf, anomaly_detection, fatf, device_intelligence, crypto_monitoring, travel_rule, responsible_gaming, e_commerce."
          },
          "mode": {
            "type": "string",
            "enum": [
              "ACTIVE",
              "DISABLED",
              "TEST"
            ],
            "description": "ACTIVE wertet live aus. TEST wertet Regelläufe aus und zeichnet sie auf, ändert jedoch niemals Score oder Status – der empfohlene Startmodus. DISABLED wird übersprungen."
          },
          "evaluation_mode": {
            "type": "string",
            "enum": [
              "ALL",
              "ANY"
            ],
            "default": "ALL",
            "description": "Gibt an, ob jede Bedingung zutreffen muss (ALL) oder mindestens eine (ANY). Wird ignoriert, wenn Bedingungen group_index verwenden."
          },
          "scope": {
            "$ref": "#/components/schemas/TransactionRuleScope"
          },
          "conditions": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/TransactionRuleCondition"
            }
          },
          "aggregation": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/TransactionRuleAggregation"
            }
          },
          "actions": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/TransactionRuleAction"
            }
          },
          "metadata": {
            "type": "object",
            "description": "Freiform-Metadaten, die für die Regel gespeichert sind."
          }
        },
        "description": "Erstellt eine CUSTOM-Regel. Regeln im Modus ACTIVE werden für neue Transaktionen sofort wirksam – erstellen Sie sie zunächst im TEST-Modus und führen Sie zuerst ein Backtesting durch."
      },
      "TransactionRuleUpdateRequest": {
        "type": "object",
        "properties": {
          "title": {
            "type": "string",
            "description": "Regelname. Eindeutig pro Anwendung unter nicht gelöschten Regeln; Duplikate geben 400 zurück."
          },
          "description": {
            "type": "string",
            "nullable": true
          },
          "category": {
            "type": "string",
            "description": "Risikothema zur Gruppierung und Berichterstellung, z. B. finance, aml_ctf, anomaly_detection, fatf, device_intelligence, crypto_monitoring, travel_rule, responsible_gaming, e_commerce."
          },
          "mode": {
            "type": "string",
            "enum": [
              "ACTIVE",
              "DISABLED",
              "TEST"
            ],
            "description": "ACTIVE wertet live aus. TEST wertet Regelläufe aus und zeichnet sie auf, ändert jedoch niemals Score oder Status – der empfohlene Startmodus. DISABLED wird übersprungen."
          },
          "evaluation_mode": {
            "type": "string",
            "enum": [
              "ALL",
              "ANY"
            ],
            "default": "ALL",
            "description": "Gibt an, ob jede Bedingung zutreffen muss (ALL) oder mindestens eine (ANY). Wird ignoriert, wenn Bedingungen group_index verwenden."
          },
          "scope": {
            "$ref": "#/components/schemas/TransactionRuleScope"
          },
          "conditions": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/TransactionRuleCondition"
            }
          },
          "aggregation": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/TransactionRuleAggregation"
            }
          },
          "actions": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/TransactionRuleAction"
            }
          },
          "metadata": {
            "type": "object",
            "description": "Freiform-Metadaten, die für die Regel gespeichert sind."
          }
        },
        "description": "Partielle Aktualisierung. Benutzerdefinierte Regeln akzeptieren jedes Feld; Bibliotheksregeln (PRESET) akzeptieren nur mode - alles andere gibt 400 zurück."
      },
      "TransactionRuleDetail": {
        "type": "object",
        "properties": {
          "uuid": {
            "type": "string",
            "format": "uuid"
          },
          "title": {
            "type": "string",
            "description": "Regelname. Eindeutig pro Anwendung unter nicht gelöschten Regeln; Duplikate geben 400 zurück."
          },
          "description": {
            "type": "string",
            "nullable": true
          },
          "category": {
            "type": "string",
            "description": "Risikothema zur Gruppierung und Berichterstellung, z. B. finance, aml_ctf, anomaly_detection, fatf, device_intelligence, crypto_monitoring, travel_rule, responsible_gaming, e_commerce."
          },
          "mode": {
            "type": "string",
            "enum": [
              "ACTIVE",
              "DISABLED",
              "TEST"
            ],
            "description": "ACTIVE wertet live aus. TEST wertet Regelläufe aus und zeichnet sie auf, ändert jedoch niemals Score oder Status – der empfohlene Startmodus. DISABLED wird übersprungen."
          },
          "evaluation_mode": {
            "type": "string",
            "enum": [
              "ALL",
              "ANY"
            ],
            "default": "ALL",
            "description": "Gibt an, ob jede Bedingung zutreffen muss (ALL) oder mindestens eine (ANY). Wird ignoriert, wenn Bedingungen group_index verwenden."
          },
          "scope": {
            "$ref": "#/components/schemas/TransactionRuleScope"
          },
          "conditions": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/TransactionRuleCondition"
            }
          },
          "aggregation": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/TransactionRuleAggregation"
            }
          },
          "actions": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/TransactionRuleAction"
            }
          },
          "metadata": {
            "type": "object",
            "description": "Freiform-Metadaten, die für die Regel gespeichert sind."
          },
          "severity": {
            "type": "string",
            "enum": [
              "UNKNOWN",
              "LOW",
              "MEDIUM",
              "HIGH",
              "CRITICAL"
            ],
            "nullable": true,
            "description": "Informativer Schweregrad, der von Bibliotheksregeln getragen wird; kann bei benutzerdefinierten Regeln nicht festgelegt werden."
          },
          "source": {
            "type": "string",
            "enum": [
              "PRESET",
              "CUSTOM"
            ],
            "description": "PRESET-Regeln stammen aus der Bibliothek (Installieren/Deinstallieren, Bearbeitungen nur des Modus); CUSTOM-Regeln gehören vollständig Ihnen."
          },
          "library_key": {
            "type": "string",
            "nullable": true,
            "description": "Stabile Bibliothekskennung; null für benutzerdefinierte Regeln."
          },
          "latest_triggered_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "run_count": {
            "type": "integer",
            "description": "Wie viele Transaktionen mit dieser Regel übereingestimmt haben."
          },
          "approved_count": {
            "type": "integer"
          },
          "reviewed_count": {
            "type": "integer"
          },
          "declined_count": {
            "type": "integer"
          },
          "awaiting_user_count": {
            "type": "integer"
          },
          "approved_pct": {
            "type": "number"
          },
          "reviewed_pct": {
            "type": "number"
          },
          "declined_pct": {
            "type": "number"
          },
          "created_at": {
            "type": "string",
            "format": "date-time"
          },
          "updated_at": {
            "type": "string",
            "format": "date-time"
          }
        }
      },
      "TransactionRuleBacktestRequest": {
        "type": "object",
        "properties": {
          "conditions": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/TransactionRuleCondition"
            },
            "default": []
          },
          "aggregation": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/TransactionRuleAggregation"
            },
            "default": []
          },
          "evaluation_mode": {
            "type": "string",
            "enum": [
              "ALL",
              "ANY"
            ],
            "default": "ALL"
          },
          "scope": {
            "$ref": "#/components/schemas/TransactionRuleScope"
          },
          "period_days": {
            "type": "integer",
            "minimum": 1,
            "maximum": 365,
            "default": 90
          }
        },
        "description": "Hypothetische Regelkonfiguration zur Auswertung anhand der jüngsten Transaktionen. Schreibgeschützt und kostenlos: Es wird nichts erstellt oder geändert. Senden Sie dieselben Bedingungen, Aggregationen, evaluation_mode UND denselben Bereich wie bei der Regel, die Sie aktivieren möchten. Weggelassene Bedingungen, Aggregationen und Bereiche fügen keine eigenen Einschränkungen hinzu; das Weglassen des Bereichs kann Richtungen oder Transaktionstypen einschließen, die die gespeicherte Regel überspringt. Ein weggelassener evaluation_mode wird standardmäßig auf ALL gesetzt (was Übereinstimmungen bei einer ANY-Regel verringern kann), und ein weggelassener period_days wird standardmäßig auf 90 Tage gesetzt, nicht auf einen unbegrenzten Verlauf."
      },
      "TransactionRuleBacktestResult": {
        "type": "object",
        "properties": {
          "evaluated": {
            "type": "integer",
            "description": "Ausgewertete Transaktionen (neueste zuerst, begrenzt)."
          },
          "matched": {
            "type": "integer",
            "description": "Transaktionen, auf die die Konfiguration zugetroffen hätte."
          },
          "affected_entities": {
            "type": "integer",
            "description": "Unterschiedliche Subjekte (nach vendor_data) unter den Treffern."
          },
          "period_days": {
            "type": "integer"
          }
        }
      },
      "TransactionRuleLibraryEntry": {
        "type": "object",
        "properties": {
          "library_key": {
            "type": "string"
          },
          "title": {
            "type": "string"
          },
          "description": {
            "type": "string",
            "nullable": true
          },
          "category": {
            "type": "string"
          },
          "evaluation_mode": {
            "type": "string",
            "enum": [
              "ALL",
              "ANY"
            ]
          },
          "scope": {
            "$ref": "#/components/schemas/TransactionRuleScope"
          },
          "conditions": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/TransactionRuleCondition"
            }
          },
          "aggregation": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/TransactionRuleAggregation"
            }
          },
          "actions": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/TransactionRuleAction"
            }
          },
          "metadata": {
            "type": "object"
          },
          "bundle": {
            "type": "string",
            "nullable": true,
            "description": "Funktionale Familie, z. B. finance, aml_ctf, crypto_monitoring, travel_rule, responsible_gaming."
          },
          "tags": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "industries": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "source": {
            "type": "string"
          },
          "is_installed": {
            "type": "boolean",
            "description": "Gibt an, ob diese Voreinstellung derzeit in der Anwendung installiert ist."
          }
        }
      },
      "TransactionRuleInstallRequest": {
        "type": "object",
        "properties": {
          "library_keys": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Spezifische Voreinstellungen zum Installieren oder Deinstallieren."
          },
          "bundle": {
            "type": "string",
            "description": "Stattdessen jede Vorlage in diesem Bundle installieren oder deinstallieren."
          }
        },
        "description": "Geben Sie library_keys ODER bundle an."
      },
      "TransactionRuleInstallResult": {
        "type": "object",
        "properties": {
          "installed_library_keys": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Nur POST (Installieren): Durch diesen Aufruf installierte Voreinstellungen."
          },
          "installed_count": {
            "type": "integer",
            "description": "Nur POST (Installieren)."
          },
          "uninstalled_count": {
            "type": "integer",
            "description": "Nur DELETE (Deinstallation): durch diesen Aufruf entfernte Voreinstellungen."
          }
        }
      },
      "WalletScreeningResult": {
        "type": "object",
        "properties": {
          "provider": {
            "type": "string",
            "description": "Anbieter, der das Screening durchgeführt hat (z. B. `merklescience`, `crystal`)."
          },
          "screening_type": {
            "type": "string",
            "enum": [
              "WALLET_SCREENING"
            ],
            "description": "Für diesen Endpoint immer `WALLET_SCREENING`."
          },
          "risk_score": {
            "type": "integer",
            "description": "Normalisierter Risiko-Score von 0–100. Höher bedeutet eine größere Exposition gegenüber riskanten Entitäten. Merkle Science bewertet eine Adresse von 0–5, was 0, 15, 35, 55, 75 oder 95 entspricht."
          },
          "severity": {
            "type": "string",
            "enum": [
              "UNKNOWN",
              "LOW",
              "MEDIUM",
              "HIGH",
              "CRITICAL"
            ],
            "description": "Aus `risk_score` abgeleitete Risikogruppe: `0-9` UNKNOWN, `10-39` LOW, `40-69` MEDIUM, `70-89` HIGH, `90-100` CRITICAL. `UNKNOWN` ist die niedrigste Spanne, kein separater Zustand ohne Daten: `risk_score` 0 (der übliche Fall einer unauffälligen Adresse) bedeutet keine negative Bewertung, während ein Wert ungleich null im Bereich 1-9 ein reales, aber unter LOW liegendes Signal darstellt – werten Sie den `risk_score` aus, nicht nur die Spanne. Behandeln Sie `UNKNOWN` niemals als bestätigte Einstufung mit geringem Risiko oder unbedenkliche Bewertung; zeigen Sie dies nicht als bestanden an."
          },
          "status": {
            "type": "string",
            "enum": [
              "SCREENED",
              "PENDING",
              "ERROR"
            ],
            "description": "Ergebnisstatus des Screenings."
          },
          "summary": {
            "type": "string",
            "description": "Für Menschen lesbare Zusammenfassung des Screening-Ergebnisses."
          },
          "wallet_address": {
            "type": "string",
            "description": "Die überprüfte Adresse, unverändert zurückgegeben."
          },
          "transaction_hash": {
            "type": "string",
            "nullable": true,
            "description": "Transaktions-Screening-Feld, gemeinsam mit der Ergebnisstruktur genutzt. Bei einem Wallet-Screening-Ergebnis immer `null`."
          },
          "blockchain": {
            "type": "string",
            "description": "Die Blockchain, die überprüft wurde."
          },
          "block_timestamp": {
            "type": "string",
            "nullable": true,
            "description": "Transaktions-Screening-Feld, gemeinsam mit der Ergebnisstruktur genutzt. Bei einem Wallet-Screening-Ergebnis immer `null`."
          },
          "total_value_usd": {
            "type": "number",
            "nullable": true,
            "description": "Transaktions-Screening-Feld, gemeinsam mit der Ergebnisstruktur genutzt. Bei einem Wallet-Screening-Ergebnis immer `null`."
          },
          "fee_usd": {
            "type": "number",
            "nullable": true,
            "description": "Transaktions-Screening-Feld, gemeinsam mit der Ergebnisstruktur genutzt. Bei einem Wallet-Screening-Ergebnis immer `null`."
          },
          "sender_rows": {
            "type": "array",
            "items": {
              "type": "object"
            },
            "description": "Transaktions-Screening-Feld, gemeinsam mit der Ergebnisstruktur genutzt. Bei einem Wallet-Screening-Ergebnis immer leer."
          },
          "receiver_rows": {
            "type": "array",
            "items": {
              "type": "object"
            },
            "description": "Transaktions-Screening-Feld, gemeinsam mit der Ergebnisstruktur genutzt. Bei einem Wallet-Screening-Ergebnis immer leer."
          },
          "transaction_flows": {
            "type": "array",
            "items": {
              "type": "object"
            },
            "description": "Transaktions-Screening-Feld, gemeinsam mit der Ergebnisstruktur genutzt. Bei einem Wallet-Screening-Ergebnis immer leer."
          },
          "transaction_flows_status": {
            "type": "string",
            "nullable": true,
            "description": "Transaktions-Screening-Feld, gemeinsam mit der Ergebnisstruktur genutzt. Bei einem Wallet-Screening-Ergebnis immer `null`."
          },
          "transaction_flows_error": {
            "type": "string",
            "nullable": true,
            "description": "Transaktions-Screening-Feld, gemeinsam mit der Ergebnisstruktur genutzt. Bei einem Wallet-Screening-Ergebnis immer `null`."
          },
          "source_of_funds": {
            "type": "array",
            "description": "Von wo die Adresse Gelder empfangen hat, zugeordnet nach Entität. Jeder Eintrag ist eine Exposure-Aufschlüsselung.",
            "items": {
              "type": "object",
              "properties": {
                "category": {
                  "type": "string",
                  "description": "Normalisierte Risikokategorie, z. B. `exchange_licensed`, `dex`, `defi`, `payment_processor`, `mixer`, `darknet_market`, `sanctioned`, `stolen_funds`, `high_risk_exchange`."
                },
                "percentage": {
                  "type": "number",
                  "description": "Anteil an der Gesamtexposition der Richtung, 0-100."
                },
                "amount_usd": {
                  "type": "number",
                  "nullable": true,
                  "description": "Dieser Entität zugeschriebener USD-Wert."
                },
                "entity_name": {
                  "type": "string",
                  "nullable": true,
                  "description": "Name der zugeordneten Entität, beispielsweise einer Krypto-Börse, eines Mixers oder einer sanktionierten Gruppe."
                },
                "entity_type": {
                  "type": "string",
                  "nullable": true,
                  "description": "Typ der Anbieter-Entität (z. B. `Exchange`, `DeFi`, `Sanctions`, `Theft`)."
                },
                "entity_subtype": {
                  "type": "string",
                  "nullable": true,
                  "description": "Detaillierterer Untertyp (z. B. `Mandatory KYC and AML`, `OFAC`, `Yield Aggregator`)."
                },
                "hops": {
                  "type": "integer",
                  "nullable": true,
                  "description": "Anzahl der Hops zur Entität (1 für eine direkte Gegenpartei), sofern der Anbieter einen angibt. Immer `null` für Merkle Science, das nur meldet, ob das Exposure direkt oder indirekt ist: Verwenden Sie `exposure_type`."
                },
                "description": {
                  "type": "string",
                  "nullable": true,
                  "description": "`entity_type / entity_subtype`, wie der Anbieter die Entität kennzeichnet."
                },
                "is_direct": {
                  "type": "boolean",
                  "description": "True, wenn `exposure_type` gleich `direct` ist."
                },
                "exposure_direction": {
                  "type": "string",
                  "enum": [
                    "incoming",
                    "outgoing",
                    "connected"
                  ],
                  "description": "Gibt an, ob die Mittel von dieser Entität stammten (`incoming`) oder an sie gingen (`outgoing`)."
                },
                "exposure_type": {
                  "type": "string",
                  "enum": [
                    "direct",
                    "indirect"
                  ],
                  "description": "`direct` (1 Hop) oder `indirect` (Multi-Hop) Exposition."
                },
                "provider_entity_id": {
                  "type": "string",
                  "nullable": true,
                  "description": "Die anbietereigene Kennung für die Entität."
                },
                "provider_entity_type_id": {
                  "type": "string",
                  "nullable": true,
                  "description": "Die anbietereigene Kennung für `entity_type`."
                },
                "provider_entity_subtype_id": {
                  "type": "string",
                  "nullable": true,
                  "description": "Die anbietereigene Kennung für `entity_subtype`."
                },
                "country": {
                  "type": "string",
                  "nullable": true,
                  "description": "Primäres ISO-3166-1-alpha-2-Land der Entität. Leer oder `null`, wenn der Anbieter es nicht kennt."
                },
                "raw_amount": {
                  "type": "number",
                  "nullable": true,
                  "description": "Betrag in der eigenen Einheit des Vermögenswerts, sofern vom Anbieter gemeldet."
                },
                "raw_currency": {
                  "type": "string",
                  "nullable": true,
                  "description": "Einheit von `raw_amount`, sofern vom Anbieter gemeldet."
                }
              }
            }
          },
          "destination_of_funds": {
            "type": "array",
            "description": "Wohin die Adresse Gelder gesendet hat, zugeordnet nach Entität. Gleiche Elementstruktur wie `source_of_funds` mit `exposure_direction` = `outgoing`.",
            "items": {
              "type": "object",
              "properties": {
                "category": {
                  "type": "string",
                  "description": "Normalisierte Risikokategorie, z. B. `exchange_licensed`, `dex`, `defi`, `payment_processor`, `mixer`, `darknet_market`, `sanctioned`, `stolen_funds`, `high_risk_exchange`."
                },
                "percentage": {
                  "type": "number",
                  "description": "Anteil an der Gesamtexposition der Richtung, 0-100."
                },
                "amount_usd": {
                  "type": "number",
                  "nullable": true,
                  "description": "Dieser Entität zugeschriebener USD-Wert."
                },
                "entity_name": {
                  "type": "string",
                  "nullable": true,
                  "description": "Name der zugeordneten Entität, beispielsweise einer Krypto-Börse, eines Mixers oder einer sanktionierten Gruppe."
                },
                "entity_type": {
                  "type": "string",
                  "nullable": true,
                  "description": "Typ der Anbieter-Entität (z. B. `Exchange`, `DeFi`, `Sanctions`, `Theft`)."
                },
                "entity_subtype": {
                  "type": "string",
                  "nullable": true,
                  "description": "Detaillierterer Untertyp (z. B. `Mandatory KYC and AML`, `OFAC`, `Yield Aggregator`)."
                },
                "hops": {
                  "type": "integer",
                  "nullable": true,
                  "description": "Anzahl der Hops zur Entität (1 für eine direkte Gegenpartei), sofern der Anbieter einen angibt. Immer `null` für Merkle Science, das nur meldet, ob das Exposure direkt oder indirekt ist: Verwenden Sie `exposure_type`."
                },
                "description": {
                  "type": "string",
                  "nullable": true,
                  "description": "`entity_type / entity_subtype`, wie der Anbieter die Entität kennzeichnet."
                },
                "is_direct": {
                  "type": "boolean",
                  "description": "True, wenn `exposure_type` gleich `direct` ist."
                },
                "exposure_direction": {
                  "type": "string",
                  "enum": [
                    "incoming",
                    "outgoing",
                    "connected"
                  ],
                  "description": "Gibt an, ob die Mittel von dieser Entität stammten (`incoming`) oder an sie gingen (`outgoing`)."
                },
                "exposure_type": {
                  "type": "string",
                  "enum": [
                    "direct",
                    "indirect"
                  ],
                  "description": "`direct` (1 Hop) oder `indirect` (Multi-Hop) Exposition."
                },
                "provider_entity_id": {
                  "type": "string",
                  "nullable": true,
                  "description": "Die anbietereigene Kennung für die Entität."
                },
                "provider_entity_type_id": {
                  "type": "string",
                  "nullable": true,
                  "description": "Die anbietereigene Kennung für `entity_type`."
                },
                "provider_entity_subtype_id": {
                  "type": "string",
                  "nullable": true,
                  "description": "Die anbietereigene Kennung für `entity_subtype`."
                },
                "country": {
                  "type": "string",
                  "nullable": true,
                  "description": "Primäres ISO-3166-1-alpha-2-Land der Entität. Leer oder `null`, wenn der Anbieter es nicht kennt."
                },
                "raw_amount": {
                  "type": "number",
                  "nullable": true,
                  "description": "Betrag in der eigenen Einheit des Vermögenswerts, sofern vom Anbieter gemeldet."
                },
                "raw_currency": {
                  "type": "string",
                  "nullable": true,
                  "description": "Einheit von `raw_amount`, sofern vom Anbieter gemeldet."
                }
              }
            }
          },
          "counterparty_connections": {
            "type": "array",
            "description": "Entitäten, denen der Anbieter die überprüfte Adresse zuordnet. Bei Merkle Science stammen diese aus den eigenen Eigentümer- und Benutzer-Tags der Adresse, sodass dieselbe Entität zweimal vorkommen kann und diese keine Mittelflüsse aufweisen: `received_usd`, `sent_usd`, `received_hops` und `sent_hops` sind `null` und `percentage` ist 0. Steuern Sie hier nicht anhand von `risk_level` oder `is_direct`: Verwenden Sie `sanctions_hit`, `dominant_risk_category` und `risk_factors[].is_high_risk` für das Urteil und `exposure_type` in `source_of_funds`/`destination_of_funds` für die Direktheit.",
            "items": {
              "type": "object",
              "properties": {
                "entity_name": {
                  "type": "string",
                  "nullable": true,
                  "description": "Name der zugeschriebenen Entität."
                },
                "entity_type": {
                  "type": "string",
                  "nullable": true,
                  "description": "Typ der Anbieter-Entität."
                },
                "entity_subtype": {
                  "type": "string",
                  "nullable": true,
                  "description": "Subtyp der Anbieter-Entität."
                },
                "risk_level": {
                  "type": "string",
                  "description": "In Kleinbuchstaben und anbieterabhängig. Bei Merkle Science ist dies die eigene Risikostufe 0–5 der Adresse (`no_risk`, `low`, `medium_low`, `medium`, `high`, `critical`), angehoben auf `high`, wenn die Kategorie der Entität ein hohes Risiko aufweist; es handelt sich nicht um eine separate Einstufung der Entität."
                },
                "categories": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  },
                  "description": "Normalisierte Risikokategorien der Entität."
                },
                "received_usd": {
                  "type": "number",
                  "nullable": true,
                  "description": "Von der Entität empfangene USD, sofern vom Anbieter gemeldet."
                },
                "sent_usd": {
                  "type": "number",
                  "nullable": true,
                  "description": "An die Entität gesendete USD, sofern vom Anbieter gemeldet."
                },
                "received_hops": {
                  "type": "integer",
                  "nullable": true,
                  "description": "Hops zur Entität auf der Empfängerseite, sofern vom Anbieter gemeldet."
                },
                "sent_hops": {
                  "type": "integer",
                  "nullable": true,
                  "description": "Hops zur Entität auf der Senderseite, sofern vom Anbieter gemeldet."
                },
                "percentage": {
                  "type": "number",
                  "description": "Anteil an der Exposition der Adresse, sofern vom Anbieter gemeldet; andernfalls 0."
                },
                "is_direct": {
                  "type": "boolean",
                  "description": "Immer `true` für Merkle Science, deren Verbindungen eher Attributionen als Gegenparteien sind."
                },
                "country": {
                  "type": "string",
                  "nullable": true,
                  "description": "Land der Entität, sofern bekannt."
                },
                "provider_entity_id": {
                  "type": "string",
                  "nullable": true,
                  "description": "Die anbietereigene Kennung für die Entität."
                }
              }
            }
          },
          "network_nodes": {
            "type": "array",
            "items": {
              "type": "object"
            },
            "description": "Knoten des Exposure-Graphen für das Transaktions-Screening. Bei einem Wallet-Screening-Ergebnis leer."
          },
          "network_edges": {
            "type": "array",
            "items": {
              "type": "object"
            },
            "description": "Kanten des Exposure-Graphen für das Transaktions-Screening. Bei einem Wallet-Screening-Ergebnis leer."
          },
          "sanctions_hit": {
            "type": "boolean",
            "description": "True, wenn die Adresse direkt oder indirekt Sanktionen ausgesetzt ist."
          },
          "pep_counterparty": {
            "type": "boolean",
            "description": "Exposition gegenüber einer politisch exponierten Person. `null`, wenn kein PEP-Befund vorliegt, was derzeit jedes Ergebnis ist, da kein Anbieter einen meldet; `false` nur bei einem explizit negativen Screening-Ergebnis. Interpretieren Sie `null` nicht als abgeschlossene PEP-Prüfung.",
            "nullable": true
          },
          "dominant_risk_category": {
            "type": "string",
            "nullable": true,
            "description": "Kategorie mit hohem Risiko mit der höchsten Gewichtung oder `null`, wenn keine dominiert (z. B. `sanctioned`, `mixer`, `stolen_funds`)."
          },
          "risk_factors": {
            "type": "array",
            "description": "Nach Rang geordnete Erklärung von `risk_score`: was dieses Urteil herbeigeführt hat. Anbieter bewerten eine Adresse nach ihrem eigenen Modell und geben lediglich ein Urteil zurück (Merkle Science gibt eine Ganzzahl von 0-5 zurück), sodass der Score allein nicht handlungsrelevant ist. Zuerst nach hohem Risiko, dann nach dem Wert sortiert, der durch jeden Treiber bewegt wurde, begrenzt auf die fünf stärksten; `source_of_funds` und `destination_of_funds` enthalten immer die vollständige Aufschlüsselung. Ein hoher `risk_score` ohne `is_high_risk`-Eintrag bedeutet, dass der Anbieter keine Übereinstimmung mit Sanktionen oder zugeordneten Entitäten gemeldet und die Adresse rein anhand seines eigenen Exposure-Modells bewertet hat – `summary` gibt dies explizit an.",
            "items": {
              "type": "object",
              "properties": {
                "source": {
                  "type": "string",
                  "enum": [
                    "attribution",
                    "exposure"
                  ],
                  "description": "`attribution` ist das, was der Anbieter als die Adresse selbst angibt (ihr eigener Tag oder Cluster); `exposure` gibt an, wohin ihre Gelder tatsächlich geflossen sind."
                },
                "category": {
                  "type": "string",
                  "description": "Normalisierte Risikokategorie, gleiches Vokabular wie bei der Aufschlüsselung der Exposition."
                },
                "label": {
                  "type": "string",
                  "description": "Der anbietereigene Wortlaut für den Treiber (z. B. `Gambling / Crypto only`), den Sie auch in der Konsole des Anbieters sehen würden."
                },
                "entity_name": {
                  "type": "string",
                  "nullable": true,
                  "description": "Zugeschriebene Entität hinter dem Treiber, zum Beispiel eine Glücksspiel-Website oder eine Börse."
                },
                "direction": {
                  "type": "string",
                  "enum": [
                    "incoming",
                    "outgoing",
                    "connected",
                    "unknown",
                    "attribution"
                  ],
                  "description": "Richtung des Geldflusses, `attribution`, wenn der Auslöser das eigene Tag der Adresse ist, oder `unknown`, wenn der Anbieter keine Richtung gemeldet hat."
                },
                "exposure_type": {
                  "type": "string",
                  "enum": [
                    "direct",
                    "indirect",
                    "unknown",
                    "attribution"
                  ],
                  "description": "`direct` (1 Hop) oder `indirect` (Multi-Hop), `attribution` für das eigene Tag der Adresse oder `unknown`, wenn der Anbieter nicht angegeben hat, wie viele Hops die Gegenpartei entfernt ist. Behandeln Sie `unknown` als nicht klassifiziert, nicht als `direct`."
                },
                "amount_usd": {
                  "type": "number",
                  "format": "float",
                  "nullable": true,
                  "description": "Diesem Treiber zugeschriebener USD-Wert."
                },
                "percentage": {
                  "type": "number",
                  "format": "float",
                  "description": "Anteil am GESAMTEN überprüften Volumen der Adresse, beide Richtungen kombiniert – im Gegensatz zu `percentage` innerhalb von `source_of_funds`/`destination_of_funds`, das pro Richtung normalisiert wird. Über die gesamte Liste hinweg vergleichbar und summierbar."
                },
                "is_high_risk": {
                  "type": "boolean",
                  "description": "Gibt an, ob die Kategorie von Didit als hohes Risiko eingestuft wird (`sanctioned`, `mixer`, `stolen_funds`, `ransomware`, `scam`, `darknet_market`, `terrorist_financing`, `child_exploitation`, `hacked_exchange`, `high_risk_exchange`, `seized_funds`)."
                },
                "description": {
                  "type": "string",
                  "description": "Einzeilige Darstellung des Treibers, z. B. `9.01% indirect outgoing exposure to Gambling / Crypto only (Example Gambling)`."
                }
              }
            }
          },
          "raw_response": {
            "type": "object",
            "additionalProperties": true,
            "description": "Die anbietereigene Payload. Ihre Struktur ist anbieterspezifisch und kann sich ohne Vorankündigung ändern: Lesen Sie die normalisierten Felder aus, anstatt sie zu parsen."
          },
          "report_signature": {
            "type": "string",
            "description": "Opake HMAC-SHA256-Signatur über genau dieses Ergebnis, beschränkt auf Ihre Anwendung. Für sich allein genommen nicht aussagekräftig – senden Sie den vollständigen Antwort-Body unverändert und einschließlich dieses Felds erneut an `POST /v3/wallet-screening/pdf/`, um ihn als PDF zu rendern. Der PDF-Endpoint weist die Anfrage mit `400` ab, wenn `report_signature` fehlt oder wenn ein signiertes Feld (z. B. `risk_score`, `severity`, `sanctions_hit`) vor dem erneuten Senden bearbeitet wurde."
          }
        },
        "required": [
          "provider",
          "screening_type",
          "risk_score",
          "severity",
          "status",
          "summary",
          "wallet_address",
          "blockchain",
          "sanctions_hit",
          "dominant_risk_category",
          "source_of_funds",
          "destination_of_funds",
          "counterparty_connections",
          "report_signature"
        ]
      },
      "NetworkRiskDisplay": {
        "type": "object",
        "properties": {
          "score": {
            "type": "integer",
            "description": "Risiko-Score, 0-100."
          },
          "band": {
            "type": "string",
            "enum": [
              "low",
              "medium",
              "high"
            ],
            "description": "Bereich, in dem der Score dargestellt wird. high >= 70, medium >= 40, andernfalls low."
          },
          "bar": {
            "type": "number",
            "format": "float",
            "description": "Normalisierter Wert von 0–1 zur Darstellung eines Risikobalkens."
          }
        }
      },
      "NetworkNodeTag": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "color": {
            "type": "string",
            "nullable": true,
            "description": "Null für Guard-Tags, deren Farb-Token der Renderer verwaltet."
          },
          "source": {
            "type": "string",
            "enum": [
              "subject_tag",
              "session_tag",
              "transaction_tag",
              "signal_guard"
            ],
            "description": "Woher der Tag stammt: ein Tag auf dem Benutzer/Unternehmen, ein Tag auf einer Sitzung in diesem Netzwerk, ein Tag auf einer Transaktion, zu der eine Partei gehört, oder eine Signal-Guard-Bedingung (z. B. Hub, Rechenzentrums-IP)."
          },
          "category": {
            "type": "string",
            "enum": [
              "customer",
              "quality"
            ],
            "nullable": true,
            "description": "customer für benutzerdefinierte Tags, quality für Tags zur Absicherung der Signalqualität. Null, wenn nicht zutreffend."
          }
        }
      },
      "NetworkListItem": {
        "type": "object",
        "properties": {
          "uuid": {
            "type": "string",
            "format": "uuid"
          },
          "network_id": {
            "type": "string",
            "description": "Für Menschen lesbare, fortlaufende ID pro Organisation, z. B. N-0001."
          },
          "name": {
            "type": "string",
            "nullable": true
          },
          "status": {
            "type": "string",
            "enum": [
              "active",
              "in_review",
              "resolved",
              "dismissed"
            ],
            "description": "Lebenszyklusstatus des Netzwerks. Unterscheidet sich vom antragstellerspezifischen outcome_status innerhalb eines Netzwerks (approved/in_review/declined/not_completed)."
          },
          "risk": {
            "$ref": "#/components/schemas/NetworkRiskDisplay"
          },
          "pattern_types": {
            "type": "array",
            "items": {
              "type": "string",
              "enum": [
                "exact_same_device",
                "similar_device",
                "same_ip_address",
                "same_address",
                "similar_selfie_backgrounds",
                "similar_poa_documents",
                "same_document_number",
                "same_phone_number",
                "same_email"
              ]
            },
            "description": "Die in diesem Netzwerk erkannten Clustering-Muster."
          },
          "signal_types": {
            "type": "array",
            "items": {
              "type": "string",
              "enum": [
                "ip_address",
                "device",
                "face",
                "document_number",
                "phone",
                "email",
                "address"
              ]
            },
            "description": "Die unterschiedlichen Signaltypen, die in diesem Netzwerk vorhanden sind."
          },
          "member_counts": {
            "type": "object",
            "description": "Anzahl der Mitglieder nach Kategorie (z. B. insgesamt, pro outcome_status)."
          },
          "member_status": {
            "type": "object",
            "description": "Aufschlüsselung der Mitglieder nach outcome_status."
          },
          "signal_coverage": {
            "type": "object",
            "description": "Abdeckung der Mitglieder dieses Netzwerks pro signal_type."
          },
          "first_activity_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "last_activity_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          }
        }
      },
      "NetworkDetail": {
        "allOf": [
          {
            "$ref": "#/components/schemas/NetworkListItem"
          },
          {
            "type": "object",
            "properties": {
              "stats": {
                "type": "object",
                "description": "Aggregierte Statistiken für das Netzwerk (z. B. Mitglieder-Gesamtzahlen)."
              },
              "fraud_tags": {
                "type": "array",
                "items": {
                  "type": "object"
                },
                "description": "Im Netzwerk erkannte Tags für Betrugsmuster."
              },
              "risk_signals": {
                "type": "object",
                "description": "Zusammenfassungen von Risikosignalen: residential_proxy_reuse, email_intelligence, phone_intelligence."
              },
              "reviewed_at": {
                "type": "string",
                "format": "date-time",
                "nullable": true
              },
              "reviewed_by": {
                "type": "string",
                "nullable": true
              },
              "review_reason": {
                "type": "string",
                "nullable": true
              }
            }
          }
        ],
        "properties": {
          "notes_count": {
            "type": "integer",
            "minimum": 0,
            "readOnly": true,
            "description": "Anzahl der privaten Analystennotizen in dieser Untersuchung."
          }
        }
      },
      "NetworkGraphNode": {
        "type": "object",
        "description": "Ein Subjekt-Knoten oder ein Signal-Knoten, unterschieden nach Typ. Subjekt-Knoten (kind: vendor_user | vendor_business | transaction_party) enthalten id, kind, subject, node_status (approved | in_review | declined | not_completed) und tags. Signal-Knoten (kind: signal) enthalten id, kind, uuid, signal_type, subject_count, coverage, is_hub, is_datacenter_ip, is_high_collision_device, node_status (signal_active | signal_guarded), tags, risk_evidence, first_seen_at und last_seen_at.",
        "properties": {
          "id": {
            "type": "string"
          },
          "kind": {
            "type": "string",
            "enum": [
              "vendor_user",
              "vendor_business",
              "transaction_party",
              "signal"
            ]
          }
        }
      },
      "NetworkGraphEdge": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "source": {
            "type": "string",
            "description": "Subjekt-Knoten-ID."
          },
          "target": {
            "type": "string",
            "description": "Signal-Knoten-ID."
          },
          "subject_kind": {
            "type": "string",
            "enum": [
              "vendor_user",
              "vendor_business",
              "transaction_party"
            ]
          },
          "signal_type": {
            "type": "string",
            "enum": [
              "ip_address",
              "device",
              "face",
              "document_number",
              "phone",
              "email",
              "address"
            ]
          },
          "confidence": {
            "type": "number",
            "format": "float",
            "description": "1.0 für eine exakte Übereinstimmung."
          },
          "observation_count": {
            "type": "integer"
          },
          "first_seen_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "last_seen_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          }
        }
      },
      "NetworkGraph": {
        "type": "object",
        "properties": {
          "network": {
            "$ref": "#/components/schemas/NetworkDetail"
          },
          "depth": {
            "type": "integer",
            "nullable": true,
            "description": "Angewendete effektive Tiefe oder null, wenn unbegrenzt (depth=all)."
          },
          "truncated": {
            "type": "boolean",
            "description": "True, wenn die Nachbarschaft aufgrund der Tiefe abgeschnitten wurde."
          },
          "nodes": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/NetworkGraphNode"
            }
          },
          "edges": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/NetworkGraphEdge"
            }
          },
          "metrics": {
            "type": "object",
            "properties": {
              "node_count": {
                "type": "integer"
              },
              "edge_count": {
                "type": "integer"
              },
              "hub_signal_count": {
                "type": "integer"
              }
            }
          }
        }
      },
      "NetworkMember": {
        "type": "object",
        "properties": {
          "subject": {
            "type": "object",
            "description": "Der vendor_user, das vendor_business oder die transaction_party, die dieses Mitglied repräsentiert."
          },
          "outcome_status": {
            "type": "string",
            "description": "Das Verifizierungs-/Entscheidungsergebnis des Subjekts."
          },
          "node_status": {
            "type": "string",
            "enum": [
              "approved",
              "in_review",
              "declined",
              "not_completed",
              "signal_active",
              "signal_guarded"
            ],
            "description": "Für eine Mitgliederzeile ist dies immer einer der Ergebniswerte der geprüften Person: approved, in_review, declined oder not_completed."
          },
          "tags": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/NetworkNodeTag"
            }
          },
          "risk": {
            "$ref": "#/components/schemas/NetworkRiskDisplay"
          },
          "signal_coverage": {
            "type": "object"
          },
          "shared_infrastructure": {
            "type": "object"
          },
          "joined_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "last_seen_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "provenance": {
            "type": "object",
            "properties": {
              "session_ids": {
                "type": "array",
                "items": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "business_session_ids": {
                "type": "array",
                "items": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "transaction_ids": {
                "type": "array",
                "items": {
                  "type": "string",
                  "format": "uuid"
                }
              }
            }
          }
        }
      },
      "NetworkSignal": {
        "type": "object",
        "properties": {
          "uuid": {
            "type": "string",
            "format": "uuid"
          },
          "signal_type": {
            "type": "string",
            "enum": [
              "ip_address",
              "device",
              "face",
              "document_number",
              "phone",
              "email",
              "address"
            ]
          },
          "subject_count": {
            "type": "integer"
          },
          "coverage": {
            "type": "number",
            "format": "float"
          },
          "is_hub": {
            "type": "boolean",
            "description": "Wahr, wenn dieses Signal eine ungewöhnlich große Anzahl von Subjekten verknüpft."
          },
          "is_datacenter_ip": {
            "type": "boolean"
          },
          "is_high_collision_device": {
            "type": "boolean"
          },
          "node_status": {
            "type": "string",
            "enum": [
              "signal_active",
              "signal_guarded"
            ]
          },
          "tags": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/NetworkNodeTag"
            }
          },
          "risk_evidence": {
            "type": "object"
          },
          "first_seen_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "last_seen_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          }
        }
      },
      "NetworkTimelineEvent": {
        "type": "object",
        "properties": {
          "event_type": {
            "type": "string",
            "description": "z. B. network_detected, signal_observed, network_in_review, network_resolved, network_dismissed."
          },
          "occurred_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "label": {
            "type": "string"
          },
          "metadata": {
            "type": "object"
          }
        }
      },
      "NetworkMap": {
        "type": "object",
        "properties": {
          "network": {
            "$ref": "#/components/schemas/NetworkDetail"
          },
          "convergence_count": {
            "type": "integer",
            "description": "Anzahl der eindeutigen Adress-/Standortpunkte, an denen Mitglieder zusammenlaufen."
          },
          "countries": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "points": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "uuid": {
                  "type": "string",
                  "format": "uuid"
                },
                "country": {
                  "type": "string",
                  "nullable": true
                },
                "country_code": {
                  "type": "string",
                  "nullable": true
                },
                "city": {
                  "type": "string",
                  "nullable": true
                },
                "latitude": {
                  "type": "number",
                  "format": "float",
                  "nullable": true
                },
                "longitude": {
                  "type": "number",
                  "format": "float",
                  "nullable": true
                },
                "observed_at": {
                  "type": "string",
                  "format": "date-time",
                  "nullable": true
                }
              }
            }
          }
        }
      },
      "EntityNetworkMembership": {
        "type": "object",
        "properties": {
          "network": {
            "$ref": "#/components/schemas/NetworkListItem"
          },
          "subject": {
            "type": "object"
          },
          "signal_types": {
            "type": "array",
            "items": {
              "type": "string",
              "enum": [
                "ip_address",
                "device",
                "face",
                "document_number",
                "phone",
                "email",
                "address"
              ]
            }
          },
          "signal_count": {
            "type": "integer"
          },
          "joined_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "last_seen_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          }
        }
      },
      "RiskSignals": {
        "type": "object",
        "description": "Optionaler Geräte- und Netzwerkkontext, der von Ihrer Anwendung beobachtet wird. Alle Felder sind optional. Ihre Übergabe speist die sitzungsübergreifende Übereinstimmungserkennung in Networks.",
        "properties": {
          "ip": {
            "type": "string",
            "format": "ip",
            "description": "Für den Endbenutzer ermittelte IPv4- oder IPv6-Adresse.",
            "example": "192.0.2.1"
          },
          "device_id": {
            "type": "string",
            "maxLength": 255,
            "description": "Stabiler Geräteidentifikator, der von Ihrer Anwendung erfasst wurde (Android `ANDROID_ID`, iOS `identifierForVendor`)."
          },
          "device_platform": {
            "type": "string",
            "enum": [
              "android",
              "ios",
              "ipados",
              "tvos",
              "web"
            ],
            "description": "Plattform des Geräts des Endbenutzers."
          },
          "device_model": {
            "type": "string",
            "maxLength": 255,
            "description": "Von Ihrer Anwendung gemeldetes Gerätemodell."
          },
          "os_version": {
            "type": "string",
            "maxLength": 64,
            "description": "Betriebssystemversion."
          },
          "app_version": {
            "type": "string",
            "maxLength": 64,
            "description": "Version Ihrer Anwendung."
          },
          "user_agent": {
            "type": "string",
            "maxLength": 512,
            "description": "User-Agent des Browsers oder der App."
          }
        }
      },
      "PhoneRiskRequest": {
        "type": "object",
        "required": [
          "phone_number"
        ],
        "properties": {
          "phone_number": {
            "type": "string",
            "maxLength": 20,
            "description": "Zu bewertende Telefonnummer. Sie wird validiert und auf E.164 normalisiert.",
            "example": "+14155552671"
          },
          "country_code": {
            "type": "string",
            "maxLength": 3,
            "description": "Optionaler ISO 3166-1 alpha-2- oder alpha-3-Länderhinweis für die Informationsabdeckung.",
            "example": "US"
          },
          "signals": {
            "$ref": "#/components/schemas/RiskSignals"
          },
          "vendor_data": {
            "type": "string",
            "description": "Ihre stabile Referenz für diese Anfrage. Wird in der API-Sitzung gespeichert und in der Antwort zurückgegeben."
          },
          "metadata": {
            "type": "object",
            "nullable": true,
            "additionalProperties": true,
            "description": "Ihre nicht sensiblen JSON-Metadaten. Werden in der API-Sitzung gespeichert und in der Antwort zurückgegeben."
          },
          "enable_social": {
            "type": "boolean",
            "default": false,
            "description": "Wenn true, wird auch der digitale Fußabdruck der Nummer ermittelt – die Messaging-, Social-, E-Commerce- und Berufs-Plattformen, auf denen sie registriert ist. Wird als eine `phone_social`-Einheit pro Anfrage zusätzlich zum regulären Preis dieses Endpoints abgerechnet.",
            "example": true
          }
        }
      },
      "EmailRiskRequest": {
        "type": "object",
        "required": [
          "email"
        ],
        "properties": {
          "email": {
            "type": "string",
            "format": "email",
            "description": "Zu bewertende E-Mail-Adresse.",
            "example": "alice@example.com"
          },
          "country_code": {
            "type": "string",
            "maxLength": 3,
            "description": "Optionaler ISO 3166-1 alpha-2- oder alpha-3-Länderhinweis für die Informationsabdeckung.",
            "example": "US"
          },
          "signals": {
            "$ref": "#/components/schemas/RiskSignals"
          },
          "vendor_data": {
            "type": "string",
            "description": "Ihre stabile Referenz für diese Anfrage. Wird in der API-Sitzung gespeichert und in der Antwort zurückgegeben."
          },
          "metadata": {
            "type": "object",
            "nullable": true,
            "additionalProperties": true,
            "description": "Ihre nicht sensiblen JSON-Metadaten. Werden in der API-Sitzung gespeichert und in der Antwort zurückgegeben."
          },
          "enable_social": {
            "type": "boolean",
            "default": false,
            "description": "Wenn true, wird auch der digitale Fußabdruck der Adresse ermittelt – die E-Mail-, Social-, Berufs-, E-Commerce- und Unterhaltungsplattformen, auf denen sie registriert ist. Wird als eine `email_social`-Einheit pro Anfrage zusätzlich zum regulären Preis dieses Endpoints abgerechnet.",
            "example": true
          }
        }
      },
      "IPRiskRequest": {
        "type": "object",
        "required": [
          "ip_address"
        ],
        "properties": {
          "ip_address": {
            "type": "string",
            "format": "ip",
            "description": "Zu bewertende IPv4- oder IPv6-Adresse.",
            "example": "8.8.8.8"
          },
          "claimed_country": {
            "type": "string",
            "maxLength": 3,
            "description": "Optionales ISO 3166-1 alpha-2 oder alpha-3 Land, das vom Benutzer oder der Sitzung angegeben wurde. Wird zur Berechnung von `country_mismatch` verwendet.",
            "example": "ESP"
          },
          "user_agent": {
            "type": "string",
            "maxLength": 512,
            "description": "Vom Backend erkannter User-Agent. Wird als Anfragekontext gespeichert; bietet kein Geräte-Fingerprinting."
          },
          "vendor_data": {
            "type": "string",
            "description": "Ihre stabile Referenz für diese Anfrage. Wird in der API-Sitzung gespeichert und in der Antwort zurückgegeben."
          },
          "metadata": {
            "type": "object",
            "nullable": true,
            "additionalProperties": true,
            "description": "Ihre nicht sensiblen JSON-Metadaten. Werden in der API-Sitzung gespeichert und in der Antwort zurückgegeben."
          }
        }
      },
      "RiskWarning": {
        "type": "object",
        "required": [
          "feature",
          "risk",
          "log_type",
          "short_description",
          "long_description"
        ],
        "properties": {
          "feature": {
            "type": "string",
            "description": "Funktion, die die Warnung erzeugt hat."
          },
          "risk": {
            "type": "string",
            "description": "Maschinenlesbarer Risiko-Code. Neue Werte können im Laufe der Zeit hinzugefügt werden."
          },
          "additional_data": {
            "type": "object",
            "nullable": true,
            "additionalProperties": true,
            "description": "Risikospezifischer Kontext oder `null`."
          },
          "log_type": {
            "type": "string",
            "enum": [
              "error",
              "warning",
              "information"
            ],
            "description": "Schweregrad, der von den Entscheidungsregeln verwendet wird."
          },
          "short_description": {
            "type": "string",
            "description": "Für Menschen lesbare einzeilige Zusammenfassung."
          },
          "long_description": {
            "type": "string",
            "description": "Lesbare Erklärung."
          }
        }
      },
      "RiskLifecycleEvent": {
        "type": "object",
        "required": [
          "type",
          "timestamp",
          "details",
          "fee"
        ],
        "properties": {
          "type": {
            "type": "string",
            "description": "Maschinenlesbarer Ereignistyp. Neue Werte können im Laufe der Zeit hinzugefügt werden."
          },
          "timestamp": {
            "type": "string",
            "format": "date-time",
            "description": "Wann das Ereignis stattgefunden hat."
          },
          "details": {
            "type": "object",
            "nullable": true,
            "additionalProperties": true,
            "description": "Ereignisspezifische Payload oder `null`."
          },
          "fee": {
            "type": "number",
            "description": "Für dieses Ereignis abgerechneter USD-Betrag."
          }
        }
      },
      "PhoneMatchItem": {
        "type": "object",
        "description": "Eine andere Sitzung Ihrer Anwendung, die dieselbe Telefonnummer mit abweichenden `vendor_data` verwendet hat.",
        "properties": {
          "session_id": {
            "type": "string",
            "format": "uuid",
            "description": "Sitzungs-ID der anderen Verifizierung, die diese Telefonnummer verwendet hat."
          },
          "session_number": {
            "type": "integer",
            "description": "Benutzerfreundliche fortlaufende Nummer dieser Sitzung."
          },
          "vendor_data": {
            "type": "string",
            "nullable": true,
            "description": "`vendor_data` dieser Sitzung."
          },
          "verification_date": {
            "type": "string",
            "description": "Wann diese Sitzung erstellt wurde (`YYYY-MM-DDTHH:MM:SSZ`)."
          },
          "phone_number": {
            "type": "string",
            "description": "Die übereinstimmende Telefonnummer."
          },
          "status": {
            "type": "string",
            "description": "Status dieser Sitzung (z. B. `Approved`, `Declined`, `In Progress`)."
          },
          "is_blocklisted": {
            "type": "boolean",
            "description": "Gibt an, ob die Telefonnummer auf der Sperrliste Ihrer Anwendung steht."
          },
          "api_service": {
            "type": "string",
            "nullable": true,
            "description": "Für Sitzungen vom API-Typ: die eigenständige API, die sie erstellt hat; `null` für reguläre Verifizierungssitzungen."
          },
          "source": {
            "type": "string",
            "description": "Wo die Übereinstimmung gefunden wurde. Normalerweise `session`; ein Sperrlisten-Treffer über einen Organisationslisteneintrag verwendet `list_entry`."
          }
        }
      },
      "EmailMatchItem": {
        "type": "object",
        "description": "Eine andere Sitzung Ihrer Anwendung, die dieselbe E-Mail-Adresse mit abweichenden `vendor_data` verwendet hat.",
        "properties": {
          "session_id": {
            "type": "string",
            "format": "uuid",
            "description": "Sitzungs-ID der anderen Verifizierung, die diese E-Mail-Adresse verwendet hat."
          },
          "session_number": {
            "type": "integer",
            "description": "Benutzerfreundliche fortlaufende Nummer dieser Sitzung."
          },
          "vendor_data": {
            "type": "string",
            "nullable": true,
            "description": "`vendor_data` dieser Sitzung."
          },
          "verification_date": {
            "type": "string",
            "description": "Wann diese Sitzung erstellt wurde (`YYYY-MM-DDTHH:MM:SSZ`)."
          },
          "email": {
            "type": "string",
            "description": "Die übereinstimmende E-Mail-Adresse."
          },
          "status": {
            "type": "string",
            "description": "Status dieser Sitzung (z. B. `Approved`, `Declined`, `In Progress`)."
          },
          "is_blocklisted": {
            "type": "boolean",
            "description": "Gibt an, ob die E-Mail-Adresse auf der Sperrliste Ihrer Anwendung steht."
          },
          "api_service": {
            "type": "string",
            "nullable": true,
            "description": "Für Sitzungen vom API-Typ: die eigenständige API, die sie erstellt hat; `null` für reguläre Verifizierungssitzungen."
          },
          "source": {
            "type": "string",
            "description": "Wo die Übereinstimmung gefunden wurde. Normalerweise `session`; ein Sperrlisten-Treffer über einen Organisationslisteneintrag verwendet `list_entry`."
          }
        }
      },
      "PhoneIntelligence": {
        "type": "object",
        "description": "Normalisierter Telefon-Intelligence-Block. Nur vorhanden, wenn das Intelligence-Add-on für diese Abfrage ausgeführt wurde; falls vorhanden, wird er auch unter dem `enrichment`-Alias mit identischen Werten bereitgestellt.",
        "properties": {
          "score": {
            "type": "number",
            "nullable": true,
            "description": "Normalisierter Risiko-Score von 0–100. Höher ist riskanter."
          },
          "phone_type_risk": {
            "type": "string",
            "nullable": true,
            "description": "`Low`, `Medium` oder `High`, abgeleitet aus dem Score."
          },
          "phone_trust_index": {
            "type": "number",
            "nullable": true,
            "description": "Kehrwert des Werts, für Dashboards, die höhere Werte bevorzugen."
          },
          "network_stability_index": {
            "type": "number",
            "nullable": true,
            "description": "Stabilität des Leitungsnetzwerks."
          },
          "is_disposable": {
            "type": "boolean",
            "nullable": true,
            "description": "`true`, wenn die Nummer wie eine Wegwerf- oder virtuelle Nummer aussieht."
          },
          "is_ported": {
            "type": "boolean",
            "nullable": true,
            "description": "`true`, wenn die Nummer den Mobilfunkanbieter gewechselt hat."
          },
          "is_recently_ported": {
            "type": "boolean",
            "nullable": true,
            "description": "`true`, wenn die Portierung kürzlich erfolgt ist."
          },
          "carrier_type": {
            "type": "string",
            "nullable": true,
            "description": "Durch die Abfrage gemeldete Leitungsklassifizierung (z. B. `mobile`)."
          },
          "reason_codes": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "code": {
                  "type": "string",
                  "description": "Stabiler Didit-Identifikator des Signals, zum Beispiel `IR-5AC67A32`. Opak: danach gruppieren und filtern, nicht parsen."
                },
                "value": {
                  "nullable": true,
                  "description": "Für ein Risiko-Flag (beispielsweise `voip`, `leaked`, `disposable`, `spam_trap`): dessen Wert: ein boolescher Wert, eine Stufe oder ein Datum. Null für einen bewerteten Grundcode."
                },
                "direction": {
                  "type": "string",
                  "enum": [
                    "risk",
                    "trust"
                  ],
                  "description": "Gibt an, ob das Signal das Risiko erhöht oder das Vertrauen gestärkt hat."
                },
                "message": {
                  "type": "string",
                  "description": "Lesbare Erklärung des Signals, auf Englisch."
                },
                "impact_level": {
                  "type": "string",
                  "nullable": true,
                  "description": "Wie stark das Signal den Score beeinflusst hat, zum Beispiel `low`, `medium` oder `high`."
                }
              }
            },
            "description": "Signale, die den Score erklären, jeweils mit einem stabilen Didit-Code, einer Richtung, einer Nachricht und einer Auswirkungsstufe. Im Laufe der Zeit können neue Codes hinzukommen; weisen Sie unbekannte Codes daher nicht ab."
          }
        }
      },
      "EmailIntelligence": {
        "type": "object",
        "description": "Normalisierter E-Mail-Intelligence-Block. Nur vorhanden, wenn das Intelligence-Add-on für diese E-Mail ausgeführt wurde; falls vorhanden, wird er auch als `enrichment`-Alias mit identischen Werten bereitgestellt.",
        "properties": {
          "score": {
            "type": "number",
            "nullable": true,
            "description": "Normalisierter Risiko-Score von 0–100. Höher ist riskanter."
          },
          "deliverable": {
            "type": "string",
            "nullable": true,
            "description": "Zustellbarkeitsbereich (z. B. `high`)."
          },
          "breach_risk_level": {
            "type": "string",
            "nullable": true,
            "description": "`Low`, `Medium` oder `High`."
          },
          "breach_risk_index": {
            "type": "number",
            "nullable": true,
            "description": "Numerischer Breach-Risiko-Index."
          },
          "is_recent_breach": {
            "type": "boolean",
            "nullable": true,
            "description": "`true`, wenn die Adresse in einer kürzlich aufgetretenen Datenpanne vorkommt."
          },
          "is_frequent_breached": {
            "type": "boolean",
            "nullable": true,
            "description": "`true`, wenn die Adresse in vielen Datenpannen vorkommt."
          },
          "is_disposable": {
            "type": "boolean",
            "nullable": true,
            "description": "`true`, wenn die Domain ein Wegwerf-Anbieter ist."
          },
          "is_free_domain": {
            "type": "boolean",
            "nullable": true,
            "description": "`true`, wenn die Domain ein Freemail-Anbieter ist."
          },
          "is_breached": {
            "type": "boolean",
            "nullable": true,
            "description": "`true`, wenn die Adresse in bekannten Datenpannen vorkommt."
          },
          "no_of_breaches": {
            "type": "number",
            "nullable": true,
            "description": "Anzahl bekannter Datenlecks, die die Adresse enthalten."
          },
          "reason_codes": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "code": {
                  "type": "string",
                  "description": "Stabiler Didit-Identifikator des Signals, zum Beispiel `IR-5AC67A32`. Opak: danach gruppieren und filtern, nicht parsen."
                },
                "value": {
                  "nullable": true,
                  "description": "Für ein Risiko-Flag (beispielsweise `voip`, `leaked`, `disposable`, `spam_trap`): dessen Wert: ein boolescher Wert, eine Stufe oder ein Datum. Null für einen bewerteten Grundcode."
                },
                "direction": {
                  "type": "string",
                  "enum": [
                    "risk",
                    "trust"
                  ],
                  "description": "Gibt an, ob das Signal das Risiko erhöht oder das Vertrauen gestärkt hat."
                },
                "message": {
                  "type": "string",
                  "description": "Lesbare Erklärung des Signals, auf Englisch."
                },
                "impact_level": {
                  "type": "string",
                  "nullable": true,
                  "description": "Wie stark das Signal den Score beeinflusst hat, zum Beispiel `low`, `medium` oder `high`."
                }
              }
            },
            "description": "Signale, die den Score erklären, jeweils mit einem stabilen Didit-Code, einer Richtung, einer Nachricht und einer Auswirkungsstufe. Im Laufe der Zeit können neue Codes hinzukommen; weisen Sie unbekannte Codes daher nicht ab."
          }
        }
      },
      "IPRiskResult": {
        "type": "object",
        "description": "IP-Risikoergebnis. Einzelne Anreicherungsfelder können `null` sein, wenn die Abfrage keine verwertbaren Daten zurückgegeben hat.",
        "required": [
          "status",
          "threat"
        ],
        "properties": {
          "status": {
            "type": "string",
            "enum": [
              "Approved",
              "In Review"
            ],
            "description": "`In Review`, wenn das ermittelte Land im Konflikt mit `claimed_country` steht oder wenn die Adresse mit VPN-, Tor- oder Rechenzentrumsinfrastruktur verknüpft ist. Andernfalls `Approved`."
          },
          "ip_address": {
            "type": "string",
            "nullable": true,
            "description": "Die bewertete Adresse. `null`, wenn keine Anreicherungsquelle verwertbare Daten zurückgegeben hat."
          },
          "ip_country": {
            "type": "string",
            "nullable": true,
            "description": "Ermittelter Ländername."
          },
          "ip_country_code": {
            "type": "string",
            "nullable": true,
            "description": "Ermittelter Ländercode. Vergleichen Sie Länder über `country_mismatch`, anstatt rohe Länder-Strings selbst zu vergleichen."
          },
          "ip_state": {
            "type": "string",
            "nullable": true,
            "description": "Ermitteltes Bundesland oder Region."
          },
          "ip_city": {
            "type": "string",
            "nullable": true,
            "description": "Ermittelte Stadt."
          },
          "latitude": {
            "type": "number",
            "nullable": true,
            "description": "Ungefähre Netzwerk-Geolokalisierung, kein genauer Gerätestandort."
          },
          "longitude": {
            "type": "number",
            "nullable": true,
            "description": "Ungefähre Netzwerk-Geolokalisierung, kein genauer Gerätestandort."
          },
          "isp": {
            "type": "string",
            "nullable": true,
            "description": "Internetanbieter, der die Adresse versorgt."
          },
          "organization": {
            "type": "string",
            "nullable": true,
            "description": "Organisation, der der Adressblock gehört."
          },
          "is_vpn_or_tor": {
            "type": "boolean",
            "nullable": true,
            "description": "`true`, wenn die Adresse mit einer VPN- oder Tor-Infrastruktur verknüpft ist."
          },
          "is_data_center": {
            "type": "boolean",
            "nullable": true,
            "description": "`true`, wenn die Adresse zu einem Hosting- oder Rechenzentrumsnetzwerk gehört."
          },
          "time_zone": {
            "type": "string",
            "nullable": true,
            "description": "Zeitzone des aufgelösten Standorts."
          },
          "time_zone_offset": {
            "type": "string",
            "nullable": true,
            "description": "UTC-Offset des aufgelösten Standorts."
          },
          "asn_number": {
            "type": "number",
            "nullable": true,
            "description": "Nummer des autonomen Systems."
          },
          "asn_organization": {
            "type": "string",
            "nullable": true,
            "description": "Organisation, die das autonome System betreibt."
          },
          "connection_type": {
            "type": "string",
            "nullable": true,
            "description": "Verbindungsklassifizierung (z. B. `cellular`, `hosting`)."
          },
          "carrier": {
            "type": "string",
            "nullable": true,
            "description": "Mobilfunkanbieter, wenn sich die Adresse in einem Mobilfunknetz befindet."
          },
          "proxy_type": {
            "type": "string",
            "nullable": true,
            "description": "Proxy-Klassifizierung, wenn sich die Adresse hinter einem Proxy befindet."
          },
          "claimed_country": {
            "type": "string",
            "nullable": true,
            "description": "Rückgabe des von Ihnen gesendeten `claimed_country`."
          },
          "country_mismatch": {
            "type": "boolean",
            "nullable": true,
            "description": "`true`, wenn das ermittelte Land von `claimed_country` abweicht. `null`, wenn keine Anreicherungsdaten oder kein angegebenes Land verfügbar sind."
          },
          "threat": {
            "type": "object",
            "additionalProperties": true,
            "description": "Netzwerkbedrohungshinweise in Freiform aus der Anreicherungsquelle (z. B. `is_proxy`, `is_tor`). Leeres Objekt, wenn keine Anreicherungsdaten verfügbar sind. Als diagnostisches Detail und nicht als stabiler Kontrakt zu behandeln."
          }
        }
      },
      "PhoneRiskResponse": {
        "type": "object",
        "required": [
          "request_id",
          "status",
          "created_at"
        ],
        "properties": {
          "request_id": {
            "type": "string",
            "format": "uuid",
            "description": "ID der API-Sitzung, die für diese Anfrage erstellt wurde. Speichern Sie sie zusammen mit `vendor_data`, wenn Sie das Ergebnis mit späteren Webhooks oder Konsolenaktivitäten korrelieren müssen."
          },
          "status": {
            "type": "string",
            "enum": [
              "Approved",
              "In Review",
              "Declined"
            ],
            "description": "Endgültige Entscheidung für diese API-Sitzung. Normalerweise `Approved`; die Risikobewertung kann `In Review` oder `Declined` ergeben."
          },
          "vendor_data": {
            "type": "string",
            "nullable": true,
            "description": "Rückgabe der von Ihnen gesendeten `vendor_data`, `null`, wenn Sie keine gesendet haben."
          },
          "metadata": {
            "type": "object",
            "nullable": true,
            "additionalProperties": true,
            "description": "Rückgabe der von Ihnen gesendeten `metadata`, `null`, wenn Sie keine gesendet haben."
          },
          "created_at": {
            "type": "string",
            "format": "date-time",
            "description": "Zeitstempel dieser Antwort."
          },
          "phone": {
            "type": "object",
            "description": "Normalisierter Telefonbericht, derselbe Block wie in den Antworten der Telefonverifizierung.",
            "required": [
              "status"
            ],
            "properties": {
              "status": {
                "type": "string",
                "enum": [
                  "Approved",
                  "In Review",
                  "Declined"
                ],
                "description": "Entscheidung für diese Telefonnummer. Spiegelt den `status` auf oberster Ebene wider."
              },
              "phone_number_prefix": {
                "type": "string",
                "description": "Ländervorwahl mit vorangestelltem `+` (z. B. `+1`).",
                "example": "+1"
              },
              "phone_number": {
                "type": "string",
                "description": "Nationale Rufnummer ohne Ländervorwahl.",
                "example": "4155552671"
              },
              "full_number": {
                "type": "string",
                "description": "Vollständige Nummer im E.164-Format.",
                "example": "+14155552671"
              },
              "country_code": {
                "type": "string",
                "nullable": true,
                "description": "ISO 3166-1-Alpha-2-Land der Nummer.",
                "example": "US"
              },
              "country_name": {
                "type": "string",
                "description": "Vollständiger Ländername, abgeleitet aus `country_code`.",
                "example": "United States"
              },
              "carrier": {
                "type": "object",
                "nullable": true,
                "description": "Netzwerk, über das die Nummer aktuell betrieben wird. `null`, wenn die Abfrage keinen Netzbetreiber ermitteln konnte.",
                "properties": {
                  "name": {
                    "type": "string",
                    "description": "Name des Mobilfunkanbieters. Leere Zeichenkette, wenn die Abfrage ihn nicht identifizieren konnte."
                  },
                  "type": {
                    "type": "string",
                    "description": "Durch die Abfrage gemeldeter Leitungstyp: `mobile`, `fixed_line`, `voip`, `isp`, `vpn`, `toll_free`, `premium_rate` oder ähnlich."
                  }
                }
              },
              "is_disposable": {
                "type": "boolean",
                "description": "`true`, wenn die Nummer zu einem temporären oder Burner-Nummern-Dienst gehört."
              },
              "is_virtual": {
                "type": "boolean",
                "description": "`true`, wenn der Leitungstyp virtuell ist (`voip`, `isp` oder `vpn`)."
              },
              "verification_method": {
                "type": "string",
                "nullable": true,
                "description": "OTP-Kanal der zugrunde liegenden Verifizierung. `null` für Risikoabfragen, die niemals einen Code senden."
              },
              "verification_attempts": {
                "type": "integer",
                "description": "OTP-Sendevorgänge für diese Nummer. `0` für Risikoabfragen."
              },
              "verified_at": {
                "type": "string",
                "format": "date-time",
                "nullable": true,
                "description": "Wann die Nummer zuletzt durch ein OTP verifiziert wurde. `null` für Risikoabfragen."
              },
              "warnings": {
                "type": "array",
                "description": "Für diese Anfrage erfasste Risikowarnungen. Leeres Array, wenn keine vorhanden sind.",
                "items": {
                  "$ref": "#/components/schemas/RiskWarning"
                }
              },
              "lifecycle": {
                "type": "array",
                "description": "Chronologischer Audit-Trail der Anfrage. Leeres Array für Risikoabfragen ohne Sendeereignisse.",
                "items": {
                  "$ref": "#/components/schemas/RiskLifecycleEvent"
                }
              },
              "matches": {
                "type": "array",
                "description": "Andere Sitzungen Ihrer Anwendung, bei denen dieselbe Telefonnummer von einem anderen Benutzer (anderes `vendor_data`) verwendet wurde. Bis zu 5 Einträge. Leeres Array, wenn keine Treffer vorliegen.",
                "items": {
                  "$ref": "#/components/schemas/PhoneMatchItem"
                }
              },
              "phone_intelligence": {
                "$ref": "#/components/schemas/PhoneIntelligence"
              },
              "enrichment": {
                "$ref": "#/components/schemas/PhoneIntelligence"
              },
              "phone_social": {
                "$ref": "#/components/schemas/PhoneSocialFootprint"
              }
            }
          }
        }
      },
      "EmailRiskResponse": {
        "type": "object",
        "required": [
          "request_id",
          "status",
          "created_at"
        ],
        "properties": {
          "request_id": {
            "type": "string",
            "format": "uuid",
            "description": "ID der API-Sitzung, die für diese Anfrage erstellt wurde. Speichern Sie sie zusammen mit `vendor_data`, wenn Sie das Ergebnis mit späteren Webhooks oder Konsolenaktivitäten korrelieren müssen."
          },
          "status": {
            "type": "string",
            "enum": [
              "Approved",
              "In Review",
              "Declined"
            ],
            "description": "Endgültige Entscheidung für diese API-Sitzung. Normalerweise `Approved`; die Risikobewertung kann `In Review` oder `Declined` ergeben."
          },
          "vendor_data": {
            "type": "string",
            "nullable": true,
            "description": "Rückgabe der von Ihnen gesendeten `vendor_data`, `null`, wenn Sie keine gesendet haben."
          },
          "metadata": {
            "type": "object",
            "nullable": true,
            "additionalProperties": true,
            "description": "Rückgabe der von Ihnen gesendeten `metadata`, `null`, wenn Sie keine gesendet haben."
          },
          "created_at": {
            "type": "string",
            "format": "date-time",
            "description": "Zeitstempel dieser Antwort."
          },
          "email": {
            "type": "object",
            "description": "Normalisierter E-Mail-Bericht, derselbe Block wie in den Antworten der E-Mail-Verifizierung.",
            "required": [
              "status",
              "email",
              "is_breached",
              "breaches",
              "is_disposable",
              "is_undeliverable"
            ],
            "properties": {
              "status": {
                "type": "string",
                "enum": [
                  "Approved",
                  "In Review",
                  "Declined"
                ],
                "description": "Entscheidung für diese E-Mail-Adresse. Spiegelt den `status` auf oberster Ebene wider."
              },
              "email": {
                "type": "string",
                "description": "Die bewertete Adresse.",
                "example": "alice@example.com"
              },
              "is_breached": {
                "type": "boolean",
                "description": "Gibt an, ob die Adresse in einem bekannten Zugangsdatenleck vorkommt."
              },
              "breaches": {
                "type": "array",
                "description": "Bis zu 5 der neuesten bekannten Datenlecks, die diese Adresse enthalten. Leeres Array, wenn `is_breached` den Wert `false` hat.",
                "items": {
                  "type": "object",
                  "properties": {
                    "name": {
                      "type": "string",
                      "description": "Breach-Identifikator."
                    },
                    "domain": {
                      "type": "string",
                      "description": "Domain des von der Sicherheitsverletzung betroffenen Dienstes."
                    },
                    "breach_date": {
                      "type": "string",
                      "format": "date",
                      "description": "Datum, an dem der Verstoß auftrat."
                    },
                    "breach_emails_count": {
                      "type": "integer",
                      "description": "Gesamtzahl der bei der Datenpanne offengelegten Konten."
                    },
                    "description": {
                      "type": "string",
                      "description": "Lesbare Beschreibung der Verletzung (kann HTML-Markup enthalten)."
                    },
                    "logo_path": {
                      "type": "string",
                      "description": "URL des Logos des von einer Datenschutzverletzung betroffenen Dienstes."
                    },
                    "data_classes": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      },
                      "description": "Kategorien offengelegter Daten in snake_case (z. B. `email_addresses`, `passwords`)."
                    },
                    "is_verified": {
                      "type": "boolean",
                      "description": "Gibt an, ob das Datenleck als legitim verifiziert wurde."
                    }
                  }
                }
              },
              "is_disposable": {
                "type": "boolean",
                "description": "Gibt an, ob die Domain zu einem Wegwerf-E-Mail-Anbieter gehört."
              },
              "is_undeliverable": {
                "type": "boolean",
                "description": "Gibt an, ob die Adresse als unzustellbar ermittelt wurde."
              },
              "verification_attempts": {
                "type": "integer",
                "description": "OTP-Sendevorgänge für diese Adresse. `0` für Risikoabfragen."
              },
              "verified_at": {
                "type": "string",
                "format": "date-time",
                "nullable": true,
                "description": "Wann die Adresse zuletzt über ein OTP verifiziert wurde. `null` bei Risikoabfragen."
              },
              "warnings": {
                "type": "array",
                "description": "Für diese Anfrage erfasste Risikowarnungen. Leeres Array, wenn keine vorhanden sind.",
                "items": {
                  "$ref": "#/components/schemas/RiskWarning"
                }
              },
              "lifecycle": {
                "type": "array",
                "description": "Chronologischer Audit-Trail der Anfrage. Leeres Array für Risikoabfragen ohne Übermittlungen.",
                "items": {
                  "$ref": "#/components/schemas/RiskLifecycleEvent"
                }
              },
              "matches": {
                "type": "array",
                "description": "Andere Sitzungen Ihrer Anwendung, bei denen dieselbe E-Mail-Adresse von einem anderen Benutzer (anderes `vendor_data`) verwendet wurde. Bis zu 5 Einträge. Leeres Array, wenn keine Treffer vorliegen.",
                "items": {
                  "$ref": "#/components/schemas/EmailMatchItem"
                }
              },
              "email_intelligence": {
                "$ref": "#/components/schemas/EmailIntelligence"
              },
              "enrichment": {
                "$ref": "#/components/schemas/EmailIntelligence"
              },
              "email_social": {
                "$ref": "#/components/schemas/EmailSocialFootprint"
              }
            }
          }
        }
      },
      "IPRiskResponse": {
        "type": "object",
        "required": [
          "request_id",
          "status",
          "created_at"
        ],
        "properties": {
          "request_id": {
            "type": "string",
            "format": "uuid",
            "description": "ID der API-Sitzung, die für diese Anfrage erstellt wurde. Speichern Sie sie zusammen mit `vendor_data`, wenn Sie das Ergebnis mit späteren Webhooks oder Konsolenaktivitäten korrelieren müssen."
          },
          "status": {
            "type": "string",
            "enum": [
              "Approved",
              "In Review"
            ],
            "description": "Entscheidung für diese API-Sitzung: `In Review` bei Netzwerk- oder Länderabweichungsrisiko, andernfalls `Approved`."
          },
          "vendor_data": {
            "type": "string",
            "nullable": true,
            "description": "Rückgabe der von Ihnen gesendeten `vendor_data`, `null`, wenn Sie keine gesendet haben."
          },
          "metadata": {
            "type": "object",
            "nullable": true,
            "additionalProperties": true,
            "description": "Rückgabe der von Ihnen gesendeten `metadata`, `null`, wenn Sie keine gesendet haben."
          },
          "created_at": {
            "type": "string",
            "format": "date-time",
            "description": "Zeitstempel dieser Antwort."
          },
          "ip": {
            "type": "object",
            "description": "IP-Risikoergebnis. Einzelne Anreicherungsfelder können `null` sein, wenn die Abfrage keine verwertbaren Daten zurückgegeben hat.",
            "required": [
              "status",
              "threat"
            ],
            "properties": {
              "status": {
                "type": "string",
                "enum": [
                  "Approved",
                  "In Review"
                ],
                "description": "`In Review`, wenn das ermittelte Land im Konflikt mit `claimed_country` steht oder wenn die Adresse mit VPN-, Tor- oder Rechenzentrumsinfrastruktur verknüpft ist. Andernfalls `Approved`."
              },
              "ip_address": {
                "type": "string",
                "nullable": true,
                "description": "Die bewertete Adresse. `null`, wenn keine Anreicherungsquelle verwertbare Daten zurückgegeben hat."
              },
              "ip_country": {
                "type": "string",
                "nullable": true,
                "description": "Ermittelter Ländername."
              },
              "ip_country_code": {
                "type": "string",
                "nullable": true,
                "description": "Ermittelter Ländercode. Vergleichen Sie Länder über `country_mismatch`, anstatt rohe Länder-Strings selbst zu vergleichen."
              },
              "ip_state": {
                "type": "string",
                "nullable": true,
                "description": "Ermitteltes Bundesland oder Region."
              },
              "ip_city": {
                "type": "string",
                "nullable": true,
                "description": "Ermittelte Stadt."
              },
              "latitude": {
                "type": "number",
                "nullable": true,
                "description": "Ungefähre Netzwerk-Geolokalisierung, kein genauer Gerätestandort."
              },
              "longitude": {
                "type": "number",
                "nullable": true,
                "description": "Ungefähre Netzwerk-Geolokalisierung, kein genauer Gerätestandort."
              },
              "isp": {
                "type": "string",
                "nullable": true,
                "description": "Internetanbieter, der die Adresse versorgt."
              },
              "organization": {
                "type": "string",
                "nullable": true,
                "description": "Organisation, der der Adressblock gehört."
              },
              "is_vpn_or_tor": {
                "type": "boolean",
                "nullable": true,
                "description": "`true`, wenn die Adresse mit einer VPN- oder Tor-Infrastruktur verknüpft ist."
              },
              "is_data_center": {
                "type": "boolean",
                "nullable": true,
                "description": "`true`, wenn die Adresse zu einem Hosting- oder Rechenzentrumsnetzwerk gehört."
              },
              "time_zone": {
                "type": "string",
                "nullable": true,
                "description": "Zeitzone des aufgelösten Standorts."
              },
              "time_zone_offset": {
                "type": "string",
                "nullable": true,
                "description": "UTC-Offset des aufgelösten Standorts."
              },
              "asn_number": {
                "type": "number",
                "nullable": true,
                "description": "Nummer des autonomen Systems."
              },
              "asn_organization": {
                "type": "string",
                "nullable": true,
                "description": "Organisation, die das autonome System betreibt."
              },
              "connection_type": {
                "type": "string",
                "nullable": true,
                "description": "Verbindungsklassifizierung (z. B. `cellular`, `hosting`)."
              },
              "carrier": {
                "type": "string",
                "nullable": true,
                "description": "Mobilfunkanbieter, wenn sich die Adresse in einem Mobilfunknetz befindet."
              },
              "proxy_type": {
                "type": "string",
                "nullable": true,
                "description": "Proxy-Klassifizierung, wenn sich die Adresse hinter einem Proxy befindet."
              },
              "claimed_country": {
                "type": "string",
                "nullable": true,
                "description": "Rückgabe des von Ihnen gesendeten `claimed_country`."
              },
              "country_mismatch": {
                "type": "boolean",
                "nullable": true,
                "description": "`true`, wenn das ermittelte Land von `claimed_country` abweicht. `null`, wenn keine Anreicherungsdaten oder kein angegebenes Land verfügbar sind."
              },
              "threat": {
                "type": "object",
                "additionalProperties": true,
                "description": "Netzwerkbedrohungshinweise in Freiform aus der Anreicherungsquelle (z. B. `is_proxy`, `is_tor`). Leeres Objekt, wenn keine Anreicherungsdaten verfügbar sind. Als diagnostisches Detail und nicht als stabiler Kontrakt zu behandeln."
              }
            }
          }
        }
      },
      "SocialFootprintPlatform": {
        "type": "object",
        "properties": {
          "platform": {
            "type": "string",
            "description": "Plattform-Identifikator.",
            "example": "whatsapp"
          },
          "category": {
            "type": "string",
            "description": "Plattformkategorie, z. B. MESSAGING, SOCIAL_MEDIA, ECOMMERCE, PROFESSIONAL, EMAIL_PROVIDER.",
            "example": "MESSAGING"
          },
          "scope": {
            "type": "string",
            "enum": [
              "global",
              "local"
            ],
            "description": "`global` für weltweite Plattformen, `local` für regionsspezifische Plattformen.",
            "example": "global"
          }
        }
      },
      "SocialFootprintCategorySummary": {
        "type": "object",
        "properties": {
          "registered": {
            "type": "integer",
            "nullable": true,
            "description": "Plattformen in dieser Kategorie, bei denen eine Registrierung bestätigt ist.",
            "example": 2
          },
          "ratio": {
            "type": "number",
            "format": "float",
            "nullable": true,
            "description": "Anteil der geprüften Plattformen der Kategorie mit einer Registrierung, 0.0-1.0.",
            "example": 0.6667
          }
        }
      },
      "SocialFootprintProfile": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "nullable": true,
            "description": "Profilname, sofern die Plattform diesen bereitstellt."
          },
          "photo": {
            "type": "string",
            "nullable": true,
            "description": "Profilfoto-URL, sofern die Plattform diese bereitstellt."
          },
          "about": {
            "type": "string",
            "nullable": true,
            "description": "Profil-Info-/Bio-Text, sofern die Plattform diesen bereitstellt."
          },
          "privacy_status": {
            "type": "string",
            "nullable": true,
            "enum": [
              "PUBLIC",
              "PRIVATE",
              null
            ],
            "description": "Profilsichtbarkeit, sofern die Plattform diese bereitstellt."
          },
          "business_account": {
            "type": "boolean",
            "nullable": true,
            "description": "Gibt an, ob das Profil ein Geschäftskonto ist, sofern die Plattform dies bereitstellt."
          }
        }
      },
      "PhoneSocialFootprint": {
        "type": "object",
        "nullable": true,
        "description": "Social Footprint der Telefonnummer: die Online-Plattformen, auf denen sie registriert ist. Nur vorhanden, wenn `enable_social` gesetzt war und die Prüfung abgeschlossen wurde. Jeder Zähler kann null sein, wenn dafür keine Daten zurückgegeben wurden. `profiles_registered: 0` bedeutet, dass die Plattformen geprüft wurden und die Telefonnummer auf keiner davon gefunden wurde – eine gültige, abrechenbare Antwort und ein häufiges Signal für eine synthetische Identität.",
        "properties": {
          "profiles_registered": {
            "type": "integer",
            "nullable": true,
            "description": "Plattformen, bei denen die Telefonnummer nachweislich registriert ist.",
            "example": 5
          },
          "profiles_checked": {
            "type": "integer",
            "nullable": true,
            "description": "Auf Registrierung geprüfte Plattformen.",
            "example": 14
          },
          "names_found": {
            "type": "integer",
            "nullable": true,
            "description": "Plattformen, die einen zugehörigen Namen zurückgegeben haben.",
            "example": 0
          },
          "photos_found": {
            "type": "integer",
            "nullable": true,
            "description": "Plattformen, die ein Profilfoto zurückgegeben haben.",
            "example": 0
          },
          "communication_breadth": {
            "type": "integer",
            "nullable": true,
            "description": "Kommunikationsplattformen mit erkannter Präsenz.",
            "example": 2
          },
          "digital_footprint_diversity": {
            "type": "integer",
            "nullable": true,
            "description": "Unterschiedliche Plattformkategorien mit erkannter Präsenz.",
            "example": 5
          },
          "digital_sophistication_index": {
            "type": "integer",
            "nullable": true,
            "description": "Zusammengesetzter Indikator für digitale Reife, 0-10.",
            "example": 5
          },
          "engagement_depth_index": {
            "type": "integer",
            "nullable": true,
            "description": "Indikator für die Profilreichhaltigkeit, 0–10.",
            "example": 3
          },
          "subscription_affordability_index": {
            "type": "integer",
            "nullable": true,
            "description": "Mix aus kostenlosen vs. kostenpflichtigen Plattformen, 0-10.",
            "example": 2
          },
          "free_platforms": {
            "type": "integer",
            "nullable": true,
            "description": "Registrierungen auf kostenlosen Plattformen.",
            "example": 4
          },
          "full_paid_platforms": {
            "type": "integer",
            "nullable": true,
            "description": "Registrierungen auf rein kostenpflichtigen Plattformen.",
            "example": 0
          },
          "partial_paid_platforms": {
            "type": "integer",
            "nullable": true,
            "description": "Registrierungen auf Freemium-Plattformen.",
            "example": 1
          },
          "whatsapp_profile_completeness": {
            "type": "string",
            "nullable": true,
            "enum": [
              "Basic",
              "Partial",
              "Complete",
              "Not Present",
              null
            ],
            "description": "Vollständigkeit des WhatsApp-Profils. Nur für Telefonnummern; null für E-Mail-Adressen.",
            "example": "Partial"
          },
          "registered_platforms": {
            "type": "array",
            "description": "Plattformen, bei denen eine Registrierung bestätigt ist.",
            "items": {
              "$ref": "#/components/schemas/SocialFootprintPlatform"
            }
          },
          "not_registered_platforms": {
            "type": "array",
            "description": "Geprüfte Plattformen mit negativem Ergebnis.",
            "items": {
              "$ref": "#/components/schemas/SocialFootprintPlatform"
            }
          },
          "categories": {
            "type": "object",
            "description": "Anzahl der Registrierungen und Verhältnis pro Plattformkategorie.",
            "additionalProperties": {
              "$ref": "#/components/schemas/SocialFootprintCategorySummary"
            }
          },
          "profiles": {
            "type": "object",
            "description": "Profildetails pro Plattform, geschlüsselt nach Plattform, sofern die Plattform diese bereitstellt.",
            "additionalProperties": {
              "$ref": "#/components/schemas/SocialFootprintProfile"
            }
          }
        }
      },
      "EmailSocialFootprint": {
        "type": "object",
        "nullable": true,
        "description": "Social Footprint der E-Mail-Adresse: die Online-Plattformen, auf denen sie registriert ist. Nur vorhanden, wenn `enable_social` gesetzt war und die Prüfung abgeschlossen wurde. Jeder Zähler kann null sein, wenn dafür keine Daten zurückgegeben wurden. `profiles_registered: 0` bedeutet, dass die Plattformen geprüft wurden und die E-Mail-Adresse auf keiner davon gefunden wurde – eine gültige, abrechenbare Antwort und ein häufiges Signal für eine synthetische Identität.",
        "properties": {
          "profiles_registered": {
            "type": "integer",
            "nullable": true,
            "description": "Plattformen, bei denen die E-Mail-Adresse nachweislich registriert ist.",
            "example": 5
          },
          "profiles_checked": {
            "type": "integer",
            "nullable": true,
            "description": "Auf Registrierung geprüfte Plattformen.",
            "example": 14
          },
          "names_found": {
            "type": "integer",
            "nullable": true,
            "description": "Plattformen, die einen zugehörigen Namen zurückgegeben haben.",
            "example": 0
          },
          "photos_found": {
            "type": "integer",
            "nullable": true,
            "description": "Plattformen, die ein Profilfoto zurückgegeben haben.",
            "example": 0
          },
          "communication_breadth": {
            "type": "integer",
            "nullable": true,
            "description": "Kommunikationsplattformen mit erkannter Präsenz.",
            "example": 2
          },
          "digital_footprint_diversity": {
            "type": "integer",
            "nullable": true,
            "description": "Unterschiedliche Plattformkategorien mit erkannter Präsenz.",
            "example": 5
          },
          "digital_sophistication_index": {
            "type": "integer",
            "nullable": true,
            "description": "Zusammengesetzter Indikator für digitale Reife, 0-10.",
            "example": 5
          },
          "engagement_depth_index": {
            "type": "integer",
            "nullable": true,
            "description": "Indikator für die Profilreichhaltigkeit, 0–10.",
            "example": 3
          },
          "subscription_affordability_index": {
            "type": "integer",
            "nullable": true,
            "description": "Mix aus kostenlosen vs. kostenpflichtigen Plattformen, 0-10.",
            "example": 2
          },
          "free_platforms": {
            "type": "integer",
            "nullable": true,
            "description": "Registrierungen auf kostenlosen Plattformen.",
            "example": 4
          },
          "full_paid_platforms": {
            "type": "integer",
            "nullable": true,
            "description": "Registrierungen auf rein kostenpflichtigen Plattformen.",
            "example": 0
          },
          "partial_paid_platforms": {
            "type": "integer",
            "nullable": true,
            "description": "Registrierungen auf Freemium-Plattformen.",
            "example": 1
          },
          "whatsapp_profile_completeness": {
            "type": "string",
            "nullable": true,
            "enum": [
              "Basic",
              "Partial",
              "Complete",
              "Not Present",
              null
            ],
            "description": "Vollständigkeit des WhatsApp-Profils. Nur für Telefonnummern; null für E-Mail-Adressen.",
            "example": "Partial"
          },
          "registered_platforms": {
            "type": "array",
            "description": "Plattformen, bei denen eine Registrierung bestätigt ist.",
            "items": {
              "$ref": "#/components/schemas/SocialFootprintPlatform"
            }
          },
          "not_registered_platforms": {
            "type": "array",
            "description": "Geprüfte Plattformen mit negativem Ergebnis.",
            "items": {
              "$ref": "#/components/schemas/SocialFootprintPlatform"
            }
          },
          "categories": {
            "type": "object",
            "description": "Anzahl der Registrierungen und Verhältnis pro Plattformkategorie.",
            "additionalProperties": {
              "$ref": "#/components/schemas/SocialFootprintCategorySummary"
            }
          },
          "profiles": {
            "type": "object",
            "description": "Profildetails pro Plattform, geschlüsselt nach Plattform, sofern die Plattform diese bereitstellt.",
            "additionalProperties": {
              "$ref": "#/components/schemas/SocialFootprintProfile"
            }
          }
        }
      },
      "KYBRegistryAddress": {
        "type": "object",
        "description": "Eine vom Register angegebene Adresse, im selben Format für jedes Land und jede Registerquelle. Jeder Schlüssel ist immer vorhanden; ein Teil, den das Register nicht veröffentlicht, ist null.",
        "properties": {
          "type": {
            "type": "string",
            "nullable": true,
            "description": "Adresstyp in Kleinbuchstaben: `registered` für den eingetragenen Sitz; andere Typen so, wie das Register sie benennt (beispielsweise `postal`, `office`). `null`, wenn das Register nicht angibt, worum es sich bei der Adresse handelt."
          },
          "address": {
            "type": "string",
            "description": "Die vollständige Adresse in einer Zeile. Bei jeder Adresse stets vorhanden."
          },
          "street": {
            "type": "string",
            "nullable": true,
            "description": "Straße und Hausnummer."
          },
          "city": {
            "type": "string",
            "nullable": true,
            "description": "Stadt oder Ortschaft."
          },
          "postal_code": {
            "type": "string",
            "nullable": true,
            "description": "Postleitzahl."
          },
          "region": {
            "type": "string",
            "nullable": true,
            "description": "Region, Bundesstaat oder Provinz."
          },
          "country_code": {
            "type": "string",
            "nullable": true,
            "description": "ISO 3166-1 Alpha-2-Ländercode."
          },
          "description": {
            "type": "string",
            "nullable": true,
            "description": "Die registerspezifische Bezeichnung für die Adresse, sofern das Register eine angibt."
          }
        },
        "required": [
          "type",
          "address",
          "street",
          "city",
          "postal_code",
          "region",
          "country_code",
          "description"
        ]
      },
      "KYBRegistryIndustry": {
        "type": "object",
        "description": "Eine Aktivität, unter die das Register das Unternehmen einstuft, im selben Format für jedes Land und jede Registerquelle.",
        "properties": {
          "code": {
            "type": "string",
            "nullable": true,
            "description": "Tätigkeitscode, wie er im Register angegeben ist (z. B. `73110`)."
          },
          "description": {
            "type": "string",
            "nullable": true,
            "description": "Tätigkeitsbezeichnung, sofern vom Register veröffentlicht."
          },
          "scheme": {
            "type": "string",
            "nullable": true,
            "description": "Klassifikationssystem, ein Name pro System, unabhängig von der meldenden Quelle: `UK SIC 2007`, `US SIC`, `NACE Rev. 2`, `NACE Rev. 2.1`, `NAF Rev. 2`, `CNAE`, `SBI`, `NOGA 2008`, `CAE Rev. 4`, `Canada SIC 1977`; andere nationale Systeme behalten die registereigene Bezeichnung bei. Null, wenn das Register das System nicht benennt."
          },
          "is_primary": {
            "type": "boolean",
            "description": "True für die Haupttätigkeit des Unternehmens. Genau ein Eintrag ist primär, wenn die Liste nicht leer ist."
          }
        },
        "required": [
          "code",
          "description",
          "scheme",
          "is_primary"
        ]
      },
      "KYBRegistryShareholding": {
        "type": "object",
        "nullable": true,
        "description": "Was ein Eigentümer hält, im selben Format für jedes Land und jede Registerquelle. Null, wenn das Register keine Beteiligung angibt. Eine Spanne (z. B. 25-50% bei einem britischen PSC) ist keine Beteiligung: `percentage` ist null und die Spanne verbleibt in `ownership_min_shares` / `ownership_max_shares`.",
        "properties": {
          "share_class": {
            "type": "string",
            "nullable": true,
            "description": "Aktienklasse oder -typ, wie im Register angegeben."
          },
          "number_of_shares": {
            "type": "number",
            "nullable": true,
            "description": "Anzahl der gehaltenen Anteile."
          },
          "currency": {
            "type": "string",
            "nullable": true,
            "description": "ISO 4217-Währung der untenstehenden Werte."
          },
          "nominal_value": {
            "type": "number",
            "nullable": true,
            "description": "Nennwert pro Aktie."
          },
          "total_value": {
            "type": "number",
            "nullable": true,
            "description": "Gesamtwert der Beteiligung."
          },
          "percentage": {
            "type": "number",
            "nullable": true,
            "description": "Exakter Anteil in Prozent auf vier Dezimalstellen genau."
          }
        },
        "required": [
          "share_class",
          "number_of_shares",
          "currency",
          "nominal_value",
          "total_value",
          "percentage"
        ]
      },
      "KYBRegistryOwnership": {
        "type": "object",
        "description": "Das Ergebnis der Eigentümerstruktur-Stufe (Gesellschafter / UBO), in derselben Form für jedes Land und jede Registerquelle.",
        "properties": {
          "status": {
            "type": "string",
            "nullable": true,
            "enum": [
              "not_requested",
              "pending",
              "delivered",
              "not_held",
              "unavailable",
              null
            ],
            "description": "`delivered`, wenn das Register die Eigentümerstruktur veröffentlicht hat; `not_held`, wenn das Unternehmensregister geantwortet hat und das Unternehmen überhaupt nicht führt (siehe `unavailable_reason`); `unavailable`, wenn es die Daten zur Eigentümerstruktur aus einem anderen Grund nicht bereitgestellt hat (siehe `unavailable_reason`); `pending`, während das Register diese noch abruft; `not_requested` für die Stufe Basic."
          },
          "tier_requested": {
            "type": "string",
            "nullable": true,
            "enum": [
              "basic",
              "shareholders",
              "ubo",
              null
            ],
            "description": "Die vom Workflow bestellte Stufe."
          },
          "tier_delivered": {
            "type": "string",
            "nullable": true,
            "enum": [
              "basic",
              "shareholders",
              "ubo",
              null
            ],
            "description": "Die vom Register gelieferte (und abgerechnete) Stufe. Eine UBO-Anfrage, die nur mit direkten Gesellschaftern beantwortet wird, lautet `shareholders`."
          },
          "unavailable_reason": {
            "type": "string",
            "nullable": true,
            "enum": [
              "no_owners_on_record",
              "no_natural_person_owner",
              "ownership_section_unavailable",
              "company_not_found",
              "ambiguous_company_match",
              "missing_registration_number",
              "entity_type_not_covered",
              "provider_unavailable",
              "other",
              null
            ],
            "description": "Warum eine angeforderte Eigentümerstruktur-Stufe nicht geliefert wurde. Null, es sei denn, `status` ist `unavailable` oder `pending`."
          },
          "direct_ownership_complete": {
            "type": "boolean",
            "nullable": true,
            "description": "True, wenn die angegebenen Anteile der direkten Gesellschafter in Summe 100% ergeben (innerhalb eines Prozentpunkts Rundungstoleranz); false, wenn dies nicht der Fall ist; null, wenn die Eigentümerstruktur nicht übermittelt wurde oder ein Anteil nicht angegeben ist."
          },
          "unresolved": {
            "type": "array",
            "description": "Teile der Eigentümerstruktur, die das Register nicht auflösen konnte, beispielsweise keine eingetragene Konzernstruktur über den direkten Eigentümern.",
            "items": {
              "type": "object",
              "properties": {
                "reason": {
                  "type": "string"
                },
                "section": {
                  "type": "string",
                  "nullable": true
                }
              }
            }
          }
        },
        "required": [
          "status",
          "tier_requested",
          "tier_delivered",
          "unavailable_reason",
          "direct_ownership_complete",
          "unresolved"
        ]
      },
      "KYBRegistryData": {
        "type": "object",
        "nullable": true,
        "description": "Didits normalisierte Registerdetails für das Unternehmen: das Ergebnis der Eigentümerstruktur (`ownership_error`, `section_errors`, `ubo_resolution`, `lite_enrichment`), die mit update-data vorgenommenen Korrekturen und Registerfakten, die kein eigenes Feld haben. Es enthält niemals den eigenen Datensatz der Registerquelle. Jeder Schlüssel ist optional und nur vorhanden, wenn das Unternehmen einen Wert dafür hat; neue Schlüssel können hinzugefügt werden. Lesen Sie die kanonischen Felder (`addresses`, `industries`, `ownership`, `beneficial_owners[].shareholding`) für alles, was diese abdecken.",
        "properties": {
          "company_name": {
            "type": "string",
            "description": "Unternehmensname wie in der Console korrigiert."
          },
          "registration_number": {
            "type": "string",
            "description": "Registernummer laut Register oder Console-Korrektur."
          },
          "country_code": {
            "type": "string",
            "description": "Land der Registrierung gemäß Register oder Korrektur in der Konsole."
          },
          "region": {
            "type": "string",
            "description": "Region oder Bundesstaat der Registrierung."
          },
          "incorporation_date": {
            "type": "string",
            "description": "Gründungsdatum (ISO 8601)."
          },
          "registration_date": {
            "type": "string",
            "description": "Eintragungsdatum (ISO 8601), wenn das Register dieses getrennt vom Gründungsdatum ausweist."
          },
          "dissolution_date": {
            "type": "string",
            "description": "Auflösungsdatum (ISO 8601), sofern im Unternehmensregister angegeben."
          },
          "tax_number": {
            "type": "string",
            "description": "Steueridentifikationsnummer."
          },
          "vat_number": {
            "type": "string",
            "description": "Umsatzsteuer-Identifikationsnummer."
          },
          "legal_address": {
            "type": "string",
            "description": "Rechtliche Adresse, wie sie in der Konsole korrigiert wurde."
          },
          "registered_address": {
            "type": "string",
            "description": "Eingetragene Adresse laut Registerangabe."
          },
          "company_type": {
            "type": "string",
            "description": "Rechtsform."
          },
          "registry_status": {
            "type": "string",
            "description": "Unternehmensstatus im Unternehmensregister."
          },
          "verification_status": {
            "type": "string",
            "description": "Verifizierungsstatus."
          },
          "alternative_names": {
            "type": "string",
            "description": "Andere Namen, unter denen das Unternehmen firmiert oder firmiert hat."
          },
          "nature_of_business": {
            "type": "string",
            "description": "Tätigkeitsbeschreibung."
          },
          "registered_capital": {
            "type": "string",
            "description": "Eingetragenes Kapital wie abgedruckt."
          },
          "registered_capital_amount": {
            "type": "string",
            "description": "Eingetragenes Stammkapital als Dezimal-String."
          },
          "registered_capital_currency": {
            "type": "string",
            "description": "Währung des eingetragenen Stammkapitals (ISO 4217)."
          },
          "website": {
            "type": "string",
            "description": "Website."
          },
          "email": {
            "type": "string",
            "description": "Kontakt-E-Mail."
          },
          "phone": {
            "type": "string",
            "description": "Telefonnummer des Kontakts."
          },
          "legal_entity_identifier": {
            "type": "string",
            "description": "Legal Entity Identifier (LEI)."
          },
          "location_of_registration": {
            "type": "string",
            "description": "Registrierungsort."
          },
          "control_scheme": {
            "type": "string",
            "description": "Governance-Schema, sofern vom Register bereitgestellt."
          },
          "ownership_error": {
            "type": "string",
            "enum": [
              "no_owners_on_record",
              "no_natural_person_owner",
              "ownership_section_unavailable",
              "company_not_found",
              "ambiguous_company_match",
              "missing_registration_number",
              "entity_type_not_covered",
              "provider_unavailable",
              "other"
            ],
            "description": "Warum eine angeforderte Eigentümerstruktur-Stufe nicht geliefert wurde, in denselben Codes wie `ownership.unavailable_reason`. `no_owners_on_record` (das Unternehmensregister hat geantwortet und nennt keine Eigentümer) und `ownership_section_unavailable` (das Unternehmensregister hat den Abschnitt zur Eigentümerstruktur nicht zurückgegeben) sind unterschiedliche Ergebnisse."
          },
          "section_errors": {
            "type": "object",
            "description": "Abschnitte, die das Register nicht zurückgegeben hat, aufgeschlüsselt nach Abschnitt (`officers`, `shareholders`, `group_structure`). Ein hier aufgeführter Abschnitt wurde nie übermittelt: Eine leere Liste daneben sagt nichts über das Unternehmen aus.",
            "additionalProperties": {
              "$ref": "#/components/schemas/KYBRegistrySectionError"
            }
          },
          "ubo_resolution": {
            "$ref": "#/components/schemas/KYBRegistryUboResolution"
          },
          "lite_enrichment": {
            "$ref": "#/components/schemas/KYBRegistryLiteEnrichment"
          },
          "registry_metadata": {
            "type": "object",
            "additionalProperties": {
              "oneOf": [
                {
                  "type": "string"
                },
                {
                  "type": "number"
                },
                {
                  "type": "boolean"
                }
              ]
            },
            "description": "Die registerspezifischen Felder für das Unternehmen, mit den Bezeichnungen des Registers als Schlüssel, als einfache Werte (Legacy-Datensätze). Es sind nur Felder enthalten, die als Register-Fakten geprüft wurden."
          },
          "registry_sources": {
            "type": "array",
            "description": "Die offiziellen Register, aus denen der Datensatz gelesen wurde (Legacy-Datensätze). Andere Quellen werden nicht genannt.",
            "items": {
              "$ref": "#/components/schemas/KYBRegistrySource"
            }
          },
          "previous_names": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Namen, unter denen das Unternehmen zuvor registriert war (historische Datensätze)."
          },
          "parent_companies": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Muttergesellschaften, die das Register nennt (Altdaten)."
          },
          "documents_available": {
            "type": "integer",
            "description": "Wie viele Einreichungen das Register für das Unternehmen anbietet (Altdaten)."
          }
        }
      },
      "KYBRegistryGroupCompany": {
        "type": "object",
        "description": "Ein Unternehmen der Unternehmensgruppe anhand seiner Registeridentität.",
        "properties": {
          "name": {
            "type": "string",
            "nullable": true,
            "description": "Unternehmensname."
          },
          "country_code": {
            "type": "string",
            "nullable": true,
            "description": "Registrierungsland."
          },
          "registration_number": {
            "type": "string",
            "nullable": true,
            "description": "Registernummer."
          }
        },
        "required": [
          "name",
          "country_code",
          "registration_number"
        ]
      },
      "KYBRegistryUboResolution": {
        "type": "object",
        "description": "Wie die UBO-Stufe die Eigentümerstruktur oberhalb des Unternehmens durchlaufen hat.",
        "properties": {
          "parent_chain": {
            "type": "array",
            "description": "Konzernmütter von der obersten Muttergesellschaft bis hin zum Unternehmen.",
            "items": {
              "$ref": "#/components/schemas/KYBRegistryGroupCompany"
            }
          },
          "subsidiaries": {
            "type": "array",
            "description": "Unternehmen direkt unterhalb des Unternehmens in seiner Unternehmensgruppe.",
            "items": {
              "$ref": "#/components/schemas/KYBRegistryGroupCompany"
            }
          },
          "unresolved": {
            "type": "array",
            "description": "Teile der Kette, die das Register nicht auflösen konnte (dieselben Einträge wie `ownership.unresolved`).",
            "items": {
              "type": "object",
              "properties": {
                "reason": {
                  "type": "string",
                  "description": "Der Grund, zum Beispiel `no_group_structure_on_record`, `selected_company_not_in_group_structure` oder `section_error`."
                },
                "section": {
                  "type": "string",
                  "nullable": true,
                  "description": "Der betroffene Abschnitt, zum Beispiel `group_structure`."
                }
              },
              "required": [
                "reason",
                "section"
              ]
            }
          }
        },
        "required": [
          "parent_chain",
          "subsidiaries",
          "unresolved"
        ]
      },
      "KYBRegistrySectionError": {
        "type": "object",
        "description": "Ein Abschnitt, den das Unternehmensregister nicht zurückgegeben hat.",
        "properties": {
          "status_code": {
            "type": "integer",
            "nullable": true,
            "description": "Der Status, den das Register für den Abschnitt zurückgemeldet hat."
          }
        },
        "required": [
          "status_code"
        ]
      },
      "KYBRegistryLiteEnrichment": {
        "type": "object",
        "description": "Leere Lite-Profilfelder, die eine andere Registerquelle des Landes ausgefüllt hat. Die Quelle wird nicht benannt.",
        "properties": {
          "fields": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Die Unternehmensfelder, die ausgefüllt wurden."
          },
          "people_added": {
            "type": "integer",
            "description": "Wie viele Geschäftsführer oder Eigentümer hinzugefügt wurden."
          }
        },
        "required": [
          "fields",
          "people_added"
        ]
      },
      "KYBRegistrySource": {
        "type": "object",
        "description": "Ein offizielles Register, aus dem der Datensatz ausgelesen wurde. Es werden nur offizielle staatliche Register, Regulierungsbehörden und das offizielle Identifikationssystem benannt; jede andere Quelle wird weggelassen.",
        "properties": {
          "name": {
            "type": "string",
            "description": "Name des Registers, zum Beispiel `UK Companies House`."
          },
          "source_type": {
            "type": "string",
            "enum": [
              "official"
            ],
            "description": "Immer `official`."
          }
        },
        "required": [
          "name",
          "source_type"
        ]
      },
      "KYBOwnershipStructure": {
        "type": "object",
        "nullable": true,
        "description": "Die vom Register nachgewiesene Cap Table zum Zeitpunkt der Bereitstellung der Eigentümerstruktur-Stufe: direkte `shareholders` und `beneficial_owners`. Null, wenn das Register keine Eigentümerstruktur nachgewiesen hat. Sie enthält niemals die eigenen Zeilen der Registerquelle; lesen Sie `company.beneficial_owners` und `company.ownership` für den aktuellen Datensatz.",
        "properties": {
          "shareholders": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/KYBOwnershipStructureOwner"
            }
          },
          "beneficial_owners": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/KYBOwnershipStructureOwner"
            }
          }
        },
        "required": [
          "shareholders",
          "beneficial_owners"
        ]
      },
      "KYBOwnershipStructureOwner": {
        "type": "object",
        "description": "Ein Eigentümer des Eigentümerstruktur-Snapshots: dieselbe Registeridentität und Beteiligung wie bei `company.beneficial_owners[]` sowie dessen kanonische `shareholding`.",
        "properties": {
          "name": {
            "type": "string",
            "nullable": true,
            "description": "Name des Eigentümers gemäß Registerangabe."
          },
          "first_name": {
            "type": "string",
            "nullable": true,
            "description": "Vorname, bei einer natürlichen Person, sofern vom Register angegeben."
          },
          "last_name": {
            "type": "string",
            "nullable": true,
            "description": "Nachname einer natürlichen Person, sofern vom Register angegeben."
          },
          "date_of_birth": {
            "type": "string",
            "nullable": true,
            "description": "Geburtsdatum (ISO 8601), sofern vom Register veröffentlicht."
          },
          "country_of_birth": {
            "type": "string",
            "nullable": true,
            "description": "Geburtsland, sofern vom Register veröffentlicht."
          },
          "company_name": {
            "type": "string",
            "nullable": true,
            "description": "Unternehmensname für einen Unternehmenseigentümer."
          },
          "registration_number": {
            "type": "string",
            "nullable": true,
            "description": "Registernummer für einen Unternehmenseigentümer."
          },
          "entity_type": {
            "type": "string",
            "nullable": true,
            "enum": [
              "person",
              "company",
              null
            ],
            "description": "Gibt an, ob der Eigentümer eine natürliche Person oder ein Unternehmen ist."
          },
          "nationality": {
            "type": "string",
            "nullable": true,
            "description": "Staatsangehörigkeit, sofern vom Register angegeben."
          },
          "designation": {
            "type": "string",
            "nullable": true,
            "description": "Der Titel oder die Rolle des Eigentümers, wie im Register angegeben."
          },
          "roles": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "`shareholder` für einen direkten Anteilseigner, `ubo` für einen wirtschaftlich Berechtigten."
          },
          "ownership_min_shares": {
            "type": "string",
            "nullable": true,
            "description": "Untergrenze der Beteiligung in Prozent (bei einer exakten Beteiligung gleich der Obergrenze)."
          },
          "ownership_max_shares": {
            "type": "string",
            "nullable": true,
            "description": "Obere Grenze der Beteiligung in Prozent."
          },
          "voting_min_shares": {
            "type": "string",
            "nullable": true,
            "description": "Untergrenze der Stimmrechte in Prozent."
          },
          "voting_max_shares": {
            "type": "string",
            "nullable": true,
            "description": "Obere Grenze der Stimmrechte in Prozent."
          },
          "appointment_date": {
            "type": "string",
            "nullable": true,
            "description": "Datum, an dem die Beteiligung oder Bestellung begann (ISO 8601)."
          },
          "is_active": {
            "type": "boolean",
            "nullable": true,
            "description": "False für einen früheren Eigentümer."
          },
          "shareholding": {
            "$ref": "#/components/schemas/KYBRegistryShareholding"
          }
        },
        "required": [
          "name",
          "first_name",
          "last_name",
          "date_of_birth",
          "country_of_birth",
          "company_name",
          "registration_number",
          "entity_type",
          "nationality",
          "designation",
          "roles",
          "ownership_min_shares",
          "ownership_max_shares",
          "voting_min_shares",
          "voting_max_shares",
          "appointment_date",
          "is_active",
          "shareholding"
        ]
      },
      "DigitalIdWalletApiWalletVerificationError": {
        "type": "object",
        "properties": {
          "error": {
            "type": "string",
            "description": "Stabiler maschinenlesbarer Code, z. B. wallet_unavailable."
          },
          "detail": {
            "type": "string"
          }
        },
        "required": [
          "detail",
          "error"
        ]
      },
      "DigitalIdWalletApiWalletVerificationStartForbidden": {
        "oneOf": [
          {
            "$ref": "#/components/schemas/DigitalIdWalletApiClientCredentialsForbiddenErrorMessage"
          },
          {
            "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationError"
          }
        ]
      },
      "DigitalIdWalletApiClientCredentialsForbiddenErrorMessage": {
        "type": "object",
        "properties": {
          "detail": {
            "type": "string",
            "default": "Forbidden - User doesn't have permission"
          }
        }
      },
      "DigitalIdWalletApiWalletVerificationStartBadRequest": {
        "oneOf": [
          {
            "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationError"
          },
          {
            "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationFieldErrors"
          }
        ]
      },
      "DigitalIdWalletApiWalletVerificationFieldErrors": {
        "type": "object",
        "description": "Validierungsfehler der Anfrage: jedes abgelehnte Feld mit seinen Meldungen.",
        "additionalProperties": {
          "type": "array",
          "items": {
            "type": "string"
          }
        }
      },
      "DigitalIdWalletApiWalletVerificationResponse": {
        "type": "object",
        "description": "Eine eigenständige Wallet-Verifizierung, wie sie von jedem Wallet-Endpoint beantwortet wird.",
        "properties": {
          "request_id": {
            "type": "string",
            "format": "uuid"
          },
          "wallet_verification": {
            "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationResult"
          },
          "vendor_data": {
            "type": "string",
            "nullable": true
          },
          "metadata": {
            "type": "object",
            "additionalProperties": {},
            "nullable": true,
            "description": "Das beim Start gesendete Metadaten-Objekt oder null."
          },
          "created_at": {
            "type": "string",
            "format": "date-time"
          }
        },
        "required": [
          "created_at",
          "metadata",
          "request_id",
          "vendor_data",
          "wallet_verification"
        ]
      },
      "DigitalIdWalletApiWalletVerificationResult": {
        "type": "object",
        "properties": {
          "wallet": {
            "allOf": [
              {
                "$ref": "#/components/schemas/DigitalIdWalletApiWallet"
              }
            ],
            "readOnly": true
          },
          "country": {
            "type": "string"
          },
          "status": {
            "type": "string",
            "description": "Nicht abgeschlossen, solange ausstehend, dann genehmigt (verifiziert) oder abgelehnt."
          },
          "outcome": {
            "$ref": "#/components/schemas/DigitalIdWalletApiWalletVerificationResultOutcomeEnum"
          },
          "error": {
            "type": "string",
            "nullable": true,
            "readOnly": true
          },
          "interaction": {
            "allOf": [
              {
                "$ref": "#/components/schemas/DigitalIdWalletApiInteractionEnum"
              }
            ],
            "readOnly": true
          },
          "simulated": {
            "type": "boolean",
            "readOnly": true
          },
          "expires_at": {
            "type": "string",
            "format": "date-time"
          },
          "next_action": {
            "allOf": [
              {
                "$ref": "#/components/schemas/DigitalIdWalletApiWalletNextAction"
              }
            ],
            "nullable": true,
            "readOnly": true
          },
          "identity": {
            "allOf": [
              {
                "$ref": "#/components/schemas/DigitalIdWalletApiWalletIdentity"
              }
            ],
            "nullable": true,
            "readOnly": true
          },
          "attributes": {
            "type": "object",
            "additionalProperties": {},
            "nullable": true,
            "readOnly": true
          },
          "level_of_assurance": {
            "type": "string",
            "nullable": true
          },
          "verified_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "signature_valid": {
            "type": "boolean",
            "nullable": true,
            "description": "True, sobald die Signatur der Zugangsdaten verifiziert wurde; null bei simulierten Zugangsdaten."
          },
          "credential_type": {
            "type": "string",
            "nullable": true
          }
        },
        "required": [
          "attributes",
          "country",
          "credential_type",
          "error",
          "expires_at",
          "identity",
          "interaction",
          "level_of_assurance",
          "next_action",
          "outcome",
          "signature_valid",
          "simulated",
          "status",
          "verified_at",
          "wallet"
        ]
      },
      "DigitalIdWalletApiWalletIdentity": {
        "type": "object",
        "properties": {
          "full_name": {
            "type": "string",
            "nullable": true
          },
          "first_name": {
            "type": "string",
            "nullable": true
          },
          "last_name": {
            "type": "string",
            "nullable": true
          },
          "date_of_birth": {
            "type": "string",
            "format": "date",
            "nullable": true
          },
          "nationality": {
            "type": "string",
            "nullable": true,
            "description": "ISO3-Staatsangehörigkeit, nur wenn die Wallet eine angibt (wird niemals abgeleitet)."
          },
          "issuing_state": {
            "type": "string",
            "description": "ISO3-Land, dessen Schema die Identität ausgestellt hat."
          }
        },
        "required": [
          "date_of_birth",
          "first_name",
          "full_name",
          "issuing_state",
          "last_name",
          "nationality"
        ]
      },
      "DigitalIdWalletApiWalletNextAction": {
        "type": "object",
        "properties": {
          "type": {
            "allOf": [
              {
                "$ref": "#/components/schemas/DigitalIdWalletApiWalletNextActionTypeEnum"
              }
            ],
            "description": "redirect: Leiten Sie den Browser des Benutzers an url weiter. confirm_in_app: Zeigen Sie dem Benutzer verification_code an, der prüft, ob er mit dem Code in seiner Wallet-App übereinstimmt, und dort bestätigt; dann per Polling abfragen. request_digital_credential: Bei einer Benutzeraktion auf dem Ursprung, mit dem Sie begonnen haben, die Wallet mit digital_credentials.request abfragen und das Ergebnis an POST .../verifications/{request_id}/response/ senden.\n\n* `redirect` - redirect\n* `confirm_in_app` - confirm_in_app\n* `request_digital_credential` - request_digital_credential"
          },
          "url": {
            "type": "string",
            "format": "uri",
            "description": "Nur redirect: wo sich der Benutzer mit der Wallet anmeldet."
          },
          "digital_credentials": {
            "allOf": [
              {
                "$ref": "#/components/schemas/DigitalIdWalletApiWalletDigitalCredentialsRequest"
              }
            ],
            "description": "Nur request_digital_credential: die an die Wallet zu übergebende Anfrage."
          },
          "verification_code": {
            "type": "string",
            "description": "Nur confirm_in_app: Der 4-stellige Vergleichscode, den auch die Wallet-App anzeigt."
          },
          "poll_interval_seconds": {
            "type": "integer",
            "description": "Nur confirm_in_app: Wie oft POST .../verifications/{request_id}/poll/ für zeitnahes Feedback aufgerufen werden soll. Didit fragt ausstehende Anmeldungen auch im Hintergrund ab, sodass der Webhook das Ergebnis auch dann meldet, wenn Sie keine Abfragen durchführen."
          }
        },
        "required": [
          "type"
        ]
      },
      "DigitalIdWalletApiWalletNextActionTypeEnum": {
        "enum": [
          "redirect",
          "confirm_in_app",
          "request_digital_credential"
        ],
        "type": "string",
        "description": "* `redirect` - redirect\n* `confirm_in_app` - confirm_in_app\n* `request_digital_credential` - request_digital_credential"
      },
      "DigitalIdWalletApiInteractionEnum": {
        "enum": [
          "redirect",
          "in_app",
          "digital_credentials"
        ],
        "type": "string",
        "description": "* `redirect` - redirect\n* `in_app` - in_app\n* `digital_credentials` - digital_credentials"
      },
      "DigitalIdWalletApiWalletVerificationResultOutcomeEnum": {
        "enum": [
          "pending",
          "verified",
          "cancelled",
          "timeout",
          "failed"
        ],
        "type": "string",
        "description": "* `pending` - Ausstehend\n* `verified` - Verifiziert\n* `cancelled` - Vom Benutzer abgebrochen\n* `timeout` - Zeitüberschreitung\n* `failed` - Fehlgeschlagen"
      },
      "DigitalIdWalletApiWallet": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Katalog-ID der Wallet, z. B. bankid_se."
          },
          "name": {
            "type": "string"
          },
          "issuing_authority": {
            "type": "string",
            "nullable": true
          }
        },
        "required": [
          "id",
          "issuing_authority",
          "name"
        ]
      },
      "DigitalIdWalletApiEudiWalletVerificationStartRequest": {
        "type": "object",
        "description": "Starten Sie eine EUDI Wallet-Verifizierung (AUT, BEL, BGR, HRV, CYP, CZE, DNK, EST, FIN, FRA, DEU, GRC, HUN, IRL, ITA, LVA, LTU, LUX, MLT, NLD, POL, PRT, ROU, SVK, SVN, ESP, SWE, ISL, LIE, NOR).",
        "properties": {
          "vendor_data": {
            "type": "string",
            "nullable": true,
            "description": "Ihre eigene Referenz für diese Verifizierung (z. B. Ihre Benutzer-ID). Wird in Ergebnissen und Webhooks zurückgegeben."
          },
          "metadata": {
            "type": "object",
            "additionalProperties": {},
            "nullable": true,
            "description": "Optionales JSON-Objekt, das mit der Verifizierung gespeichert und in Ergebnissen sowie Webhooks zurückgegeben wird."
          },
          "sandbox_scenario": {
            "type": "string",
            "minLength": 1,
            "description": "Nur für Sandbox-Anwendungen: Das simulierte Ergebnis – 'wallet_cancelled', 'wallet_timeout' oder 'wallet_provider_error'; jedes andere Szenario (oder keines) verifiziert erfolgreich. Bei Live-Anwendungen abgelehnt. Der vollständige Katalog ist unter GET /v1/sandbox/scenarios/ verfügbar."
          },
          "country": {
            "allOf": [
              {
                "$ref": "#/components/schemas/DigitalIdWalletApiEudiWalletVerificationStartCountryEnum"
              }
            ],
            "description": "ISO 3166-1-Alpha-3-Land der EUDI Wallet-Identität.\n\n* `AUT` - AUT\n* `BEL` - BEL\n* `BGR` - BGR\n* `HRV` - HRV\n* `CYP` - CYP\n* `CZE` - CZE\n* `DNK` - DNK\n* `EST` - EST\n* `FIN` - FIN\n* `FRA` - FRA\n* `DEU` - DEU\n* `GRC` - GRC\n* `HUN` - HUN\n* `IRL` - IRL\n* `ITA` - ITA\n* `LVA` - LVA\n* `LTU` - LTU\n* `LUX` - LUX\n* `MLT` - MLT\n* `NLD` - NLD\n* `POL` - POL\n* `PRT` - PRT\n* `ROU` - ROU\n* `SVK` - SVK\n* `SVN` - SVN\n* `ESP` - ESP\n* `SWE` - SWE\n* `ISL` - ISL\n* `LIE` - LIE\n* `NOR` - NOR"
          },
          "return_url": {
            "type": "string",
            "format": "uri",
            "minLength": 1,
            "description": "HTTPS-URL, zu der der Browser des Benutzers nach der Wallet zurückkehrt, wobei request_id und result angehängt werden. Ihr Host muss in den allowed_return_hosts der Anwendung registriert sein (oder deren White-Label-Domain sein). Vertrauen Sie result niemals allein: Rufen Sie das Ergebnis mit GET .../verifications/{request_id}/ oder über den Webhook ab.",
            "maxLength": 2048
          },
          "device": {
            "allOf": [
              {
                "$ref": "#/components/schemas/DigitalIdWalletApiDeviceEnum"
              }
            ],
            "default": "same_device",
            "description": "same_device, wenn sich der Benutzer auf dem Gerät anmeldet, das Ihre Seite anzeigt; cross_device, wenn er ein anderes Gerät verwendet (z. B. den QR-Code von BankID).\n\n* `same_device` - same_device\n* `cross_device` - cross_device"
          }
        },
        "required": [
          "country",
          "return_url"
        ]
      },
      "DigitalIdWalletApiDeviceEnum": {
        "enum": [
          "same_device",
          "cross_device"
        ],
        "type": "string",
        "description": "* `same_device` - same_device\n* `cross_device` - cross_device"
      },
      "DigitalIdWalletApiEudiWalletVerificationStartCountryEnum": {
        "enum": [
          "AUT",
          "BEL",
          "BGR",
          "HRV",
          "CYP",
          "CZE",
          "DNK",
          "EST",
          "FIN",
          "FRA",
          "DEU",
          "GRC",
          "HUN",
          "IRL",
          "ITA",
          "LVA",
          "LTU",
          "LUX",
          "MLT",
          "NLD",
          "POL",
          "PRT",
          "ROU",
          "SVK",
          "SVN",
          "ESP",
          "SWE",
          "ISL",
          "LIE",
          "NOR"
        ],
        "type": "string",
        "description": "* `AUT` - AUT\n* `BEL` - BEL\n* `BGR` - BGR\n* `HRV` - HRV\n* `CYP` - CYP\n* `CZE` - CZE\n* `DNK` - DNK\n* `EST` - EST\n* `FIN` - FIN\n* `FRA` - FRA\n* `DEU` - DEU\n* `GRC` - GRC\n* `HUN` - HUN\n* `IRL` - IRL\n* `ITA` - ITA\n* `LVA` - LVA\n* `LTU` - LTU\n* `LUX` - LUX\n* `MLT` - MLT\n* `NLD` - NLD\n* `POL` - POL\n* `PRT` - PRT\n* `ROU` - ROU\n* `SVK` - SVK\n* `SVN` - SVN\n* `ESP` - ESP\n* `SWE` - SWE\n* `ISL` - ISL\n* `LIE` - LIE\n* `NOR` - NOR"
      },
      "DigitalIdWalletApiConnectidWalletVerificationStartRequest": {
        "type": "object",
        "description": "Starten Sie eine ConnectID-Verifizierung (AUS).",
        "properties": {
          "vendor_data": {
            "type": "string",
            "nullable": true,
            "description": "Ihre eigene Referenz für diese Verifizierung (z. B. Ihre Benutzer-ID). Wird in Ergebnissen und Webhooks zurückgegeben."
          },
          "metadata": {
            "type": "object",
            "additionalProperties": {},
            "nullable": true,
            "description": "Optionales JSON-Objekt, das mit der Verifizierung gespeichert und in Ergebnissen sowie Webhooks zurückgegeben wird."
          },
          "sandbox_scenario": {
            "type": "string",
            "minLength": 1,
            "description": "Nur für Sandbox-Anwendungen: Das simulierte Ergebnis – 'wallet_cancelled', 'wallet_timeout' oder 'wallet_provider_error'; jedes andere Szenario (oder keines) verifiziert erfolgreich. Bei Live-Anwendungen abgelehnt. Der vollständige Katalog ist unter GET /v1/sandbox/scenarios/ verfügbar."
          },
          "country": {
            "allOf": [
              {
                "$ref": "#/components/schemas/DigitalIdWalletApiConnectidWalletVerificationStartCountryEnum"
              }
            ],
            "default": "AUS",
            "description": "ISO 3166-1-Alpha-3-Land der ConnectID-Identität. Standardmäßig AUS, das einzige Land, das unterstützt wird.\n\n* `AUS` - AUS"
          },
          "authorisation_server_id": {
            "type": "string",
            "minLength": 1,
            "description": "Über die Bankauswahl von ConnectID ausgewählte Autorisierungsserver-ID. Standardwert in der Sandbox ist Mock Bank A.",
            "maxLength": 36
          },
          "return_url": {
            "type": "string",
            "format": "uri",
            "minLength": 1,
            "description": "HTTPS-URL, zu der der Browser des Benutzers nach der Wallet zurückkehrt, wobei request_id und result angehängt werden. Ihr Host muss in den allowed_return_hosts der Anwendung registriert sein (oder deren White-Label-Domain sein). Vertrauen Sie result niemals allein: Rufen Sie das Ergebnis mit GET .../verifications/{request_id}/ oder über den Webhook ab.",
            "maxLength": 2048
          },
          "device": {
            "allOf": [
              {
                "$ref": "#/components/schemas/DigitalIdWalletApiDeviceEnum"
              }
            ],
            "default": "same_device",
            "description": "same_device, wenn sich der Benutzer auf dem Gerät anmeldet, das Ihre Seite anzeigt; cross_device, wenn er ein anderes Gerät verwendet (z. B. den QR-Code von BankID).\n\n* `same_device` - same_device\n* `cross_device` - cross_device"
          }
        },
        "required": [
          "return_url"
        ]
      },
      "DigitalIdWalletApiConnectidWalletVerificationStartCountryEnum": {
        "enum": [
          "AUS"
        ],
        "type": "string",
        "description": "* `AUS` - AUS"
      },
      "DigitalIdWalletApiAudkenniWalletVerificationStartRequest": {
        "type": "object",
        "description": "Auðkenni-Verifizierung starten (ISL).",
        "properties": {
          "vendor_data": {
            "type": "string",
            "nullable": true,
            "description": "Ihre eigene Referenz für diese Verifizierung (z. B. Ihre Benutzer-ID). Wird in Ergebnissen und Webhooks zurückgegeben."
          },
          "metadata": {
            "type": "object",
            "additionalProperties": {},
            "nullable": true,
            "description": "Optionales JSON-Objekt, das mit der Verifizierung gespeichert und in Ergebnissen sowie Webhooks zurückgegeben wird."
          },
          "sandbox_scenario": {
            "type": "string",
            "minLength": 1,
            "description": "Nur für Sandbox-Anwendungen: Das simulierte Ergebnis – 'wallet_cancelled', 'wallet_timeout' oder 'wallet_provider_error'; jedes andere Szenario (oder keines) verifiziert erfolgreich. Bei Live-Anwendungen abgelehnt. Der vollständige Katalog ist unter GET /v1/sandbox/scenarios/ verfügbar."
          },
          "country": {
            "allOf": [
              {
                "$ref": "#/components/schemas/DigitalIdWalletApiAudkenniWalletVerificationStartCountryEnum"
              }
            ],
            "default": "ISL",
            "description": "ISO 3166-1-Alpha-3-Land der Auðkenni-Identität. Standardmäßig ISL, das einzige Land, das unterstützt wird.\n\n* `ISL` - ISL"
          },
          "return_url": {
            "type": "string",
            "format": "uri",
            "minLength": 1,
            "description": "HTTPS-URL, zu der der Browser des Benutzers nach der Wallet zurückkehrt, wobei request_id und result angehängt werden. Ihr Host muss in den allowed_return_hosts der Anwendung registriert sein (oder deren White-Label-Domain sein). Vertrauen Sie result niemals allein: Rufen Sie das Ergebnis mit GET .../verifications/{request_id}/ oder über den Webhook ab.",
            "maxLength": 2048
          },
          "device": {
            "allOf": [
              {
                "$ref": "#/components/schemas/DigitalIdWalletApiDeviceEnum"
              }
            ],
            "default": "same_device",
            "description": "same_device, wenn sich der Benutzer auf dem Gerät anmeldet, das Ihre Seite anzeigt; cross_device, wenn er ein anderes Gerät verwendet (z. B. den QR-Code von BankID).\n\n* `same_device` - same_device\n* `cross_device` - cross_device"
          }
        },
        "required": [
          "return_url"
        ]
      },
      "DigitalIdWalletApiAudkenniWalletVerificationStartCountryEnum": {
        "enum": [
          "ISL"
        ],
        "type": "string",
        "description": "* `ISL` - ISL"
      },
      "DigitalIdWalletApiFranceconnectWalletVerificationStartRequest": {
        "type": "object",
        "description": "Starten Sie eine FranceConnect-Verifizierung (FRA).",
        "properties": {
          "vendor_data": {
            "type": "string",
            "nullable": true,
            "description": "Ihre eigene Referenz für diese Verifizierung (z. B. Ihre Benutzer-ID). Wird in Ergebnissen und Webhooks zurückgegeben."
          },
          "metadata": {
            "type": "object",
            "additionalProperties": {},
            "nullable": true,
            "description": "Optionales JSON-Objekt, das mit der Verifizierung gespeichert und in Ergebnissen sowie Webhooks zurückgegeben wird."
          },
          "sandbox_scenario": {
            "type": "string",
            "minLength": 1,
            "description": "Nur für Sandbox-Anwendungen: Das simulierte Ergebnis – 'wallet_cancelled', 'wallet_timeout' oder 'wallet_provider_error'; jedes andere Szenario (oder keines) verifiziert erfolgreich. Bei Live-Anwendungen abgelehnt. Der vollständige Katalog ist unter GET /v1/sandbox/scenarios/ verfügbar."
          },
          "country": {
            "allOf": [
              {
                "$ref": "#/components/schemas/DigitalIdWalletApiFranceconnectWalletVerificationStartCountryEnum"
              }
            ],
            "default": "FRA",
            "description": "ISO 3166-1-Alpha-3-Land der FranceConnect-Identität. Standardmäßig FRA, das einzige Land, das unterstützt wird.\n\n* `FRA` - FRA"
          },
          "return_url": {
            "type": "string",
            "format": "uri",
            "minLength": 1,
            "description": "HTTPS-URL, zu der der Browser des Benutzers nach der Wallet zurückkehrt, wobei request_id und result angehängt werden. Ihr Host muss in den allowed_return_hosts der Anwendung registriert sein (oder deren White-Label-Domain sein). Vertrauen Sie result niemals allein: Rufen Sie das Ergebnis mit GET .../verifications/{request_id}/ oder über den Webhook ab.",
            "maxLength": 2048
          },
          "device": {
            "allOf": [
              {
                "$ref": "#/components/schemas/DigitalIdWalletApiDeviceEnum"
              }
            ],
            "default": "same_device",
            "description": "same_device, wenn sich der Benutzer auf dem Gerät anmeldet, das Ihre Seite anzeigt; cross_device, wenn er ein anderes Gerät verwendet (z. B. den QR-Code von BankID).\n\n* `same_device` - same_device\n* `cross_device` - cross_device"
          }
        },
        "required": [
          "return_url"
        ]
      },
      "DigitalIdWalletApiFranceconnectWalletVerificationStartCountryEnum": {
        "enum": [
          "FRA"
        ],
        "type": "string",
        "description": "* `FRA` - FRA"
      },
      "DigitalIdWalletApiDiiaWalletVerificationStartRequest": {
        "type": "object",
        "description": "Starten Sie eine Diia-Verifizierung (UKR).",
        "properties": {
          "vendor_data": {
            "type": "string",
            "nullable": true,
            "description": "Ihre eigene Referenz für diese Verifizierung (z. B. Ihre Benutzer-ID). Wird in Ergebnissen und Webhooks zurückgegeben."
          },
          "metadata": {
            "type": "object",
            "additionalProperties": {},
            "nullable": true,
            "description": "Optionales JSON-Objekt, das mit der Verifizierung gespeichert und in Ergebnissen sowie Webhooks zurückgegeben wird."
          },
          "sandbox_scenario": {
            "type": "string",
            "minLength": 1,
            "description": "Nur für Sandbox-Anwendungen: Das simulierte Ergebnis – 'wallet_cancelled', 'wallet_timeout' oder 'wallet_provider_error'; jedes andere Szenario (oder keines) verifiziert erfolgreich. Bei Live-Anwendungen abgelehnt. Der vollständige Katalog ist unter GET /v1/sandbox/scenarios/ verfügbar."
          },
          "country": {
            "allOf": [
              {
                "$ref": "#/components/schemas/DigitalIdWalletApiDiiaWalletVerificationStartCountryEnum"
              }
            ],
            "default": "UKR",
            "description": "ISO 3166-1-Alpha-3-Land der Diia-Identität. Standardmäßig UKR, das einzige Land, das unterstützt wird.\n\n* `UKR` - UKR"
          },
          "return_url": {
            "type": "string",
            "format": "uri",
            "minLength": 1,
            "description": "HTTPS-URL, zu der der Browser des Benutzers nach der Wallet zurückkehrt, wobei request_id und result angehängt werden. Ihr Host muss in den allowed_return_hosts der Anwendung registriert sein (oder deren White-Label-Domain sein). Vertrauen Sie result niemals allein: Rufen Sie das Ergebnis mit GET .../verifications/{request_id}/ oder über den Webhook ab.",
            "maxLength": 2048
          },
          "device": {
            "allOf": [
              {
                "$ref": "#/components/schemas/DigitalIdWalletApiDeviceEnum"
              }
            ],
            "default": "same_device",
            "description": "same_device, wenn sich der Benutzer auf dem Gerät anmeldet, das Ihre Seite anzeigt; cross_device, wenn er ein anderes Gerät verwendet (z. B. den QR-Code von BankID).\n\n* `same_device` - same_device\n* `cross_device` - cross_device"
          }
        },
        "required": [
          "return_url"
        ]
      },
      "DigitalIdWalletApiDiiaWalletVerificationStartCountryEnum": {
        "enum": [
          "UKR"
        ],
        "type": "string",
        "description": "* `UKR` - UKR"
      },
      "DigitalIdWalletApiMojeidWalletVerificationStartRequest": {
        "type": "object",
        "description": "Starten Sie eine MojeID-Verifizierung (CZE).",
        "properties": {
          "vendor_data": {
            "type": "string",
            "nullable": true,
            "description": "Ihre eigene Referenz für diese Verifizierung (z. B. Ihre Benutzer-ID). Wird in Ergebnissen und Webhooks zurückgegeben."
          },
          "metadata": {
            "type": "object",
            "additionalProperties": {},
            "nullable": true,
            "description": "Optionales JSON-Objekt, das mit der Verifizierung gespeichert und in Ergebnissen sowie Webhooks zurückgegeben wird."
          },
          "sandbox_scenario": {
            "type": "string",
            "minLength": 1,
            "description": "Nur für Sandbox-Anwendungen: Das simulierte Ergebnis – 'wallet_cancelled', 'wallet_timeout' oder 'wallet_provider_error'; jedes andere Szenario (oder keines) verifiziert erfolgreich. Bei Live-Anwendungen abgelehnt. Der vollständige Katalog ist unter GET /v1/sandbox/scenarios/ verfügbar."
          },
          "country": {
            "allOf": [
              {
                "$ref": "#/components/schemas/DigitalIdWalletApiCountryE2dEnum"
              }
            ],
            "default": "CZE",
            "description": "ISO 3166-1-Alpha-3-Land der MojeID-Identität. Standardmäßig CZE, das einzige Land, das unterstützt wird.\n\n* `CZE` - CZE"
          },
          "return_url": {
            "type": "string",
            "format": "uri",
            "minLength": 1,
            "description": "HTTPS-URL, zu der der Browser des Benutzers nach der Wallet zurückkehrt, wobei request_id und result angehängt werden. Ihr Host muss in den allowed_return_hosts der Anwendung registriert sein (oder deren White-Label-Domain sein). Vertrauen Sie result niemals allein: Rufen Sie das Ergebnis mit GET .../verifications/{request_id}/ oder über den Webhook ab.",
            "maxLength": 2048
          },
          "device": {
            "allOf": [
              {
                "$ref": "#/components/schemas/DigitalIdWalletApiDeviceEnum"
              }
            ],
            "default": "same_device",
            "description": "same_device, wenn sich der Benutzer auf dem Gerät anmeldet, das Ihre Seite anzeigt; cross_device, wenn er ein anderes Gerät verwendet (z. B. den QR-Code von BankID).\n\n* `same_device` - same_device\n* `cross_device` - cross_device"
          }
        },
        "required": [
          "return_url"
        ]
      },
      "DigitalIdWalletApiCountryE2dEnum": {
        "enum": [
          "CZE"
        ],
        "type": "string",
        "description": "* `CZE` - CZE"
      },
      "DigitalIdWalletApiBankidCzWalletVerificationStartRequest": {
        "type": "object",
        "description": "Starten Sie eine Bank iD-Verifizierung (CZE).",
        "properties": {
          "vendor_data": {
            "type": "string",
            "nullable": true,
            "description": "Ihre eigene Referenz für diese Verifizierung (z. B. Ihre Benutzer-ID). Wird in Ergebnissen und Webhooks zurückgegeben."
          },
          "metadata": {
            "type": "object",
            "additionalProperties": {},
            "nullable": true,
            "description": "Optionales JSON-Objekt, das mit der Verifizierung gespeichert und in Ergebnissen sowie Webhooks zurückgegeben wird."
          },
          "sandbox_scenario": {
            "type": "string",
            "minLength": 1,
            "description": "Nur für Sandbox-Anwendungen: Das simulierte Ergebnis – 'wallet_cancelled', 'wallet_timeout' oder 'wallet_provider_error'; jedes andere Szenario (oder keines) verifiziert erfolgreich. Bei Live-Anwendungen abgelehnt. Der vollständige Katalog ist unter GET /v1/sandbox/scenarios/ verfügbar."
          },
          "country": {
            "allOf": [
              {
                "$ref": "#/components/schemas/DigitalIdWalletApiCountryE2dEnum"
              }
            ],
            "default": "CZE",
            "description": "ISO 3166-1-Alpha-3-Land der Bank iD-Identität. Standardmäßig CZE, das einzige Land, das unterstützt wird.\n\n* `CZE` - CZE"
          },
          "return_url": {
            "type": "string",
            "format": "uri",
            "minLength": 1,
            "description": "HTTPS-URL, zu der der Browser des Benutzers nach der Wallet zurückkehrt, wobei request_id und result angehängt werden. Ihr Host muss in den allowed_return_hosts der Anwendung registriert sein (oder deren White-Label-Domain sein). Vertrauen Sie result niemals allein: Rufen Sie das Ergebnis mit GET .../verifications/{request_id}/ oder über den Webhook ab.",
            "maxLength": 2048
          },
          "device": {
            "allOf": [
              {
                "$ref": "#/components/schemas/DigitalIdWalletApiDeviceEnum"
              }
            ],
            "default": "same_device",
            "description": "same_device, wenn sich der Benutzer auf dem Gerät anmeldet, das Ihre Seite anzeigt; cross_device, wenn er ein anderes Gerät verwendet (z. B. den QR-Code von BankID).\n\n* `same_device` - same_device\n* `cross_device` - cross_device"
          }
        },
        "required": [
          "return_url"
        ]
      },
      "DigitalIdWalletApiEparakstsMobileWalletVerificationStartRequest": {
        "type": "object",
        "description": "Starten Sie eine eParaksts-mobile-Verifizierung (LVA).",
        "properties": {
          "vendor_data": {
            "type": "string",
            "nullable": true,
            "description": "Ihre eigene Referenz für diese Verifizierung (z. B. Ihre Benutzer-ID). Wird in Ergebnissen und Webhooks zurückgegeben."
          },
          "metadata": {
            "type": "object",
            "additionalProperties": {},
            "nullable": true,
            "description": "Optionales JSON-Objekt, das mit der Verifizierung gespeichert und in Ergebnissen sowie Webhooks zurückgegeben wird."
          },
          "sandbox_scenario": {
            "type": "string",
            "minLength": 1,
            "description": "Nur für Sandbox-Anwendungen: Das simulierte Ergebnis – 'wallet_cancelled', 'wallet_timeout' oder 'wallet_provider_error'; jedes andere Szenario (oder keines) verifiziert erfolgreich. Bei Live-Anwendungen abgelehnt. Der vollständige Katalog ist unter GET /v1/sandbox/scenarios/ verfügbar."
          },
          "country": {
            "allOf": [
              {
                "$ref": "#/components/schemas/DigitalIdWalletApiEparakstsMobileWalletVerificationStartCountryEnum"
              }
            ],
            "default": "LVA",
            "description": "ISO 3166-1-Alpha-3-Land der eParaksts mobile-Identität. Standardmäßig LVA, das einzige Land, das unterstützt wird.\n\n* `LVA` - LVA"
          },
          "return_url": {
            "type": "string",
            "format": "uri",
            "minLength": 1,
            "description": "HTTPS-URL, zu der der Browser des Benutzers nach der Wallet zurückkehrt, wobei request_id und result angehängt werden. Ihr Host muss in den allowed_return_hosts der Anwendung registriert sein (oder deren White-Label-Domain sein). Vertrauen Sie result niemals allein: Rufen Sie das Ergebnis mit GET .../verifications/{request_id}/ oder über den Webhook ab.",
            "maxLength": 2048
          },
          "device": {
            "allOf": [
              {
                "$ref": "#/components/schemas/DigitalIdWalletApiDeviceEnum"
              }
            ],
            "default": "same_device",
            "description": "same_device, wenn sich der Benutzer auf dem Gerät anmeldet, das Ihre Seite anzeigt; cross_device, wenn er ein anderes Gerät verwendet (z. B. den QR-Code von BankID).\n\n* `same_device` - same_device\n* `cross_device` - cross_device"
          }
        },
        "required": [
          "return_url"
        ]
      },
      "DigitalIdWalletApiEparakstsMobileWalletVerificationStartCountryEnum": {
        "enum": [
          "LVA"
        ],
        "type": "string",
        "description": "* `LVA` - LVA"
      },
      "DigitalIdWalletApiIdcardEeWalletVerificationStartRequest": {
        "type": "object",
        "description": "Starten Sie eine Verifizierung einer estnischen ID-Karte (EST).",
        "properties": {
          "vendor_data": {
            "type": "string",
            "nullable": true,
            "description": "Ihre eigene Referenz für diese Verifizierung (z. B. Ihre Benutzer-ID). Wird in Ergebnissen und Webhooks zurückgegeben."
          },
          "metadata": {
            "type": "object",
            "additionalProperties": {},
            "nullable": true,
            "description": "Optionales JSON-Objekt, das mit der Verifizierung gespeichert und in Ergebnissen sowie Webhooks zurückgegeben wird."
          },
          "sandbox_scenario": {
            "type": "string",
            "minLength": 1,
            "description": "Nur für Sandbox-Anwendungen: Das simulierte Ergebnis – 'wallet_cancelled', 'wallet_timeout' oder 'wallet_provider_error'; jedes andere Szenario (oder keines) verifiziert erfolgreich. Bei Live-Anwendungen abgelehnt. Der vollständige Katalog ist unter GET /v1/sandbox/scenarios/ verfügbar."
          },
          "country": {
            "allOf": [
              {
                "$ref": "#/components/schemas/DigitalIdWalletApiIdcardEeWalletVerificationStartCountryEnum"
              }
            ],
            "default": "EST",
            "description": "ISO 3166-1-Alpha-3-Land der estnischen ID-Karten-Identität. Standardmäßig EST, das einzige Land, das unterstützt wird.\n\n* `EST` - EST"
          },
          "return_url": {
            "type": "string",
            "format": "uri",
            "minLength": 1,
            "description": "HTTPS-URL, zu der der Browser des Benutzers nach der Wallet zurückkehrt, wobei request_id und result angehängt werden. Ihr Host muss in den allowed_return_hosts der Anwendung registriert sein (oder deren White-Label-Domain sein). Vertrauen Sie result niemals allein: Rufen Sie das Ergebnis mit GET .../verifications/{request_id}/ oder über den Webhook ab.",
            "maxLength": 2048
          },
          "device": {
            "allOf": [
              {
                "$ref": "#/components/schemas/DigitalIdWalletApiDeviceEnum"
              }
            ],
            "default": "same_device",
            "description": "same_device, wenn sich der Benutzer auf dem Gerät anmeldet, das Ihre Seite anzeigt; cross_device, wenn er ein anderes Gerät verwendet (z. B. den QR-Code von BankID).\n\n* `same_device` - same_device\n* `cross_device` - cross_device"
          }
        },
        "required": [
          "return_url"
        ]
      },
      "DigitalIdWalletApiIdcardEeWalletVerificationStartCountryEnum": {
        "enum": [
          "EST"
        ],
        "type": "string",
        "description": "* `EST` - EST"
      },
      "DigitalIdWalletApiMobileIdWalletVerificationStartRequest": {
        "type": "object",
        "description": "Starten Sie eine Mobile-ID-Verifizierung (EST, LTU).",
        "properties": {
          "vendor_data": {
            "type": "string",
            "nullable": true,
            "description": "Ihre eigene Referenz für diese Verifizierung (z. B. Ihre Benutzer-ID). Wird in Ergebnissen und Webhooks zurückgegeben."
          },
          "metadata": {
            "type": "object",
            "additionalProperties": {},
            "nullable": true,
            "description": "Optionales JSON-Objekt, das mit der Verifizierung gespeichert und in Ergebnissen sowie Webhooks zurückgegeben wird."
          },
          "sandbox_scenario": {
            "type": "string",
            "minLength": 1,
            "description": "Nur für Sandbox-Anwendungen: Das simulierte Ergebnis – 'wallet_cancelled', 'wallet_timeout' oder 'wallet_provider_error'; jedes andere Szenario (oder keines) verifiziert erfolgreich. Bei Live-Anwendungen abgelehnt. Der vollständige Katalog ist unter GET /v1/sandbox/scenarios/ verfügbar."
          },
          "country": {
            "allOf": [
              {
                "$ref": "#/components/schemas/DigitalIdWalletApiMobileIdWalletVerificationStartCountryEnum"
              }
            ],
            "description": "ISO 3166-1-Alpha-3-Land der Mobile-ID-Identität.\n\n* `EST` - EST\n* `LTU` - LTU"
          },
          "personal_code": {
            "type": "string",
            "minLength": 1,
            "description": "Die nationale persönliche Identifikationsnummer des Benutzers. Sie dient zur Adressierung der Mobile-ID-App des Benutzers; der Benutzer bestätigt den Kontrollcode und gibt seine PIN in der App ein. Erfassen Sie die PIN niemals.",
            "pattern": "^[0-9-]{6,20}$"
          },
          "phone_number": {
            "type": "string",
            "minLength": 1,
            "description": "Die Mobile-ID-Telefonnummer im E.164-Format (+372... oder +370...).",
            "maxLength": 16
          }
        },
        "required": [
          "country",
          "personal_code",
          "phone_number"
        ]
      },
      "DigitalIdWalletApiMobileIdWalletVerificationStartCountryEnum": {
        "enum": [
          "EST",
          "LTU"
        ],
        "type": "string",
        "description": "* `EST` - EST\n* `LTU` - LTU"
      },
      "DigitalIdWalletApiSmartIdWalletVerificationStartRequest": {
        "type": "object",
        "description": "Starten Sie eine Smart-ID-Verifizierung (EST, LVA, LTU, BEL).",
        "properties": {
          "vendor_data": {
            "type": "string",
            "nullable": true,
            "description": "Ihre eigene Referenz für diese Verifizierung (z. B. Ihre Benutzer-ID). Wird in Ergebnissen und Webhooks zurückgegeben."
          },
          "metadata": {
            "type": "object",
            "additionalProperties": {},
            "nullable": true,
            "description": "Optionales JSON-Objekt, das mit der Verifizierung gespeichert und in Ergebnissen sowie Webhooks zurückgegeben wird."
          },
          "sandbox_scenario": {
            "type": "string",
            "minLength": 1,
            "description": "Nur für Sandbox-Anwendungen: Das simulierte Ergebnis – 'wallet_cancelled', 'wallet_timeout' oder 'wallet_provider_error'; jedes andere Szenario (oder keines) verifiziert erfolgreich. Bei Live-Anwendungen abgelehnt. Der vollständige Katalog ist unter GET /v1/sandbox/scenarios/ verfügbar."
          },
          "country": {
            "allOf": [
              {
                "$ref": "#/components/schemas/DigitalIdWalletApiSmartIdWalletVerificationStartCountryEnum"
              }
            ],
            "description": "ISO 3166-1-Alpha-3-Land der Smart-ID-Identität.\n\n* `EST` - EST\n* `LVA` - LVA\n* `LTU` - LTU\n* `BEL` - BEL"
          },
          "personal_code": {
            "type": "string",
            "minLength": 1,
            "description": "Die nationale persönliche Identifikationsnummer des Benutzers. Sie dient zur Adressierung der Smart-ID-App des Benutzers; der Benutzer bestätigt den Kontrollcode und gibt seine PIN in der App ein. Erfassen Sie die PIN niemals.",
            "pattern": "^[0-9-]{6,20}$"
          }
        },
        "required": [
          "country",
          "personal_code"
        ]
      },
      "DigitalIdWalletApiSmartIdWalletVerificationStartCountryEnum": {
        "enum": [
          "EST",
          "LVA",
          "LTU",
          "BEL"
        ],
        "type": "string",
        "description": "* `EST` - EST\n* `LVA` - LVA\n* `LTU` - LTU\n* `BEL` - BEL"
      },
      "DigitalIdWalletApiGovukWalletWalletVerificationStartRequest": {
        "type": "object",
        "description": "Starten Sie eine GOV.UK-Wallet-Verifizierung (GBR).",
        "properties": {
          "vendor_data": {
            "type": "string",
            "nullable": true,
            "description": "Ihre eigene Referenz für diese Verifizierung (z. B. Ihre Benutzer-ID). Wird in Ergebnissen und Webhooks zurückgegeben."
          },
          "metadata": {
            "type": "object",
            "additionalProperties": {},
            "nullable": true,
            "description": "Optionales JSON-Objekt, das mit der Verifizierung gespeichert und in Ergebnissen sowie Webhooks zurückgegeben wird."
          },
          "sandbox_scenario": {
            "type": "string",
            "minLength": 1,
            "description": "Nur für Sandbox-Anwendungen: Das simulierte Ergebnis – 'wallet_cancelled', 'wallet_timeout' oder 'wallet_provider_error'; jedes andere Szenario (oder keines) verifiziert erfolgreich. Bei Live-Anwendungen abgelehnt. Der vollständige Katalog ist unter GET /v1/sandbox/scenarios/ verfügbar."
          },
          "country": {
            "allOf": [
              {
                "$ref": "#/components/schemas/DigitalIdWalletApiCountry520Enum"
              }
            ],
            "default": "GBR",
            "description": "ISO 3166-1-Alpha-3-Land der GOV.UK Wallet-Identität. Standardmäßig GBR, das einzige Land, das unterstützt wird.\n\n* `GBR` - GBR"
          },
          "return_url": {
            "type": "string",
            "format": "uri",
            "minLength": 1,
            "description": "HTTPS-URL, zu der der Browser des Benutzers nach der Wallet zurückkehrt, wobei request_id und result angehängt werden. Ihr Host muss in den allowed_return_hosts der Anwendung registriert sein (oder deren White-Label-Domain sein). Vertrauen Sie result niemals allein: Rufen Sie das Ergebnis mit GET .../verifications/{request_id}/ oder über den Webhook ab.",
            "maxLength": 2048
          },
          "device": {
            "allOf": [
              {
                "$ref": "#/components/schemas/DigitalIdWalletApiDeviceEnum"
              }
            ],
            "default": "same_device",
            "description": "same_device, wenn sich der Benutzer auf dem Gerät anmeldet, das Ihre Seite anzeigt; cross_device, wenn er ein anderes Gerät verwendet (z. B. den QR-Code von BankID).\n\n* `same_device` - same_device\n* `cross_device` - cross_device"
          }
        },
        "required": [
          "return_url"
        ]
      },
      "DigitalIdWalletApiCountry520Enum": {
        "enum": [
          "GBR"
        ],
        "type": "string",
        "description": "* `GBR` - GBR"
      },
      "DigitalIdWalletApiOneidWalletVerificationStartRequest": {
        "type": "object",
        "description": "Starten Sie eine OneID-Verifizierung (GBR).",
        "properties": {
          "vendor_data": {
            "type": "string",
            "nullable": true,
            "description": "Ihre eigene Referenz für diese Verifizierung (z. B. Ihre Benutzer-ID). Wird in Ergebnissen und Webhooks zurückgegeben."
          },
          "metadata": {
            "type": "object",
            "additionalProperties": {},
            "nullable": true,
            "description": "Optionales JSON-Objekt, das mit der Verifizierung gespeichert und in Ergebnissen sowie Webhooks zurückgegeben wird."
          },
          "sandbox_scenario": {
            "type": "string",
            "minLength": 1,
            "description": "Nur für Sandbox-Anwendungen: Das simulierte Ergebnis – 'wallet_cancelled', 'wallet_timeout' oder 'wallet_provider_error'; jedes andere Szenario (oder keines) verifiziert erfolgreich. Bei Live-Anwendungen abgelehnt. Der vollständige Katalog ist unter GET /v1/sandbox/scenarios/ verfügbar."
          },
          "country": {
            "allOf": [
              {
                "$ref": "#/components/schemas/DigitalIdWalletApiCountry520Enum"
              }
            ],
            "default": "GBR",
            "description": "ISO 3166-1-Alpha-3-Land der OneID-Identität. Standardmäßig GBR, das einzige Land, das unterstützt wird.\n\n* `GBR` - GBR"
          },
          "return_url": {
            "type": "string",
            "format": "uri",
            "minLength": 1,
            "description": "HTTPS-URL, zu der der Browser des Benutzers nach der Wallet zurückkehrt, wobei request_id und result angehängt werden. Ihr Host muss in den allowed_return_hosts der Anwendung registriert sein (oder deren White-Label-Domain sein). Vertrauen Sie result niemals allein: Rufen Sie das Ergebnis mit GET .../verifications/{request_id}/ oder über den Webhook ab.",
            "maxLength": 2048
          },
          "device": {
            "allOf": [
              {
                "$ref": "#/components/schemas/DigitalIdWalletApiDeviceEnum"
              }
            ],
            "default": "same_device",
            "description": "same_device, wenn sich der Benutzer auf dem Gerät anmeldet, das Ihre Seite anzeigt; cross_device, wenn er ein anderes Gerät verwendet (z. B. den QR-Code von BankID).\n\n* `same_device` - same_device\n* `cross_device` - cross_device"
          }
        },
        "required": [
          "return_url"
        ]
      },
      "DigitalIdWalletApiGovbrWalletVerificationStartRequest": {
        "type": "object",
        "description": "Eine gov.br-Verifizierung (BRA) starten.",
        "properties": {
          "vendor_data": {
            "type": "string",
            "nullable": true,
            "description": "Ihre eigene Referenz für diese Verifizierung (z. B. Ihre Benutzer-ID). Wird in Ergebnissen und Webhooks zurückgegeben."
          },
          "metadata": {
            "type": "object",
            "additionalProperties": {},
            "nullable": true,
            "description": "Optionales JSON-Objekt, das mit der Verifizierung gespeichert und in Ergebnissen sowie Webhooks zurückgegeben wird."
          },
          "sandbox_scenario": {
            "type": "string",
            "minLength": 1,
            "description": "Nur für Sandbox-Anwendungen: Das simulierte Ergebnis – 'wallet_cancelled', 'wallet_timeout' oder 'wallet_provider_error'; jedes andere Szenario (oder keines) verifiziert erfolgreich. Bei Live-Anwendungen abgelehnt. Der vollständige Katalog ist unter GET /v1/sandbox/scenarios/ verfügbar."
          },
          "country": {
            "allOf": [
              {
                "$ref": "#/components/schemas/DigitalIdWalletApiGovbrWalletVerificationStartCountryEnum"
              }
            ],
            "default": "BRA",
            "description": "ISO 3166-1-Alpha-3-Land der gov.br-Identität. Standardmäßig BRA, das einzige Land, das unterstützt wird.\n\n* `BRA` - BRA"
          },
          "return_url": {
            "type": "string",
            "format": "uri",
            "minLength": 1,
            "description": "HTTPS-URL, zu der der Browser des Benutzers nach der Wallet zurückkehrt, wobei request_id und result angehängt werden. Ihr Host muss in den allowed_return_hosts der Anwendung registriert sein (oder deren White-Label-Domain sein). Vertrauen Sie result niemals allein: Rufen Sie das Ergebnis mit GET .../verifications/{request_id}/ oder über den Webhook ab.",
            "maxLength": 2048
          },
          "device": {
            "allOf": [
              {
                "$ref": "#/components/schemas/DigitalIdWalletApiDeviceEnum"
              }
            ],
            "default": "same_device",
            "description": "same_device, wenn sich der Benutzer auf dem Gerät anmeldet, das Ihre Seite anzeigt; cross_device, wenn er ein anderes Gerät verwendet (z. B. den QR-Code von BankID).\n\n* `same_device` - same_device\n* `cross_device` - cross_device"
          }
        },
        "required": [
          "return_url"
        ]
      },
      "DigitalIdWalletApiGovbrWalletVerificationStartCountryEnum": {
        "enum": [
          "BRA"
        ],
        "type": "string",
        "description": "* `BRA` - BRA"
      },
      "DigitalIdWalletApiUaePassWalletVerificationStartRequest": {
        "type": "object",
        "description": "Starten Sie eine UAE PASS-Verifizierung (ARE).",
        "properties": {
          "vendor_data": {
            "type": "string",
            "nullable": true,
            "description": "Ihre eigene Referenz für diese Verifizierung (z. B. Ihre Benutzer-ID). Wird in Ergebnissen und Webhooks zurückgegeben."
          },
          "metadata": {
            "type": "object",
            "additionalProperties": {},
            "nullable": true,
            "description": "Optionales JSON-Objekt, das mit der Verifizierung gespeichert und in Ergebnissen sowie Webhooks zurückgegeben wird."
          },
          "sandbox_scenario": {
            "type": "string",
            "minLength": 1,
            "description": "Nur für Sandbox-Anwendungen: Das simulierte Ergebnis – 'wallet_cancelled', 'wallet_timeout' oder 'wallet_provider_error'; jedes andere Szenario (oder keines) verifiziert erfolgreich. Bei Live-Anwendungen abgelehnt. Der vollständige Katalog ist unter GET /v1/sandbox/scenarios/ verfügbar."
          },
          "country": {
            "allOf": [
              {
                "$ref": "#/components/schemas/DigitalIdWalletApiUaePassWalletVerificationStartCountryEnum"
              }
            ],
            "default": "ARE",
            "description": "ISO 3166-1-Alpha-3-Land der UAE PASS-Identität. Standardmäßig ARE, das einzige Land, das unterstützt wird.\n\n* `ARE` - ARE"
          },
          "return_url": {
            "type": "string",
            "format": "uri",
            "minLength": 1,
            "description": "HTTPS-URL, zu der der Browser des Benutzers nach der Wallet zurückkehrt, wobei request_id und result angehängt werden. Ihr Host muss in den allowed_return_hosts der Anwendung registriert sein (oder deren White-Label-Domain sein). Vertrauen Sie result niemals allein: Rufen Sie das Ergebnis mit GET .../verifications/{request_id}/ oder über den Webhook ab.",
            "maxLength": 2048
          },
          "device": {
            "allOf": [
              {
                "$ref": "#/components/schemas/DigitalIdWalletApiDeviceEnum"
              }
            ],
            "default": "same_device",
            "description": "same_device, wenn sich der Benutzer auf dem Gerät anmeldet, das Ihre Seite anzeigt; cross_device, wenn er ein anderes Gerät verwendet (z. B. den QR-Code von BankID).\n\n* `same_device` - same_device\n* `cross_device` - cross_device"
          }
        },
        "required": [
          "return_url"
        ]
      },
      "DigitalIdWalletApiUaePassWalletVerificationStartCountryEnum": {
        "enum": [
          "ARE"
        ],
        "type": "string",
        "description": "* `ARE` - ARE"
      },
      "DigitalIdWalletApiFrejaidWalletVerificationStartRequest": {
        "type": "object",
        "description": "Starten Sie eine Freja-eID-Verifizierung (SWE).",
        "properties": {
          "vendor_data": {
            "type": "string",
            "nullable": true,
            "description": "Ihre eigene Referenz für diese Verifizierung (z. B. Ihre Benutzer-ID). Wird in Ergebnissen und Webhooks zurückgegeben."
          },
          "metadata": {
            "type": "object",
            "additionalProperties": {},
            "nullable": true,
            "description": "Optionales JSON-Objekt, das mit der Verifizierung gespeichert und in Ergebnissen sowie Webhooks zurückgegeben wird."
          },
          "sandbox_scenario": {
            "type": "string",
            "minLength": 1,
            "description": "Nur für Sandbox-Anwendungen: Das simulierte Ergebnis – 'wallet_cancelled', 'wallet_timeout' oder 'wallet_provider_error'; jedes andere Szenario (oder keines) verifiziert erfolgreich. Bei Live-Anwendungen abgelehnt. Der vollständige Katalog ist unter GET /v1/sandbox/scenarios/ verfügbar."
          },
          "country": {
            "allOf": [
              {
                "$ref": "#/components/schemas/DigitalIdWalletApiCountryEe9Enum"
              }
            ],
            "default": "SWE",
            "description": "ISO 3166-1-Alpha-3-Land der Freja eID-Identität. Standardmäßig SWE, das einzige Land, das unterstützt wird.\n\n* `SWE` - SWE"
          },
          "return_url": {
            "type": "string",
            "format": "uri",
            "minLength": 1,
            "description": "HTTPS-URL, zu der der Browser des Benutzers nach der Wallet zurückkehrt, wobei request_id und result angehängt werden. Ihr Host muss in den allowed_return_hosts der Anwendung registriert sein (oder deren White-Label-Domain sein). Vertrauen Sie result niemals allein: Rufen Sie das Ergebnis mit GET .../verifications/{request_id}/ oder über den Webhook ab.",
            "maxLength": 2048
          },
          "device": {
            "allOf": [
              {
                "$ref": "#/components/schemas/DigitalIdWalletApiDeviceEnum"
              }
            ],
            "default": "same_device",
            "description": "same_device, wenn sich der Benutzer auf dem Gerät anmeldet, das Ihre Seite anzeigt; cross_device, wenn er ein anderes Gerät verwendet (z. B. den QR-Code von BankID).\n\n* `same_device` - same_device\n* `cross_device` - cross_device"
          }
        },
        "required": [
          "return_url"
        ]
      },
      "DigitalIdWalletApiCountryEe9Enum": {
        "enum": [
          "SWE"
        ],
        "type": "string",
        "description": "* `SWE` - SWE"
      },
      "DigitalIdWalletApiPersonalausweisWalletVerificationStartRequest": {
        "type": "object",
        "description": "Starten Sie eine Personalausweis-Verifizierung (DEU).",
        "properties": {
          "vendor_data": {
            "type": "string",
            "nullable": true,
            "description": "Ihre eigene Referenz für diese Verifizierung (z. B. Ihre Benutzer-ID). Wird in Ergebnissen und Webhooks zurückgegeben."
          },
          "metadata": {
            "type": "object",
            "additionalProperties": {},
            "nullable": true,
            "description": "Optionales JSON-Objekt, das mit der Verifizierung gespeichert und in Ergebnissen sowie Webhooks zurückgegeben wird."
          },
          "sandbox_scenario": {
            "type": "string",
            "minLength": 1,
            "description": "Nur für Sandbox-Anwendungen: Das simulierte Ergebnis – 'wallet_cancelled', 'wallet_timeout' oder 'wallet_provider_error'; jedes andere Szenario (oder keines) verifiziert erfolgreich. Bei Live-Anwendungen abgelehnt. Der vollständige Katalog ist unter GET /v1/sandbox/scenarios/ verfügbar."
          },
          "country": {
            "allOf": [
              {
                "$ref": "#/components/schemas/DigitalIdWalletApiPersonalausweisWalletVerificationStartCountryEnum"
              }
            ],
            "default": "DEU",
            "description": "ISO 3166-1-Alpha-3-Land der Personalausweis-Identität. Standardmäßig DEU, das einzige Land, das unterstützt wird.\n\n* `DEU` - DEU"
          },
          "return_url": {
            "type": "string",
            "format": "uri",
            "minLength": 1,
            "description": "HTTPS-URL, zu der der Browser des Benutzers nach der Wallet zurückkehrt, wobei request_id und result angehängt werden. Ihr Host muss in den allowed_return_hosts der Anwendung registriert sein (oder deren White-Label-Domain sein). Vertrauen Sie result niemals allein: Rufen Sie das Ergebnis mit GET .../verifications/{request_id}/ oder über den Webhook ab.",
            "maxLength": 2048
          },
          "device": {
            "allOf": [
              {
                "$ref": "#/components/schemas/DigitalIdWalletApiDeviceEnum"
              }
            ],
            "default": "same_device",
            "description": "same_device, wenn sich der Benutzer auf dem Gerät anmeldet, das Ihre Seite anzeigt; cross_device, wenn er ein anderes Gerät verwendet (z. B. den QR-Code von BankID).\n\n* `same_device` - same_device\n* `cross_device` - cross_device"
          }
        },
        "required": [
          "return_url"
        ]
      },
      "DigitalIdWalletApiPersonalausweisWalletVerificationStartCountryEnum": {
        "enum": [
          "DEU"
        ],
        "type": "string",
        "description": "* `DEU` - DEU"
      },
      "DigitalIdWalletApiFtnWalletVerificationStartRequest": {
        "type": "object",
        "description": "Starten Sie eine Verifizierung über das Finnish Trust Network (FIN).",
        "properties": {
          "vendor_data": {
            "type": "string",
            "nullable": true,
            "description": "Ihre eigene Referenz für diese Verifizierung (z. B. Ihre Benutzer-ID). Wird in Ergebnissen und Webhooks zurückgegeben."
          },
          "metadata": {
            "type": "object",
            "additionalProperties": {},
            "nullable": true,
            "description": "Optionales JSON-Objekt, das mit der Verifizierung gespeichert und in Ergebnissen sowie Webhooks zurückgegeben wird."
          },
          "sandbox_scenario": {
            "type": "string",
            "minLength": 1,
            "description": "Nur für Sandbox-Anwendungen: Das simulierte Ergebnis – 'wallet_cancelled', 'wallet_timeout' oder 'wallet_provider_error'; jedes andere Szenario (oder keines) verifiziert erfolgreich. Bei Live-Anwendungen abgelehnt. Der vollständige Katalog ist unter GET /v1/sandbox/scenarios/ verfügbar."
          },
          "country": {
            "allOf": [
              {
                "$ref": "#/components/schemas/DigitalIdWalletApiFtnWalletVerificationStartCountryEnum"
              }
            ],
            "default": "FIN",
            "description": "ISO 3166-1-Alpha-3-Land der Finnish Trust Network-Identität. Standardmäßig FIN, das einzige Land, das unterstützt wird.\n\n* `FIN` - FIN"
          },
          "return_url": {
            "type": "string",
            "format": "uri",
            "minLength": 1,
            "description": "HTTPS-URL, zu der der Browser des Benutzers nach der Wallet zurückkehrt, wobei request_id und result angehängt werden. Ihr Host muss in den allowed_return_hosts der Anwendung registriert sein (oder deren White-Label-Domain sein). Vertrauen Sie result niemals allein: Rufen Sie das Ergebnis mit GET .../verifications/{request_id}/ oder über den Webhook ab.",
            "maxLength": 2048
          },
          "device": {
            "allOf": [
              {
                "$ref": "#/components/schemas/DigitalIdWalletApiDeviceEnum"
              }
            ],
            "default": "same_device",
            "description": "same_device, wenn sich der Benutzer auf dem Gerät anmeldet, das Ihre Seite anzeigt; cross_device, wenn er ein anderes Gerät verwendet (z. B. den QR-Code von BankID).\n\n* `same_device` - same_device\n* `cross_device` - cross_device"
          }
        },
        "required": [
          "return_url"
        ]
      },
      "DigitalIdWalletApiFtnWalletVerificationStartCountryEnum": {
        "enum": [
          "FIN"
        ],
        "type": "string",
        "description": "* `FIN` - FIN"
      },
      "DigitalIdWalletApiIdinWalletVerificationStartRequest": {
        "type": "object",
        "description": "Eine iDIN-Verifizierung (NLD) starten.",
        "properties": {
          "vendor_data": {
            "type": "string",
            "nullable": true,
            "description": "Ihre eigene Referenz für diese Verifizierung (z. B. Ihre Benutzer-ID). Wird in Ergebnissen und Webhooks zurückgegeben."
          },
          "metadata": {
            "type": "object",
            "additionalProperties": {},
            "nullable": true,
            "description": "Optionales JSON-Objekt, das mit der Verifizierung gespeichert und in Ergebnissen sowie Webhooks zurückgegeben wird."
          },
          "sandbox_scenario": {
            "type": "string",
            "minLength": 1,
            "description": "Nur für Sandbox-Anwendungen: Das simulierte Ergebnis – 'wallet_cancelled', 'wallet_timeout' oder 'wallet_provider_error'; jedes andere Szenario (oder keines) verifiziert erfolgreich. Bei Live-Anwendungen abgelehnt. Der vollständige Katalog ist unter GET /v1/sandbox/scenarios/ verfügbar."
          },
          "country": {
            "allOf": [
              {
                "$ref": "#/components/schemas/DigitalIdWalletApiIdinWalletVerificationStartCountryEnum"
              }
            ],
            "default": "NLD",
            "description": "ISO 3166-1-Alpha-3-Land der iDIN-Identität. Standardmäßig NLD, das einzige Land, das unterstützt wird.\n\n* `NLD` - NLD"
          },
          "return_url": {
            "type": "string",
            "format": "uri",
            "minLength": 1,
            "description": "HTTPS-URL, zu der der Browser des Benutzers nach der Wallet zurückkehrt, wobei request_id und result angehängt werden. Ihr Host muss in den allowed_return_hosts der Anwendung registriert sein (oder deren White-Label-Domain sein). Vertrauen Sie result niemals allein: Rufen Sie das Ergebnis mit GET .../verifications/{request_id}/ oder über den Webhook ab.",
            "maxLength": 2048
          },
          "device": {
            "allOf": [
              {
                "$ref": "#/components/schemas/DigitalIdWalletApiDeviceEnum"
              }
            ],
            "default": "same_device",
            "description": "same_device, wenn sich der Benutzer auf dem Gerät anmeldet, das Ihre Seite anzeigt; cross_device, wenn er ein anderes Gerät verwendet (z. B. den QR-Code von BankID).\n\n* `same_device` - same_device\n* `cross_device` - cross_device"
          }
        },
        "required": [
          "return_url"
        ]
      },
      "DigitalIdWalletApiIdinWalletVerificationStartCountryEnum": {
        "enum": [
          "NLD"
        ],
        "type": "string",
        "description": "* `NLD` - NLD"
      },
      "DigitalIdWalletApiItsmeWalletVerificationStartRequest": {
        "type": "object",
        "description": "Eine itsme-Verifizierung (BEL, LUX, NLD) starten.",
        "properties": {
          "vendor_data": {
            "type": "string",
            "nullable": true,
            "description": "Ihre eigene Referenz für diese Verifizierung (z. B. Ihre Benutzer-ID). Wird in Ergebnissen und Webhooks zurückgegeben."
          },
          "metadata": {
            "type": "object",
            "additionalProperties": {},
            "nullable": true,
            "description": "Optionales JSON-Objekt, das mit der Verifizierung gespeichert und in Ergebnissen sowie Webhooks zurückgegeben wird."
          },
          "sandbox_scenario": {
            "type": "string",
            "minLength": 1,
            "description": "Nur für Sandbox-Anwendungen: Das simulierte Ergebnis – 'wallet_cancelled', 'wallet_timeout' oder 'wallet_provider_error'; jedes andere Szenario (oder keines) verifiziert erfolgreich. Bei Live-Anwendungen abgelehnt. Der vollständige Katalog ist unter GET /v1/sandbox/scenarios/ verfügbar."
          },
          "country": {
            "allOf": [
              {
                "$ref": "#/components/schemas/DigitalIdWalletApiItsmeWalletVerificationStartCountryEnum"
              }
            ],
            "description": "ISO 3166-1-Alpha-3-Land der itsme-Identität.\n\n* `BEL` - BEL\n* `LUX` - LUX\n* `NLD` - NLD"
          },
          "return_url": {
            "type": "string",
            "format": "uri",
            "minLength": 1,
            "description": "HTTPS-URL, zu der der Browser des Benutzers nach der Wallet zurückkehrt, wobei request_id und result angehängt werden. Ihr Host muss in den allowed_return_hosts der Anwendung registriert sein (oder deren White-Label-Domain sein). Vertrauen Sie result niemals allein: Rufen Sie das Ergebnis mit GET .../verifications/{request_id}/ oder über den Webhook ab.",
            "maxLength": 2048
          },
          "device": {
            "allOf": [
              {
                "$ref": "#/components/schemas/DigitalIdWalletApiDeviceEnum"
              }
            ],
            "default": "same_device",
            "description": "same_device, wenn sich der Benutzer auf dem Gerät anmeldet, das Ihre Seite anzeigt; cross_device, wenn er ein anderes Gerät verwendet (z. B. den QR-Code von BankID).\n\n* `same_device` - same_device\n* `cross_device` - cross_device"
          }
        },
        "required": [
          "country",
          "return_url"
        ]
      },
      "DigitalIdWalletApiItsmeWalletVerificationStartCountryEnum": {
        "enum": [
          "BEL",
          "LUX",
          "NLD"
        ],
        "type": "string",
        "description": "* `BEL` - BEL\n* `LUX` - LUX\n* `NLD` - NLD"
      },
      "DigitalIdWalletApiBuypassWalletVerificationStartRequest": {
        "type": "object",
        "description": "Starten Sie eine Buypass ID-Verifizierung (NOR).",
        "properties": {
          "vendor_data": {
            "type": "string",
            "nullable": true,
            "description": "Ihre eigene Referenz für diese Verifizierung (z. B. Ihre Benutzer-ID). Wird in Ergebnissen und Webhooks zurückgegeben."
          },
          "metadata": {
            "type": "object",
            "additionalProperties": {},
            "nullable": true,
            "description": "Optionales JSON-Objekt, das mit der Verifizierung gespeichert und in Ergebnissen sowie Webhooks zurückgegeben wird."
          },
          "sandbox_scenario": {
            "type": "string",
            "minLength": 1,
            "description": "Nur für Sandbox-Anwendungen: Das simulierte Ergebnis – 'wallet_cancelled', 'wallet_timeout' oder 'wallet_provider_error'; jedes andere Szenario (oder keines) verifiziert erfolgreich. Bei Live-Anwendungen abgelehnt. Der vollständige Katalog ist unter GET /v1/sandbox/scenarios/ verfügbar."
          },
          "country": {
            "allOf": [
              {
                "$ref": "#/components/schemas/DigitalIdWalletApiCountryAfcEnum"
              }
            ],
            "default": "NOR",
            "description": "ISO 3166-1-Alpha-3-Land der Buypass ID-Identität. Standardmäßig NOR, das einzige Land, das unterstützt wird.\n\n* `NOR` - NOR"
          },
          "return_url": {
            "type": "string",
            "format": "uri",
            "minLength": 1,
            "description": "HTTPS-URL, zu der der Browser des Benutzers nach der Wallet zurückkehrt, wobei request_id und result angehängt werden. Ihr Host muss in den allowed_return_hosts der Anwendung registriert sein (oder deren White-Label-Domain sein). Vertrauen Sie result niemals allein: Rufen Sie das Ergebnis mit GET .../verifications/{request_id}/ oder über den Webhook ab.",
            "maxLength": 2048
          },
          "device": {
            "allOf": [
              {
                "$ref": "#/components/schemas/DigitalIdWalletApiDeviceEnum"
              }
            ],
            "default": "same_device",
            "description": "same_device, wenn sich der Benutzer auf dem Gerät anmeldet, das Ihre Seite anzeigt; cross_device, wenn er ein anderes Gerät verwendet (z. B. den QR-Code von BankID).\n\n* `same_device` - same_device\n* `cross_device` - cross_device"
          }
        },
        "required": [
          "return_url"
        ]
      },
      "DigitalIdWalletApiCountryAfcEnum": {
        "enum": [
          "NOR"
        ],
        "type": "string",
        "description": "* `NOR` - NOR"
      },
      "DigitalIdWalletApiVippsWalletVerificationStartRequest": {
        "type": "object",
        "description": "Starten Sie eine Vipps-Verifizierung (NOR).",
        "properties": {
          "vendor_data": {
            "type": "string",
            "nullable": true,
            "description": "Ihre eigene Referenz für diese Verifizierung (z. B. Ihre Benutzer-ID). Wird in Ergebnissen und Webhooks zurückgegeben."
          },
          "metadata": {
            "type": "object",
            "additionalProperties": {},
            "nullable": true,
            "description": "Optionales JSON-Objekt, das mit der Verifizierung gespeichert und in Ergebnissen sowie Webhooks zurückgegeben wird."
          },
          "sandbox_scenario": {
            "type": "string",
            "minLength": 1,
            "description": "Nur für Sandbox-Anwendungen: Das simulierte Ergebnis – 'wallet_cancelled', 'wallet_timeout' oder 'wallet_provider_error'; jedes andere Szenario (oder keines) verifiziert erfolgreich. Bei Live-Anwendungen abgelehnt. Der vollständige Katalog ist unter GET /v1/sandbox/scenarios/ verfügbar."
          },
          "country": {
            "allOf": [
              {
                "$ref": "#/components/schemas/DigitalIdWalletApiCountryAfcEnum"
              }
            ],
            "default": "NOR",
            "description": "ISO 3166-1-Alpha-3-Land der Vipps-Identität. Standardmäßig NOR, das einzige Land, das unterstützt wird.\n\n* `NOR` - NOR"
          },
          "return_url": {
            "type": "string",
            "format": "uri",
            "minLength": 1,
            "description": "HTTPS-URL, zu der der Browser des Benutzers nach der Wallet zurückkehrt, wobei request_id und result angehängt werden. Ihr Host muss in den allowed_return_hosts der Anwendung registriert sein (oder deren White-Label-Domain sein). Vertrauen Sie result niemals allein: Rufen Sie das Ergebnis mit GET .../verifications/{request_id}/ oder über den Webhook ab.",
            "maxLength": 2048
          },
          "device": {
            "allOf": [
              {
                "$ref": "#/components/schemas/DigitalIdWalletApiDeviceEnum"
              }
            ],
            "default": "same_device",
            "description": "same_device, wenn sich der Benutzer auf dem Gerät anmeldet, das Ihre Seite anzeigt; cross_device, wenn er ein anderes Gerät verwendet (z. B. den QR-Code von BankID).\n\n* `same_device` - same_device\n* `cross_device` - cross_device"
          }
        },
        "required": [
          "return_url"
        ]
      },
      "DigitalIdWalletApiBankidNoWalletVerificationStartRequest": {
        "type": "object",
        "description": "Starten Sie eine BankID-Verifizierung (NOR).",
        "properties": {
          "vendor_data": {
            "type": "string",
            "nullable": true,
            "description": "Ihre eigene Referenz für diese Verifizierung (z. B. Ihre Benutzer-ID). Wird in Ergebnissen und Webhooks zurückgegeben."
          },
          "metadata": {
            "type": "object",
            "additionalProperties": {},
            "nullable": true,
            "description": "Optionales JSON-Objekt, das mit der Verifizierung gespeichert und in Ergebnissen sowie Webhooks zurückgegeben wird."
          },
          "sandbox_scenario": {
            "type": "string",
            "minLength": 1,
            "description": "Nur für Sandbox-Anwendungen: Das simulierte Ergebnis – 'wallet_cancelled', 'wallet_timeout' oder 'wallet_provider_error'; jedes andere Szenario (oder keines) verifiziert erfolgreich. Bei Live-Anwendungen abgelehnt. Der vollständige Katalog ist unter GET /v1/sandbox/scenarios/ verfügbar."
          },
          "country": {
            "allOf": [
              {
                "$ref": "#/components/schemas/DigitalIdWalletApiCountryAfcEnum"
              }
            ],
            "default": "NOR",
            "description": "ISO 3166-1-Alpha-3-Land der BankID-Identität. Standardmäßig NOR, das einzige Land, das unterstützt wird.\n\n* `NOR` - NOR"
          },
          "return_url": {
            "type": "string",
            "format": "uri",
            "minLength": 1,
            "description": "HTTPS-URL, zu der der Browser des Benutzers nach der Wallet zurückkehrt, wobei request_id und result angehängt werden. Ihr Host muss in den allowed_return_hosts der Anwendung registriert sein (oder deren White-Label-Domain sein). Vertrauen Sie result niemals allein: Rufen Sie das Ergebnis mit GET .../verifications/{request_id}/ oder über den Webhook ab.",
            "maxLength": 2048
          },
          "device": {
            "allOf": [
              {
                "$ref": "#/components/schemas/DigitalIdWalletApiDeviceEnum"
              }
            ],
            "default": "same_device",
            "description": "same_device, wenn sich der Benutzer auf dem Gerät anmeldet, das Ihre Seite anzeigt; cross_device, wenn er ein anderes Gerät verwendet (z. B. den QR-Code von BankID).\n\n* `same_device` - same_device\n* `cross_device` - cross_device"
          }
        },
        "required": [
          "return_url"
        ]
      },
      "DigitalIdWalletApiBankidSeWalletVerificationStartRequest": {
        "type": "object",
        "description": "Starten Sie eine BankID-Verifizierung (SWE).",
        "properties": {
          "vendor_data": {
            "type": "string",
            "nullable": true,
            "description": "Ihre eigene Referenz für diese Verifizierung (z. B. Ihre Benutzer-ID). Wird in Ergebnissen und Webhooks zurückgegeben."
          },
          "metadata": {
            "type": "object",
            "additionalProperties": {},
            "nullable": true,
            "description": "Optionales JSON-Objekt, das mit der Verifizierung gespeichert und in Ergebnissen sowie Webhooks zurückgegeben wird."
          },
          "sandbox_scenario": {
            "type": "string",
            "minLength": 1,
            "description": "Nur für Sandbox-Anwendungen: Das simulierte Ergebnis – 'wallet_cancelled', 'wallet_timeout' oder 'wallet_provider_error'; jedes andere Szenario (oder keines) verifiziert erfolgreich. Bei Live-Anwendungen abgelehnt. Der vollständige Katalog ist unter GET /v1/sandbox/scenarios/ verfügbar."
          },
          "country": {
            "allOf": [
              {
                "$ref": "#/components/schemas/DigitalIdWalletApiCountryEe9Enum"
              }
            ],
            "default": "SWE",
            "description": "ISO 3166-1-Alpha-3-Land der BankID-Identität. Standardmäßig SWE, das einzige Land, das unterstützt wird.\n\n* `SWE` - SWE"
          },
          "return_url": {
            "type": "string",
            "format": "uri",
            "minLength": 1,
            "description": "HTTPS-URL, zu der der Browser des Benutzers nach der Wallet zurückkehrt, wobei request_id und result angehängt werden. Ihr Host muss in den allowed_return_hosts der Anwendung registriert sein (oder deren White-Label-Domain sein). Vertrauen Sie result niemals allein: Rufen Sie das Ergebnis mit GET .../verifications/{request_id}/ oder über den Webhook ab.",
            "maxLength": 2048
          },
          "device": {
            "allOf": [
              {
                "$ref": "#/components/schemas/DigitalIdWalletApiDeviceEnum"
              }
            ],
            "default": "same_device",
            "description": "same_device, wenn sich der Benutzer auf dem Gerät anmeldet, das Ihre Seite anzeigt; cross_device, wenn er ein anderes Gerät verwendet (z. B. den QR-Code von BankID).\n\n* `same_device` - same_device\n* `cross_device` - cross_device"
          }
        },
        "required": [
          "return_url"
        ]
      },
      "DigitalIdWalletApiMitidWalletVerificationStartRequest": {
        "type": "object",
        "description": "Starten Sie eine MitID-Verifizierung (DNK).",
        "properties": {
          "vendor_data": {
            "type": "string",
            "nullable": true,
            "description": "Ihre eigene Referenz für diese Verifizierung (z. B. Ihre Benutzer-ID). Wird in Ergebnissen und Webhooks zurückgegeben."
          },
          "metadata": {
            "type": "object",
            "additionalProperties": {},
            "nullable": true,
            "description": "Optionales JSON-Objekt, das mit der Verifizierung gespeichert und in Ergebnissen sowie Webhooks zurückgegeben wird."
          },
          "sandbox_scenario": {
            "type": "string",
            "minLength": 1,
            "description": "Nur für Sandbox-Anwendungen: Das simulierte Ergebnis – 'wallet_cancelled', 'wallet_timeout' oder 'wallet_provider_error'; jedes andere Szenario (oder keines) verifiziert erfolgreich. Bei Live-Anwendungen abgelehnt. Der vollständige Katalog ist unter GET /v1/sandbox/scenarios/ verfügbar."
          },
          "country": {
            "allOf": [
              {
                "$ref": "#/components/schemas/DigitalIdWalletApiMitidWalletVerificationStartCountryEnum"
              }
            ],
            "default": "DNK",
            "description": "ISO 3166-1-Alpha-3-Land der MitID-Identität. Standardmäßig DNK, das einzige Land, das unterstützt wird.\n\n* `DNK` - DNK"
          },
          "return_url": {
            "type": "string",
            "format": "uri",
            "minLength": 1,
            "description": "HTTPS-URL, zu der der Browser des Benutzers nach der Wallet zurückkehrt, wobei request_id und result angehängt werden. Ihr Host muss in den allowed_return_hosts der Anwendung registriert sein (oder deren White-Label-Domain sein). Vertrauen Sie result niemals allein: Rufen Sie das Ergebnis mit GET .../verifications/{request_id}/ oder über den Webhook ab.",
            "maxLength": 2048
          },
          "device": {
            "allOf": [
              {
                "$ref": "#/components/schemas/DigitalIdWalletApiDeviceEnum"
              }
            ],
            "default": "same_device",
            "description": "same_device, wenn sich der Benutzer auf dem Gerät anmeldet, das Ihre Seite anzeigt; cross_device, wenn er ein anderes Gerät verwendet (z. B. den QR-Code von BankID).\n\n* `same_device` - same_device\n* `cross_device` - cross_device"
          }
        },
        "required": [
          "return_url"
        ]
      },
      "DigitalIdWalletApiMitidWalletVerificationStartCountryEnum": {
        "enum": [
          "DNK"
        ],
        "type": "string",
        "description": "* `DNK` - DNK"
      },
      "DigitalIdWalletApiWalletCatalogResponse": {
        "type": "object",
        "properties": {
          "wallets": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/DigitalIdWalletApiWalletCatalogEntry"
            }
          }
        },
        "required": [
          "wallets"
        ]
      },
      "DigitalIdWalletApiWalletCatalogEntry": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "path": {
            "type": "string",
            "description": "Der Start-Endpoint der Wallet selbst."
          },
          "countries": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "issuing_authority": {
            "type": "string"
          },
          "level_of_assurance": {
            "type": "string",
            "nullable": true
          },
          "interaction": {
            "$ref": "#/components/schemas/DigitalIdWalletApiInteractionEnum"
          },
          "required_fields": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "available": {
            "type": "boolean",
            "description": "Gibt an, ob diese Anwendung dies jetzt in dieser Umgebung starten kann. Aufgeführt bedeutet nicht, dass es aktiv ist."
          }
        },
        "required": [
          "available",
          "countries",
          "id",
          "interaction",
          "issuing_authority",
          "level_of_assurance",
          "name",
          "path",
          "required_fields"
        ]
      },
      "CaseDuplicateCaseDuplicate": {
        "type": "object",
        "properties": {
          "uuid": {
            "type": "string",
            "format": "uuid",
            "readOnly": true
          },
          "case_number": {
            "type": "string",
            "nullable": true,
            "maxLength": 32
          },
          "title": {
            "type": "string",
            "maxLength": 255
          },
          "status": {
            "$ref": "#/components/schemas/CaseDuplicateStatusEnum"
          },
          "priority": {
            "$ref": "#/components/schemas/CaseDuplicatePriorityEnum"
          },
          "created_at": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          }
        },
        "required": [
          "created_at",
          "title",
          "uuid"
        ]
      },
      "CaseDuplicateCaseDuplicatePage": {
        "type": "object",
        "properties": {
          "count": {
            "type": "integer"
          },
          "next_offset": {
            "type": "integer",
            "nullable": true
          },
          "results": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/CaseDuplicateCaseDuplicate"
            }
          }
        },
        "required": [
          "count",
          "next_offset",
          "results"
        ]
      },
      "RoutingPublicationPolicyDraftResponse": {
        "type": "object",
        "properties": {
          "draft": {
            "allOf": [
              {
                "$ref": "#/components/schemas/RoutingPublicationPolicyDraft"
              }
            ],
            "nullable": true
          }
        },
        "required": [
          "draft"
        ]
      },
      "RoutingPublicationPolicyDraftWriteRequest": {
        "type": "object",
        "properties": {
          "expected_version": {
            "type": "integer",
            "minimum": 0
          },
          "expected_revision": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "changes": {
            "type": "object",
            "additionalProperties": {}
          }
        },
        "required": [
          "changes",
          "expected_revision",
          "expected_version"
        ]
      },
      "CasePublicationPolicyDraft": {
        "type": "object",
        "properties": {
          "revision": {
            "type": "string",
            "format": "uuid"
          },
          "base_version": {
            "type": "integer",
            "maximum": 2147483647,
            "minimum": 0
          },
          "changes": {},
          "actor_email": {
            "type": "string",
            "format": "email",
            "nullable": true,
            "maxLength": 254
          },
          "updated_at": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          }
        },
        "required": [
          "base_version",
          "updated_at"
        ]
      },
      "CasePublicationPolicyDraftPreconditionRequest": {
        "type": "object",
        "properties": {
          "expected_version": {
            "type": "integer",
            "minimum": 0
          },
          "expected_revision": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          }
        },
        "required": [
          "expected_revision",
          "expected_version"
        ]
      },
      "CaseCollaborationCaseNote": {
        "type": "object",
        "properties": {
          "uuid": {
            "type": "string",
            "format": "uuid",
            "readOnly": true
          },
          "comment": {
            "type": "string"
          },
          "actor_email": {
            "type": "string",
            "format": "email",
            "nullable": true,
            "maxLength": 255
          },
          "actor_name": {
            "type": "string",
            "nullable": true,
            "maxLength": 255
          },
          "mentioned_emails": {},
          "is_internal": {
            "type": "boolean"
          },
          "attachments": {},
          "tags": {},
          "created_at": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          },
          "reply_to": {
            "allOf": [
              {
                "$ref": "#/components/schemas/CaseCollaborationCaseNoteReply"
              }
            ],
            "nullable": true,
            "readOnly": true
          },
          "is_pinned": {
            "type": "boolean"
          },
          "client_reference": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          }
        },
        "required": [
          "comment",
          "created_at",
          "reply_to",
          "uuid"
        ]
      },
      "CustomerMessagingPaginatedCaseRequestList": {
        "type": "object",
        "required": [
          "count",
          "results"
        ],
        "properties": {
          "count": {
            "type": "integer",
            "example": 123
          },
          "next": {
            "type": "string",
            "nullable": true,
            "format": "uri",
            "example": "http://api.example.org/accounts/?offset=400&limit=100"
          },
          "previous": {
            "type": "string",
            "nullable": true,
            "format": "uri",
            "example": "http://api.example.org/accounts/?offset=200&limit=100"
          },
          "results": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/CustomerMessagingCaseRequest"
            }
          }
        }
      },
      "FraudCheckResponse": {
        "type": "object",
        "properties": {
          "check_id": {
            "type": "string",
            "format": "uuid"
          },
          "request_id": {
            "type": "string",
            "format": "uuid",
            "description": "Native-Verifizierungssitzung, die für diese Prüfung erstellt wurde."
          },
          "client_reference": {
            "type": "string",
            "nullable": true
          },
          "processing_status": {
            "$ref": "#/components/schemas/FraudProcessingStatusEnum"
          },
          "profile_id": {
            "type": "string"
          },
          "profile_version": {
            "type": "string"
          },
          "created_at": {
            "type": "string",
            "format": "date-time"
          },
          "completed_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "inputs": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/FraudCheckInput"
            }
          },
          "modules": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/FraudCheckModuleReport"
            }
          },
          "attribute_evidence": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": {}
            }
          },
          "compound_evidence": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": {}
            }
          },
          "risk": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/FraudCheckRisk"
            }
          },
          "network": {
            "type": "object",
            "additionalProperties": {}
          },
          "enrichment": {
            "type": "object",
            "additionalProperties": {}
          },
          "identity_relationship": {
            "allOf": [
              {
                "$ref": "#/components/schemas/FraudCheckIdentityRelationship"
              }
            ],
            "nullable": true
          },
          "recommendation": {
            "$ref": "#/components/schemas/FraudRecommendationEnum"
          },
          "next_action": {
            "$ref": "#/components/schemas/FraudNextActionEnum"
          },
          "decision_reasons": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "coverage": {
            "type": "object",
            "additionalProperties": {}
          },
          "usage": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": {}
            }
          },
          "vendor_data": {
            "type": "string",
            "nullable": true
          },
          "metadata": {
            "nullable": true
          }
        },
        "required": [
          "attribute_evidence",
          "check_id",
          "client_reference",
          "completed_at",
          "compound_evidence",
          "coverage",
          "created_at",
          "decision_reasons",
          "inputs",
          "modules",
          "network",
          "next_action",
          "processing_status",
          "profile_id",
          "profile_version",
          "recommendation",
          "risk",
          "usage"
        ]
      },
      "CaseReviewTeam": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "maxLength": 100
          },
          "description": {
            "type": "string",
            "maxLength": 500
          },
          "members": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/CaseReviewTeamMember"
            },
            "maxItems": 250
          },
          "is_active": {
            "type": "boolean"
          },
          "uuid": {
            "type": "string",
            "format": "uuid",
            "readOnly": true
          },
          "created_at": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          },
          "updated_at": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          }
        }
      },
      "CaseActionCaseEntityActionRequest": {
        "type": "object",
        "properties": {
          "client_reference": {
            "type": "string",
            "format": "uuid"
          },
          "retry": {
            "type": "boolean",
            "default": false
          },
          "action": {
            "$ref": "#/components/schemas/CaseActionActionEnum"
          },
          "status": {
            "type": "string",
            "nullable": true
          },
          "tags": {
            "type": "array",
            "items": {
              "type": "string",
              "minLength": 1
            }
          },
          "note": {
            "type": "string",
            "nullable": true
          }
        },
        "required": [
          "action"
        ]
      },
      "RoutingPublicationPaginatedPolicyRevisionList": {
        "type": "object",
        "required": [
          "count",
          "results"
        ],
        "properties": {
          "count": {
            "type": "integer",
            "example": 123
          },
          "next": {
            "type": "string",
            "nullable": true,
            "format": "uri",
            "example": "http://api.example.org/accounts/?offset=400&limit=100"
          },
          "previous": {
            "type": "string",
            "nullable": true,
            "format": "uri",
            "example": "http://api.example.org/accounts/?offset=200&limit=100"
          },
          "results": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/RoutingPublicationPolicyRevision"
            }
          }
        }
      },
      "FraudRecommendationEnum": {
        "enum": [
          "approve",
          "review",
          "reject"
        ],
        "type": "string",
        "description": "* `approve` - Genehmigen\n* `review` - Prüfen\n* `reject` - Ablehnen"
      },
      "CustomerMessagingCaseRequestPreviewResponse": {
        "type": "object",
        "properties": {
          "request_id": {
            "type": "string",
            "format": "uuid"
          },
          "expires_at": {
            "type": "string",
            "format": "date-time"
          },
          "recipient": {
            "type": "string",
            "format": "email"
          },
          "sender": {
            "type": "string"
          },
          "subject": {
            "type": "string"
          },
          "html": {
            "type": "string"
          },
          "requires_user_action": {
            "type": "boolean"
          },
          "preview_token": {
            "type": "string"
          }
        },
        "required": [
          "expires_at",
          "html",
          "preview_token",
          "recipient",
          "request_id",
          "requires_user_action",
          "sender",
          "subject"
        ]
      },
      "CustomerMessagingCaseCustomerResponseRequest": {
        "type": "object",
        "properties": {
          "full_name": {
            "type": "string",
            "minLength": 1,
            "maxLength": 512
          },
          "date_of_birth": {
            "type": "string",
            "format": "date"
          },
          "file": {
            "type": "string",
            "format": "binary",
            "writeOnly": true
          }
        }
      },
      "CaseCollaborationCaseNoteReply": {
        "type": "object",
        "properties": {
          "uuid": {
            "type": "string",
            "format": "uuid"
          },
          "actor_name": {
            "type": "string",
            "nullable": true
          },
          "actor_email": {
            "type": "string",
            "format": "email",
            "nullable": true
          },
          "comment": {
            "type": "string",
            "maxLength": 300
          }
        },
        "required": [
          "actor_email",
          "actor_name",
          "comment",
          "uuid"
        ]
      },
      "FraudCheckModuleReport": {
        "type": "object",
        "properties": {
          "module": {
            "$ref": "#/components/schemas/FraudExcludeEnum"
          },
          "status": {
            "$ref": "#/components/schemas/FraudStatusEnum"
          },
          "reason": {
            "type": "string",
            "nullable": true
          },
          "latency_ms": {
            "type": "integer"
          },
          "freshness": {
            "type": "string",
            "nullable": true
          },
          "billable_units": {
            "type": "integer"
          }
        },
        "required": [
          "billable_units",
          "freshness",
          "latency_ms",
          "module",
          "reason",
          "status"
        ]
      },
      "CaseDuplicateEntityTypeEnum": {
        "enum": [
          "session",
          "business_session",
          "transaction"
        ],
        "type": "string",
        "description": "* `session` - Sitzung\n* `business_session` - Unternehmenssitzung\n* `transaction` - Transaktion"
      },
      "FraudClientCredentialsErrorMessage": {
        "type": "object",
        "properties": {
          "detail": {
            "type": "string",
            "default": "Authentication failed: Invalid client access token."
          }
        }
      },
      "FraudAvailabilityEnum": {
        "enum": [
          "available",
          "not_requested",
          "no_reference",
          "insufficient_history",
          "unsupported_region",
          "source_unavailable"
        ],
        "type": "string",
        "description": "* `available` - Verfügbar\n* `not_requested` - Nicht angefragt\n* `no_reference` - Keine Referenz\n* `insufficient_history` - Unzureichender Verlauf\n* `unsupported_region` - Nicht unterstützte Region\n* `source_unavailable` - Quelle nicht verfügbar"
      },
      "CasePublicationPolicyDraftResponse": {
        "type": "object",
        "properties": {
          "draft": {
            "allOf": [
              {
                "$ref": "#/components/schemas/CasePublicationPolicyDraft"
              }
            ],
            "nullable": true
          }
        },
        "required": [
          "draft"
        ]
      },
      "FraudCheckAttributesRequest": {
        "type": "object",
        "description": "Bestätigende Attribute. Alle sind optional; sie erweitern die Modulabdeckung.",
        "properties": {
          "first_name": {
            "type": "string",
            "maxLength": 128
          },
          "last_name": {
            "type": "string",
            "maxLength": 128
          },
          "full_name": {
            "type": "string",
            "maxLength": 256
          },
          "date_of_birth": {
            "type": "string",
            "format": "date"
          },
          "nationality": {
            "type": "string",
            "maxLength": 3
          },
          "gender": {
            "type": "string",
            "maxLength": 16
          },
          "address": {
            "type": "string",
            "maxLength": 512
          },
          "city": {
            "type": "string",
            "maxLength": 128
          },
          "state": {
            "type": "string",
            "maxLength": 128
          },
          "postal_code": {
            "type": "string",
            "maxLength": 32
          }
        }
      },
      "NetworkNote": {
        "type": "object",
        "required": [
          "uuid",
          "actor_email",
          "comment",
          "client_reference",
          "created_at"
        ],
        "properties": {
          "uuid": {
            "type": "string",
            "format": "uuid",
            "readOnly": true
          },
          "actor_email": {
            "type": "string",
            "format": "email",
            "readOnly": true,
            "description": "Authentifizierter Autor, vom Server zugewiesen."
          },
          "comment": {
            "type": "string",
            "minLength": 1,
            "maxLength": 10000
          },
          "client_reference": {
            "type": "string",
            "format": "uuid"
          },
          "created_at": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          }
        }
      },
      "CaseActionEntityTypeEnum": {
        "enum": [
          "user",
          "business"
        ],
        "type": "string",
        "description": "* `user` - user\n* `business` - business"
      },
      "CaseRoutingCondition": {
        "type": "object",
        "properties": {
          "field": {
            "type": "string",
            "enum": [
              "source",
              "priority",
              "tags"
            ]
          },
          "operator": {
            "type": "string",
            "enum": [
              "equals",
              "in",
              "contains"
            ]
          },
          "value": {
            "oneOf": [
              {
                "type": "string"
              },
              {
                "type": "array",
                "items": {
                  "type": "string"
                }
              }
            ]
          }
        },
        "required": [
          "field",
          "operator",
          "value"
        ],
        "description": "Quelle und Priorität unterstützen equals oder in mit unterstützten Werten. Tags unterstützen contains mit einem nicht leeren Tag."
      },
      "RoutingPublicationPolicyRevision": {
        "type": "object",
        "properties": {
          "version": {
            "type": "integer",
            "maximum": 2147483647,
            "minimum": 0
          },
          "snapshot": {},
          "actor_email": {
            "type": "string",
            "format": "email",
            "nullable": true,
            "maxLength": 254
          },
          "published_at": {
            "type": "string",
            "format": "date-time"
          }
        },
        "required": [
          "published_at",
          "snapshot",
          "version"
        ]
      },
      "CasePublicationPolicyRevision": {
        "type": "object",
        "properties": {
          "version": {
            "type": "integer",
            "maximum": 2147483647,
            "minimum": 0
          },
          "snapshot": {},
          "actor_email": {
            "type": "string",
            "format": "email",
            "nullable": true,
            "maxLength": 254
          },
          "published_at": {
            "type": "string",
            "format": "date-time"
          }
        },
        "required": [
          "published_at",
          "snapshot",
          "version"
        ]
      },
      "FraudCheckIdentityRelationship": {
        "type": "object",
        "properties": {
          "result": {
            "$ref": "#/components/schemas/FraudResultEnum"
          },
          "reference_type": {
            "type": "string"
          },
          "country": {
            "type": "string"
          },
          "availability": {
            "$ref": "#/components/schemas/FraudAvailabilityEnum"
          },
          "reason_codes": {
            "type": "array",
            "items": {
              "type": "string"
            }
          }
        },
        "required": [
          "availability",
          "country",
          "reason_codes",
          "reference_type",
          "result"
        ]
      },
      "CasePublicationPaginatedPolicyRevisionList": {
        "type": "object",
        "required": [
          "count",
          "results"
        ],
        "properties": {
          "count": {
            "type": "integer",
            "example": 123
          },
          "next": {
            "type": "string",
            "nullable": true,
            "format": "uri",
            "example": "http://api.example.org/accounts/?offset=400&limit=100"
          },
          "previous": {
            "type": "string",
            "nullable": true,
            "format": "uri",
            "example": "http://api.example.org/accounts/?offset=200&limit=100"
          },
          "results": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/CasePublicationPolicyRevision"
            }
          }
        }
      },
      "CaseDuplicateBlankEnum": {
        "enum": [
          ""
        ]
      },
      "FraudCheckPlan": {
        "type": "object",
        "properties": {
          "profile_id": {
            "type": "string"
          },
          "profile_version": {
            "type": "string"
          },
          "modules": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/FraudCheckPlannedModule"
            }
          },
          "estimated_price": {
            "type": "string",
            "nullable": true
          },
          "currency": {
            "type": "string",
            "nullable": true
          },
          "is_sandbox": {
            "type": "boolean"
          },
          "can_afford": {
            "type": "boolean"
          }
        },
        "required": [
          "can_afford",
          "currency",
          "estimated_price",
          "is_sandbox",
          "modules",
          "profile_id",
          "profile_version"
        ]
      },
      "CaseReviewTeamUpdate": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "maxLength": 100
          },
          "description": {
            "type": "string",
            "maxLength": 500
          },
          "members": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/CaseReviewTeamMember"
            },
            "maxItems": 250
          },
          "is_active": {
            "type": "boolean"
          }
        }
      },
      "RoutingPublicationPolicyDraft": {
        "type": "object",
        "properties": {
          "revision": {
            "type": "string",
            "format": "uuid"
          },
          "base_version": {
            "type": "integer",
            "maximum": 2147483647,
            "minimum": 0
          },
          "changes": {},
          "actor_email": {
            "type": "string",
            "format": "email",
            "nullable": true,
            "maxLength": 254
          },
          "updated_at": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          }
        },
        "required": [
          "base_version",
          "updated_at"
        ]
      },
      "FraudCheckRequestRequest": {
        "type": "object",
        "properties": {
          "client_reference": {
            "type": "string",
            "minLength": 1,
            "description": "Ihre eigene Referenz für diese Prüfung. Dient gleichzeitig als Idempotenzschlüssel: Bei Wiederverwendung mit demselben Body wird die ursprüngliche Prüfung zurückgegeben, ohne die Module erneut auszuführen oder abzurechnen; bei Wiederverwendung mit einem anderen Body wird 409 zurückgegeben.",
            "maxLength": 255
          },
          "profile": {
            "type": "string",
            "minLength": 1,
            "default": "standard",
            "description": "Orchestrierungsprofil-ID. Standardmäßig das Didit-Profil `standard`.",
            "maxLength": 64
          },
          "profile_version": {
            "type": "string",
            "minLength": 1,
            "description": "Eine eingefrorene Profilversion anpinnen. Standardmäßig die aktuelle Version des Profils.",
            "maxLength": 32
          },
          "subject": {
            "$ref": "#/components/schemas/FraudCheckSubjectRequest"
          },
          "context": {
            "$ref": "#/components/schemas/FraudCheckContextRequest"
          },
          "checks": {
            "$ref": "#/components/schemas/FraudCheckModuleSelectionRequest"
          },
          "vendor_data": {
            "type": "string",
            "maxLength": 1000
          },
          "metadata": {}
        },
        "required": [
          "subject"
        ]
      },
      "CaseDuplicateCaseSubjectInputRequest": {
        "type": "object",
        "properties": {
          "type": {
            "$ref": "#/components/schemas/CaseDuplicateTypeEnum"
          },
          "uuid": {
            "type": "string",
            "format": "uuid"
          }
        },
        "required": [
          "type",
          "uuid"
        ]
      },
      "CaseReviewTeamMember": {
        "type": "object",
        "properties": {
          "user_id": {
            "type": "string",
            "format": "uuid"
          },
          "availability": {
            "type": "string",
            "enum": [
              "available",
              "unavailable"
            ],
            "default": "available"
          },
          "capacity": {
            "type": "integer",
            "minimum": 1,
            "maximum": 1000,
            "default": 10
          },
          "skills": {
            "type": "array",
            "items": {
              "type": "string",
              "maxLength": 64
            },
            "maxItems": 25
          },
          "available_from": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "available_until": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          }
        },
        "required": [
          "user_id"
        ]
      },
      "CaseRoutingPreviewRequest": {
        "type": "object",
        "properties": {
          "source": {
            "type": "string",
            "enum": [
              "MANUAL",
              "AML_SCREENING",
              "TRANSACTION_RULE",
              "WORKFLOW_BUILDER"
            ]
          },
          "priority": {
            "type": "string",
            "enum": [
              "LOW",
              "MEDIUM",
              "HIGH"
            ],
            "default": "MEDIUM"
          },
          "tags": {
            "type": "array",
            "items": {
              "type": "string",
              "maxLength": 64
            },
            "maxItems": 50
          },
          "rule_uuid": {
            "type": "string",
            "format": "uuid"
          },
          "draft": {
            "$ref": "#/components/schemas/CaseRoutingRuleCreate"
          }
        },
        "required": [
          "source"
        ]
      },
      "FraudExcludeEnum": {
        "enum": [
          "normalization",
          "email_risk",
          "email_social",
          "phone_social",
          "phone_risk",
          "ip_risk",
          "database_validation",
          "networks_same_org",
          "networks_cross_org",
          "biometric_identity"
        ],
        "type": "string",
        "description": "* `normalization` - Normalisierung\n* `email_risk` - E-Mail-Risiko\n* `email_social` - E-Mail-Social\n* `phone_social` - Telefon-Social\n* `phone_risk` - Telefonrisiko\n* `ip_risk` - IP-Risiko\n* `database_validation` - Datenbankvalidierung\n* `networks_same_org` - Netzwerke derselben Organisation\n* `networks_cross_org` - Organisationsübergreifende Netzwerke\n* `biometric_identity` - Biometrische Identität"
      },
      "CaseDuplicateCaseLinkCreateRequest": {
        "type": "object",
        "properties": {
          "entity_type": {
            "$ref": "#/components/schemas/CaseDuplicateEntityTypeEnum"
          },
          "entity_uuid": {
            "type": "string",
            "format": "uuid"
          }
        },
        "required": [
          "entity_type",
          "entity_uuid"
        ]
      },
      "CaseDuplicateStatusEnum": {
        "enum": [
          "OPEN",
          "AWAITING_USER",
          "RESOLVED"
        ],
        "type": "string",
        "description": "* `OPEN` - Offen\n* `AWAITING_USER` - Wartet auf den Benutzer\n* `RESOLVED` - Gelöst"
      },
      "FraudBandEnum": {
        "enum": [
          "low",
          "medium",
          "high",
          "unknown"
        ],
        "type": "string",
        "description": "* `low` - Niedrig\n* `medium` - Mittel\n* `high` - Hoch\n* `unknown` - Unbekannt"
      },
      "CaseDuplicatePriorityEnum": {
        "enum": [
          "LOW",
          "MEDIUM",
          "HIGH"
        ],
        "type": "string",
        "description": "* `LOW` - Niedrig\n* `MEDIUM` - Mittel\n* `HIGH` - Hoch"
      },
      "FraudStatusEnum": {
        "enum": [
          "planned",
          "completed",
          "skipped",
          "failed"
        ],
        "type": "string",
        "description": "* `planned` - Geplant\n* `completed` - Abgeschlossen\n* `skipped` - Übersprungen\n* `failed` - Fehlgeschlagen"
      },
      "FraudCheckInput": {
        "type": "object",
        "properties": {
          "reference": {
            "type": "string",
            "description": "Geschwärzter Handle für die übermittelte Kennung."
          },
          "type": {
            "$ref": "#/components/schemas/FraudTypeEnum"
          },
          "namespace": {
            "type": "object",
            "additionalProperties": {}
          },
          "quality": {
            "type": "string"
          },
          "normalization": {
            "type": "object",
            "additionalProperties": {}
          },
          "availability": {
            "$ref": "#/components/schemas/FraudAvailabilityEnum"
          }
        },
        "required": [
          "availability",
          "namespace",
          "normalization",
          "quality",
          "reference",
          "type"
        ]
      },
      "CustomerMessagingPurposesEnum": {
        "enum": [
          "identity_document",
          "proof_of_address",
          "business_document",
          "confirm_details",
          "review_in_progress"
        ],
        "type": "string",
        "description": "* `identity_document` - identity_document\n* `proof_of_address` - proof_of_address\n* `business_document` - business_document\n* `confirm_details` - confirm_details\n* `review_in_progress` - review_in_progress"
      },
      "FraudTypeEnum": {
        "enum": [
          "email",
          "phone",
          "national_id",
          "tax_number",
          "passport_number",
          "driving_licence_number",
          "residence_permit_number",
          "voter_id",
          "external_id"
        ],
        "type": "string",
        "description": "* `email` - E-Mail\n* `phone` - Telefon\n* `national_id` - Nationale ID\n* `tax_number` - Steuernummer\n* `passport_number` - Reisepassnummer\n* `driving_licence_number` - Führerscheinnummer\n* `residence_permit_number` - Aufenthaltstitelnummer\n* `voter_id` - Wähler-ID\n* `external_id` - Externe ID"
      },
      "CaseDuplicateCaseSubjectInput": {
        "type": "object",
        "properties": {
          "type": {
            "$ref": "#/components/schemas/CaseDuplicateTypeEnum"
          },
          "uuid": {
            "type": "string",
            "format": "uuid"
          }
        },
        "required": [
          "type",
          "uuid"
        ]
      },
      "CaseReviewTeamCreate": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "maxLength": 100
          },
          "description": {
            "type": "string",
            "maxLength": 500
          },
          "members": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/CaseReviewTeamMember"
            },
            "maxItems": 250
          },
          "is_active": {
            "type": "boolean"
          }
        },
        "required": [
          "name",
          "members"
        ]
      },
      "CaseDuplicateCaseDuplicateQueryRequest": {
        "type": "object",
        "properties": {
          "subject": {
            "$ref": "#/components/schemas/CaseDuplicateCaseSubjectInputRequest"
          },
          "links": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/CaseDuplicateCaseLinkCreateRequest"
            }
          },
          "offset": {
            "type": "integer",
            "maximum": 1000000,
            "minimum": 0,
            "default": 0
          }
        }
      },
      "CaseDuplicateResolutionEnum": {
        "enum": [
          "FALSE_POSITIVE",
          "VALID_THREAT"
        ],
        "type": "string",
        "description": "* `FALSE_POSITIVE` - Falsch positiv\n* `VALID_THREAT` - Echte Bedrohung"
      },
      "CasePublicationPolicyDraftWriteRequest": {
        "type": "object",
        "properties": {
          "expected_version": {
            "type": "integer",
            "minimum": 0
          },
          "expected_revision": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "changes": {
            "type": "object",
            "additionalProperties": {}
          }
        },
        "required": [
          "changes",
          "expected_revision",
          "expected_version"
        ]
      },
      "FraudCheckSubjectRequest": {
        "type": "object",
        "properties": {
          "selfie": {
            "type": "string",
            "minLength": 1,
            "description": "Base64-kodiertes JPEG-, PNG- oder WebP-Selfie, bis zu 6 MB. Kein Referenzbild oder keine URL.",
            "maxLength": 8388672
          },
          "identifiers": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/FraudCheckIdentifierRequest"
            },
            "description": "Ein oder mehrere typisierte Bezeichner. Einer reicht aus.",
            "maxItems": 10,
            "minItems": 1
          },
          "attributes": {
            "$ref": "#/components/schemas/FraudCheckAttributesRequest"
          }
        },
        "required": [
          "identifiers"
        ]
      },
      "RoutingPublicationRoutingCondition": {
        "type": "object",
        "properties": {
          "field": {
            "$ref": "#/components/schemas/RoutingPublicationFieldEnum"
          },
          "operator": {
            "$ref": "#/components/schemas/RoutingPublicationOperatorEnum"
          },
          "value": {}
        },
        "required": [
          "field",
          "operator",
          "value"
        ]
      },
      "CaseActionCaseActionReceipt": {
        "type": "object",
        "properties": {
          "uuid": {
            "type": "string",
            "format": "uuid",
            "readOnly": true
          },
          "client_reference": {
            "type": "string",
            "format": "uuid"
          },
          "action": {
            "type": "string",
            "maxLength": 32
          },
          "status": {
            "$ref": "#/components/schemas/CaseActionStatusEnum"
          },
          "result": {},
          "error": {
            "type": "string",
            "maxLength": 255
          },
          "actor_email": {
            "type": "string",
            "format": "email",
            "nullable": true,
            "maxLength": 254
          },
          "attempts": {
            "type": "integer",
            "maximum": 2147483647,
            "minimum": 0
          },
          "created_at": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          },
          "updated_at": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          }
        },
        "required": [
          "action",
          "client_reference",
          "created_at",
          "status",
          "updated_at",
          "uuid"
        ]
      },
      "FraudCheckContextRequest": {
        "type": "object",
        "properties": {
          "ip_address": {
            "type": "string",
            "minLength": 1
          },
          "user_agent": {
            "type": "string",
            "maxLength": 512
          },
          "country": {
            "type": "string",
            "description": "Land, in dem sich die Person laut eigener Angabe befindet. Dient nur dem Kontext – niemals als Nachweis dafür, dass die Person die Identität besitzt.",
            "maxLength": 3
          },
          "purpose": {
            "type": "string",
            "maxLength": 128
          },
          "consent_obtained": {
            "type": "boolean"
          }
        }
      },
      "CustomerMessagingCaseCustomerResponseResult": {
        "type": "object",
        "properties": {
          "responded_at": {
            "type": "string",
            "format": "date-time"
          }
        },
        "required": [
          "responded_at"
        ]
      },
      "CustomerMessagingCaseRequestContact": {
        "type": "object",
        "properties": {
          "uuid": {
            "type": "string",
            "format": "uuid"
          },
          "email": {
            "type": "string",
            "format": "email"
          },
          "verified_at": {
            "type": "string",
            "format": "date-time"
          }
        },
        "required": [
          "email",
          "uuid",
          "verified_at"
        ]
      },
      "FraudClientCredentialsForbiddenErrorMessage": {
        "type": "object",
        "properties": {
          "detail": {
            "type": "string",
            "default": "Forbidden - User doesn't have permission"
          }
        }
      },
      "CasePublicationAssignmentMethodEnum": {
        "enum": [
          "MANUAL",
          "AUTOMATIC"
        ],
        "type": "string",
        "description": "* `MANUAL` - Manuell\n* `AUTOMATIC` - Automatisch"
      },
      "CaseDuplicateNullEnum": {
        "enum": [
          null
        ]
      },
      "CustomerMessagingLanguageEnum": {
        "enum": [
          "en",
          "es",
          "pt"
        ],
        "type": "string",
        "description": "* `en` - en\n* `es` - es\n* `pt` - pt"
      },
      "CaseDuplicateCaseFraudSourceContextRequest": {
        "type": "object",
        "properties": {
          "check_id": {
            "type": "string",
            "format": "uuid"
          },
          "request_id": {
            "type": "string",
            "format": "uuid"
          },
          "source_section": {
            "type": "string",
            "minLength": 1,
            "pattern": "^[A-Z][A-Z0-9_:-]{0,63}$"
          }
        },
        "required": [
          "check_id",
          "request_id",
          "source_section"
        ]
      },
      "FraudCheckPlannedModule": {
        "type": "object",
        "properties": {
          "module": {
            "$ref": "#/components/schemas/FraudExcludeEnum"
          },
          "available": {
            "type": "boolean"
          },
          "availability_reason": {
            "type": "string",
            "nullable": true
          },
          "will_run": {
            "type": "boolean"
          },
          "selection_reason": {
            "type": "string",
            "nullable": true
          },
          "estimated_price": {
            "type": "string",
            "nullable": true
          }
        },
        "required": [
          "availability_reason",
          "available",
          "estimated_price",
          "module",
          "selection_reason",
          "will_run"
        ]
      },
      "CustomerMessagingCaseRequestOptions": {
        "type": "object",
        "properties": {
          "contacts": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/CustomerMessagingCaseRequestContact"
            }
          },
          "purposes": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/CustomerMessagingPurposesEnum"
            }
          },
          "languages": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/CustomerMessagingLanguagesEnum"
            }
          }
        },
        "required": [
          "contacts",
          "languages",
          "purposes"
        ]
      },
      "CaseCollaborationPaginatedCaseNoteList": {
        "type": "object",
        "required": [
          "count",
          "results"
        ],
        "properties": {
          "count": {
            "type": "integer",
            "example": 123
          },
          "next": {
            "type": "string",
            "nullable": true,
            "format": "uri",
            "example": "http://api.example.org/accounts/?offset=400&limit=100"
          },
          "previous": {
            "type": "string",
            "nullable": true,
            "format": "uri",
            "example": "http://api.example.org/accounts/?offset=200&limit=100"
          },
          "results": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/CaseCollaborationCaseNote"
            }
          }
        }
      },
      "FraudProcessingStatusEnum": {
        "enum": [
          "pending",
          "running",
          "completed",
          "failed"
        ],
        "type": "string",
        "description": "* `pending` - Ausstehend\n* `running` - Wird ausgeführt\n* `completed` - Abgeschlossen\n* `failed` - Fehlgeschlagen"
      },
      "CasePublicationCaseBlueprint": {
        "type": "object",
        "properties": {
          "uuid": {
            "type": "string",
            "format": "uuid",
            "readOnly": true
          },
          "name": {
            "type": "string",
            "maxLength": 24
          },
          "description": {
            "type": "string",
            "nullable": true
          },
          "assignment_method": {
            "$ref": "#/components/schemas/CasePublicationAssignmentMethodEnum"
          },
          "assignee_pool": {},
          "max_active_cases": {
            "type": "integer",
            "maximum": 2147483647,
            "minimum": 0,
            "nullable": true
          },
          "escalation_enabled": {
            "type": "boolean"
          },
          "escalation_blueprint": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "escalation_blueprint_name": {
            "type": "string",
            "readOnly": true
          },
          "transfer_enabled": {
            "type": "boolean"
          },
          "four_eyes_checker_blueprint": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "four_eyes_checker_blueprint_name": {
            "type": "string",
            "readOnly": true
          },
          "require_resolution_note": {
            "type": "boolean"
          },
          "content_config": {},
          "version": {
            "type": "integer",
            "maximum": 2147483647,
            "minimum": 0
          },
          "default_deadline_hours": {
            "type": "integer",
            "maximum": 2147483647,
            "minimum": 0,
            "nullable": true
          },
          "is_active": {
            "type": "boolean"
          },
          "preset_key": {
            "type": "string",
            "nullable": true,
            "maxLength": 64
          },
          "creation_sources": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": {}
            },
            "readOnly": true
          },
          "receives_escalation_from": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": {}
            },
            "readOnly": true
          },
          "created_at": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          },
          "updated_at": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          }
        },
        "required": [
          "created_at",
          "creation_sources",
          "escalation_blueprint_name",
          "four_eyes_checker_blueprint_name",
          "name",
          "receives_escalation_from",
          "updated_at",
          "uuid"
        ]
      },
      "CaseRoutingRuleUpdate": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "maxLength": 100
          },
          "description": {
            "type": "string",
            "maxLength": 500
          },
          "priority": {
            "type": "integer",
            "minimum": 0
          },
          "conditions": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/CaseRoutingCondition"
            },
            "maxItems": 20
          },
          "required_skills": {
            "type": "array",
            "items": {
              "type": "string",
              "maxLength": 64
            },
            "maxItems": 25
          },
          "blueprint": {
            "type": "string",
            "format": "uuid"
          },
          "team": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "is_active": {
            "type": "boolean"
          },
          "expected_version": {
            "type": "integer",
            "minimum": 1,
            "writeOnly": true,
            "description": "Vom Editor geöffnete Version. Wenn angegeben, geben veraltete Schreibvorgänge 409 zurück, ohne die Regel zu ändern."
          }
        }
      },
      "CustomerMessagingCaseRequestPreviewRequest": {
        "type": "object",
        "properties": {
          "contact_id": {
            "type": "string",
            "format": "uuid"
          },
          "purpose": {
            "$ref": "#/components/schemas/CustomerMessagingPurposeEnum"
          },
          "language": {
            "allOf": [
              {
                "$ref": "#/components/schemas/CustomerMessagingLanguageEnum"
              }
            ],
            "default": "en"
          }
        },
        "required": [
          "contact_id",
          "purpose"
        ]
      },
      "CaseDuplicateCaseFraudSourceContext": {
        "type": "object",
        "properties": {
          "check_id": {
            "type": "string",
            "format": "uuid"
          },
          "request_id": {
            "type": "string",
            "format": "uuid"
          },
          "source_section": {
            "type": "string",
            "pattern": "^[A-Z][A-Z0-9_:-]{0,63}$"
          }
        },
        "required": [
          "check_id",
          "request_id",
          "source_section"
        ]
      },
      "RoutingPublicationOperatorEnum": {
        "enum": [
          "equals",
          "in",
          "contains"
        ],
        "type": "string",
        "description": "* `equals` - equals\n* `in` - in\n* `contains` - contains"
      },
      "CaseRoutingPreview": {
        "type": "object",
        "properties": {
          "rule_uuid": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "rule_name": {
            "type": "string",
            "nullable": true
          },
          "rule_version": {
            "type": "integer",
            "nullable": true
          },
          "blueprint_uuid": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "team_uuid": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "assignee_user_id": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "reason": {
            "type": "string"
          },
          "candidates": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "user_id": {
                  "type": "string",
                  "format": "uuid"
                },
                "eligible": {
                  "type": "boolean"
                },
                "active_cases": {
                  "type": "integer",
                  "nullable": true
                },
                "reason": {
                  "type": "string",
                  "nullable": true
                }
              }
            }
          },
          "matched_rules": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "uuid": {
                  "type": "string",
                  "format": "uuid"
                },
                "name": {
                  "type": "string"
                },
                "priority": {
                  "type": "integer"
                }
              }
            }
          }
        }
      },
      "FraudDimensionEnum": {
        "enum": [
          "identity",
          "contact",
          "device_network",
          "behavioral",
          "fraud_network"
        ],
        "type": "string",
        "description": "* `identity` - Identität\n* `contact` - Kontakt\n* `device_network` - Gerätenetzwerk\n* `behavioral` - Verhalten\n* `fraud_network` - Betrugsnetzwerk"
      },
      "FraudBadRequestErrorMessage": {
        "type": "object",
        "properties": {
          "detail": {
            "type": "string",
            "default": "Bad Request - Invalid request data"
          }
        }
      },
      "FraudNextActionEnum": {
        "enum": [
          "none",
          "manual_review",
          "step_up",
          "resubmit_capture"
        ],
        "type": "string",
        "description": "* `none` - Keine\n* `manual_review` - Manuelle Prüfung\n* `step_up` - Step-Up\n* `resubmit_capture` - Erneute Erfassung einreichen"
      },
      "RoutingPublicationPolicyDraftPreconditionRequest": {
        "type": "object",
        "properties": {
          "expected_version": {
            "type": "integer",
            "minimum": 0
          },
          "expected_revision": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          }
        },
        "required": [
          "expected_revision",
          "expected_version"
        ]
      },
      "FraudCheckRisk": {
        "type": "object",
        "properties": {
          "dimension": {
            "$ref": "#/components/schemas/FraudDimensionEnum"
          },
          "score": {
            "type": "integer",
            "nullable": true
          },
          "band": {
            "$ref": "#/components/schemas/FraudBandEnum"
          },
          "availability": {
            "$ref": "#/components/schemas/FraudAvailabilityEnum"
          },
          "requested_but_unavailable": {
            "type": "boolean",
            "description": "True, wenn die Anfrage alles bereitgestellt hat, was diese Dimension benötigte, und die Plattform sie dennoch nicht beantworten konnte. Eine solche Prüfung wird niemals allein aufgrund der Dimensionen zur Genehmigung empfohlen, die beantwortet werden konnten."
          },
          "reason_codes": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "evidence_indexes": {
            "type": "array",
            "items": {
              "type": "integer"
            }
          }
        },
        "required": [
          "availability",
          "band",
          "dimension",
          "evidence_indexes",
          "reason_codes",
          "requested_but_unavailable",
          "score"
        ]
      },
      "CaseDuplicateSourceEnum": {
        "enum": [
          "MANUAL",
          "AML_SCREENING",
          "TRANSACTION_RULE",
          "WORKFLOW_BUILDER"
        ],
        "type": "string",
        "description": "* `MANUAL` - Manuell\n* `AML_SCREENING` - AML-Screening\n* `TRANSACTION_RULE` - Transaktionsregel\n* `WORKFLOW_BUILDER` - Workflow-Builder"
      },
      "CaseCollaborationPatchedCaseNoteUpdateRequest": {
        "type": "object",
        "properties": {
          "is_pinned": {
            "type": "boolean"
          }
        }
      },
      "CustomerMessagingPurposeEnum": {
        "enum": [
          "identity_document",
          "proof_of_address",
          "business_document",
          "confirm_details",
          "review_in_progress"
        ],
        "type": "string",
        "description": "* `identity_document` - identity_document\n* `proof_of_address` - proof_of_address\n* `business_document` - business_document\n* `confirm_details` - confirm_details\n* `review_in_progress` - review_in_progress"
      },
      "CaseDuplicateTypeEnum": {
        "enum": [
          "user",
          "business"
        ],
        "type": "string",
        "description": "* `user` - user\n* `business` - business"
      },
      "CaseCollaborationCaseNoteCreateRequest": {
        "type": "object",
        "properties": {
          "comment": {
            "type": "string",
            "minLength": 1,
            "maxLength": 10000
          },
          "reply_to": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "client_reference": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "mentioned_emails": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "email",
              "minLength": 1
            }
          },
          "is_internal": {
            "type": "boolean",
            "default": false
          },
          "attachments": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": {}
            }
          },
          "tags": {
            "type": "array",
            "items": {
              "type": "string",
              "minLength": 1
            }
          }
        },
        "required": [
          "comment"
        ]
      },
      "CustomerMessagingLanguagesEnum": {
        "enum": [
          "en",
          "es",
          "pt"
        ],
        "type": "string",
        "description": "* `en` - en\n* `es` - es\n* `pt` - pt"
      },
      "CustomerMessagingCaseRequestConfirmRequest": {
        "type": "object",
        "properties": {
          "contact_id": {
            "type": "string",
            "format": "uuid"
          },
          "purpose": {
            "$ref": "#/components/schemas/CustomerMessagingPurposeEnum"
          },
          "language": {
            "allOf": [
              {
                "$ref": "#/components/schemas/CustomerMessagingLanguageEnum"
              }
            ],
            "default": "en"
          },
          "request_id": {
            "type": "string",
            "format": "uuid"
          },
          "expires_at": {
            "type": "string",
            "format": "date-time"
          },
          "preview_token": {
            "type": "string",
            "minLength": 1,
            "maxLength": 512
          }
        },
        "required": [
          "contact_id",
          "expires_at",
          "preview_token",
          "purpose",
          "request_id"
        ]
      },
      "CaseRoutingRule": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "maxLength": 100
          },
          "description": {
            "type": "string",
            "maxLength": 500
          },
          "priority": {
            "type": "integer",
            "minimum": 0
          },
          "conditions": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/CaseRoutingCondition"
            },
            "maxItems": 20
          },
          "required_skills": {
            "type": "array",
            "items": {
              "type": "string",
              "maxLength": 64
            },
            "maxItems": 25
          },
          "blueprint": {
            "type": "string",
            "format": "uuid"
          },
          "team": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "is_active": {
            "type": "boolean"
          },
          "uuid": {
            "type": "string",
            "format": "uuid",
            "readOnly": true
          },
          "created_at": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          },
          "updated_at": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          },
          "version": {
            "type": "integer",
            "readOnly": true
          },
          "blueprint_name": {
            "type": "string",
            "readOnly": true
          },
          "team_name": {
            "type": "string",
            "nullable": true,
            "readOnly": true
          }
        }
      },
      "FraudResultEnum": {
        "enum": [
          "match",
          "mismatch",
          "inconclusive",
          "no_reference"
        ],
        "type": "string",
        "description": "* `match` - Übereinstimmung\n* `mismatch` - Keine Übereinstimmung\n* `inconclusive` - Nicht eindeutig\n* `no_reference` - Keine Referenz"
      },
      "CaseRoutingRuleCreate": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "maxLength": 100
          },
          "description": {
            "type": "string",
            "maxLength": 500
          },
          "priority": {
            "type": "integer",
            "minimum": 0
          },
          "conditions": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/CaseRoutingCondition"
            },
            "maxItems": 20
          },
          "required_skills": {
            "type": "array",
            "items": {
              "type": "string",
              "maxLength": 64
            },
            "maxItems": 25
          },
          "blueprint": {
            "type": "string",
            "format": "uuid"
          },
          "team": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "is_active": {
            "type": "boolean"
          },
          "publish": {
            "type": "boolean",
            "writeOnly": true,
            "description": "Auf false setzen, um einen noch nie veröffentlichten Entwurf zu speichern. Der Datensatz bleibt bei Version 0 inaktiv, bis der Entwurf explizit veröffentlicht wird. Das Weglassen dieses Felds behält die sofortige Erstellung für bestehende Integrationen bei."
          }
        },
        "required": [
          "name",
          "conditions",
          "blueprint"
        ]
      },
      "FraudCheckIdentifierRequest": {
        "type": "object",
        "properties": {
          "type": {
            "allOf": [
              {
                "$ref": "#/components/schemas/FraudTypeEnum"
              }
            ],
            "description": "Kennungstyp. Bestimmt, welche Namespace-Felder erforderlich sind.\n\n* `email` - E-Mail\n* `phone` - Telefon\n* `national_id` - Nationale ID\n* `tax_number` - Steuernummer\n* `passport_number` - Reisepassnummer\n* `driving_licence_number` - Führerscheinnummer\n* `residence_permit_number` - Aufenthaltstitelnummer\n* `voter_id` - Wähler-ID\n* `external_id` - Externe ID"
          },
          "value": {
            "type": "string",
            "minLength": 1,
            "description": "Der Identifikatorwert in einem beliebigen gebräuchlichen Format.",
            "maxLength": 255
          },
          "country": {
            "type": "string",
            "description": "ISO-3166-Alpha-2- oder -Alpha-3-Code des Ausstellungslands. Erforderlich für behördliche Identifikatortypen: Dieselben Ziffern bezeichnen in verschiedenen Ländern unterschiedliche Personen.",
            "maxLength": 3
          },
          "issuer": {
            "type": "string",
            "description": "Optionale Ausstellungsbehörde oder subnationale Ausstellungsstelle, wenn das Land allein nicht eindeutig ist.",
            "maxLength": 128
          }
        },
        "required": [
          "type",
          "value"
        ]
      },
      "CaseActionActionEnum": {
        "enum": [
          "set_status",
          "add_tags",
          "add_note",
          "add_to_blocklist"
        ],
        "type": "string",
        "description": "* `set_status` - set_status\n* `add_tags` - add_tags\n* `add_note` - add_note\n* `add_to_blocklist` - add_to_blocklist"
      },
      "CaseActionCaseActionReceiptPage": {
        "type": "object",
        "properties": {
          "count": {
            "type": "integer"
          },
          "next_offset": {
            "type": "integer",
            "nullable": true
          },
          "results": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/CaseActionCaseActionReceipt"
            }
          }
        },
        "required": [
          "count",
          "next_offset",
          "results"
        ]
      },
      "CaseActionCaseEntityActionResult": {
        "type": "object",
        "properties": {
          "receipt": {
            "$ref": "#/components/schemas/CaseActionCaseActionReceipt"
          },
          "entity_type": {
            "$ref": "#/components/schemas/CaseActionEntityTypeEnum"
          },
          "entity_uuid": {
            "type": "string",
            "format": "uuid"
          },
          "action": {
            "type": "string"
          },
          "previous_status": {
            "type": "string"
          },
          "new_status": {
            "type": "string"
          },
          "tags_added": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "comment_uuid": {
            "type": "string",
            "format": "uuid"
          },
          "blocklisted": {
            "type": "array",
            "items": {
              "type": "string"
            }
          }
        }
      },
      "CustomerMessagingCaseRequest": {
        "type": "object",
        "properties": {
          "uuid": {
            "type": "string",
            "format": "uuid",
            "readOnly": true
          },
          "purpose": {
            "type": "string",
            "readOnly": true
          },
          "language": {
            "type": "string",
            "readOnly": true
          },
          "recipient": {
            "type": "string",
            "format": "email",
            "readOnly": true
          },
          "expires_at": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          },
          "actor_email": {
            "type": "string",
            "format": "email",
            "readOnly": true,
            "nullable": true
          },
          "delivery_status": {
            "type": "string",
            "readOnly": true
          },
          "delivered_at": {
            "type": "string",
            "format": "date-time",
            "readOnly": true,
            "nullable": true
          },
          "cancelled_at": {
            "type": "string",
            "format": "date-time",
            "readOnly": true,
            "nullable": true
          },
          "responded_at": {
            "type": "string",
            "format": "date-time",
            "readOnly": true,
            "nullable": true
          },
          "response": {
            "readOnly": true,
            "nullable": true
          },
          "has_attachment": {
            "type": "boolean",
            "readOnly": true
          },
          "created_at": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          }
        },
        "required": [
          "actor_email",
          "cancelled_at",
          "created_at",
          "delivered_at",
          "delivery_status",
          "expires_at",
          "has_attachment",
          "language",
          "purpose",
          "recipient",
          "responded_at",
          "response",
          "uuid"
        ]
      },
      "CustomerMessagingCaseRequestPublic": {
        "type": "object",
        "properties": {
          "request_id": {
            "type": "string",
            "format": "uuid"
          },
          "purpose": {
            "$ref": "#/components/schemas/CustomerMessagingPurposeEnum"
          },
          "language": {
            "$ref": "#/components/schemas/CustomerMessagingLanguageEnum"
          },
          "expires_at": {
            "type": "string",
            "format": "date-time"
          },
          "responded_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "copy": {
            "type": "object",
            "additionalProperties": {}
          },
          "organization_name": {
            "type": "string"
          },
          "is_white_label": {
            "type": "boolean"
          },
          "customization": {
            "type": "object",
            "additionalProperties": {},
            "nullable": true
          }
        },
        "required": [
          "copy",
          "customization",
          "expires_at",
          "is_white_label",
          "language",
          "organization_name",
          "purpose",
          "request_id",
          "responded_at"
        ]
      },
      "RoutingPublicationFieldEnum": {
        "enum": [
          "source",
          "priority",
          "tags"
        ],
        "type": "string",
        "description": "* `source` - source\n* `priority` - priority\n* `tags` - tags"
      },
      "RoutingPublicationCaseRoutingRule": {
        "type": "object",
        "properties": {
          "uuid": {
            "type": "string",
            "format": "uuid",
            "readOnly": true
          },
          "name": {
            "type": "string",
            "maxLength": 100
          },
          "description": {
            "type": "string",
            "maxLength": 500
          },
          "priority": {
            "type": "integer",
            "maximum": 2147483647,
            "minimum": 0
          },
          "conditions": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/RoutingPublicationRoutingCondition"
            }
          },
          "required_skills": {
            "type": "array",
            "items": {
              "type": "string",
              "maxLength": 64
            },
            "maxItems": 25
          },
          "blueprint": {
            "type": "string",
            "format": "uuid"
          },
          "blueprint_name": {
            "type": "string",
            "readOnly": true
          },
          "team": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "team_name": {
            "type": "string",
            "readOnly": true
          },
          "is_active": {
            "type": "boolean"
          },
          "version": {
            "type": "integer",
            "readOnly": true
          },
          "created_at": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          },
          "updated_at": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          }
        },
        "required": [
          "blueprint",
          "blueprint_name",
          "conditions",
          "created_at",
          "name",
          "team_name",
          "updated_at",
          "uuid",
          "version"
        ]
      },
      "CaseActionStatusEnum": {
        "enum": [
          "APPLIED",
          "FAILED"
        ],
        "type": "string",
        "description": "* `APPLIED` - Angewendet\n* `FAILED` - Fehlgeschlagen"
      },
      "FraudCheckModuleSelectionRequest": {
        "type": "object",
        "properties": {
          "include": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/FraudExcludeEnum"
            }
          },
          "exclude": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/FraudExcludeEnum"
            }
          }
        }
      },
      "SignatureField": {
        "type": "object",
        "description": "Ein Feld, das auf einem Sitzungsdokument platziert werden soll: welcher Unterzeichner es ausfüllt, wie und wo. Geben Sie entweder eine Position (`page`, `x`, `y`, `width` und `height`) oder einen `anchor` an. Positionen sind Anteile der Seite, wie sie angezeigt wird, ausgehend von der oberen linken Ecke, gerundet auf 4 Dezimalstellen, und das Feld muss innerhalb der Seite liegen. Ein Dokument fasst bis zu 200 Felder und ein Unterzeichner bis zu 500, und jede Rolle mit Feldern auf einem Dokument benötigt dort ein `signature`- oder `initials`-Feld. Siehe [Felder auf dem Dokument](/de/core-technology/electronic-signature/overview#felder-auf-dem-dokument).",
        "required": [
          "key",
          "type"
        ],
        "properties": {
          "key": {
            "type": "string",
            "pattern": "^[a-z][a-z0-9_]{0,63}$",
            "description": "Benennt das Feld in den Ergebnissen und in `sign.field_values`. Eindeutig innerhalb des Dokuments."
          },
          "type": {
            "type": "string",
            "enum": [
              "signature",
              "initials",
              "full_name",
              "date_signed",
              "text",
              "checkbox",
              "email",
              "data"
            ],
            "description": "Was das Feld enthält. Der Unterzeichner verwendet seine hinterlegte `signature` und `initials`, tippt `text` ein, hakt eine `checkbox` an und gibt eine `email` ein, wenn die Sitzung keine verifizierte E-Mail-Adresse hat. Didit füllt `full_name` (der verifizierte Name), `date_signed` (das Datum der Unterzeichnung in der Zeitzone des Unterzeichners), `data` (aus `prefill`) und eine verifizierte `email` aus und zeigt sie schreibgeschützt an. Es gibt keinen Datepicker-Typ: Verwenden Sie `text`."
          },
          "role": {
            "type": "string",
            "enum": [
              "verified_person",
              "legal_representative",
              "key_people"
            ],
            "description": "Wer das Feld ausfüllt, mit den Werten von `signature_signer`. Ein Schritt füllt und stempelt nur die Felder seines eigenen Unterzeichners aus. Standardmäßig der Unterzeichner des Schritts."
          },
          "page": {
            "type": "integer",
            "minimum": 1,
            "description": "Seitenzahl, von 1 bis zur Gesamtseitenzahl des Dokuments. Bei einem Word-Dokument eine Seite des konvertierten PDFs."
          },
          "x": {
            "type": "number",
            "minimum": 0,
            "maximum": 1,
            "description": "Linke Kante als Bruchteil der Seitenbreite."
          },
          "y": {
            "type": "number",
            "minimum": 0,
            "maximum": 1,
            "description": "Oberer Rand als Bruchteil der Seitenhöhe."
          },
          "width": {
            "type": "number",
            "minimum": 0.02,
            "maximum": 1,
            "description": "Breite als Bruchteil der Seitenbreite. Eine Signatur ist mindestens `0.12` breit."
          },
          "height": {
            "type": "number",
            "minimum": 0.012,
            "maximum": 1,
            "description": "Höhe als Bruchteil der Seitenhöhe. Eine Signatur ist mindestens `0.035` hoch."
          },
          "anchor": {
            "$ref": "#/components/schemas/SignatureFieldAnchor"
          },
          "required": {
            "type": "boolean",
            "description": "`signature` and `initials` are required unless you set `false`. `full_name`, `date_signed` and `data` are always required. The signer can't finish a document until its required fields have a value, and a required checkbox must be ticked."
          },
          "label": {
            "type": "string",
            "minLength": 1,
            "maxLength": 80,
            "description": "Wird dem Unterzeichner und in den Ergebnissen angezeigt. Standardwert richtet sich nach dem Typ."
          },
          "placeholder": {
            "type": "string",
            "nullable": true,
            "maxLength": 80,
            "description": "Nur `text` und `email`."
          },
          "validation": {
            "$ref": "#/components/schemas/SignatureFieldValidation"
          },
          "prefill": {
            "type": "string",
            "nullable": true,
            "description": "Woher der Wert stammt: `identity.full_name`, `identity.first_name`, `identity.last_name`, `identity.date_of_birth` (`DD/MM/YYYY`), `identity.nationality`, `identity.document_number`, `identity.document_type`, `identity.issuing_country`, `identity.address`, `contact.email`, `contact.phone`, `company.name`, `company.registration_number`, `company.address`, `company.country` (KYB), `session.vendor_data`, `metadata.<key>` (ein Schlüssel der `metadata` der Sitzung) oder `api.<key>` (ein Schlüssel von `sign.field_values`). Erforderlich für `data`. `full_name` verwendet immer `identity.full_name` und `email` verwendet `contact.email`. Die Werte der Felder `data`, `full_name` und der verifizierten `email` werden festgelegt, wenn der Unterzeichner mit dem Unterzeichnen beginnt."
          },
          "editable_when_prefilled": {
            "type": "boolean",
            "default": false,
            "description": "Nur `text` und `email`: Der Unterzeichner kann einen vorausgefüllten Wert ändern."
          },
          "checked_by_default": {
            "type": "boolean",
            "default": false,
            "description": "Nur `checkbox`: Das Kästchen ist anfangs angehakt."
          },
          "date_format": {
            "type": "string",
            "enum": [
              "DD/MM/YYYY",
              "MM/DD/YYYY",
              "YYYY-MM-DD",
              "D MMMM YYYY"
            ],
            "default": "DD/MM/YYYY",
            "description": "Nur `date_signed`."
          }
        }
      },
      "SessionSignDocument": {
        "type": "object",
        "required": [
          "file_name",
          "content_base64"
        ],
        "properties": {
          "title": {
            "type": "string",
            "minLength": 1,
            "maxLength": 255,
            "description": "Dem Unterzeichner angezeigter Titel. Standardmäßig `file_name`."
          },
          "file_name": {
            "type": "string",
            "minLength": 1,
            "maxLength": 255,
            "description": "Dateiname, der auf `.pdf` oder `.docx` endet."
          },
          "content_base64": {
            "type": "string",
            "format": "byte",
            "description": "Die Datei, Base64-kodiert. Ein PDF kann bis zu 20 MB und 100 Seiten umfassen, ohne Passwort, Skripte oder angehängte Dateien. Eine Word-Datei (`.docx`) kann bis zu 20 MB umfassen und wird während der Anfrageausführung in maximal 25 Sekunden in ein PDF konvertiert; für das PDF gelten dann dieselben Limits. Bis zu 5 Word-Dateien pro Sitzung. Eine Word-Datei mit Makros, nachverfolgten Änderungen, Links zu externen Inhalten oder eingebetteten Objekten wird mit `signature_document_not_supported` abgelehnt, und eine Datei, die nicht konvertiert werden kann, gibt `signature_document_conversion_failed` zurück, jeweils mit einem `reason`."
          },
          "fields": {
            "type": "array",
            "description": "Optionale Felder, die auf diesem Dokument platziert werden sollen, bis zu 200. Seiten und Positionen beziehen sich auf das PDF bzw. auf das konvertierte PDF bei einer Word-Datei. Ohne Felder liest der Unterzeichner das Dokument und stimmt ihm zu.",
            "items": {
              "$ref": "#/components/schemas/SignatureField"
            },
            "maxItems": 200
          }
        }
      },
      "SignatureResult": {
        "type": "object",
        "description": "Das Ergebnis eines Unterzeichners für einen E-Signatur-Schritt. Siehe den [E-Signatur-Bericht](/de/core-technology/electronic-signature/report-electronic-signature).",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "description": "Als `signature_id` übergeben, um den Nachweis dieses Unterzeichners herunterzuladen oder dessen Signatur zu validieren."
          },
          "node_id": {
            "type": "string",
            "description": "Der Workflow-Schritt, der dies erzeugt hat."
          },
          "status": {
            "type": "string",
            "enum": [
              "intro",
              "review",
              "code",
              "signing",
              "signed",
              "declined"
            ],
            "description": "Wo sich der Unterzeichner im Schritt befindet. Nur `signed` bedeutet, dass die Dokumente unterzeichnet sind."
          },
          "verdict": {
            "type": "string",
            "enum": [
              "Not Finished",
              "Approved",
              "In Review",
              "Declined"
            ],
            "description": "Das Ergebnis des Schritts. Eine Warnung legt es anhand ihrer Regel fest; benutzerdefinierte Statusregeln greifen danach."
          },
          "level": {
            "type": "string",
            "enum": [
              "simple",
              "aes",
              "qes"
            ],
            "description": "`simple` (Standard) oder `aes`. `qes` (Qualifizierte elektronische Signatur, QES) ist ein Add-on, das noch nicht verfügbar ist."
          },
          "format": {
            "type": "string",
            "enum": [
              "pdf",
              "pades"
            ],
            "description": "`pdf` für eine einfache Signatur, `pades` für eine fortgeschrittene elektronische Signatur (AES)."
          },
          "profile": {
            "type": "string",
            "nullable": true,
            "description": "`PAdES-B-LT`, sobald eine fortgeschrittene (AES) Signatur unterzeichnet wurde, andernfalls null."
          },
          "signer": {
            "type": "object",
            "properties": {
              "name": {
                "type": "string",
                "nullable": true,
                "description": "Der Name des Unterzeichners. Verifiziert (aus der genehmigten Ausweisverifizierung oder der Sitzung), außer auf der Stufe Simple ohne einen verifizierten Sitzungsnamen, wo es der vom Unterzeichner eingegebene Name ist und nicht verifiziert wird."
              },
              "capacity": {
                "type": "string",
                "enum": [
                  "self",
                  "company"
                ]
              },
              "company": {
                "type": "string",
                "nullable": true
              },
              "role": {
                "type": "string",
                "nullable": true,
                "description": "Die Bezeichnung der Schlüsselperson, wie angegeben."
              },
              "roles": {
                "type": "array",
                "items": {
                  "type": "string"
                },
                "description": "Die strukturierten Rollen der Schlüsselperson, wie für das Unternehmen angegeben."
              },
              "identity_session_id": {
                "type": "string",
                "format": "uuid",
                "description": "Die KYC-Sitzung, die den Unterzeichner verifiziert hat."
              }
            }
          },
          "identity_used": {
            "type": "object",
            "description": "Die verifizierte Identität, auf der die Signatur basiert. Leer bei einer einfachen Signatur ohne verifizierte Identität.",
            "properties": {
              "session_id": {
                "type": "string",
                "format": "uuid"
              },
              "kyc_id": {
                "type": "string",
                "format": "uuid",
                "nullable": true
              },
              "verified": {
                "type": "boolean"
              },
              "expected_name": {
                "type": "string",
                "nullable": true,
                "description": "Der Name, mit dem der Unterzeichner übereinstimmen musste."
              }
            }
          },
          "certificate": {
            "type": "object",
            "nullable": true,
            "description": "Das Zertifikat, mit dem die Dokumente signiert wurden. `null` bis zur Signatur und bei einer Simple-Signatur immer `null`.",
            "properties": {
              "issuer": {
                "type": "string"
              },
              "issued_to": {
                "type": "string"
              },
              "serial": {
                "type": "string",
                "description": "Seriennummer, hexadezimal."
              },
              "valid_from": {
                "type": "string",
                "format": "date-time"
              },
              "valid_until": {
                "type": "string",
                "format": "date-time"
              }
            }
          },
          "confirmation": {
            "type": "object",
            "properties": {
              "channel": {
                "type": "string",
                "nullable": true,
                "enum": [
                  "email",
                  "sms"
                ],
                "description": "`null` für eine einfache Signatur, die keinen Code hat."
              },
              "destination": {
                "type": "string",
                "nullable": true,
                "description": "Der maskierte Kontakt, an den der Code gesendet wurde."
              },
              "confirmed_at": {
                "type": "string",
                "format": "date-time",
                "nullable": true
              },
              "attempts": {
                "type": "integer",
                "description": "Eingegebene Codes, einschließlich des richtigen."
              }
            }
          },
          "timestamp": {
            "type": "object",
            "nullable": true,
            "description": "Der RFC-3161-Zeitstempel in der Signatur, ausgestellt von Didit. `null`, bis signiert wurde, und immer `null` bei einer Simple-Signatur.",
            "properties": {
              "time": {
                "type": "string",
                "format": "date-time"
              },
              "qualified": {
                "type": "boolean",
                "description": "Für AES immer `false`."
              },
              "valid": {
                "type": "boolean"
              }
            }
          },
          "documents": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string",
                  "format": "uuid",
                  "description": "Das Dokument auf der Kopie dieses Unterzeichners. Verwenden Sie es, um die signierte Datei herunterzuladen."
                },
                "uuid": {
                  "type": "string",
                  "format": "uuid",
                  "description": "Identisch mit `id`."
                },
                "title": {
                  "type": "string"
                },
                "file_name": {
                  "type": "string"
                },
                "pages": {
                  "type": "integer",
                  "description": "Signierte Seiten des Dokuments. Bei Word: Seiten des konvertierten PDFs."
                },
                "size_bytes": {
                  "type": "integer"
                },
                "sha256_original": {
                  "type": "string",
                  "description": "SHA-256 des Dokuments in der Form, wie es dem Unterzeichner angezeigt wurde."
                },
                "sha256_signed": {
                  "type": "string",
                  "nullable": true,
                  "description": "SHA-256 des signierten PDFs, sobald es signiert wurde."
                },
                "status": {
                  "type": "string",
                  "enum": [
                    "signed",
                    "declined",
                    "not_signed",
                    "not_reached"
                  ],
                  "description": "`not_signed`: geöffnet, aber nicht unterzeichnet. `not_reached`: nie geöffnet."
                },
                "opened_at": {
                  "type": "string",
                  "format": "date-time",
                  "nullable": true
                },
                "read_at": {
                  "type": "string",
                  "format": "date-time",
                  "nullable": true,
                  "description": "Wann der Unterzeichner das Ende eines Dokuments ohne Felder erreicht hat, wenn der Schritt dies erfordert."
                },
                "read_to_end": {
                  "type": "boolean"
                },
                "consented_at": {
                  "type": "string",
                  "format": "date-time",
                  "nullable": true,
                  "description": "Wann der Unterzeichner einem Dokument ohne Felder zugestimmt oder die Felder eines Dokuments mit Feldern ausgefüllt hat."
                },
                "consent": {
                  "type": "boolean"
                },
                "signed_file": {
                  "type": "string",
                  "nullable": true,
                  "description": "Pfad des signierten PDFs nach der Signatur. Siehe [Signiertes Dokument herunterladen](/de/sessions-api/electronic-signature/download-signed-document)."
                },
                "mode": {
                  "type": "string",
                  "enum": [
                    "fields",
                    "read_and_agree"
                  ],
                  "description": "`fields` für ein Dokument mit Feldern, `read_and_agree` für ein Dokument ohne."
                },
                "source_format": {
                  "type": "string",
                  "enum": [
                    "pdf",
                    "docx"
                  ],
                  "description": "`pdf` oder `docx` für ein Word-Dokument, das Didit in PDF konvertiert hat."
                },
                "conversion": {
                  "type": "object",
                  "nullable": true,
                  "description": "`null` für ein PDF. Für ein Word-Dokument die Originaldatei und die Konvertierung.",
                  "properties": {
                    "from": {
                      "type": "string",
                      "enum": [
                        "docx"
                      ]
                    },
                    "file_name": {
                      "type": "string",
                      "description": "Ihr ursprünglicher Word-Dateiname."
                    },
                    "sha256": {
                      "type": "string",
                      "description": "SHA-256 Ihrer ursprünglichen Word-Datei."
                    },
                    "size_bytes": {
                      "type": "integer",
                      "description": "Größe Ihrer ursprünglichen Word-Datei."
                    },
                    "converter": {
                      "type": "string",
                      "description": "Version des Konverters, der das PDF erstellt hat."
                    }
                  }
                },
                "fields": {
                  "type": "array",
                  "description": "Felder auf dem Dokument mit ihren Werten. Leer bei einem Dokument ohne Felder.",
                  "items": {
                    "$ref": "#/components/schemas/SignatureFieldResult"
                  }
                }
              }
            }
          },
          "adopted_signature": {
            "type": "object",
            "nullable": true,
            "description": "Die Signatur und Initialen, die der Unterzeichner für Signatur- und Initialenfelder übernommen hat. `null`, bis der Unterzeichner eine übernimmt.",
            "properties": {
              "method": {
                "type": "string",
                "enum": [
                  "typed",
                  "drawn"
                ],
                "description": "`typed`: der verifizierte Name im Handschriftstil. `drawn`: mit einem Finger oder einer Maus gezeichnet."
              },
              "font": {
                "type": "string",
                "nullable": true,
                "description": "Der Handschriftstil einer getippten Signatur. `null`, wenn gezeichnet."
              },
              "adopted_at": {
                "type": "string",
                "format": "date-time"
              }
            }
          },
          "electronic_signature_consent_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "description": "Wann der Unterzeichner auf dem Prüfungsbildschirm zugestimmt hat, die Dokumente elektronisch zu signieren. Wird gesetzt, wenn irgendein Dokument Felder enthält."
          },
          "evidence_file": {
            "type": "string",
            "nullable": true,
            "description": "Pfad der Nachweis-PDF-Datei nach der Signierung. Siehe [Signaturnachweis herunterladen](/de/sessions-api/electronic-signature/download-evidence)."
          },
          "warnings": {
            "type": "array",
            "description": "Für diesen Unterzeichner ausgelöste Warnungen. Siehe [E-Signatur-Warnungen](/de/core-technology/electronic-signature/warnings-electronic-signature).",
            "items": {
              "type": "object",
              "properties": {
                "code": {
                  "type": "string",
                  "enum": [
                    "SIGNATURE_DECLINED",
                    "SIGNATURE_OTP_FAILED",
                    "SIGNATURE_NAME_MISMATCH",
                    "SIGNATURE_IDENTITY_NOT_VERIFIED",
                    "SIGNATURE_DOCUMENT_CHANGED",
                    "SIGNATURE_FIELD_DATA_MISSING"
                  ]
                },
                "node_id": {
                  "type": "string"
                }
              }
            }
          },
          "validation": {
            "type": "object",
            "nullable": true,
            "description": "Die letzte kryptografische Prüfung der signierten Dokumente. `null`, bis die Dokumente signiert sind. Wenn Didit das Ergebnis der Signierung nicht bestätigen kann, lautet es `{\"valid\": null, \"reason\": \"signature_provider_outcome_unknown\", \"checked_at\": ...}` und `status` bleibt `signing`: Behandeln Sie es als nicht signiert.",
            "properties": {
              "valid": {
                "type": "boolean",
                "nullable": true,
                "description": "`true`, wenn jedes Dokument gültig ist. `null`, wenn das Ergebnis der Signierung nicht bestätigt werden konnte."
              },
              "reason": {
                "type": "string",
                "description": "Wird gesetzt, wenn `valid` gleich `null` ist: `signature_provider_outcome_unknown`."
              },
              "checked_at": {
                "type": "string",
                "format": "date-time"
              },
              "documents": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "id": {
                      "type": "string",
                      "format": "uuid"
                    },
                    "checked_at": {
                      "type": "string",
                      "format": "date-time"
                    },
                    "valid": {
                      "type": "boolean",
                      "description": "`true`, wenn sowohl die Signatur als auch der Zeitstempel gültig und vertrauenswürdig sind."
                    },
                    "integrity": {
                      "type": "boolean",
                      "description": "`true`, wenn das Dokument seit der Signierung unverändert ist."
                    },
                    "trusted": {
                      "type": "boolean",
                      "description": "`true`, wenn das Signaturzertifikat auf ein vertrauenswürdiges Stammzertifikat zurückgeht."
                    },
                    "revoked": {
                      "type": "boolean"
                    },
                    "trusted_list": {
                      "type": "object",
                      "description": "Prüfung der EU-Vertrauensliste. Für AES: `{\"status\": \"not_applicable\", \"reason\": \"aes_not_qualified\"}`.",
                      "properties": {
                        "status": {
                          "type": "string"
                        },
                        "reason": {
                          "type": "string"
                        }
                      }
                    },
                    "certificate": {
                      "type": "object",
                      "nullable": true,
                      "description": "Das Zertifikat, mit dem die Dokumente signiert wurden. `null` bis zur Signatur und bei einer Simple-Signatur immer `null`.",
                      "properties": {
                        "issuer": {
                          "type": "string"
                        },
                        "issued_to": {
                          "type": "string"
                        },
                        "serial": {
                          "type": "string",
                          "description": "Seriennummer, hexadezimal."
                        },
                        "valid_from": {
                          "type": "string",
                          "format": "date-time"
                        },
                        "valid_until": {
                          "type": "string",
                          "format": "date-time"
                        }
                      }
                    },
                    "timestamp": {
                      "type": "object",
                      "nullable": true,
                      "description": "Der RFC-3161-Zeitstempel in der Signatur, ausgestellt von Didit. `null`, bis signiert wurde, und immer `null` bei einer Simple-Signatur.",
                      "properties": {
                        "time": {
                          "type": "string",
                          "format": "date-time"
                        },
                        "qualified": {
                          "type": "boolean",
                          "description": "Für AES immer `false`."
                        },
                        "valid": {
                          "type": "boolean"
                        }
                      }
                    }
                  }
                }
              }
            }
          },
          "declined_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "declined_action": {
            "type": "string",
            "enum": [
              "DECLINE",
              "REVIEW",
              "NO_ACTION"
            ]
          },
          "signed_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "expires_at": {
            "type": "string",
            "format": "date-time",
            "description": "Wann der Signaturlink aufhört zu funktionieren."
          },
          "email_sent_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "email_unavailable_reason": {
            "type": "string",
            "nullable": true
          },
          "ip_address": {
            "type": "string",
            "nullable": true,
            "description": "Die IP-Adresse des Unterzeichners, als er seinen Code angefordert hat."
          },
          "place": {
            "type": "string",
            "nullable": true,
            "description": "Nicht erfasst: immer `null`."
          },
          "place_unavailable_reason": {
            "type": "string",
            "nullable": true,
            "enum": [
              "not_collected"
            ]
          }
        }
      },
      "SignatureFieldValidation": {
        "type": "object",
        "nullable": true,
        "description": "Regeln für den Wert eines `text`-Felds. Die Konsolenvorschau, der Signatur-Ablauf und die API wenden dieselben Regeln an.",
        "properties": {
          "kind": {
            "type": "string",
            "enum": [
              "any",
              "letters",
              "number",
              "email",
              "pattern"
            ],
            "description": "`letters`: Buchstaben in jedem Schriftsystem, Leerzeichen, Bindestriche und Apostrophe. `number`: Ziffern mit einem optionalen Dezimaltrennzeichen. `pattern`: Der Wert muss mit `pattern` übereinstimmen."
          },
          "min_length": {
            "type": "integer",
            "minimum": 0,
            "maximum": 500,
            "description": "Von `0` bis `max_length`."
          },
          "max_length": {
            "type": "integer",
            "minimum": 1,
            "maximum": 500,
            "default": 120
          },
          "pattern": {
            "type": "string",
            "nullable": true,
            "minLength": 1,
            "maxLength": 200,
            "description": "Erforderlich bei `kind: \"pattern\"`. Ein regulärer Ausdruck, mit dem der gesamte Wert übereinstimmen muss. Lookarounds und Backreferences werden nicht unterstützt."
          },
          "message": {
            "type": "string",
            "nullable": true,
            "maxLength": 120,
            "description": "Wird dem Unterzeichner anstelle des Standardfehlers angezeigt."
          }
        }
      },
      "SignatureFieldAnchor": {
        "type": "object",
        "description": "Platziert ein Feld anhand einer Textstelle im Dokument anstelle einer Position. Didit entfernt den Text nicht aus dem PDF; schreiben Sie ihn daher in derselben Farbe wie den Seitenhintergrund. Wenn der Text nicht gefunden wird, gibt der Aufruf `400` mit `field_anchor_not_found` zurück. Siehe [Felder über Ankertext platzieren](/de/sessions-api/create-session#felder-über-ankertext-platzieren).",
        "required": [
          "text"
        ],
        "properties": {
          "text": {
            "type": "string",
            "minLength": 1,
            "maxLength": 64,
            "description": "Im Dokument gesuchter Text. Bei einer Word-Datei im konvertierten PDF."
          },
          "occurrence": {
            "type": "string",
            "enum": [
              "first",
              "all"
            ],
            "default": "first",
            "description": "`all` fügt pro Übereinstimmung ein Feld ein; die Schlüssel nach dem ersten erhalten `_2`, `_3` und so weiter."
          },
          "offset_x": {
            "type": "number",
            "description": "Am linken Rand des Texts hinzugefügt, als Bruchteil der Seitenbreite."
          },
          "offset_y": {
            "type": "number",
            "description": "Am oberen Rand des Texts hinzugefügt, als Bruchteil der Seitenhöhe."
          },
          "width": {
            "type": "number",
            "minimum": 0.02,
            "maximum": 1,
            "description": "Breite des Felds als Bruchteil der Seitenbreite."
          },
          "height": {
            "type": "number",
            "minimum": 0.012,
            "maximum": 1,
            "description": "Höhe des Felds als Bruchteil der Seitenhöhe."
          }
        }
      },
      "SignatureFieldResult": {
        "type": "object",
        "description": "Ein Feld eines signierten Dokuments mit seinem Wert auf der Kopie dieses Unterzeichners. Siehe [Felder](/de/core-technology/electronic-signature/report-electronic-signature#felder).",
        "properties": {
          "key": {
            "type": "string",
            "description": "Der Schlüssel des Felds, wie in `sign.field_values` verwendet."
          },
          "type": {
            "type": "string",
            "enum": [
              "signature",
              "initials",
              "full_name",
              "date_signed",
              "text",
              "checkbox",
              "email",
              "data"
            ]
          },
          "role": {
            "type": "string",
            "enum": [
              "verified_person",
              "legal_representative",
              "key_people"
            ]
          },
          "label": {
            "type": "string"
          },
          "page": {
            "type": "integer",
            "description": "Seitenzahl, beginnend bei 1. Bei einem Word-Dokument eine Seite des konvertierten PDFs."
          },
          "x": {
            "type": "number",
            "description": "Linke Kante als Bruchteil der Seitenbreite."
          },
          "y": {
            "type": "number",
            "description": "Oberer Rand als Bruchteil der Seitenhöhe."
          },
          "width": {
            "type": "number",
            "description": "Breite als Bruchteil der Seitenbreite."
          },
          "height": {
            "type": "number",
            "description": "Höhe als Bruchteil der Seitenhöhe."
          },
          "required": {
            "type": "boolean"
          },
          "value": {
            "nullable": true,
            "description": "Ein String für `text`, `email`, `full_name`, `date_signed` und `data`, ein boolescher Wert für eine `checkbox` und `true` für eine gesetzte Signatur oder gesetzte Initialen. `null`, wenn leer."
          },
          "display_value": {
            "type": "string",
            "nullable": true,
            "description": "Der Wert, wie er auf der Seite eingetragen ist: Datumsangaben im `date_format` des Felds, `Yes` oder `No` für ein Kontrollkästchen, `Signed` für eine Signatur oder Initialen."
          },
          "value_source": {
            "type": "string",
            "nullable": true,
            "enum": [
              "signer",
              "identity",
              "contact",
              "company",
              "session",
              "metadata",
              "api",
              "signing_time",
              null
            ],
            "description": "Woher der Wert stammt: `signer` (vom Unterzeichner eingegeben, angehakt oder angewendet), `identity` (der verifizierte Ausweis), `contact` (die verifizierte E-Mail-Adresse oder Telefonnummer), `company` (das verifizierte Unternehmen), `session` (`vendor_data`), `metadata`, `api` (`sign.field_values`) oder `signing_time` (das Unterzeichnungsdatum)."
          },
          "filled_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "image_url": {
            "type": "string",
            "nullable": true,
            "description": "Nur Signatur und Initialen: der Pfad des angewendeten Bildes. Siehe [Signaturbild herunterladen](/de/sessions-api/electronic-signature/download-field-image)."
          },
          "value_unavailable_reason": {
            "type": "string",
            "nullable": true,
            "enum": [
              "source_empty",
              null
            ],
            "description": "`source_empty`, wenn ein vorausgefülltes Feld in der Sitzung keinen Wert hatte und `signature_field_data_missing_action` dem Unterzeichner das Signieren trotzdem erlaubt hat."
          }
        }
      },
      "VaspDirectoryWidgetEntry": {
        "type": "object",
        "description": "Was die VASP-Auswahl des Endbenutzers anzeigt: wer der VASP ist und ob er erreichbar ist.",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "description": "Die ID des Eintrags, für GET /v3/travel-rule/vasps/{vasp_id}/."
          },
          "kind": {
            "type": "string",
            "enum": [
              "directory",
              "didit"
            ],
            "description": "directory für einen Eintrag des gemeinsamen Verzeichnisses; didit für ein Mitglied des Didit-Netzwerks."
          },
          "name": {
            "type": "string"
          },
          "lei": {
            "type": "string"
          },
          "jurisdiction": {
            "type": "string",
            "description": "ISO 3166-Ländercode, wie von der Quelle bereitgestellt."
          },
          "domains": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Die Web-Domains des VASPs. Für Didit-Netzwerkmitglieder immer leer."
          },
          "reachable": {
            "type": "boolean",
            "description": "Gibt an, ob Ihre Anwendung über eine verfügbare Route zu diesem VASP oder zu einer seiner Einheiten für eine Marke verfügt. Bei Mitgliedern des Didit-Netzwerks immer true."
          }
        }
      },
      "TravelRuleDataSharingFields": {
        "type": "object",
        "description": "Die Felder, die Didit pro Entitätstyp an das Gegenpartei-VASP über Ihre eigenen Benutzer sendet. Der `name` und die `wallet_address` werden immer gesendet, unabhängig vom Inhalt der Liste. Ein Entitätstyp, den Sie nie ausgewählt haben, teilt jedes Feld. Eine leere Liste ist ebenfalls eine Auswahl: Sie teilt nur den Namen und die Wallet.",
        "properties": {
          "individual": {
            "type": "array",
            "items": {
              "type": "string",
              "enum": [
                "name",
                "wallet_address",
                "address",
                "national_id",
                "customer_identification",
                "date_of_birth",
                "place_of_birth"
              ]
            },
            "description": "Über eine natürliche Person geteilte Felder."
          },
          "company": {
            "type": "array",
            "items": {
              "type": "string",
              "enum": [
                "name",
                "wallet_address",
                "address",
                "national_id",
                "customer_identification"
              ]
            },
            "description": "Über eine juristische Person geteilte Felder."
          }
        }
      },
      "TravelRuleMatchingRules": {
        "type": "object",
        "description": "Wie genau jedes Feld der Daten der Gegenpartei mit den bei Ihnen vorliegenden Daten verglichen wird, pro Entitätstyp. Ein weggelassenes Feld behält seinen Standardwert. `NONE` überspringt den Vergleich, `STRICT` erfordert exakt dieselben Wörter, `CONTAINS` akzeptiert einen Wert, dessen Wörter alle im anderen vorkommen, `DEFAULT` ist der Standard-Teilmengenabgleich und `FUZZY` akzeptiert ähnliche Schreibweisen (sowie bei Geburtsdaten einen vertauschten Tag und Monat).",
        "properties": {
          "individual": {
            "type": "object",
            "description": "Regeln für eine natürliche Person.",
            "properties": {
              "name": {
                "type": "string",
                "enum": [
                  "NONE",
                  "STRICT",
                  "CONTAINS",
                  "DEFAULT",
                  "FUZZY"
                ],
                "description": "Standard: folgt `name_matching_strictness`."
              },
              "date_of_birth": {
                "type": "string",
                "enum": [
                  "NONE",
                  "STRICT",
                  "CONTAINS",
                  "DEFAULT",
                  "FUZZY"
                ],
                "description": "Standard `NONE`."
              },
              "address": {
                "type": "string",
                "enum": [
                  "NONE",
                  "STRICT",
                  "CONTAINS",
                  "DEFAULT",
                  "FUZZY"
                ],
                "description": "Standard `NONE`."
              },
              "account": {
                "type": "string",
                "enum": [
                  "NONE",
                  "STRICT",
                  "CONTAINS",
                  "DEFAULT",
                  "FUZZY"
                ],
                "description": "Die Wallet, über die der Austausch weitergeleitet wurde. Standardwert `STRICT`."
              }
            }
          },
          "company": {
            "type": "object",
            "description": "Regeln für eine juristische Person.",
            "properties": {
              "name": {
                "type": "string",
                "enum": [
                  "NONE",
                  "STRICT",
                  "CONTAINS",
                  "DEFAULT",
                  "FUZZY"
                ],
                "description": "Standard: folgt `name_matching_strictness`."
              },
              "address": {
                "type": "string",
                "enum": [
                  "NONE",
                  "STRICT",
                  "CONTAINS",
                  "DEFAULT",
                  "FUZZY"
                ],
                "description": "Standard `NONE`."
              },
              "account": {
                "type": "string",
                "enum": [
                  "NONE",
                  "STRICT",
                  "CONTAINS",
                  "DEFAULT",
                  "FUZZY"
                ],
                "description": "Die Wallet, über die der Austausch weitergeleitet wurde. Standardwert `STRICT`."
              }
            }
          }
        }
      },
      "TravelRuleDataMatch": {
        "type": "object",
        "nullable": true,
        "description": "Feldweiser Abgleich der Daten der an der Übertragung beteiligten Partei mit den Informationen der Gegenseite über den Wallet-Inhaber. Nennt Felder und Ergebnisse, niemals Werte, damit die Lesbarkeit erhalten bleibt, während die Daten der Gegenpartei maskiert sind. Null, bis ein Abgleich ausgeführt wurde.",
        "properties": {
          "matched": {
            "type": "boolean",
            "description": "True, wenn kein verglichenes Feld abweicht."
          },
          "mismatched_fields": {
            "type": "array",
            "items": {
              "type": "string",
              "enum": [
                "name",
                "date_of_birth",
                "address",
                "account"
              ]
            },
            "description": "Die Felder, die sich unterscheiden."
          },
          "fields": {
            "type": "object",
            "description": "Ein Eintrag pro verglichenem Feld für den Entitätstyp der Partei (`name`, `date_of_birth`, `address`, `account`; ein Unternehmen hat kein `date_of_birth`).",
            "additionalProperties": {
              "type": "object",
              "properties": {
                "result": {
                  "type": "string",
                  "enum": [
                    "matched",
                    "mismatched",
                    "not_compared"
                  ],
                  "description": "`not_compared`, wenn die Regel `NONE` ist oder eine der beiden Seiten keinen Wert für das Feld aufweist."
                },
                "strictness": {
                  "type": "string",
                  "enum": [
                    "NONE",
                    "STRICT",
                    "CONTAINS",
                    "DEFAULT",
                    "FUZZY"
                  ]
                }
              }
            }
          }
        }
      },
      "TravelRuleDataUnmasked": {
        "type": "object",
        "nullable": true,
        "description": "Audit-Eintrag des Zeitpunkts, zu dem die Daten der Gegenpartei demaskiert wurden. Null, solange die Daten noch maskiert sind, sowie bei ausgehenden Überweisungen.",
        "properties": {
          "at": {
            "type": "string",
            "format": "date-time"
          },
          "reason": {
            "type": "string",
            "enum": [
              "ownership_confirmed",
              "wallet_proof",
              "address_book_match",
              "own_verified_wallet",
              "inquiry_approved",
              "known_payment_method",
              "travel_address"
            ],
            "description": "Was die Inhaberschaft bestätigt hat: ownership_confirmed (Ihre Bestätigung über die Konsole oder die API), wallet_proof (ein Wallet-Nachweis im Widget oder ein eingehender INTERNAL-Transfer, festgelegt bei der Erstellung), address_book_match (eine verifizierte Adressbuch-Wallet), own_verified_wallet (die eigene verifizierte Wallet Ihres Benutzers), inquiry_approved (Ihre Genehmigung einer eingehenden TRP-Anfrage oder einer GTR- oder Sygna-Nachricht), known_payment_method (eine Wallet, mit der Ihr Benutzer bereits bezahlt hat) oder travel_address (die pro Wallet angegebene Travel Address)."
          },
          "actor": {
            "type": "string",
            "description": "Wer die Bestätigung vorgenommen hat: die E-Mail-Adresse des Konsolenbenutzers oder die Bezeichnung des API-Schlüssels. Leer bei einer automatischen Entscheidung."
          }
        }
      },
      "TravelRuleMessageAttachment": {
        "type": "object",
        "nullable": true,
        "description": "Das an eine Nachricht angehängte Dokument, gespeichert wie jedes andere Transaktionsdokument.",
        "properties": {
          "uuid": {
            "type": "string",
            "format": "uuid"
          },
          "label": {
            "type": "string",
            "nullable": true
          },
          "note": {
            "type": "string",
            "nullable": true
          },
          "uploaded_by": {
            "type": "string",
            "nullable": true,
            "description": "Wer die Datei angehängt hat. Im Abrufportal zeigt eine von Ihnen gesendete Datei Ihren VASP-Namen, niemals die dahinterstehende Person oder den API-Schlüssel."
          },
          "created_at": {
            "type": "string",
            "format": "date-time"
          },
          "files": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "uuid": {
                  "type": "string",
                  "format": "uuid"
                },
                "file_url": {
                  "type": "string",
                  "nullable": true,
                  "description": "Zeitlich begrenzte Download-URL."
                },
                "original_filename": {
                  "type": "string"
                },
                "file_size": {
                  "type": "integer"
                }
              }
            }
          }
        }
      },
      "TravelRuleMessage": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "kind": {
            "type": "string",
            "enum": [
              "MESSAGE",
              "DOCUMENT_REQUEST"
            ]
          },
          "direction": {
            "type": "string",
            "enum": [
              "INBOUND",
              "OUTBOUND"
            ],
            "description": "`OUTBOUND` ist das, was die eigene Seite des Lesers gesendet hat. Im Abholportal entspricht die Richtung der Sicht der Gegenpartei."
          },
          "author": {
            "type": "string",
            "description": "Wer es auf der jeweiligen Seite verfasst hat: die E-Mail-Adresse eines Console-Benutzers, die Bezeichnung eines API-Schlüssels oder der Name des anderen VASP."
          },
          "body": {
            "type": "string"
          },
          "requested_documents": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Was bei einem DOCUMENT_REQUEST angefordert wird, in den Worten des Anfragenden."
          },
          "reply_to": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "fulfilled_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "description": "Wird für ein DOCUMENT_REQUEST gesetzt, sobald eine Antwort darauf ein Dokument enthält."
          },
          "attachment": {
            "$ref": "#/components/schemas/TravelRuleMessageAttachment"
          },
          "created_at": {
            "type": "string",
            "format": "date-time"
          }
        }
      },
      "TravelRuleMessageCreateRequest": {
        "type": "object",
        "description": "Senden Sie als JSON oder als multipart/form-data mit den Anhängen in `files`.",
        "properties": {
          "kind": {
            "type": "string",
            "enum": [
              "MESSAGE",
              "DOCUMENT_REQUEST"
            ],
            "default": "MESSAGE"
          },
          "body": {
            "type": "string",
            "maxLength": 5000,
            "description": "Erforderlich für eine MESSAGE, es sei denn, eine Datei ist angehängt."
          },
          "requested_documents": {
            "type": "array",
            "items": {
              "type": "string",
              "maxLength": 255
            },
            "maxItems": 10,
            "description": "Erforderlich (mindestens eines) für einen DOCUMENT_REQUEST und nur dort zulässig."
          },
          "reply_to": {
            "type": "string",
            "format": "uuid",
            "nullable": true,
            "description": "Eine Nachricht desselben Transfers. Eine Antwort, die ein Dokument enthält, erfüllt die Dokumentenanforderung, auf die sie antwortet."
          },
          "files": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "binary"
            },
            "maxItems": 5,
            "description": "Nur Multipart. Bis zu 5 Dateien mit jeweils 10 MB."
          }
        }
      },
      "SessionDeletionJob": {
        "type": "object",
        "description": "Eine Massenlöschung von Sitzungen, die im Hintergrund ausgeführt wird: Fortschritt und Anzahlen pro Ergebnis, niemals welche Sitzungen gelöscht wurden.",
        "properties": {
          "job_id": {
            "type": "string",
            "format": "uuid",
            "description": "Rufen Sie `GET /v3/sessions/delete/{job_id}/` mit dieser ID regelmäßig ab."
          },
          "status": {
            "type": "string",
            "enum": [
              "PENDING",
              "PROCESSING",
              "COMPLETED",
              "FAILED"
            ],
            "description": "`PENDING`: Akzeptiert, noch nicht gestartet. `PROCESSING`: Wird gelöscht; `processed` und `outcomes` werden aktualisiert. `COMPLETED`: Jede ausgewählte Sitzung wurde berücksichtigt. `FAILED`: Der Auftrag wurde vorzeitig abgebrochen; siehe `error`."
          },
          "total": {
            "type": "integer",
            "description": "Sitzungen, die ausgewählt wurden, als die Löschung angefordert wurde."
          },
          "processed": {
            "type": "integer",
            "description": "Sitzungen, die der Job bisher abgeschlossen hat."
          },
          "outcomes": {
            "type": "object",
            "description": "Wie viele Sitzungen mit welchem Ergebnis geendet haben. Jeder Schlüssel ist immer vorhanden.",
            "properties": {
              "deleted": {
                "type": "integer",
                "description": "Zusammen mit ihrem Gesichts-Embedding gelöschte Sitzungen."
              },
              "none": {
                "type": "integer",
                "description": "Gelöschte Sitzungen, die kein Gesichts-Embedding hatten."
              },
              "retained_with_user": {
                "type": "integer",
                "description": "Gelöschte Sitzungen, bei denen ein bildfreies biometrisches Template für ihren Benutzer aufbewahrt wurde, wie von der Anfrage oder der Anwendungsrichtlinie gefordert."
              },
              "ineligible_no_vendor_user": {
                "type": "integer",
                "description": "Gelöschte Sitzungen samt ihrem Gesichts-Embedding, da eine Aufbewahrung angefordert wurde, sie jedoch keinen verknüpften Benutzer hatten."
              },
              "failed_retryable": {
                "type": "integer",
                "description": "Sitzungen, die als nicht gelöscht gemeldet wurden. Ein Job versucht, eine Gruppe, die er nicht selbst löschen konnte, erneut zu löschen, anstatt sie hier mitzuzählen."
              },
              "already_deleted": {
                "type": "integer",
                "description": "Ausgewählte Sitzungen, die bereits gelöscht waren, beispielsweise durch eine andere Anfrage, als der Job sie erreichte."
              }
            }
          },
          "deleted_child_verifications": {
            "type": "integer",
            "description": "Verifizierungen, die durch die gelöschten Unternehmensverifizierungen erstellt wurden und mit ihnen gelöscht werden. Immer `0` bei einem Job, der durch `POST /v3/sessions/delete/` gestartet wurde, da dieser nur KYC-Sitzungen löscht."
          },
          "error": {
            "type": "string",
            "nullable": true,
            "description": "`null`, außer wenn `status` auf `FAILED` steht; dann der Grund, warum die Löschung gestoppt wurde. Die Sitzungen, die der Job noch nicht erreicht hatte, bleiben bestehen: Wiederholen Sie die Anfrage, um sie zu löschen."
          },
          "created_at": {
            "type": "string",
            "format": "date-time",
            "description": "Wann die Löschung angefordert wurde."
          },
          "completed_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "description": "Wann der Job beendet wurde; `null`, während er läuft."
          }
        }
      },
      "EntityStatusUpdateRequest": {
        "type": "object",
        "required": [
          "status"
        ],
        "properties": {
          "status": {
            "type": "string",
            "enum": [
              "ACTIVE",
              "FLAGGED",
              "BLOCKED"
            ],
            "description": "Neuer Lebenszyklusstatus. `BLOCKED` fügt die `vendor_data` außerdem zur System-Sperrliste hinzu."
          }
        }
      },
      "AMLMonitoringToggleResult": {
        "oneOf": [
          {
            "type": "object",
            "required": [
              "users_total",
              "already_enabled",
              "with_existing_aml",
              "needing_screening",
              "skipped_no_identity_data",
              "skipped_blocked",
              "estimated_screening_cost_usd",
              "estimated_annual_monitoring_cost_usd",
              "balance_sufficient",
              "unmatched"
            ],
            "description": "Kostenvorschau. Wird direkt zurückgegeben, wenn estimate_only wahr ist (es wird nichts geschrieben).",
            "properties": {
              "users_total": {
                "type": "integer",
                "description": "Profile, die der Auswahl entsprechen."
              },
              "already_enabled": {
                "type": "integer",
                "description": "Profile, die bereits überwacht werden (beim Aktivieren ist nichts zu tun; diese werden beim Deaktivieren abgeschaltet)."
              },
              "with_existing_aml": {
                "type": "integer",
                "description": "Profile, deren bestehendes AML-Screening auf überwacht umgestellt wird (kein neues Screening)."
              },
              "needing_screening": {
                "type": "integer",
                "description": "Profile ohne bisheriges AML-Screening, die zuerst gescreent werden (abgerechnet als reguläres AML-Screening)."
              },
              "skipped_no_identity_data": {
                "type": "integer",
                "description": "Profile, die nicht gescreent werden können, da Identitätsdaten fehlen."
              },
              "skipped_blocked": {
                "type": "integer",
                "description": "Gesperrte Benutzer, die übersprungen werden (bei Unternehmen immer 0)."
              },
              "estimated_screening_cost_usd": {
                "type": "number",
                "example": 0.2,
                "description": "Einmalige Kosten für die neuen Screenings."
              },
              "estimated_annual_monitoring_cost_usd": {
                "type": "number",
                "example": 0.07,
                "description": "Jährliche Überwachungskosten für die Profile, die künftig überwacht werden."
              },
              "balance_sufficient": {
                "type": "boolean",
                "description": "Gibt an, ob das Guthaben der Organisation das Screening plus das erste Jahr der Überwachung abdeckt."
              },
              "unmatched": {
                "type": "array",
                "items": {
                  "type": "string"
                },
                "description": "Kennungen der Anfrage, die mit keinem Profil in dieser Anwendung übereinstimmten, exakt wie gesendet."
              }
            }
          },
          {
            "type": "object",
            "required": [
              "job_id",
              "status",
              "is_enabled",
              "target_type",
              "total",
              "processed",
              "outcomes",
              "results",
              "error",
              "created_at",
              "completed_at",
              "estimate",
              "unmatched"
            ],
            "properties": {
              "job_id": {
                "type": "string",
                "format": "uuid"
              },
              "status": {
                "type": "string",
                "enum": [
                  "PENDING",
                  "PROCESSING",
                  "COMPLETED",
                  "FAILED"
                ]
              },
              "is_enabled": {
                "type": "boolean",
                "description": "true, wenn der Job die Überwachung aktiviert, false, wenn er sie deaktiviert."
              },
              "target_type": {
                "type": "string",
                "enum": [
                  "user",
                  "business"
                ],
                "description": "Welche Profilfamilie der Auftrag umschaltet."
              },
              "total": {
                "type": "integer",
                "description": "Profile, die der Job verarbeitet."
              },
              "processed": {
                "type": "integer",
                "description": "Bisher verarbeitete Profile."
              },
              "outcomes": {
                "type": "object",
                "description": "Ergebniszähler pro Datensatz. Jedes ausgewählte Profil wird genau einem Zähler zugeordnet; nichts wird stillschweigend übersprungen.",
                "properties": {
                  "enabled": {
                    "type": "integer",
                    "description": "Überwachung für ein bestehendes AML-Screening aktiviert."
                  },
                  "screened_and_enabled": {
                    "type": "integer",
                    "description": "Ein neues AML-Screening wurde erstellt (in Rechnung gestellt) und die Überwachung dafür aktiviert."
                  },
                  "already_enabled": {
                    "type": "integer",
                    "description": "Überwachung war bereits aktiv; es wurde nichts geändert und nichts in Rechnung gestellt."
                  },
                  "disabled": {
                    "type": "integer",
                    "description": "Überwachung für jedes AML-Screening des Profils deaktiviert."
                  },
                  "skipped_no_identity_data": {
                    "type": "integer",
                    "description": "Übersprungen: Dem Profil fehlen der vollständige Name, das Geburtsdatum und das Land (Benutzer) oder ein Name (Unternehmen), die für das Screening erforderlich sind."
                  },
                  "skipped_blocked": {
                    "type": "integer",
                    "description": "Übersprungen: Der Benutzer ist gesperrt."
                  },
                  "skipped_sandbox": {
                    "type": "integer",
                    "description": "Übersprungen: Sandbox-Anwendung, es wird kein Screening erstellt."
                  },
                  "failed_provider": {
                    "type": "integer",
                    "description": "Das Screening konnte nicht abgeschlossen werden; versuchen Sie es später erneut."
                  },
                  "failed_insufficient_balance": {
                    "type": "integer",
                    "description": "Das Guthaben wurde aufgebraucht, während der Auftrag lief."
                  }
                }
              },
              "results": {
                "type": "array",
                "description": "Ein Eintrag pro verarbeitetem Profil, in der Reihenfolge der Verarbeitung. Wächst, während der Job läuft; vollständig, sobald der Status COMPLETED ist. Erfasst für Jobs, die über die API gestartet wurden.",
                "items": {
                  "type": "object",
                  "properties": {
                    "didit_internal_id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "Interne Didit-ID des Profils."
                    },
                    "vendor_data": {
                      "type": "string",
                      "nullable": true,
                      "description": "Ihre eigene Kennung für das Profil."
                    },
                    "outcome": {
                      "type": "string",
                      "enum": [
                        "enabled",
                        "screened_and_enabled",
                        "already_enabled",
                        "disabled",
                        "skipped_no_identity_data",
                        "skipped_blocked",
                        "skipped_sandbox",
                        "failed_provider",
                        "failed_insufficient_balance"
                      ]
                    }
                  }
                }
              },
              "error": {
                "type": "string",
                "nullable": true,
                "description": "Generische Fehlermeldung, wenn der Status FAILED lautet; die detaillierte Ursache verbleibt auf Plattformseite."
              },
              "created_at": {
                "type": "string",
                "format": "date-time"
              },
              "completed_at": {
                "type": "string",
                "format": "date-time",
                "nullable": true
              },
              "estimate": {
                "type": "object",
                "description": "Kostenvorschau. Wird direkt zurückgegeben, wenn estimate_only wahr ist (es wird nichts geschrieben).",
                "properties": {
                  "users_total": {
                    "type": "integer",
                    "description": "Profile, die der Auswahl entsprechen."
                  },
                  "already_enabled": {
                    "type": "integer",
                    "description": "Profile, die bereits überwacht werden (beim Aktivieren ist nichts zu tun; diese werden beim Deaktivieren abgeschaltet)."
                  },
                  "with_existing_aml": {
                    "type": "integer",
                    "description": "Profile, deren bestehendes AML-Screening auf überwacht umgestellt wird (kein neues Screening)."
                  },
                  "needing_screening": {
                    "type": "integer",
                    "description": "Profile ohne bisheriges AML-Screening, die zuerst gescreent werden (abgerechnet als reguläres AML-Screening)."
                  },
                  "skipped_no_identity_data": {
                    "type": "integer",
                    "description": "Profile, die nicht gescreent werden können, da Identitätsdaten fehlen."
                  },
                  "skipped_blocked": {
                    "type": "integer",
                    "description": "Gesperrte Benutzer, die übersprungen werden (bei Unternehmen immer 0)."
                  },
                  "estimated_screening_cost_usd": {
                    "type": "number",
                    "example": 0.2,
                    "description": "Einmalige Kosten für die neuen Screenings."
                  },
                  "estimated_annual_monitoring_cost_usd": {
                    "type": "number",
                    "example": 0.07,
                    "description": "Jährliche Überwachungskosten für die Profile, die künftig überwacht werden."
                  },
                  "balance_sufficient": {
                    "type": "boolean",
                    "description": "Gibt an, ob das Guthaben der Organisation das Screening plus das erste Jahr der Überwachung abdeckt."
                  }
                }
              },
              "unmatched": {
                "type": "array",
                "items": {
                  "type": "string"
                },
                "description": "Kennungen der Anfrage, die mit keinem Profil in dieser Anwendung übereinstimmten, exakt wie gesendet. Sie sind nicht Teil des Auftrags."
              }
            }
          }
        ]
      },
      "AMLMonitoringJob": {
        "type": "object",
        "properties": {
          "job_id": {
            "type": "string",
            "format": "uuid"
          },
          "status": {
            "type": "string",
            "enum": [
              "PENDING",
              "PROCESSING",
              "COMPLETED",
              "FAILED"
            ]
          },
          "is_enabled": {
            "type": "boolean",
            "description": "true, wenn der Job die Überwachung aktiviert, false, wenn er sie deaktiviert."
          },
          "target_type": {
            "type": "string",
            "enum": [
              "user",
              "business"
            ],
            "description": "Welche Profilfamilie der Auftrag umschaltet."
          },
          "total": {
            "type": "integer",
            "description": "Profile, die der Job verarbeitet."
          },
          "processed": {
            "type": "integer",
            "description": "Bisher verarbeitete Profile."
          },
          "outcomes": {
            "type": "object",
            "description": "Ergebniszähler pro Datensatz. Jedes ausgewählte Profil wird genau einem Zähler zugeordnet; nichts wird stillschweigend übersprungen.",
            "properties": {
              "enabled": {
                "type": "integer",
                "description": "Überwachung für ein bestehendes AML-Screening aktiviert."
              },
              "screened_and_enabled": {
                "type": "integer",
                "description": "Ein neues AML-Screening wurde erstellt (in Rechnung gestellt) und die Überwachung dafür aktiviert."
              },
              "already_enabled": {
                "type": "integer",
                "description": "Überwachung war bereits aktiv; es wurde nichts geändert und nichts in Rechnung gestellt."
              },
              "disabled": {
                "type": "integer",
                "description": "Überwachung für jedes AML-Screening des Profils deaktiviert."
              },
              "skipped_no_identity_data": {
                "type": "integer",
                "description": "Übersprungen: Dem Profil fehlen der vollständige Name, das Geburtsdatum und das Land (Benutzer) oder ein Name (Unternehmen), die für das Screening erforderlich sind."
              },
              "skipped_blocked": {
                "type": "integer",
                "description": "Übersprungen: Der Benutzer ist gesperrt."
              },
              "skipped_sandbox": {
                "type": "integer",
                "description": "Übersprungen: Sandbox-Anwendung, es wird kein Screening erstellt."
              },
              "failed_provider": {
                "type": "integer",
                "description": "Das Screening konnte nicht abgeschlossen werden; versuchen Sie es später erneut."
              },
              "failed_insufficient_balance": {
                "type": "integer",
                "description": "Das Guthaben wurde aufgebraucht, während der Auftrag lief."
              }
            }
          },
          "results": {
            "type": "array",
            "description": "Ein Eintrag pro verarbeitetem Profil, in der Reihenfolge der Verarbeitung. Wächst, während der Job läuft; vollständig, sobald der Status COMPLETED ist. Erfasst für Jobs, die über die API gestartet wurden.",
            "items": {
              "type": "object",
              "properties": {
                "didit_internal_id": {
                  "type": "string",
                  "format": "uuid",
                  "description": "Interne Didit-ID des Profils."
                },
                "vendor_data": {
                  "type": "string",
                  "nullable": true,
                  "description": "Ihre eigene Kennung für das Profil."
                },
                "outcome": {
                  "type": "string",
                  "enum": [
                    "enabled",
                    "screened_and_enabled",
                    "already_enabled",
                    "disabled",
                    "skipped_no_identity_data",
                    "skipped_blocked",
                    "skipped_sandbox",
                    "failed_provider",
                    "failed_insufficient_balance"
                  ]
                }
              }
            }
          },
          "error": {
            "type": "string",
            "nullable": true,
            "description": "Generische Fehlermeldung, wenn der Status FAILED lautet; die detaillierte Ursache verbleibt auf Plattformseite."
          },
          "created_at": {
            "type": "string",
            "format": "date-time"
          },
          "completed_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "estimate": {
            "type": "object",
            "description": "Kostenvorschau. Wird direkt zurückgegeben, wenn estimate_only wahr ist (es wird nichts geschrieben).",
            "properties": {
              "users_total": {
                "type": "integer",
                "description": "Profile, die der Auswahl entsprechen."
              },
              "already_enabled": {
                "type": "integer",
                "description": "Profile, die bereits überwacht werden (beim Aktivieren ist nichts zu tun; diese werden beim Deaktivieren abgeschaltet)."
              },
              "with_existing_aml": {
                "type": "integer",
                "description": "Profile, deren bestehendes AML-Screening auf überwacht umgestellt wird (kein neues Screening)."
              },
              "needing_screening": {
                "type": "integer",
                "description": "Profile ohne bisheriges AML-Screening, die zuerst gescreent werden (abgerechnet als reguläres AML-Screening)."
              },
              "skipped_no_identity_data": {
                "type": "integer",
                "description": "Profile, die nicht gescreent werden können, da Identitätsdaten fehlen."
              },
              "skipped_blocked": {
                "type": "integer",
                "description": "Gesperrte Benutzer, die übersprungen werden (bei Unternehmen immer 0)."
              },
              "estimated_screening_cost_usd": {
                "type": "number",
                "example": 0.2,
                "description": "Einmalige Kosten für die neuen Screenings."
              },
              "estimated_annual_monitoring_cost_usd": {
                "type": "number",
                "example": 0.07,
                "description": "Jährliche Überwachungskosten für die Profile, die künftig überwacht werden."
              },
              "balance_sufficient": {
                "type": "boolean",
                "description": "Gibt an, ob das Guthaben der Organisation das Screening plus das erste Jahr der Überwachung abdeckt."
              }
            }
          },
          "unmatched": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Kennungen der Anfrage, die mit keinem Profil in dieser Anwendung übereinstimmten, exakt wie gesendet. Sie sind nicht Teil des Auftrags."
          }
        }
      },
      "OngoingMonitoringToggleRequest": {
        "type": "object",
        "required": [
          "is_enabled"
        ],
        "properties": {
          "is_enabled": {
            "type": "boolean",
            "description": "true, um die Überwachung zu aktivieren, false, um sie zu deaktivieren."
          },
          "estimate_only": {
            "type": "boolean",
            "default": false,
            "description": "Wenn true, wird die Kostenschätzung zurückgegeben und es werden keine Schreibvorgänge ausgeführt."
          },
          "update_all": {
            "type": "boolean",
            "default": false,
            "description": "Auf jede Entität der Anwendung anwenden (eingegrenzt durch die filter_*-Parameter, sofern vorhanden)."
          },
          "filter_search": {
            "type": "string"
          },
          "filter_status": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "filter_country": {
            "type": "string"
          },
          "filter_date_from": {
            "type": "string",
            "format": "date"
          },
          "filter_date_to": {
            "type": "string",
            "format": "date"
          },
          "didit_internal_id_list": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Umzuschaltende Entitäten. Erforderlich, sofern update_all nicht true ist."
          }
        }
      },
      "OngoingMonitoringJob": {
        "type": "object",
        "properties": {
          "job_id": {
            "type": "string",
            "format": "uuid"
          },
          "status": {
            "type": "string",
            "enum": [
              "PENDING",
              "PROCESSING",
              "COMPLETED",
              "FAILED"
            ]
          },
          "is_enabled": {
            "type": "boolean"
          },
          "total": {
            "type": "integer"
          },
          "processed": {
            "type": "integer"
          },
          "outcomes": {
            "type": "object",
            "description": "Ergebniszähler pro Entität. Nichts wird stillschweigend übersprungen: Jede angefragte Entität wird genau einem Zähler zugeordnet.",
            "properties": {
              "enabled": {
                "type": "integer",
                "description": "Überwachung für ein bestehendes AML-Screening aktiviert."
              },
              "screened_and_enabled": {
                "type": "integer",
                "description": "Ein neues AML-Screening wurde erstellt (in Rechnung gestellt) und die Überwachung aktiviert."
              },
              "already_enabled": {
                "type": "integer",
                "description": "Überwachung war bereits aktiv (veraltete doppelte Zeilen werden zusammengeführt)."
              },
              "disabled": {
                "type": "integer",
                "description": "Überwachung für jede AML-Zeile der Entität deaktiviert."
              },
              "skipped_no_identity_data": {
                "type": "integer",
                "description": "Übersprungen: Kein vollständiger Name + Geburtsdatum + Land für das Screening verfügbar."
              },
              "skipped_blocked": {
                "type": "integer",
                "description": "Übersprungen: Der Benutzer ist gesperrt."
              },
              "skipped_sandbox": {
                "type": "integer",
                "description": "Übersprungen: Sandbox-Anwendung."
              },
              "failed_provider": {
                "type": "integer",
                "description": "Der Aufruf des Screening-Anbieters ist fehlgeschlagen."
              },
              "failed_insufficient_balance": {
                "type": "integer",
                "description": "Guthaben während der Auftragsausführung aufgebraucht."
              }
            }
          },
          "error": {
            "type": "string",
            "nullable": true
          },
          "estimate": {
            "type": "object",
            "description": "Kostenvorschau. Wird direkt zurückgegeben, wenn estimate_only wahr ist (es werden keine Schreibvorgänge durchgeführt).",
            "properties": {
              "users_total": {
                "type": "integer",
                "description": "Entitäten in der Auswahl."
              },
              "already_enabled": {
                "type": "integer"
              },
              "with_existing_aml": {
                "type": "integer",
                "description": "Entitäten, deren bestehendes AML-Screening zur Überwachung aktiviert wird."
              },
              "needing_screening": {
                "type": "integer",
                "description": "Entitäten ohne jegliches AML-Screening, die zuerst gescreent werden (abgerechnet)."
              },
              "skipped_no_identity_data": {
                "type": "integer"
              },
              "skipped_blocked": {
                "type": "integer"
              },
              "estimated_screening_cost_usd": {
                "type": "number",
                "example": 0.2
              },
              "estimated_annual_monitoring_cost_usd": {
                "type": "number",
                "example": 0.07
              },
              "balance_sufficient": {
                "type": "boolean"
              }
            }
          }
        }
      },
      "OngoingMonitoringToggleResult": {
        "oneOf": [
          {
            "type": "object",
            "description": "Kostenvorschau. Wird direkt zurückgegeben, wenn estimate_only wahr ist (es werden keine Schreibvorgänge durchgeführt).",
            "properties": {
              "users_total": {
                "type": "integer",
                "description": "Entitäten in der Auswahl."
              },
              "already_enabled": {
                "type": "integer"
              },
              "with_existing_aml": {
                "type": "integer",
                "description": "Entitäten, deren bestehendes AML-Screening zur Überwachung aktiviert wird."
              },
              "needing_screening": {
                "type": "integer",
                "description": "Entitäten ohne jegliches AML-Screening, die zuerst gescreent werden (abgerechnet)."
              },
              "skipped_no_identity_data": {
                "type": "integer"
              },
              "skipped_blocked": {
                "type": "integer"
              },
              "estimated_screening_cost_usd": {
                "type": "number",
                "example": 0.2
              },
              "estimated_annual_monitoring_cost_usd": {
                "type": "number",
                "example": 0.07
              },
              "balance_sufficient": {
                "type": "boolean"
              }
            }
          },
          {
            "$ref": "#/components/schemas/OngoingMonitoringJob"
          }
        ]
      },
      "CaseBlueprintPresetInstallResult": {
        "type": "object",
        "properties": {
          "created": {
            "type": "array",
            "items": {
              "type": "string"
            }
          }
        }
      },
      "CaseBulkUpdateResult": {
        "type": "object",
        "properties": {
          "updated": {
            "type": "integer"
          },
          "failures": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "case_uuid": {
                  "type": "string",
                  "format": "uuid"
                },
                "detail": {
                  "type": "string"
                }
              }
            }
          }
        }
      },
      "RegulatoryReportList": {
        "type": "object",
        "properties": {
          "count": {
            "type": "integer",
            "description": "Anzahl der übereinstimmenden Zeilen, aus Performancegründen auf 100 begrenzt."
          },
          "next": {
            "type": "string",
            "nullable": true
          },
          "previous": {
            "type": "string",
            "nullable": true
          },
          "results": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/RegulatoryReportDetail"
            }
          }
        }
      },
      "EntityNetworkMembershipList": {
        "type": "object",
        "properties": {
          "results": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/EntityNetworkMembership"
            }
          }
        }
      },
      "SessionDecision": {
        "type": "object",
        "properties": {
          "session_id": {
            "type": "string",
            "format": "uuid",
            "description": "Die eindeutige Kennung der Sitzung."
          },
          "session_kind": {
            "type": "string",
            "enum": [
              "user",
              "business"
            ],
            "description": "Diskriminator, der angibt, ob es sich um eine Sitzung zur Benutzerverifizierung (KYC) oder Unternehmensverifizierung (KYB) handelt. Bei `user` gelten die KYC-Funktions-Arrays (`id_verifications`, `nfc_verifications`, `liveness_checks`, `face_matches`, `poa_verifications`, `document_ai_documents`, `database_validations`, ...) und die Unternehmens-Arrays fehlen. Bei `business` enthält die Payload stattdessen `registry_checks`, `document_verifications`, `key_people_checks` sowie die gemeinsamen Arrays (`aml_screenings`, `phone_verifications`, `email_verifications`, `ip_analyses`, `questionnaire_responses`). **Wird weggelassen, wenn `include=events` übergeben wird** – die Ereignisstruktur existiert nur für Benutzersitzungen, daher entfällt der Diskriminator in dieser Variante."
          },
          "shared_from_session": {
            "type": "string",
            "format": "uuid",
            "nullable": true,
            "description": "Für eine mit `POST /v3/session/import-shared/` geklonte Sitzung: die `session_id` der ursprünglichen Sitzung in der Quellanwendung. `null` für jede andere Sitzung. Wird weggelassen, wenn `include=events` übergeben wird."
          },
          "shared_from_session_number": {
            "type": "integer",
            "nullable": true,
            "description": "`session_number` der Quellsitzung, wenn diese Sitzung aus einer anderen Anwendung Ihrer Organisation importiert wurde. Andernfalls `null`."
          },
          "session_number": {
            "type": "integer",
            "description": "Die Nummer der Sitzung.",
            "nullable": true
          },
          "session_url": {
            "type": "string",
            "format": "uri",
            "description": "Die URL der Sitzung.",
            "nullable": true
          },
          "status": {
            "type": "string",
            "enum": [
              "Not Started",
              "In Progress",
              "Awaiting User",
              "In Review",
              "Approved",
              "Declined",
              "Resubmitted",
              "Expired",
              "Kyc Expired",
              "Abandoned"
            ],
            "description": "Gesamter Lebenszyklusstatus der Sitzung — das zusammengefasste Workflow-Ergebnis. Endgültige Werte sind `Approved`, `Declined`, `In Review`, `Expired`, `Kyc Expired` und `Abandoned`; `Not Started`, `In Progress`, `Awaiting User` und `Resubmitted` zeigen an, dass die Sitzung den Workflow noch durchläuft."
          },
          "status_override": {
            "type": "object",
            "nullable": true,
            "description": "Vorhanden, wenn ein Prüfer `status` manuell gesetzt hat. `null`, wenn der Status automatisch vergeben wurde. Dient zur Unterscheidung einer manuellen von einer automatischen Genehmigung.",
            "properties": {
              "overridden_at": {
                "type": "string",
                "format": "date-time",
                "nullable": true
              },
              "automatic_status": {
                "type": "string",
                "nullable": true,
                "description": "Der Status, den die eigenen Prüfungen der Plattform ergeben."
              }
            }
          },
          "decision_trace": {
            "type": "object",
            "description": "Wie der Status erreicht wurde: wer ihn festgelegt hat und welche Warnungen dazu geführt haben.",
            "properties": {
              "status": {
                "type": "string",
                "description": "Der Sitzungsstatus."
              },
              "decided_by": {
                "type": "string",
                "nullable": true,
                "enum": [
                  "manual",
                  "automatic",
                  "investigator",
                  null
                ],
                "description": "Wer den Status festgelegt hat. `null`, solange über die Sitzung noch nicht entschieden wurde."
              },
              "decided_at": {
                "type": "string",
                "format": "date-time",
                "nullable": true
              },
              "automatic_status": {
                "type": "string",
                "nullable": true,
                "description": "Was die plattformeigenen Prüfungen ergeben; dies kann sich nach einer manuellen Entscheidung von `status` unterscheiden."
              },
              "terminal_node_id": {
                "type": "string",
                "nullable": true,
                "description": "Der Workflow-Statusknoten, der die Sitzung beendet hat, falls zutreffend."
              },
              "actor": {
                "type": "object",
                "nullable": true,
                "description": "Der Prüfer, der hinter einer manuellen Entscheidung steht.",
                "properties": {
                  "user": {
                    "type": "string",
                    "nullable": true
                  },
                  "actor_type": {
                    "type": "string",
                    "nullable": true
                  }
                }
              },
              "warning_counts": {
                "type": "object",
                "description": "Warnungen pro `log_type` (`error`, `warning`, `information`) und `total`.",
                "additionalProperties": {
                  "type": "integer"
                }
              },
              "status_warnings": {
                "type": "array",
                "description": "Die Warnungen, die den Status `Declined` oder `In Review` setzen.",
                "items": {
                  "type": "object",
                  "properties": {
                    "risk": {
                      "type": "string"
                    },
                    "feature": {
                      "type": "string",
                      "nullable": true
                    },
                    "node_id": {
                      "type": "string",
                      "nullable": true
                    },
                    "log_type": {
                      "type": "string",
                      "nullable": true
                    },
                    "check_status": {
                      "type": "string",
                      "nullable": true
                    },
                    "source": {
                      "type": "string",
                      "description": "Die Payload-Liste, aus der die Warnung stammt, beispielsweise `id_verifications`."
                    },
                    "short_description": {
                      "type": "string",
                      "nullable": true
                    }
                  }
                }
              }
            }
          },
          "linked_records": {
            "type": "object",
            "nullable": true,
            "description": "Eine Zusammenfassung anderer mit der Sitzung verknüpfter Datensätze. `null`, wenn nichts anzuzeigen ist, sowie für Workflows, die einen Standard zur Altersabsicherung deklarieren.",
            "properties": {
              "same_face": {
                "type": "object",
                "nullable": true,
                "description": "Andere Personen, deren Gesicht mit einer der Gesichtssuchen dieser Sitzung übereinstimmte.",
                "properties": {
                  "count": {
                    "type": "integer"
                  },
                  "best_match": {
                    "type": "object",
                    "nullable": true,
                    "properties": {
                      "session_id": {
                        "type": "string",
                        "format": "uuid",
                        "nullable": true
                      },
                      "session_number": {
                        "type": "integer",
                        "nullable": true
                      },
                      "vendor_user_id": {
                        "type": "string",
                        "format": "uuid",
                        "nullable": true
                      },
                      "similarity_percentage": {
                        "type": "number",
                        "nullable": true
                      }
                    }
                  }
                }
              },
              "earlier_verifications": {
                "type": "object",
                "nullable": true,
                "properties": {
                  "count": {
                    "type": "integer"
                  },
                  "vendor_user_id": {
                    "type": "string",
                    "format": "uuid",
                    "nullable": true
                  }
                }
              },
              "networks": {
                "type": "object",
                "nullable": true,
                "properties": {
                  "count": {
                    "type": "integer"
                  },
                  "open": {
                    "type": "integer"
                  },
                  "dismissed": {
                    "type": "integer"
                  },
                  "items": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "network_id": {
                          "type": "string",
                          "format": "uuid"
                        },
                        "display_number": {
                          "type": "integer",
                          "nullable": true
                        },
                        "name": {
                          "type": "string"
                        },
                        "status": {
                          "type": "string"
                        },
                        "risk_score": {
                          "type": "number",
                          "nullable": true
                        }
                      }
                    }
                  }
                }
              }
            }
          },
          "workflow_id": {
            "type": "string",
            "format": "uuid",
            "description": "Stabiler Identifikator der Workflow-Gruppe, die diese Sitzung erzeugt hat. Workflows sind versioniert – dieser Wert identifiziert den Workflow selbst, nicht die spezifische Version.",
            "nullable": true
          },
          "features": {
            "type": "array",
            "items": {
              "type": "string",
              "description": "Die Funktion der Sitzung."
            },
            "description": "Liste der für diese Sitzung konfigurierten Verifizierungsfunktionen als Anzeigenamen: `ID_VERIFICATION`, `NFC`, `LIVENESS`, `FACE_MATCH`, `POA`, `PHONE`, `EMAIL_VERIFICATION`, `AML`, `IP_ANALYSIS`, `DATABASE_VALIDATION`, `QUESTIONNAIRE`, `AGE_ESTIMATION`, `FACE_SEARCH`, `GEOLOCATION` (Standortverifizierung) (Sitzungen zur Unternehmensverifizierung verwenden das KYB-Funktionsset: `KYB_REGISTRY`, `KYB_DOCUMENTS`, `KYB_KEY_PEOPLE`, `AML`, `PHONE`, `EMAIL_VERIFICATION`, `IP_ANALYSIS`, `QUESTIONNAIRE`). Bei `include=events` wird jeder Eintrag zu einem Objekt `{feature, node_id}` anstelle einer einfachen Zeichenkette, und die E-Mail-Funktion wird umbenannt: Sie erscheint im Ereignismodus als `EMAIL` anstelle des hier verwendeten `EMAIL_VERIFICATION`."
          },
          "vendor_data": {
            "type": "string",
            "description": "Die Vendor-Daten der Sitzung.",
            "nullable": true
          },
          "metadata": {
            "type": "object",
            "description": "Die Metadaten der Sitzung.",
            "nullable": true
          },
          "expected_details": {
            "type": "object",
            "description": "Erwartete Details, die bei der Sitzungserstellung angegeben wurden — verwendet für die Kreuzvalidierung mit extrahierten Daten (KYC) oder zum Vorausfüllen der Suche im Unternehmensregister (KYB). Gibt genau die Schlüssel zurück, die bereitgestellt wurden; `null`, wenn keine angegeben wurden. KYC-Sitzungen enthalten die Personenfelder; Unternehmenssitzungen (KYB) enthalten `company_name`, `registry_country` und `registration_number`.",
            "properties": {
              "first_name": {
                "type": "string",
                "description": "Vorname des Benutzers. Zum Beispiel `John`."
              },
              "last_name": {
                "type": "string",
                "description": "Nachname des Benutzers. Zum Beispiel `Doe`."
              },
              "date_of_birth": {
                "type": "string",
                "format": "date",
                "description": "Geburtsdatum des Benutzers im Format: YYYY-MM-DD. Zum Beispiel `1990-05-15`."
              },
              "gender": {
                "type": "string",
                "nullable": true,
                "enum": [
                  "M",
                  "F"
                ],
                "default": null,
                "description": "Geschlecht des Benutzers. Muss entweder 'M', 'F' oder null sein."
              },
              "nationality": {
                "type": "string",
                "description": "ISO 3166-1-Alpha-3-Ländercode, der das Herkunftsland des Antragstellers darstellt. Zum Beispiel `USA`."
              },
              "country": {
                "type": "string",
                "description": "ISO 3166-1-Alpha-3-Ländercode, der das Land des Adressnachweis-Dokuments oder das Land des Ausweisdokuments des Antragstellers darstellt, welches von der Staatsangehörigkeit abweichen kann. Zum Beispiel `GBR`."
              },
              "address": {
                "type": "string",
                "description": "Die Adresse in einem menschenlesbaren Format, einschließlich so vieler Informationen wie möglich. Zum Beispiel `123 Main St, San Francisco, CA 94105, USA`."
              },
              "identification_number": {
                "type": "string",
                "description": "Die Dokumentennummer, persönliche Identifikationsnummer oder Steuernummer des Benutzers. Zum Beispiel `123456789`."
              },
              "ip_address": {
                "type": "string",
                "format": "ipv4",
                "description": "Erwartete IP-Adresse für die Sitzung. Wenn die tatsächliche IP-Adresse von diesem Wert abweicht, wird eine Warnung protokolliert. Zum Beispiel `192.168.1.100`."
              },
              "expected_document_types": {
                "type": "array",
                "description": "Dokumenttypen, auf die der Ausweisverifizierungsschritt bei der Sitzungserstellung beschränkt wurde. Leer/nicht gesetzt bedeutet keine Einschränkung. Codes: `P` (Reisepass), `ID` (Personalausweis), `DL` (Führerschein), `RP` (Aufenthaltstitel), `HIC` (Krankenversicherungskarte), `TC` (Steuerkarte), `SSC` (Sozialversicherungskarte).",
                "items": {
                  "type": "string",
                  "enum": [
                    "P",
                    "ID",
                    "DL",
                    "RP",
                    "HIC",
                    "TC",
                    "SSC"
                  ]
                }
              },
              "id_country": {
                "type": "string",
                "nullable": true,
                "description": "Erwartetes Ausstellungsland des Ausweisdokuments (ISO 3166-1 alpha-3), falls bei der Erstellung eingeschränkt.",
                "example": "ESP"
              },
              "poa_country": {
                "type": "string",
                "nullable": true,
                "description": "Erwartetes Land des Adressnachweisdokuments (ISO 3166-1 alpha-3), falls bei der Erstellung eingeschränkt.",
                "example": "ESP"
              },
              "company_name": {
                "type": "string",
                "description": "Erwarteter rechtlicher Name des Unternehmens. Nur für Unternehmenssitzungen (KYB)."
              },
              "registry_country": {
                "type": "string",
                "description": "Erwartetes Registerland als `XX` oder `XX-YY` (ISO 3166-1 Alpha-2, optional mit einer ISO 3166-2-Unterteilung für Register auf Bundesstaatsebene, z. B. `US-CA`). Nur für Unternehmenssitzungen (KYB)."
              },
              "registration_number": {
                "type": "string",
                "description": "Erwartete Unternehmensregisternummer. Nur für Unternehmenssitzungen (KYB)."
              }
            },
            "nullable": true
          },
          "contact_details": {
            "type": "object",
            "description": "Kontaktdaten, die bei der Erstellung der Sitzung angegeben wurden (verwendet für Benachrichtigungs-E-Mails, vorausgefüllte Telefon-/E-Mail-Verifizierung und Kommunikationssprache). `null`, wenn weder eine E-Mail-Adresse noch eine Telefonnummer angegeben wurde.",
            "properties": {
              "email": {
                "type": "string",
                "description": "E-Mail-Adresse des Benutzers (z. B. \"john.doe@example.com\"), die während des Schritts der E-Mail-Verifizierung verwendet wird. Falls nicht angegeben, muss der Benutzer sie während des Verifizierungsablaufs angeben."
              },
              "email_lang": {
                "type": "string",
                "description": "Sprachcode (ISO 639-1) für E-Mail-Benachrichtigungen. Steuert die Sprache aller E-Mail-Mitteilungen (z. B. „en“, „es“, „fr“)."
              },
              "send_notification_emails": {
                "type": "boolean",
                "default": false,
                "description": "Wenn true und eine E-Mail-Adresse angegeben ist, versendet Didit die anfängliche E-Mail „Bestätigen Sie Ihre Identität“ asynchron, sobald die Sitzung zur Benutzerverifizierung (KYC) oder Unternehmensverifizierung (KYB) erstellt wird. Didit sendet außerdem Benachrichtigungen über den Verifizierungsstatus für Sitzungen, die eine manuelle Prüfung erfordern, an die angegebene E-Mail-Adresse."
              },
              "phone": {
                "type": "string",
                "nullable": true,
                "description": "Telefonnummer des Benutzers im E.164-Format, falls verfügbar (z. B. +14155552671). `null`, wenn bei der Sitzungserstellung nur eine E-Mail-Adresse angegeben wurde. Hinweis: Dieses Feld gibt die ursprünglich bei der Sitzungserstellung angegebene Telefonnummer zurück. Wenn die Nummer ungültig war, liegt sie möglicherweise nicht im E.164-Format vor."
              }
            },
            "nullable": true
          },
          "callback": {
            "type": "string",
            "format": "uri",
            "description": "Die Callback-URL der Sitzung.",
            "nullable": true
          },
          "id_verifications": {
            "type": "array",
            "nullable": true,
            "description": "**Array von Ausweisverifizierungsberichten (OCR)**, die von Ausweisdokument-Schritten im Workflow-Graphen erzeugt wurden. Immer ein JSON-Array – lesen Sie `id_verifications[0]` und iterieren Sie, falls Ihr Workflow mehr als eine Ausweisprüfung ausführen kann (beispielsweise eine primäre Prüfung plus eine zusätzliche Prüfung). `null`, bis mindestens ein Ausweisschritt Daten erzeugt hat. Jeder Eintrag ist der vollständige Bericht, einschließlich `node_id`, `status` auf Funktionsebene, extrahierten Dokumentfeldern, Bild-URLs, Qualitätswerten, MRZ, Adress-Parsing, sitzungsübergreifenden Übereinstimmungen sowie `warnings[]`.",
            "items": {
              "type": "object",
              "description": "Ein Ausweisverifizierungsbericht – der vollständige Bericht für einen einzelnen Ausweisverifizierungsschritt. `verification_method` gibt an, welche der drei Methoden ihn erzeugt hat (Dokumentenerfassung, Abfrage ohne Dokument oder Wallet-Anmeldung), und der methodenspezifische Nachweisblock wird entsprechend befüllt.",
              "properties": {
                "node_id": {
                  "type": "string",
                  "description": "Workflow-Graph-Knoten-ID des OCR-Schritts, der diesen Bericht erstellt hat."
                },
                "verification_method": {
                  "type": "string",
                  "enum": [
                    "document",
                    "id_lookup",
                    "wallet"
                  ],
                  "description": "Welche Methode der Ausweisverifizierung diesen Bericht erstellt hat. `document` - der Benutzer hat einen physischen Ausweis fotografiert (der Standardwert und der Wert jeder Sitzung, die vor der Einführung der anderen Methoden erstellt wurde). `id_lookup` - der Benutzer hat seine nationale Ausweisnummer eingegeben und diese wurde mit einem Behördenregister oder einer anderen maßgeblichen Quelle für dieses Land abgeglichen (`id_lookup.source` gibt die Quelle an). `wallet` - der Benutzer hat sich mit einer digitalen behördlichen oder bankbezogenen Identität angemeldet."
                },
                "assurance": {
                  "type": "string",
                  "enum": [
                    "documentary",
                    "data_match",
                    "cryptographic"
                  ],
                  "description": "Aus `verification_method` abgeleitete Vertrauensstufe: `documentary` für ein Dokument, das erfasst und geprüft wurde, `data_match` für Angaben, die mit einem Datensatz der abgefragten Quelle übereinstimmten, `cryptographic` für Attribute, die ein Identitätsanbieter authentifiziert und signiert hat."
                },
                "wallet_provider": {
                  "type": "string",
                  "nullable": true,
                  "description": "Katalog-Wallet-ID, wenn `verification_method` `wallet` ist (`mitid`, `bankid_se`, `itsme`, ...). Andernfalls `null`."
                },
                "fallback_from": {
                  "type": "object",
                  "nullable": true,
                  "description": "Warum eine Methode ohne Dokument den Ausweisschritt nicht abgeschlossen hat. Wird gesetzt, wenn eine Abfrage oder eine Wallet-Anmeldung fehlgeschlagen ist: bei der Dokumentenverifizierung, mit der der Benutzer fortgefahren ist, wenn der Fallback-Schalter des Landes `fallback_to_document` war (`action` ist `fallback_to_document`), oder im abgelehnten Bericht, wenn er `decline` war. Andernfalls `null`.",
                  "properties": {
                    "method": {
                      "type": "string",
                      "enum": [
                        "id_lookup",
                        "wallet"
                      ],
                      "description": "Die Methode, die fehlgeschlagen ist."
                    },
                    "reason": {
                      "type": "string",
                      "description": "Das Ergebnis, das den Vorgang beendet hat, z. B. `no_match`, `provider_error`, `cancelled`, `timeout`."
                    },
                    "action": {
                      "type": "string",
                      "enum": [
                        "fallback_to_document",
                        "decline"
                      ],
                      "description": "Die konfigurierte Aktion, die ausgeführt wurde: `fallback_to_document` oder `decline`."
                    }
                  }
                },
                "id_lookup": {
                  "type": "object",
                  "nullable": true,
                  "description": "Registernachweis. Nur vorhanden, wenn `verification_method` den Wert `id_lookup` hat; andernfalls `null`.",
                  "properties": {
                    "source": {
                      "type": "string",
                      "description": "Kundenorientierter Name der abgefragten Quelle, z. B. `Department of Home Affairs` (ein staatliches Register) oder `UK credit bureau and financial services records` (kein staatliches Register). Dies ist die einzige Herkunftsangabe für die Abfrage; gehen Sie nicht von einer staatlichen Quelle aus."
                    },
                    "checked_at": {
                      "type": "string",
                      "format": "date-time",
                      "nullable": true,
                      "description": "Wann das Unternehmensregister geantwortet hat."
                    },
                    "attempts": {
                      "type": "integer",
                      "description": "1-basierte Versuchsnummer, aus der dieser Bericht stammt."
                    },
                    "max_attempts": {
                      "type": "integer",
                      "description": "Für das Land konfiguriertes Versuchsbudget (1 bis 5, Standardwert 1)."
                    },
                    "outcome": {
                      "type": "string",
                      "enum": [
                        "match",
                        "partial_match",
                        "no_match",
                        "provider_error",
                        "format_rejected"
                      ],
                      "nullable": true,
                      "description": "Was das Register geantwortet hat. Nur `match`, `partial_match` und `no_match` zählen gegen das Versuchsbudget und werden abgerechnet."
                    },
                    "comparison": {
                      "type": "array",
                      "description": "Eine Zeile pro vergleichbarem Feld, auf das die Quelle geantwortet hat, plus eine Zeile pro Quellenfehler. Vergleichszeilen verwenden die unten aufgeführten normalisierten Feldnamen anstelle der länderspezifischen Anfrage-Feld-Keys, da mehrere Anfragefelder (Vor- und Nachname oder Aliasse von Bezeichnern) zu einem einzigen Vergleich zusammengefasst werden. Eine fehlgeschlagene Quelle hängt eine Zeile mit `field: \"provider\"` und `result: \"error\"` an; prüfen Sie daher `result`, bevor Sie eine Zeile als Feldurteil behandeln.",
                      "items": {
                        "type": "object",
                        "required": [
                          "field",
                          "label",
                          "provided",
                          "record",
                          "result"
                        ],
                        "properties": {
                          "field": {
                            "type": "string",
                            "enum": [
                              "identification_number",
                              "full_name",
                              "date_of_birth",
                              "address",
                              "provider"
                            ],
                            "description": "Normalisiertes Vergleichsfeld. `provider` ist kein Benutzerfeld: Es kennzeichnet eine Zeile mit einem Quellfehler."
                          },
                          "label": {
                            "type": "string",
                            "description": "Anzeigebezeichnung für die Zeile, z. B. `ID number`, `Full name`, `Provider`."
                          },
                          "provided": {
                            "type": "string",
                            "nullable": true,
                            "description": "Was der Benutzer eingegeben hat. `null` bei einer `provider`-Fehlerzeile."
                          },
                          "record": {
                            "type": "string",
                            "nullable": true,
                            "description": "Was in der Quelle enthalten war. Bei einer `provider`-Fehlerzeile enthält dies stattdessen die Fehlermeldung."
                          },
                          "result": {
                            "type": "string",
                            "enum": [
                              "match",
                              "partial",
                              "no_match",
                              "error"
                            ],
                            "description": "Vergleichsergebnis pro Feld. `error` erscheint nur in einer `provider`-Zeile und bedeutet, dass diese Quelle nicht geantwortet hat; behandeln Sie dies als Beleg für die Anfrage, niemals als Feldabweichung."
                          }
                        }
                      }
                    },
                    "registry_portrait": {
                      "type": "string",
                      "format": "uri",
                      "nullable": true,
                      "description": "Kurzlebige vorsignierte URL zum Porträt, das die Quelle zurückgegeben hat. Nur die vier Regierungsregister, die eines zurückgeben (Südafrika, Nigeria, Argentinien, Panama)."
                    },
                    "face_match_score": {
                      "type": "number",
                      "nullable": true,
                      "description": "Selfie gegen das Register-Porträt, 0-100. Nur verfügbar, wenn das Register ein Porträt zurückgibt."
                    }
                  }
                },
                "wallet_verification": {
                  "type": "object",
                  "nullable": true,
                  "description": "Berechtigungsnachweis. Nur vorhanden, wenn `verification_method` auf `wallet` gesetzt ist; andernfalls `null`.",
                  "properties": {
                    "provider": {
                      "type": "string",
                      "description": "Katalog-Wallet-ID, z. B. `mitid`."
                    },
                    "provider_name": {
                      "type": "string",
                      "nullable": true,
                      "description": "Wallet-Name, wie ihn der Endbenutzer kennt, z. B. `MitID`."
                    },
                    "issuing_authority": {
                      "type": "string",
                      "nullable": true,
                      "description": "Die für die Wallet verantwortliche Stelle, z. B. `Danish Agency for Digital Government`."
                    },
                    "issuing_country": {
                      "type": "string",
                      "description": "ISO 3166-1-Alpha-3-Land, in dem die Wallet angeboten wurde."
                    },
                    "credential_type": {
                      "type": "string",
                      "nullable": true,
                      "description": "Von der Wallet vorgelegter Berechtigungsnachweis, z. B. `person_identification`."
                    },
                    "level_of_assurance": {
                      "type": "string",
                      "enum": [
                        "low",
                        "substantial",
                        "high"
                      ],
                      "nullable": true,
                      "description": "Das von der Wallet zugesicherte Vertrauensniveau (Level of Assurance). Eine Anmeldung, die weniger als das angeforderte Niveau zusichert, schlägt fehl, anstatt herabgestuft zu werden."
                    },
                    "verified_at": {
                      "type": "string",
                      "format": "date-time",
                      "nullable": true,
                      "description": "Der Authentifizierungszeitpunkt der Wallet."
                    },
                    "signature_valid": {
                      "type": "boolean",
                      "nullable": true,
                      "description": "Gibt an, ob die von der Wallet zurückgegebene signierte Assertion validiert wurde."
                    },
                    "attributes": {
                      "type": "object",
                      "additionalProperties": true,
                      "description": "Die von der Wallet geteilten Attribute, mit Schlüsseln gemäß dem Katalogeintrag der Wallet."
                    },
                    "portrait": {
                      "type": "string",
                      "format": "uri",
                      "nullable": true,
                      "description": "Kurzlebige vorsignierte URL zum Porträt, das die Wallet geteilt hat, sofern sie eines teilt."
                    },
                    "face_match_score": {
                      "type": "number",
                      "nullable": true,
                      "description": "Selfie gegen das Wallet-Porträt, 0-100, sofern die Wallet eines teilt."
                    }
                  }
                },
                "status": {
                  "type": "string",
                  "enum": [
                    "Not Finished",
                    "Approved",
                    "Declined",
                    "In Review",
                    "Expired"
                  ],
                  "description": "Status auf Funktionsebene dieses Schritts der Ausweisverifizierung. Unabhängig vom `status` der übergeordneten Sitzung – eine Sitzung kann ihre Gesamtentscheidung erreichen, während eine einzelne Funktion `In Review` bleibt."
                },
                "document_type": {
                  "type": "string",
                  "description": "Art des Ausweisdokuments"
                },
                "document_subtype": {
                  "type": "string",
                  "nullable": true,
                  "description": "Akzeptierter Dokument-Subtyp-Code aus den Dokumenteinstellungen des Workflows, einschließlich der Dokumentregion, sofern zutreffend. Beispiele: `ID_CARD_GENERIC`, `QUEENSLAND_DRIVER_LICENSE_GENERIC`."
                },
                "document_number": {
                  "type": "string",
                  "description": "Dokumentenidentifikationsnummer"
                },
                "personal_number": {
                  "type": "string",
                  "description": "Persönliche Identifikationsnummer"
                },
                "portrait_image": {
                  "type": "string",
                  "format": "uri",
                  "description": "URL des Porträtbildes"
                },
                "front_image": {
                  "type": "string",
                  "format": "uri",
                  "description": "URL des Bildes der Dokumentvorderseite"
                },
                "front_video": {
                  "type": "string",
                  "format": "uri",
                  "description": "URL des Videos der Dokumentvorderseite"
                },
                "back_image": {
                  "type": "string",
                  "format": "uri",
                  "description": "URL des Bildes der Dokumentrückseite"
                },
                "back_video": {
                  "type": "string",
                  "format": "uri",
                  "description": "URL des Videos der Dokumentrückseite"
                },
                "full_front_image": {
                  "type": "string",
                  "format": "uri",
                  "description": "URL des vollständigen Bildes der Dokumentvorderseite"
                },
                "full_back_image": {
                  "type": "string",
                  "format": "uri",
                  "description": "URL des vollständigen Bildes der Dokumentrückseite"
                },
                "front_image_camera_front": {
                  "type": "string",
                  "format": "uri",
                  "description": "URL des über die Frontkamera aufgenommenen Bildes der Dokumentvorderseite"
                },
                "back_image_camera_front": {
                  "type": "string",
                  "format": "uri",
                  "description": "URL des über die Frontkamera aufgenommenen Bildes der Dokumentrückseite"
                },
                "date_of_birth": {
                  "type": "string",
                  "format": "date",
                  "description": "Geburtsdatum aus dem Dokument"
                },
                "age": {
                  "type": "integer",
                  "description": "Aus dem Geburtsdatum berechnetes Alter"
                },
                "expiration_date": {
                  "type": "string",
                  "format": "date",
                  "description": "Dokumentenablaufdatum"
                },
                "date_of_issue": {
                  "type": "string",
                  "format": "date",
                  "description": "Dokumentenausstellungsdatum"
                },
                "issuing_state": {
                  "type": "string",
                  "description": "ISO-Code des Ausstellungsstaates"
                },
                "issuing_state_name": {
                  "type": "string",
                  "description": "Vollständiger Name des ausstellenden Staates"
                },
                "first_name": {
                  "type": "string",
                  "description": "Vorname aus dem Dokument"
                },
                "last_name": {
                  "type": "string",
                  "description": "Nachname aus dem Dokument"
                },
                "full_name": {
                  "type": "string",
                  "description": "Vollständiger Name aus dem Dokument"
                },
                "gender": {
                  "type": "string",
                  "description": "Geschlecht aus dem Dokument"
                },
                "address": {
                  "type": "string",
                  "description": "Unverarbeitete Adresse aus dem Dokument"
                },
                "formatted_address": {
                  "type": "string",
                  "description": "Formatierte vollständige Adresse"
                },
                "place_of_birth": {
                  "type": "string",
                  "description": "Geburtsort aus dem Dokument"
                },
                "marital_status": {
                  "type": "string",
                  "description": "Familienstand aus dem Dokument"
                },
                "nationality": {
                  "type": "string",
                  "description": "ISO-Code der Staatsangehörigkeit"
                },
                "extra_fields": {
                  "type": "object",
                  "description": "Zusätzliche Dokumentenfelder. Enthält dokumentspezifische Attribute (z. B. `dl_categories`, `blood_group`, `sponsor`, `employer`, `dl_class_code_b_from`, `dl_class_code_b_to`). Gültigkeitsdaten von Führerscheinklassen werden als `dl_class_code_<class>_from` und `dl_class_code_<class>_to` zurückgegeben, und Beschränkungs-/Informationscodes pro Klasse (z. B. Spalte 12 britischer Führerscheine) als `dl_class_code_<class>_notes`. Wenn das Dokument Namen, Adresse oder Geburtsort in mehreren Schriftsystemen enthält, enthält dieses Objekt auch Versionen dieser Felder in alternativen Schriftsystemen. Die Workflow-Einstellung `preferred_characters` (`latin` oder `non_latin`) steuert, welches Schriftsystem die Felder der obersten Ebene (`first_name`, `last_name`, `full_name`, `address`, `place_of_birth`) befüllt; das jeweils andere Schriftsystem wird hier als `first_name_non_latin` / `last_name_non_latin` / `full_name_non_latin` / `middle_name_non_latin` / `address_non_latin` / `place_of_birth_non_latin` (wenn `preferred_characters` `latin` ist) oder mit einem Suffix `_latin` (wenn `preferred_characters` `non_latin` ist) aufgeführt. Schlüssel werden nur angezeigt, wenn die OCR tatsächlich einen echten Wert in einem alternativen Schriftsystem extrahiert — ein Feld, dessen alternativer Wert im selben Schriftsystem wie das bevorzugte Set liegt (beispielsweise ein kyrillisch beschriftetes Feld, dessen OCR-Wert in lateinischen Homoglyphen zurückgegeben wurde), wird übersprungen. Wenn `preferred_characters` `latin` ist, das Dokument jedoch nur nicht-lateinischen Text enthält, transliteriert Didit die extrahierten Werte und stellt `first_name_latin` / `last_name_latin` / etc. als Fallback bereit.",
                  "additionalProperties": true,
                  "properties": {
                    "dl_categories": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      }
                    },
                    "blood_group": {
                      "type": "string",
                      "nullable": true
                    },
                    "first_name_non_latin": {
                      "type": "string",
                      "description": "Vorname in der nicht-lateinischen Schrift, wenn `preferred_characters=latin` und eine nicht-lateinische Version auf dem Dokument vorhanden ist (z. B. `Айна` bei einem kirgisischen Ausweis)."
                    },
                    "last_name_non_latin": {
                      "type": "string",
                      "description": "Nachname in nicht-lateinischer Schrift, wenn `preferred_characters=latin` und eine nicht-lateinische Version auf dem Dokument vorhanden ist."
                    },
                    "middle_name_non_latin": {
                      "type": "string",
                      "description": "Zweitname / Vatersname im nicht-lateinischen Schriftsystem, wenn `preferred_characters=latin` gilt und eine nicht-lateinische Version auf dem Dokument vorhanden ist."
                    },
                    "full_name_non_latin": {
                      "type": "string",
                      "description": "Zusammengesetzter vollständiger Name in nicht-lateinischer Schrift. Wird aus den einzelnen Komponenten rekonstruiert, wenn sowohl Vor- als auch Nachname verfügbar sind."
                    },
                    "address_non_latin": {
                      "type": "string",
                      "description": "Adresse im nicht-lateinischen Schriftsystem, wenn `preferred_characters=latin` gilt und eine nicht-lateinische Version auf dem Dokument vorhanden ist."
                    },
                    "place_of_birth_non_latin": {
                      "type": "string",
                      "description": "Geburtsort im nicht-lateinischen Schriftsystem, wenn `preferred_characters=latin` gilt und eine nicht-lateinische Version auf dem Dokument vorhanden ist."
                    },
                    "first_name_latin": {
                      "type": "string",
                      "description": "Vorname in lateinischer Schrift. Ausgefüllt, wenn `preferred_characters=non_latin` und eine lateinische Version auf dem Dokument vorhanden ist, oder – als Transliterations-Fallback –, wenn `preferred_characters=latin`, das Dokument jedoch nur nicht-lateinischen Text enthält."
                    },
                    "last_name_latin": {
                      "type": "string",
                      "description": "Nachname in lateinischer Schrift. Dieselben Regeln wie für `first_name_latin`."
                    },
                    "middle_name_latin": {
                      "type": "string",
                      "description": "Zweitname / Vatersname in lateinischer Schrift. Dieselben Regeln wie für `first_name_latin`."
                    },
                    "full_name_latin": {
                      "type": "string",
                      "description": "Zusammengesetzter vollständiger Name in lateinischer Schrift. Wird immer aus den einzelnen Komponenten rekonstruiert, wenn sowohl Vor- als auch Nachname verfügbar sind."
                    },
                    "address_latin": {
                      "type": "string",
                      "description": "Adresse in lateinischem Schriftsystem. Dieselben Regeln wie für `first_name_latin`."
                    },
                    "place_of_birth_latin": {
                      "type": "string",
                      "description": "Geburtsort in lateinischer Schrift. Gleiche Regeln wie für `first_name_latin`."
                    }
                  }
                },
                "mrz": {
                  "type": "object",
                  "nullable": true,
                  "description": "Geparste Felder der maschinenlesbaren Zone (MRZ), die aus dem Dokument extrahiert wurden. `null`, wenn keine MRZ erkannt wurde.",
                  "properties": {
                    "surname": {
                      "type": "string",
                      "example": "MARTINEZ<SANCHEZ"
                    },
                    "name": {
                      "type": "string",
                      "example": "ELENA"
                    },
                    "country": {
                      "type": "string",
                      "example": "ESP"
                    },
                    "nationality": {
                      "type": "string",
                      "example": "ESP"
                    },
                    "birth_date": {
                      "type": "string",
                      "example": "850315"
                    },
                    "expiry_date": {
                      "type": "string",
                      "example": "220821"
                    },
                    "sex": {
                      "type": "string",
                      "example": "F"
                    },
                    "document_type": {
                      "type": "string",
                      "example": "ID"
                    },
                    "document_number": {
                      "type": "string",
                      "example": "YZA123456"
                    },
                    "optional_data": {
                      "type": "string",
                      "example": "X9876543L"
                    },
                    "optional_data_2": {
                      "type": "string",
                      "example": ""
                    },
                    "birth_date_hash": {
                      "type": "string",
                      "example": "7"
                    },
                    "expiry_date_hash": {
                      "type": "string",
                      "example": "4"
                    },
                    "document_number_hash": {
                      "type": "string",
                      "example": "9"
                    },
                    "final_hash": {
                      "type": "string",
                      "example": "2"
                    },
                    "personal_number": {
                      "type": "string",
                      "example": "X9876543L"
                    },
                    "warnings": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      }
                    },
                    "errors": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      }
                    },
                    "mrz_type": {
                      "type": "string",
                      "example": "TD1"
                    },
                    "mrz_string": {
                      "type": "string",
                      "example": "IDESPMARTINEZ<SANCHEZ<<<<<<<<<<\nYZA123456<9ESP8503157F3208214<X9876543L<<<<<<<2\nMARTINEZ<SANCHEZ<<ELENA<<<<<<<<<<"
                    },
                    "mrz_key": {
                      "type": "string",
                      "example": "YZA123456985031573208214"
                    }
                  }
                },
                "parsed_address": {
                  "type": "object",
                  "description": "Strukturierte Adressdetails",
                  "properties": {
                    "city": {
                      "type": "string"
                    },
                    "label": {
                      "type": "string"
                    },
                    "region": {
                      "type": "string"
                    },
                    "country": {
                      "type": "string",
                      "description": "Zweistelliger Ländercode"
                    },
                    "category": {
                      "type": "string",
                      "description": "Adresskategorie (z. B. Residential, Commercial)"
                    },
                    "street_1": {
                      "type": "string"
                    },
                    "street_2": {
                      "type": "string",
                      "nullable": true
                    },
                    "is_verified": {
                      "type": "boolean",
                      "description": "Gibt an, ob die Adresse verifiziert wurde"
                    },
                    "postal_code": {
                      "type": "string"
                    },
                    "raw_results": {
                      "type": "object",
                      "properties": {
                        "types": {
                          "type": "array",
                          "items": {
                            "type": "string"
                          }
                        },
                        "geometry": {
                          "type": "object",
                          "properties": {
                            "location": {
                              "type": "object",
                              "properties": {
                                "lat": {
                                  "type": "number"
                                },
                                "lng": {
                                  "type": "number"
                                }
                              }
                            },
                            "viewport": {
                              "type": "object",
                              "properties": {
                                "northeast": {
                                  "type": "object",
                                  "properties": {
                                    "lat": {
                                      "type": "number"
                                    },
                                    "lng": {
                                      "type": "number"
                                    }
                                  }
                                },
                                "southwest": {
                                  "type": "object",
                                  "properties": {
                                    "lat": {
                                      "type": "number"
                                    },
                                    "lng": {
                                      "type": "number"
                                    }
                                  }
                                }
                              }
                            },
                            "location_type": {
                              "type": "string"
                            }
                          }
                        },
                        "place_id": {
                          "type": "string"
                        },
                        "formatted_address": {
                          "type": "string"
                        },
                        "navigation_points": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "location": {
                                "type": "object",
                                "properties": {
                                  "latitude": {
                                    "type": "number"
                                  },
                                  "longitude": {
                                    "type": "number"
                                  }
                                }
                              }
                            }
                          }
                        },
                        "address_components": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "types": {
                                "type": "array",
                                "items": {
                                  "type": "string"
                                }
                              },
                              "long_name": {
                                "type": "string"
                              },
                              "short_name": {
                                "type": "string"
                              }
                            }
                          }
                        }
                      }
                    },
                    "address_type": {
                      "type": "string"
                    },
                    "document_location": {
                      "type": "object",
                      "properties": {
                        "latitude": {
                          "type": "number"
                        },
                        "longitude": {
                          "type": "number"
                        }
                      }
                    },
                    "formatted_address": {
                      "type": "string"
                    }
                  }
                },
                "extra_files": {
                  "type": "array",
                  "items": {
                    "type": "string",
                    "format": "uri"
                  },
                  "description": "Zusätzliche Dateien zur Dokumentenverifizierung"
                },
                "front_image_camera_front_face_match_score": {
                  "type": "number",
                  "nullable": true,
                  "description": "Gesichtsabgleichswert zwischen dem aus dem Bild der Dokumentenvorderseite extrahierten Porträt und dem Frontkamerabild"
                },
                "back_image_camera_front_face_match_score": {
                  "type": "number",
                  "nullable": true,
                  "description": "Gesichtsabgleichswert zwischen dem aus dem Bild der Dokumentenrückseite extrahierten Porträt und dem Frontkamerabild"
                },
                "document_selfie_face_matches": {
                  "type": "array",
                  "description": "Frühere Sitzungen oder Gesichtssperrlisten-Einträge, deren Gesicht mit dem Selfie übereinstimmte, das die Frontkamera während der Dokumentenerfassung aufgenommen hat (Silent Capture Face Search). Gleiches Eintragsformat wie `liveness_checks[].matches`. `null` für Sitzungen, die erstellt wurden, bevor dieses Feld existierte, oder wenn die Suche nicht ausgeführt wurde; ein leeres Array, wenn sie ausgeführt wurde und nichts gefunden hat. `match_image_url` ist eine vorsignierte URL, die abläuft.",
                  "items": {
                    "type": "object",
                    "properties": {
                      "session_id": {
                        "type": "string",
                        "format": "uuid",
                        "nullable": true,
                        "description": "Sitzungs-ID des übereinstimmenden Gesichts. `null`, wenn `source` den Wert `imported`, `list_entry` oder `retained_template` hat."
                      },
                      "session_number": {
                        "type": "integer",
                        "nullable": true
                      },
                      "similarity_percentage": {
                        "type": "number",
                        "description": "Gesichtsähnlichkeit zwischen den beiden Bildern, begrenzt auf 0–100."
                      },
                      "vendor_data": {
                        "type": "string",
                        "nullable": true,
                        "description": "`vendor_data` der übereinstimmenden Sitzung oder des verknüpften Benutzers für importierte und aufbewahrte Template-Gesichter."
                      },
                      "vendor_user_id": {
                        "type": "string",
                        "format": "uuid",
                        "nullable": true,
                        "description": "Verknüpfte Benutzer-ID für `imported`- und `retained_template`-Treffer sowie für Sitzungstreffer, die mit einem Benutzer verknüpft sind. `null` für Listeneinträge und Sitzungen ohne Benutzer."
                      },
                      "biometric_template_id": {
                        "type": "string",
                        "format": "uuid",
                        "nullable": true,
                        "description": "ID des aufbewahrten biometrischen Templates. Wird nur gesetzt, wenn `source` den Wert `retained_template` hat; andernfalls `null`."
                      },
                      "verification_date": {
                        "type": "string",
                        "format": "date-time",
                        "nullable": true,
                        "description": "Wann das übereinstimmende Gesicht erfasst wurde oder wann eine aufbewahrte Vorlage erstellt wurde. `null` für Listeneinträge."
                      },
                      "user_details": {
                        "type": "object",
                        "nullable": true,
                        "description": "Identitätsdaten aus der übereinstimmenden Sitzung oder dem importierten Benutzerprofil. Immer `null` bei Übereinstimmungen mit `retained_template` und `list_entry`.",
                        "properties": {
                          "full_name": {
                            "type": "string",
                            "nullable": true
                          },
                          "document_type": {
                            "type": "string",
                            "nullable": true
                          },
                          "document_number": {
                            "type": "string",
                            "nullable": true
                          }
                        }
                      },
                      "match_image_url": {
                        "type": "string",
                        "format": "uri",
                        "nullable": true,
                        "description": "Referenzbild für bildbasierte Abgleiche. Immer `null` bei `retained_template`-Abgleichen, da gespeicherte Templates kein Bild enthalten."
                      },
                      "status": {
                        "type": "string",
                        "nullable": true,
                        "description": "Lebenszyklusstatus der übereinstimmenden Sitzung. `null` für Quellen, die keine Sitzungen sind."
                      },
                      "is_blocklisted": {
                        "type": "boolean",
                        "description": "Gibt an, ob das übereinstimmende Gesicht auf einer Sperrliste steht."
                      },
                      "is_allowlisted": {
                        "type": "boolean",
                        "description": "Gibt an, ob das übereinstimmende Gesicht auf einer Positivliste steht."
                      },
                      "api_service": {
                        "type": "string",
                        "nullable": true,
                        "description": "Eigenständiger API-Service der zugehörigen Sitzung (z. B. `PASSIVE_LIVENESS`, `FACE_MATCH`); `null` für Workflow-Sitzungen und Nicht-Sitzungsquellen."
                      },
                      "source": {
                        "type": "string",
                        "enum": [
                          "session",
                          "imported",
                          "list_entry",
                          "retained_template"
                        ],
                        "description": "Ursprung des übereinstimmenden Gesichts: `session`, `imported` (Gesichts-Upload des Benutzers), `list_entry` (Positiv-/Sperrliste) oder `retained_template` (ein bildfreies biometrisches Template, das bei einem Benutzer gespeichert ist, aufgeführt unter `/v3/biometric-templates/`)."
                      }
                    }
                  },
                  "nullable": true
                },
                "front_image_quality_score": {
                  "type": "object",
                  "nullable": true,
                  "description": "Qualitätsmetriken für das Bild der Dokumentvorderseite. Jeder Teilwert liegt im Bereich von 0 bis 100.",
                  "properties": {
                    "focus_score": {
                      "type": "number",
                      "description": "Schärfe des Bildes, gemessen anhand der oberen 10 % der lokalen Laplace-Varianz. Robust gegenüber Dokumenten mit großen einheitlichen Hintergründen. Höhere Werte weisen auf ein schärferes, weniger verschwommenes Bild hin."
                    },
                    "brightness_score": {
                      "type": "number",
                      "description": "Wie gut das Bild ausgeleuchtet ist. Bestraft zu dunkle oder überbelichtete Bilder, wobei die ideale Helligkeit im mittleren Bereich liegt."
                    },
                    "brightness_issue": {
                      "type": "string",
                      "enum": [
                        "ok",
                        "too_dark",
                        "too_bright"
                      ],
                      "description": "Gibt die Richtung des Helligkeitsproblems an, wenn der brightness_score niedrig ist. 'ok' bedeutet, dass die Helligkeit akzeptabel ist, 'too_dark' bedeutet, dass das Bild unterbelichtet ist, 'too_bright' bedeutet, dass das Bild überbelichtet ist."
                    },
                    "is_document_fully_visible": {
                      "type": "boolean",
                      "nullable": true,
                      "description": "true, wenn alle vier Ecken des Dokuments innerhalb des Bildrahmens vollständig sichtbar sind, false, wenn eine Ecke abgeschnitten ist. Null, wenn keine Eckkoordinaten verfügbar sind."
                    },
                    "resolution_score": {
                      "type": "number",
                      "description": "Effektive Auflösung des Bildes basierend auf der Gesamtpixelanzahl."
                    },
                    "overall_score": {
                      "type": "number",
                      "description": "Gewichteter Gesamtwert aus Teilwerten (Schärfe 45%, Helligkeit 30%, Auflösung 25%)."
                    }
                  }
                },
                "back_image_quality_score": {
                  "type": "object",
                  "nullable": true,
                  "description": "Qualitätsmetriken für das Bild der Dokumentrückseite. Gleiche Struktur wie front_image_quality_score.",
                  "properties": {
                    "focus_score": {
                      "type": "number",
                      "description": "Schärfe des Bildes, gemessen anhand der oberen 10 % der lokalen Laplace-Varianz. Robust gegenüber Dokumenten mit großen einheitlichen Hintergründen. Höhere Werte weisen auf ein schärferes, weniger verschwommenes Bild hin."
                    },
                    "brightness_score": {
                      "type": "number",
                      "description": "Wie gut das Bild ausgeleuchtet ist. Bestraft zu dunkle oder überbelichtete Bilder, wobei die ideale Helligkeit im mittleren Bereich liegt."
                    },
                    "brightness_issue": {
                      "type": "string",
                      "enum": [
                        "ok",
                        "too_dark",
                        "too_bright"
                      ],
                      "description": "Gibt die Richtung des Helligkeitsproblems an, wenn der brightness_score niedrig ist. 'ok' bedeutet, dass die Helligkeit akzeptabel ist, 'too_dark' bedeutet, dass das Bild unterbelichtet ist, 'too_bright' bedeutet, dass das Bild überbelichtet ist."
                    },
                    "is_document_fully_visible": {
                      "type": "boolean",
                      "nullable": true,
                      "description": "true, wenn alle vier Ecken des Dokuments innerhalb des Bildrahmens vollständig sichtbar sind, false, wenn eine Ecke abgeschnitten ist. Null, wenn keine Eckkoordinaten verfügbar sind."
                    },
                    "resolution_score": {
                      "type": "number",
                      "description": "Effektive Auflösung des Bildes basierend auf der Gesamtpixelanzahl."
                    },
                    "overall_score": {
                      "type": "number",
                      "description": "Gewichteter Gesamtwert aus Teilwerten (Schärfe 45%, Helligkeit 30%, Auflösung 25%)."
                    }
                  }
                },
                "warnings": {
                  "type": "array",
                  "items": {
                    "type": "object",
                    "properties": {
                      "feature": {
                        "type": "string",
                        "enum": [
                          "ID_VERIFICATION",
                          "NFC",
                          "LIVENESS",
                          "FACEMATCH",
                          "PROOF_OF_ADDRESS",
                          "PHONE",
                          "EMAIL",
                          "AML",
                          "LOCATION",
                          "DATABASE_VALIDATION",
                          "QUESTIONNAIRE",
                          "DOCUMENT_AI",
                          "KYB_REGISTRY",
                          "KYB_DOCUMENTS",
                          "KYB_KEY_PEOPLE",
                          "GEOLOCATION",
                          "SIGNATURE"
                        ],
                        "description": "Die Funktion, die diese Warnung generiert hat (z. B. `ID_VERIFICATION`, `NFC`, `LIVENESS`). Der Wert identifiziert den Funktionsblock, zu dem die Warnung gehört. Das Warnungs-Array jedes Moduls verwendet typischerweise den zu seinem Modul passenden Wert, aber das obige Enum ist für alle Funktionswarnungen in der Entscheidungs-Payload maßgeblich."
                      },
                      "risk": {
                        "type": "string"
                      },
                      "additional_data": {
                        "type": "object",
                        "nullable": true,
                        "description": "Zusätzliche Kontextdaten zur Warnung"
                      },
                      "log_type": {
                        "type": "string",
                        "description": "Art des Logs: Information, Warnung oder Fehler"
                      },
                      "short_description": {
                        "type": "string"
                      },
                      "long_description": {
                        "type": "string"
                      },
                      "node_id": {
                        "type": "string",
                        "description": "Die ID des Workflow-Graph-Knotens, der diese Warnung erzeugt hat (für graphbasierte Workflows)"
                      }
                    }
                  },
                  "description": "Warnungen der Dokumentenverifizierung"
                },
                "matches": {
                  "type": "array",
                  "description": "Bei der Duplikat-/Sperrlistenerkennung gefundene übereinstimmende Dokumente (bis zu 5 Treffer)",
                  "items": {
                    "type": "object",
                    "properties": {
                      "session_id": {
                        "type": "string",
                        "format": "uuid",
                        "description": "Sitzungs-ID des übereinstimmenden Dokuments"
                      },
                      "session_number": {
                        "type": "integer",
                        "description": "Sitzungsnummer des übereinstimmenden Dokuments"
                      },
                      "vendor_data": {
                        "type": "string",
                        "nullable": true,
                        "description": "Vendor-Daten, die mit der übereinstimmenden Sitzung verknüpft sind"
                      },
                      "verification_date": {
                        "type": "string",
                        "format": "date-time",
                        "description": "Datum, an dem die Sitzung mit Übereinstimmung verifiziert wurde"
                      },
                      "user_details": {
                        "type": "object",
                        "properties": {
                          "name": {
                            "type": "string",
                            "description": "Vollständiger Name aus dem übereinstimmenden Dokument"
                          },
                          "document_type": {
                            "type": "string",
                            "description": "Art des übereinstimmenden Dokuments"
                          },
                          "document_number": {
                            "type": "string",
                            "description": "Dokumentennummer des übereinstimmenden Dokuments"
                          }
                        }
                      },
                      "status": {
                        "type": "string",
                        "description": "Status der übereinstimmenden Sitzung"
                      },
                      "is_blocklisted": {
                        "type": "boolean",
                        "description": "Gibt an, ob das übereinstimmende Dokument auf der Sperrliste steht"
                      },
                      "api_service": {
                        "type": "string",
                        "nullable": true,
                        "description": "API-Servicetyp der übereinstimmenden Sitzung"
                      },
                      "front_image_url": {
                        "type": "string",
                        "format": "uri",
                        "nullable": true,
                        "description": "URL des Bildes der Dokumentvorderseite aus dem übereinstimmenden Dokument"
                      }
                    }
                  }
                },
                "document_liveness": {
                  "type": "object",
                  "nullable": true,
                  "description": "Dokumenten-Liveness-Werte pro Betrugsart, gemeldet unabhängig davon, ob eine Warnung ausgelöst wurde, sodass ein genehmigtes Dokument dennoch auditiert werden kann. `null`, wenn die Prüfung nicht ausgeführt wurde.",
                  "properties": {
                    "portrait_replace": {
                      "type": "object",
                      "nullable": true,
                      "properties": {
                        "score": {
                          "type": "number",
                          "nullable": true,
                          "description": "Wahrscheinlichkeit, dass das Dokument für diesen Betrugstyp echt ist, 0-100 (höher = wahrscheinlicher echt). Der niedrigere der beiden Seitenwerte – der von der Entscheidung verwendete Wert. `null`, wenn keine der beiden Seiten einen nutzbaren Wert geliefert hat."
                        },
                        "front": {
                          "type": "number",
                          "nullable": true,
                          "description": "Score für die Vorderseite; `null`, wenn nicht erfasst oder wenn der Score verworfen wurde."
                        },
                        "back": {
                          "type": "number",
                          "nullable": true,
                          "description": "Score für die Rückseite; `null`, wenn nicht erfasst oder wenn der Score verworfen wurde."
                        },
                        "decline_threshold": {
                          "type": "number",
                          "nullable": true,
                          "description": "Der Ablehnungsschwellenwert, der bei der Auswertung dieses Dokuments gespeichert wurde. Spätere Workflow-Änderungen ändern ihn nicht. Null, wenn historische Auswertungsnachweise nicht verfügbar sind."
                        },
                        "review_threshold": {
                          "type": "number",
                          "nullable": true,
                          "description": "Der Schwellenwert für die Prüfung, der bei der Bewertung dieses Dokuments gespeichert wurde. Spätere Workflow-Bearbeitungen ändern ihn nicht. Null, wenn historische Bewertungsnachweise nicht verfügbar sind."
                        },
                        "bucket": {
                          "type": "string",
                          "nullable": true,
                          "enum": [
                            "approve",
                            "review",
                            "decline",
                            null
                          ],
                          "description": "Die zum Auswertungszeitpunkt gespeicherte Betrugstyp-Kategorie. Null, wenn kein verwertbarer Score vorliegt, die Prüfung nicht angewendet wurde oder historische Auswertungsnachweise nicht verfügbar sind. Spätere Workflow-Bearbeitungen ändern sie nicht."
                        }
                      }
                    },
                    "printed_copy": {
                      "type": "object",
                      "nullable": true,
                      "properties": {
                        "score": {
                          "type": "number",
                          "nullable": true,
                          "description": "Wahrscheinlichkeit, dass das Dokument für diesen Betrugstyp echt ist, 0-100 (höher = wahrscheinlicher echt). Der niedrigere der beiden Seitenwerte – der von der Entscheidung verwendete Wert. `null`, wenn keine der beiden Seiten einen nutzbaren Wert geliefert hat."
                        },
                        "front": {
                          "type": "number",
                          "nullable": true,
                          "description": "Score für die Vorderseite; `null`, wenn nicht erfasst oder wenn der Score verworfen wurde."
                        },
                        "back": {
                          "type": "number",
                          "nullable": true,
                          "description": "Score für die Rückseite; `null`, wenn nicht erfasst oder wenn der Score verworfen wurde."
                        },
                        "decline_threshold": {
                          "type": "number",
                          "nullable": true,
                          "description": "Der Ablehnungsschwellenwert, der bei der Auswertung dieses Dokuments gespeichert wurde. Spätere Workflow-Änderungen ändern ihn nicht. Null, wenn historische Auswertungsnachweise nicht verfügbar sind."
                        },
                        "review_threshold": {
                          "type": "number",
                          "nullable": true,
                          "description": "Der Schwellenwert für die Prüfung, der bei der Bewertung dieses Dokuments gespeichert wurde. Spätere Workflow-Bearbeitungen ändern ihn nicht. Null, wenn historische Bewertungsnachweise nicht verfügbar sind."
                        },
                        "bucket": {
                          "type": "string",
                          "nullable": true,
                          "enum": [
                            "approve",
                            "review",
                            "decline",
                            null
                          ],
                          "description": "Die zum Auswertungszeitpunkt gespeicherte Betrugstyp-Kategorie. Null, wenn kein verwertbarer Score vorliegt, die Prüfung nicht angewendet wurde oder historische Auswertungsnachweise nicht verfügbar sind. Spätere Workflow-Bearbeitungen ändern sie nicht."
                        }
                      }
                    },
                    "screen_replay": {
                      "type": "object",
                      "nullable": true,
                      "properties": {
                        "score": {
                          "type": "number",
                          "nullable": true,
                          "description": "Wahrscheinlichkeit, dass das Dokument für diesen Betrugstyp echt ist, 0-100 (höher = wahrscheinlicher echt). Der niedrigere der beiden Seitenwerte – der von der Entscheidung verwendete Wert. `null`, wenn keine der beiden Seiten einen nutzbaren Wert geliefert hat."
                        },
                        "front": {
                          "type": "number",
                          "nullable": true,
                          "description": "Score für die Vorderseite; `null`, wenn nicht erfasst oder wenn der Score verworfen wurde."
                        },
                        "back": {
                          "type": "number",
                          "nullable": true,
                          "description": "Score für die Rückseite; `null`, wenn nicht erfasst oder wenn der Score verworfen wurde."
                        },
                        "decline_threshold": {
                          "type": "number",
                          "nullable": true,
                          "description": "Der Ablehnungsschwellenwert, der bei der Auswertung dieses Dokuments gespeichert wurde. Spätere Workflow-Änderungen ändern ihn nicht. Null, wenn historische Auswertungsnachweise nicht verfügbar sind."
                        },
                        "review_threshold": {
                          "type": "number",
                          "nullable": true,
                          "description": "Der Schwellenwert für die Prüfung, der bei der Bewertung dieses Dokuments gespeichert wurde. Spätere Workflow-Bearbeitungen ändern ihn nicht. Null, wenn historische Bewertungsnachweise nicht verfügbar sind."
                        },
                        "bucket": {
                          "type": "string",
                          "nullable": true,
                          "enum": [
                            "approve",
                            "review",
                            "decline",
                            null
                          ],
                          "description": "Die zum Auswertungszeitpunkt gespeicherte Betrugstyp-Kategorie. Null, wenn kein verwertbarer Score vorliegt, die Prüfung nicht angewendet wurde oder historische Auswertungsnachweise nicht verfügbar sind. Spätere Workflow-Bearbeitungen ändern sie nicht."
                        }
                      }
                    }
                  }
                },
                "address_validation": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/AddressValidationResult"
                    }
                  ],
                  "nullable": true,
                  "description": "Adressvalidierung der auf diesem Dokument aufgedruckten Adresse: ob sie existiert und ihre normalisierte Form, wie sie aus dem Dokument ausgelesen wurde (eine spätere Korrektur von `address` führt sie nicht erneut aus). Vorhanden, wenn dieser Ausweisverifizierungs-Schritt das Add-on Adressvalidierung aktiviert hatte; andernfalls `null`."
                },
                "region": {
                  "type": "string",
                  "nullable": true,
                  "description": "Region oder Bundesstaat des Ausstellungslandes des Dokuments, sofern auf dem Dokument angegeben."
                },
                "extracted_data": {
                  "type": "object",
                  "nullable": true,
                  "additionalProperties": true,
                  "description": "Snapshot der aus dem Dokument extrahierten Daten, die der Person zur Überprüfung vorgelegt wurden, gespeichert neben den bestätigten Werten, damit Sie vergleichen können, was ausgelesen und was von der Person bestätigt wurde. `null`, wenn die Person nicht um Überprüfung gebeten wurde."
                },
                "barcodes": {
                  "type": "array",
                  "items": {
                    "type": "object",
                    "additionalProperties": true
                  },
                  "description": "Aus den Barcodes des Dokuments ausgelesene Daten. Leer, wenn das Dokument keine enthält oder keine ausgelesen wurden."
                }
              }
            }
          },
          "nfc_skip_reason": {
            "type": "string",
            "nullable": true,
            "enum": [
              "USER_SKIPPED",
              "DOCUMENT_WITHOUT_CHIP",
              "CHIP_CERTIFICATE_UNAVAILABLE",
              "DEVICE_WITHOUT_NFC",
              "INTEGRATION_WITHOUT_NFC_ACCESS",
              "MRZ_KEY_UNAVAILABLE",
              "JPKI_UNAVAILABLE"
            ],
            "description": "Warum die NFC-Chip-Verifizierung nicht ausgeführt wurde; wird angegeben, wenn der Workflow einen NFC-Schritt enthält. `null`, solange NFC aussteht oder wenn der Chip tatsächlich gelesen wurde. Werte: `USER_SKIPPED` – der Benutzer hat sich entschieden, den Schritt auf einem NFC-fähigen Gerät zu überspringen (durch `allow_nfc_skip` erlaubt); `DOCUMENT_WITHOUT_CHIP` – das Dokument besitzt keinen lesbaren NFC-Chip (kein elektronisches Dokument nach ICAO 9303); `CHIP_CERTIFICATE_UNAVAILABLE` – das Signaturzertifikat des Ausstellungslands (CSCA) für den Ausgabezeitraum des Dokuments ist nicht verfügbar, sodass die Chipsignatur nicht überprüft werden kann; `DEVICE_WITHOUT_NFC` – das Gerät hat kein NFC-Lesegerät gemeldet; `INTEGRATION_WITHOUT_NFC_ACCESS` – die Verifizierung lief ohne natives SDK (z. B. in einem Webbrowser), das keinen Zugriff auf das NFC-Lesegerät des Telefons hat; `MRZ_KEY_UNAVAILABLE` – der Chip-Zugriffsschlüssel konnte nicht aus der MRZ des Dokuments abgeleitet werden; `JPKI_UNAVAILABLE` – das Dokument ist eine japanische My Number Card, deren Chip über JPKI gelesen wird, und JPKI war für diese Verifizierung nicht verfügbar: es ist nicht aktiviert oder das native SDK der App kann keine My Number Cards lesen."
          },
          "nfc_verifications": {
            "type": "array",
            "nullable": true,
            "description": "**Array von NFC- / ePass-Berichten**, die von NFC-Schritten im Workflow-Graphen erzeugt wurden. **Dies ist immer ein JSON-Array, niemals ein einzelnes `nfc`-Objekt** – lesen Sie `nfc_verifications[0]` und iterieren Sie, falls Ihr Workflow NFC mehr als einmal ausführen kann. `null`, bis mindestens ein NFC-Schritt Daten erzeugt hat. Jeder Eintrag ist der vollständige Bericht, einschließlich `node_id`, `status` auf Funktionsebene, `chip_protocol`, `chip_data`, `authenticity` (SOD + DG-Integrität), `certificate_summary` sowie `warnings[]`. Eine japanische My Number Card wird über JPKI anstelle von ICAO 9303 ausgelesen: Ihr Eintrag weist `chip_protocol: \"jpki\"` auf, führt ihre Nachweise unter `jpki` und lässt die ICAO-Felder `null`. Wenn der NFC-Schritt übersprungen wurde, bevor er überhaupt angeboten werden konnte (Dokument ohne Chip, fehlendes Zertifikat, keine gemeldete NFC-Fähigkeit, unlesbarer MRZ-Schlüssel, JPKI für eine My Number Card nicht verfügbar), bleibt dies `null` und `nfc_skip_reason` erklärt den Grund; ein Überspringen beim Schritt selbst (Benutzer hat auf Überspringen getippt oder das Lesegerät war zum Scanzeitpunkt nicht verfügbar) erzeugt dennoch einen Bericht mit `is_nfc_skipped: true`.",
            "items": {
              "type": "object",
              "description": "Ein NFC-Bericht: der vollständige Bericht für ein einzelnes Auslesen des Chips (ein ICAO-9303-ePassport- oder eID-Chip oder eine über JPKI ausgelesene japanische My Number Card).",
              "properties": {
                "node_id": {
                  "type": "string",
                  "description": "Workflow-Graph-Knoten-ID des NFC-Schritts, der diesen Bericht erstellt hat. Verwenden Sie sie, um den Bericht mit der Workflow-Definition zu korrelieren."
                },
                "status": {
                  "type": "string",
                  "enum": [
                    "Not Finished",
                    "Approved",
                    "Declined",
                    "In Review",
                    "Resub Requested"
                  ],
                  "description": "Status auf Funktionsebene dieses NFC-Schritts. Unabhängig vom `status` der übergeordneten Sitzung – eine Sitzung kann ihre Gesamtentscheidung erreichen, während eine einzelne Funktion `In Review` bleibt."
                },
                "is_nfc_skipped": {
                  "type": "boolean",
                  "description": "`true`, wenn dieser NFC-Schritt explizit übersprungen statt ausgelesen wurde; `skip_reason` gibt den Grund an."
                },
                "skip_reason": {
                  "type": "string",
                  "nullable": true,
                  "enum": [
                    "USER_SKIPPED",
                    "DOCUMENT_WITHOUT_CHIP",
                    "CHIP_CERTIFICATE_UNAVAILABLE",
                    "DEVICE_WITHOUT_NFC",
                    "INTEGRATION_WITHOUT_NFC_ACCESS",
                    "MRZ_KEY_UNAVAILABLE",
                    "JPKI_UNAVAILABLE"
                  ],
                  "description": "Warum dieser NFC-Schritt übersprungen wurde. Nur gesetzt, wenn `is_nfc_skipped` den Wert `true` hat. Gleiche Taxonomie wie das sitzungsbezogene `nfc_skip_reason`, das zusätzlich die Fälle abdeckt, in denen NFC überhaupt keinen Bericht erzeugt hat."
                },
                "chip_protocol": {
                  "type": "string",
                  "enum": [
                    "icao",
                    "jpki"
                  ],
                  "description": "Wie der NFC-Schritt den Chip liest. `icao`: ICAO 9303 ePassport- oder eID-Chip, geöffnet mit dem Zugriffsschlüssel aus der MRZ. `jpki`: Japanische My Number Card, bei der die Karte eine einmalige Challenge signiert, nachdem der Inhaber die Karten-PIN in einem nativen SDK eingegeben hat; das Ergebnis befindet sich unter `jpki`. Wird auch bei übersprungenen Schritten gesetzt, sodass Sie einen übersprungenen Lesevorgang der My Number Card unterscheiden können."
                },
                "jpki": {
                  "type": "object",
                  "nullable": true,
                  "description": "Was das Auslesen einer japanischen My Number Card über JPKI nachgewiesen hat. Vorhanden, wenn `chip_protocol` den Wert `jpki` hat und die Karte ausgelesen wurde. `null` bei ICAO-Chips, bei übersprungenen Schritten und wenn der NFC-Schritt beendet wurde, ohne dass eine Karte ausgelesen wurde (dieser Fall löst `JPKI_SIGNATURE_INVALID` aus). Enthält niemals die Zertifikate, deren Seriennummern, die Signaturen oder die 12-stellige My Number.",
                  "properties": {
                    "certificate_types": {
                      "type": "array",
                      "items": {
                        "type": "string",
                        "enum": [
                          "user_authentication",
                          "signature"
                        ]
                      },
                      "description": "Die gelesenen Kartenzertifikate. `user_authentication` (4-stellige PIN) wird immer gelesen; `signature` (Signatur-PIN) wird gelesen, wenn die Einstellung `jpki_request_attributes` des NFC-Knotens aktiviert ist."
                    },
                    "chain_valid": {
                      "type": "boolean",
                      "description": "`true`, wenn jedes gelesene Zertifikat auf die JPKI-Zertifizierungsstelle zurückgeht, innerhalb seiner Gültigkeitsdauer liegt und ein My Number Card-Zertifikat seines Typs ist."
                    },
                    "signature_valid": {
                      "type": "boolean",
                      "description": "`true`, wenn jede von der Karte über die Einmal-Challenge erstellte Signatur erfolgreich geprüft wird. Die Karte signiert erst nach Eingabe ihrer PIN, was den Besitz der Karte und die Kenntnis der PIN nachweist."
                    },
                    "revocation_status": {
                      "type": "string",
                      "enum": [
                        "good",
                        "revoked",
                        "unchecked"
                      ],
                      "description": "`good`, wenn die Sperrprüfung bestätigt hat, dass jedes Zertifikat gültig ist, `revoked`, wenn ein Zertifikat gesperrt ist (zum Beispiel eine als verloren gemeldete Karte), `unchecked`, wenn keine Antwort zur Sperrung verfügbar war. `unchecked` wird niemals als `good` behandelt: Die Option `jpki_revocation_unchecked_action` des NFC-Knotens bestimmt das Ergebnis (Standardwert `REVIEW`)."
                    },
                    "ca_generation": {
                      "type": "string",
                      "nullable": true,
                      "description": "Generation der JPKI-Zertifizierungsstelle, die die Zertifikate ausgestellt hat, beispielsweise `2023`. `null`, wenn kein Zertifikat auf eine solche zurückgeht."
                    },
                    "certificate_expires_at": {
                      "type": "string",
                      "format": "date-time",
                      "nullable": true,
                      "description": "Das früheste Ablaufdatum unter den gelesenen Zertifikaten."
                    },
                    "certificates": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "description": "Was ein von der Karte gelesenes Zertifikat nachgewiesen hat. Niemals das Zertifikat selbst oder seine Seriennummer.",
                        "properties": {
                          "type": {
                            "type": "string",
                            "enum": [
                              "user_authentication",
                              "signature"
                            ],
                            "description": "Welches Kartenzertifikat dieser Eintrag beschreibt."
                          },
                          "chain_valid": {
                            "type": "boolean",
                            "description": "`true`, wenn das Zertifikat auf die JPKI-Zertifizierungsstelle seines Typs zurückgeht, innerhalb seiner Gültigkeitsdauer liegt und ein My Number Card-Zertifikat dieses Typs ist."
                          },
                          "signature_valid": {
                            "type": "boolean",
                            "description": "`true`, wenn die Signatur der Karte über die Einmal-Challenge anhand dieses Zertifikats verifiziert werden kann."
                          },
                          "ca_generation": {
                            "type": "string",
                            "nullable": true,
                            "description": "Generation der JPKI-Zertifizierungsstelle, die das Zertifikat ausgestellt hat, beispielsweise `2023`. `null`, wenn kein vertrauenswürdiger Aussteller gefunden wurde."
                          },
                          "not_valid_before": {
                            "type": "string",
                            "format": "date-time",
                            "nullable": true,
                            "description": "Beginn der Gültigkeitsdauer des Zertifikats. `null`, wenn das Zertifikat nicht gelesen werden konnte."
                          },
                          "not_valid_after": {
                            "type": "string",
                            "format": "date-time",
                            "nullable": true,
                            "description": "Ende der Gültigkeitsdauer des Zertifikats. `null`, wenn das Zertifikat nicht gelesen werden konnte."
                          },
                          "failure": {
                            "type": "string",
                            "nullable": true,
                            "enum": [
                              "unreadable_certificate",
                              "untrusted_issuer",
                              "expired",
                              "not_yet_valid",
                              "wrong_policy",
                              "key_usage",
                              null
                            ],
                            "description": "Warum `chain_valid` den Wert `false` hat: `unreadable_certificate`, `untrusted_issuer` (nicht von der JPKI-Zertifizierungsstelle dieses Typs ausgestellt), `expired`, `not_yet_valid`, `wrong_policy` (kein My Number Card-Zertifikat dieses Typs) oder `key_usage` (der Schlüssel darf nicht signieren). `null`, wenn die Kette gültig ist."
                          }
                        }
                      },
                      "description": "Ergebnisse pro Zertifikat, ein Eintrag pro gelesenem Zertifikat."
                    },
                    "attributes": {
                      "type": "object",
                      "nullable": true,
                      "description": "Die Daten des Inhabers aus dem Signaturzertifikat, sobald dessen Kette gültig ist. `null`, wenn das Signaturzertifikat nicht angefordert wurde oder keine gültige Zertifikatskette bis zur JPKI-Zertifizierungsstelle aufwies.",
                      "properties": {
                        "full_name": {
                          "type": "string",
                          "nullable": true,
                          "description": "Name wie registriert, in der Regel in japanischem Schriftsystem."
                        },
                        "date_of_birth": {
                          "type": "string",
                          "format": "date",
                          "nullable": true,
                          "description": "Geburtsdatum, `YYYY-MM-DD`. `null`, wenn das registrierte Datum unvollständig ist."
                        },
                        "gender": {
                          "type": "string",
                          "nullable": true,
                          "enum": [
                            "M",
                            "F",
                            null
                          ],
                          "description": "`M`, `F` oder `null`, wenn nicht registriert."
                        },
                        "address": {
                          "type": "string",
                          "nullable": true,
                          "description": "Eingetragene Adresse."
                        },
                        "name_substitute_characters": {
                          "type": "string",
                          "nullable": true,
                          "description": "Positionszeichenkette, die die Zeichen von `full_name` kennzeichnet, die durch ein Ersatzzeichen ersetzt wurden, weil das Originalzeichen außerhalb des Standardzeichensatzes liegt. `null`, wenn keine ersetzt wurden."
                        },
                        "address_substitute_characters": {
                          "type": "string",
                          "nullable": true,
                          "description": "Positionszeichenkette, die Ersatzzeichen in `address` kennzeichnet, wie bei `name_substitute_characters`."
                        }
                      }
                    },
                    "attributes_match_ocr": {
                      "type": "boolean",
                      "nullable": true,
                      "description": "`true`, wenn die Attribute mit den aus dem Foto derselben Karte gelesenen Daten übereinstimmen, `false`, wenn ein Attribut abweicht (`JPKI_AND_OCR_DATA_NOT_SAME`), `null`, wenn nichts verglichen werden konnte, einschließlich wenn `attributes` gleich `null` ist."
                    },
                    "mismatched_attributes": {
                      "type": "array",
                      "items": {
                        "type": "string",
                        "enum": [
                          "full_name",
                          "date_of_birth",
                          "gender",
                          "address"
                        ]
                      },
                      "description": "Namen der Attribute, die von den Fotodaten abweichen, niemals deren Werte. Leer, wenn alle verglichenen Daten übereinstimmen."
                    }
                  }
                },
                "portrait_image": {
                  "type": "string",
                  "format": "uri",
                  "nullable": true,
                  "description": "Vorsignierte URL zum aus dem Chip ausgelesenen Porträt (ICAO DG2). `null` bei einem JPKI-Auslesevorgang (`chip_protocol: \"jpki\"`) sowie für übersprungene Schritte."
                },
                "signature_image": {
                  "type": "string",
                  "format": "uri",
                  "nullable": true,
                  "description": "Vorsignierte URL zum aus dem Chip ausgelesenen Unterschriftsbild des Inhabers (ICAO DG7), sofern der Chip ein solches speichert. `null` bei einem JPKI-Auslesevorgang (`chip_protocol: \"jpki\"`) sowie für übersprungene Schritte."
                },
                "chip_data": {
                  "type": "object",
                  "nullable": true,
                  "description": "Aus den Datengruppen des ICAO-Chips geparste personenbezogene Daten. `null` bei einem JPKI-Lesevorgang (`chip_protocol: \"jpki\"`) und bei übersprungenen Schritten.",
                  "properties": {
                    "document_type": {
                      "type": "string"
                    },
                    "issuing_country": {
                      "type": "string"
                    },
                    "document_number": {
                      "type": "string"
                    },
                    "expiration_date": {
                      "type": "string",
                      "format": "date"
                    },
                    "first_name": {
                      "type": "string"
                    },
                    "last_name": {
                      "type": "string"
                    },
                    "birth_date": {
                      "type": "string",
                      "format": "date"
                    },
                    "gender": {
                      "type": "string"
                    },
                    "nationality": {
                      "type": "string"
                    },
                    "address": {
                      "type": "string"
                    },
                    "place_of_birth": {
                      "type": "string"
                    }
                  }
                },
                "authenticity": {
                  "type": "object",
                  "nullable": true,
                  "description": "Passive ICAO-Authentifizierung: SOD-Signatur (`sod_integrity`) und Data-Group-Hashes (`dg_integrity`). `null` bei einem JPKI-Lesevorgang, dessen Nachweis unter `jpki` ausgewiesen wird.",
                  "properties": {
                    "sod_integrity": {
                      "type": "boolean"
                    },
                    "dg_integrity": {
                      "type": "boolean"
                    }
                  }
                },
                "certificate_summary": {
                  "type": "object",
                  "nullable": true,
                  "description": "Zusammenfassung des ICAO Document Signer Certificate. `null` für einen JPKI-Lesevorgang (`chip_protocol: \"jpki\"`) und für übersprungene Schritte.",
                  "properties": {
                    "issuer": {
                      "type": "string"
                    },
                    "subject": {
                      "type": "string"
                    },
                    "serial_number": {
                      "type": "string"
                    },
                    "not_valid_after": {
                      "type": "string",
                      "format": "date-time"
                    },
                    "not_valid_before": {
                      "type": "string",
                      "format": "date-time"
                    }
                  }
                },
                "warnings": {
                  "type": "array",
                  "items": {
                    "type": "object",
                    "properties": {
                      "feature": {
                        "type": "string",
                        "enum": [
                          "ID_VERIFICATION",
                          "NFC",
                          "LIVENESS",
                          "FACEMATCH",
                          "PROOF_OF_ADDRESS",
                          "PHONE",
                          "EMAIL",
                          "AML",
                          "LOCATION",
                          "DATABASE_VALIDATION",
                          "QUESTIONNAIRE",
                          "DOCUMENT_AI",
                          "KYB_REGISTRY",
                          "KYB_DOCUMENTS",
                          "KYB_KEY_PEOPLE",
                          "GEOLOCATION",
                          "SIGNATURE"
                        ],
                        "description": "Die Funktion, die diese Warnung generiert hat. Der Wert identifiziert den Funktionsblock, zu dem die Warnung gehört. Das Warnungs-Array jedes Moduls verwendet typischerweise den zu seinem Modul passenden Wert (z. B. `PHONE` innerhalb von `phone_verifications[].warnings`), aber das obige Enum ist für alle Funktionswarnungen in der Entscheidungs-Payload maßgeblich."
                      },
                      "risk": {
                        "type": "string"
                      },
                      "additional_data": {
                        "type": "object",
                        "nullable": true
                      },
                      "log_type": {
                        "type": "string"
                      },
                      "short_description": {
                        "type": "string"
                      },
                      "long_description": {
                        "type": "string"
                      },
                      "node_id": {
                        "type": "string",
                        "description": "Die ID des Workflow-Graph-Knotens, der diese Warnung erzeugt hat"
                      }
                    }
                  }
                }
              }
            }
          },
          "liveness_checks": {
            "type": "array",
            "nullable": true,
            "description": "**Array von Berichten zur Liveness-Erkennung**, die von Schritten zur Liveness-Erkennung im Workflow-Graphen erzeugt wurden. Immer ein JSON-Array – niemals ein einzelnes `liveness`-Objekt. `null`, bis mindestens ein Schritt zur Liveness-Erkennung Daten erzeugt hat. Jeder Eintrag ist der vollständige Bericht, einschließlich `node_id`, `status` auf Funktionsebene, `method`, `score`, `reference_image`, `video_url`, optionaler `age_estimation`, sitzungsübergreifenden `matches[]` sowie `warnings[]`.",
            "items": {
              "type": "object",
              "description": "Ein Liveness-Bericht — der vollständige Bericht für einen einzelnen Liveness-Durchlauf.",
              "properties": {
                "node_id": {
                  "type": "string",
                  "description": "Workflow-Graph-Knoten-ID des Liveness-Schritts, der diesen Bericht erstellt hat."
                },
                "status": {
                  "type": "string",
                  "enum": [
                    "Not Finished",
                    "Approved",
                    "Declined",
                    "In Review",
                    "Resub Requested"
                  ],
                  "description": "Status auf Funktionsebene dieses Liveness-Schritts. Unabhängig vom `status` der übergeordneten Sitzung – eine Sitzung kann ihre Gesamtentscheidung erreichen, während eine einzelne Funktion `In Review` bleibt."
                },
                "method": {
                  "type": "string",
                  "description": "Für die Liveness-Erkennung verwendete Methode"
                },
                "score": {
                  "type": "number",
                  "description": "Konfidenzwert der Liveness-Prüfung"
                },
                "reference_image": {
                  "type": "string",
                  "format": "uri",
                  "description": "URL des verwendeten Referenzbildes"
                },
                "video_url": {
                  "type": "string",
                  "format": "uri",
                  "description": "URL des Videos der Liveness-Erkennung"
                },
                "age_estimation": {
                  "type": "number",
                  "description": "Geschätztes Alter der Person"
                },
                "matches": {
                  "type": "array",
                  "description": "Ähnliche Gesichter, die durch die Duplikatsgesichtssuche gefunden wurden (beste Treffer, Einträge auf Sperrlisten/Positivlisten zuerst). Das Feld `source` jedes Eintrags gibt an, woher das übereinstimmende Gesicht stammt: `session` (eine andere Verifizierungssitzung), `imported` (ein für einen Vendor-Benutzer hochgeladenes Gesicht), `list_entry` (ein von der Organisation verwaltetes Gesicht aus einer Positiv-/Sperrliste) oder `retained_template` (ein bildfreies biometrisches Template, das bei einem Benutzer gespeichert ist und unter `/v3/biometric-templates/` aufgeführt wird). `session_id`, `session_number`, `status` und `api_service` sind für Nicht-Sitzungsquellen `null`. Bei Treffern mit `imported` werden weiterhin `vendor_data`, `verification_date` und – sofern für den Vendor-Benutzer ein Name hinterlegt ist – `user_details` (nur mit `full_name`) aus dem Vendor-Benutzerdatensatz befüllt; bei `retained_template`-Treffern werden `vendor_user_id`, `vendor_data`, `biometric_template_id` und `verification_date` befüllt, während deren Bild- und Identitätsfelder `null` sind; bei `list_entry`-Treffern werden alle diese Felder als `null` zurückgegeben.",
                  "items": {
                    "type": "object",
                    "properties": {
                      "session_id": {
                        "type": "string",
                        "format": "uuid",
                        "nullable": true,
                        "description": "Sitzungs-ID des übereinstimmenden Gesichts. `null`, wenn `source` den Wert `imported`, `list_entry` oder `retained_template` hat."
                      },
                      "session_number": {
                        "type": "integer",
                        "nullable": true
                      },
                      "similarity_percentage": {
                        "type": "number",
                        "description": "Gesichtsähnlichkeit zwischen den beiden Bildern, begrenzt auf 0–100."
                      },
                      "vendor_data": {
                        "type": "string",
                        "nullable": true,
                        "description": "`vendor_data` der übereinstimmenden Sitzung oder des verknüpften Benutzers für importierte und aufbewahrte Template-Gesichter."
                      },
                      "vendor_user_id": {
                        "type": "string",
                        "format": "uuid",
                        "nullable": true,
                        "description": "Verknüpfte Benutzer-ID für `imported`- und `retained_template`-Treffer sowie für Sitzungstreffer, die mit einem Benutzer verknüpft sind. `null` für Listeneinträge und Sitzungen ohne Benutzer."
                      },
                      "biometric_template_id": {
                        "type": "string",
                        "format": "uuid",
                        "nullable": true,
                        "description": "ID des aufbewahrten biometrischen Templates. Wird nur gesetzt, wenn `source` den Wert `retained_template` hat; andernfalls `null`."
                      },
                      "verification_date": {
                        "type": "string",
                        "format": "date-time",
                        "nullable": true,
                        "description": "Wann das übereinstimmende Gesicht erfasst wurde oder wann eine aufbewahrte Vorlage erstellt wurde. `null` für Listeneinträge."
                      },
                      "user_details": {
                        "type": "object",
                        "nullable": true,
                        "description": "Identitätsdaten aus der übereinstimmenden Sitzung oder dem importierten Benutzerprofil. Immer `null` bei Übereinstimmungen mit `retained_template` und `list_entry`.",
                        "properties": {
                          "full_name": {
                            "type": "string",
                            "nullable": true
                          },
                          "document_type": {
                            "type": "string",
                            "nullable": true
                          },
                          "document_number": {
                            "type": "string",
                            "nullable": true
                          }
                        }
                      },
                      "match_image_url": {
                        "type": "string",
                        "format": "uri",
                        "nullable": true,
                        "description": "Referenzbild für bildbasierte Abgleiche. Immer `null` bei `retained_template`-Abgleichen, da gespeicherte Templates kein Bild enthalten."
                      },
                      "status": {
                        "type": "string",
                        "nullable": true,
                        "description": "Lebenszyklusstatus der übereinstimmenden Sitzung. `null` für Quellen, die keine Sitzungen sind."
                      },
                      "is_blocklisted": {
                        "type": "boolean",
                        "description": "Gibt an, ob das übereinstimmende Gesicht auf einer Sperrliste steht."
                      },
                      "is_allowlisted": {
                        "type": "boolean",
                        "description": "Gibt an, ob das übereinstimmende Gesicht auf einer Positivliste steht."
                      },
                      "api_service": {
                        "type": "string",
                        "nullable": true,
                        "description": "Eigenständiger API-Service der zugehörigen Sitzung (z. B. `PASSIVE_LIVENESS`, `FACE_MATCH`); `null` für Workflow-Sitzungen und Nicht-Sitzungsquellen."
                      },
                      "source": {
                        "type": "string",
                        "enum": [
                          "session",
                          "imported",
                          "list_entry",
                          "retained_template"
                        ],
                        "description": "Ursprung des übereinstimmenden Gesichts: `session`, `imported` (Gesichts-Upload des Benutzers), `list_entry` (Positiv-/Sperrliste) oder `retained_template` (ein bildfreies biometrisches Template, das bei einem Benutzer gespeichert ist, aufgeführt unter `/v3/biometric-templates/`)."
                      }
                    }
                  }
                },
                "warnings": {
                  "type": "array",
                  "items": {
                    "type": "object",
                    "properties": {
                      "feature": {
                        "type": "string",
                        "enum": [
                          "ID_VERIFICATION",
                          "NFC",
                          "LIVENESS",
                          "FACEMATCH",
                          "PROOF_OF_ADDRESS",
                          "PHONE",
                          "EMAIL",
                          "AML",
                          "LOCATION",
                          "DATABASE_VALIDATION",
                          "QUESTIONNAIRE",
                          "DOCUMENT_AI",
                          "KYB_REGISTRY",
                          "KYB_DOCUMENTS",
                          "KYB_KEY_PEOPLE",
                          "GEOLOCATION",
                          "SIGNATURE"
                        ],
                        "description": "Die Funktion, die diese Warnung generiert hat. Der Wert identifiziert den Funktionsblock, zu dem die Warnung gehört. Das Warnungs-Array jedes Moduls verwendet typischerweise den zu seinem Modul passenden Wert (z. B. `PHONE` innerhalb von `phone_verifications[].warnings`), aber das obige Enum ist für alle Funktionswarnungen in der Entscheidungs-Payload maßgeblich."
                      },
                      "risk": {
                        "type": "string"
                      },
                      "additional_data": {
                        "type": "object",
                        "nullable": true
                      },
                      "log_type": {
                        "type": "string"
                      },
                      "short_description": {
                        "type": "string"
                      },
                      "long_description": {
                        "type": "string"
                      },
                      "node_id": {
                        "type": "string",
                        "description": "Die ID des Workflow-Graph-Knotens, der diese Warnung erzeugt hat"
                      }
                    }
                  }
                },
                "face_quality": {
                  "type": "number",
                  "nullable": true,
                  "description": "Qualitätswert des Gesichtsbildes (0-100%). Nur für passive Liveness-Erkennung verfügbar."
                },
                "face_luminance": {
                  "type": "number",
                  "nullable": true,
                  "description": "Gesichts-Luminanz-/Helligkeitswert (0-100%). Nur für passive Liveness-Erkennung verfügbar."
                }
              }
            }
          },
          "face_matches": {
            "type": "array",
            "nullable": true,
            "description": "**Array von Gesichtsabgleichsberichten**, die von Gesichtsabgleichsschritten im Workflow-Graphen erzeugt wurden. Immer ein JSON-Array – niemals ein einzelnes `face_match`-Objekt. `null`, bis mindestens ein Gesichtsabgleichsschritt Daten erzeugt hat. Jeder Eintrag ist der vollständige Bericht, einschließlich `node_id`, `status` auf Funktionsebene, Ähnlichkeits-`score`, `source_image`, `target_image` sowie `warnings[]`.",
            "items": {
              "type": "object",
              "description": "Ein Gesichtsabgleichs-Bericht — der vollständige Bericht.",
              "properties": {
                "node_id": {
                  "type": "string",
                  "description": "Workflow-Graph-Knoten-ID des Gesichtsabgleich-Schritts, der diesen Bericht erstellt hat."
                },
                "status": {
                  "type": "string",
                  "enum": [
                    "Not Finished",
                    "Approved",
                    "Declined",
                    "In Review",
                    "Resub Requested"
                  ],
                  "description": "Status auf Funktionsebene dieses Gesichtsabgleich-Schritts. Unabhängig vom `status` der übergeordneten Sitzung – eine Sitzung kann ihre Gesamtentscheidung erreichen, während eine einzelne Funktion `In Review` bleibt."
                },
                "score": {
                  "type": "number",
                  "description": "Konfidenzwert des Gesichtsabgleichs"
                },
                "source_image_session_id": {
                  "type": "string",
                  "format": "uuid",
                  "nullable": true,
                  "description": "Sitzungs-ID, unter der das Quellporträt (Referenzporträt) gespeichert ist. Bei Abläufen zur biometrischen Authentifizierung ist dies die eigene ID der Sitzung (das übermittelte Porträt wird unter der neuen Sitzung gespeichert). `null`, wenn das Quellbild das Dokumentenporträt derselben Sitzung ist."
                },
                "source_image": {
                  "type": "string",
                  "format": "uri",
                  "description": "URL des für den Abgleich verwendeten Quellbildes"
                },
                "target_image": {
                  "type": "string",
                  "format": "uri",
                  "description": "URL des für den Abgleich verwendeten Zielbildes"
                },
                "warnings": {
                  "type": "array",
                  "items": {
                    "type": "object",
                    "properties": {
                      "feature": {
                        "type": "string",
                        "enum": [
                          "ID_VERIFICATION",
                          "NFC",
                          "LIVENESS",
                          "FACEMATCH",
                          "PROOF_OF_ADDRESS",
                          "PHONE",
                          "EMAIL",
                          "AML",
                          "LOCATION",
                          "DATABASE_VALIDATION",
                          "QUESTIONNAIRE",
                          "DOCUMENT_AI",
                          "KYB_REGISTRY",
                          "KYB_DOCUMENTS",
                          "KYB_KEY_PEOPLE",
                          "GEOLOCATION",
                          "SIGNATURE"
                        ],
                        "description": "Die Funktion, die diese Warnung generiert hat. Der Wert identifiziert den Funktionsblock, zu dem die Warnung gehört. Das Warnungs-Array jedes Moduls verwendet typischerweise den zu seinem Modul passenden Wert (z. B. `PHONE` innerhalb von `phone_verifications[].warnings`), aber das obige Enum ist für alle Funktionswarnungen in der Entscheidungs-Payload maßgeblich."
                      },
                      "risk": {
                        "type": "string"
                      },
                      "additional_data": {
                        "type": "object",
                        "nullable": true
                      },
                      "log_type": {
                        "type": "string"
                      },
                      "short_description": {
                        "type": "string"
                      },
                      "long_description": {
                        "type": "string"
                      },
                      "node_id": {
                        "type": "string",
                        "description": "Die ID des Workflow-Graph-Knotens, der diese Warnung erzeugt hat"
                      }
                    }
                  },
                  "description": "Warnungen zur Gesichtsabgleichsprüfung"
                },
                "face_coverage": {
                  "type": "object",
                  "nullable": true,
                  "description": "Gibt an, ob Augen, Mund und Gesicht im erfassten Bild verdeckt sind. Wird nur von `GET /v3/session/{sessionId}/decision/` zurückgegeben; ist nicht Teil von Webhook-Payloads. `null`, wenn kein Verdeckungswert vorliegt.",
                  "properties": {
                    "eyes": {
                      "type": "object",
                      "properties": {
                        "covered": {
                          "type": "boolean",
                          "nullable": true
                        },
                        "calibrated": {
                          "type": "boolean",
                          "nullable": true,
                          "description": "`false` bedeutet, dass der Messwert nur als Schattennachweis dient und keine Warnung darauf reagiert."
                        },
                        "visibility_score": {
                          "type": "number",
                          "nullable": true
                        }
                      }
                    },
                    "mouth": {
                      "type": "object",
                      "properties": {
                        "covered": {
                          "type": "boolean",
                          "nullable": true
                        },
                        "calibrated": {
                          "type": "boolean",
                          "nullable": true,
                          "description": "`false` bedeutet, dass der Messwert nur als Schattennachweis dient und keine Warnung darauf reagiert."
                        },
                        "visibility_score": {
                          "type": "number",
                          "nullable": true
                        }
                      }
                    },
                    "face": {
                      "type": "object",
                      "properties": {
                        "covered": {
                          "type": "boolean",
                          "nullable": true
                        },
                        "calibrated": {
                          "type": "boolean",
                          "nullable": true,
                          "description": "`false` bedeutet, dass der Messwert nur als Schattennachweis dient und keine Warnung darauf reagiert."
                        },
                        "visibility_score": {
                          "type": "number",
                          "nullable": true
                        }
                      }
                    }
                  }
                }
              }
            }
          },
          "phone_verifications": {
            "type": "array",
            "nullable": true,
            "description": "**Array von Telefonverifizierungsberichten** – immer ein JSON-Array, niemals ein einzelnes `phone`-Objekt. `null`, bis mindestens ein Telefonschritt Daten erzeugt hat. Jeder Eintrag ist der vollständige Bericht, einschließlich `node_id`, `status` auf Funktionsebene, der Telefonnummer und Ländermetadaten, `lifecycle[]`, `matches[]` sowie `warnings[]`.",
            "items": {
              "type": "object",
              "properties": {
                "node_id": {
                  "type": "string",
                  "description": "Eindeutige Kennung für diesen Telefon-Schritt im Workflow-Graphen."
                },
                "status": {
                  "type": "string",
                  "description": "Status auf Funktionsebene dieses Schritts der Telefonverifizierung. Unabhängig vom `status` der übergeordneten Sitzung – eine Sitzung kann ihre Gesamtentscheidung erreichen, während eine einzelne Funktion `In Review` bleibt.",
                  "enum": [
                    "Not Finished",
                    "Approved",
                    "Declined",
                    "In Review",
                    "Expired"
                  ]
                },
                "phone_number_prefix": {
                  "type": "string",
                  "description": "Ländervorwahl-Präfix"
                },
                "phone_number": {
                  "type": "string",
                  "description": "Telefonnummer ohne Ländervorwahl"
                },
                "full_number": {
                  "type": "string",
                  "description": "Vollständige Telefonnummer mit Ländervorwahl"
                },
                "country_code": {
                  "type": "string",
                  "description": "Zweistelliger Ländercode (ISO 3166-1 Alpha-2)"
                },
                "country_name": {
                  "type": "string",
                  "description": "Vollständiger Ländername"
                },
                "carrier": {
                  "type": "object",
                  "properties": {
                    "name": {
                      "type": "string",
                      "description": "Name des Mobilfunkanbieters"
                    },
                    "type": {
                      "type": "string",
                      "description": "Art des Telefonanschlusses (Mobilfunk, Festnetz usw.)"
                    }
                  }
                },
                "is_disposable": {
                  "type": "boolean",
                  "description": "Gibt an, ob die Telefonnummer von einem Wegwerfdienst stammt"
                },
                "is_virtual": {
                  "type": "boolean",
                  "description": "Gibt an, ob es sich um eine virtuelle Telefonnummer handelt"
                },
                "verification_method": {
                  "type": "string",
                  "description": "Zur Verifizierung der Telefonnummer verwendete Methode"
                },
                "verification_attempts": {
                  "type": "integer",
                  "description": "Anzahl der durchgeführten Verifizierungsversuche"
                },
                "verified_at": {
                  "type": "string",
                  "format": "date-time",
                  "description": "Zeitstempel, wann das Telefon verifiziert wurde"
                },
                "lifecycle": {
                  "type": "array",
                  "description": "Chronologische Liste der Ereignisse im Lebenszyklus der Telefonverifizierung.",
                  "items": {
                    "type": "object",
                    "properties": {
                      "type": {
                        "type": "string"
                      },
                      "timestamp": {
                        "type": "string",
                        "format": "date-time"
                      },
                      "details": {
                        "type": "object",
                        "nullable": true,
                        "description": "Ereignisspezifische Payload. Sende-Ereignisse enthalten `status`, `reason`, `channel`, `actual_channel`; Zustellungs-Ereignisse enthalten `channel`, `status`; Code-Prüfungs-Ereignisse enthalten `code_tried`, `status`; finale Status-Ereignisse enthalten `reason` – oder `null`, wenn kein Grund zu melden ist (z. B. `PHONE_VERIFICATION_APPROVED`).",
                        "properties": {
                          "status": {
                            "type": "string"
                          },
                          "reason": {
                            "type": "string",
                            "nullable": true
                          },
                          "channel": {
                            "type": "string",
                            "nullable": true
                          },
                          "actual_channel": {
                            "type": "string",
                            "nullable": true
                          },
                          "code_tried": {
                            "type": "string"
                          }
                        }
                      },
                      "fee": {
                        "type": "number"
                      }
                    }
                  }
                },
                "warnings": {
                  "type": "array",
                  "description": "Liste von Warnungen bezüglich der Telefonverifizierung",
                  "items": {
                    "type": "object",
                    "properties": {
                      "feature": {
                        "type": "string",
                        "enum": [
                          "ID_VERIFICATION",
                          "NFC",
                          "LIVENESS",
                          "FACEMATCH",
                          "PROOF_OF_ADDRESS",
                          "PHONE",
                          "EMAIL",
                          "AML",
                          "LOCATION",
                          "DATABASE_VALIDATION",
                          "QUESTIONNAIRE",
                          "DOCUMENT_AI",
                          "KYB_REGISTRY",
                          "KYB_DOCUMENTS",
                          "KYB_KEY_PEOPLE",
                          "GEOLOCATION",
                          "SIGNATURE"
                        ],
                        "description": "Die Funktion, die diese Warnung generiert hat. Der Wert identifiziert den Funktionsblock, zu dem die Warnung gehört. Das Warnungs-Array jedes Moduls verwendet typischerweise den zu seinem Modul passenden Wert (z. B. `PHONE` innerhalb von `phone_verifications[].warnings`), aber das obige Enum ist für alle Funktionswarnungen in der Entscheidungs-Payload maßgeblich."
                      },
                      "risk": {
                        "type": "string"
                      },
                      "additional_data": {
                        "type": "object",
                        "nullable": true
                      },
                      "log_type": {
                        "type": "string"
                      },
                      "short_description": {
                        "type": "string"
                      },
                      "long_description": {
                        "type": "string"
                      },
                      "node_id": {
                        "type": "string",
                        "description": "Die ID des Workflow-Graph-Knotens, der diese Warnung erzeugt hat"
                      }
                    }
                  }
                },
                "matches": {
                  "type": "array",
                  "description": "Für diese Telefonnummer gefundene Übereinstimmungen. Jede Übereinstimmung hat eine `source`: `session` (eine andere Verifizierungssitzung in Ihrer Anwendung stimmte mit derselben Nummer überein, zurückgegeben mit `session_id`/`session_number`/`vendor_data`/`verification_date`) oder `list_entry` (die Nummer befindet sich auf einer von der Organisation verwalteten Erlaubnis-/Sperrliste – siehe `/management-api/lists/overview`). Sitzungsübergreifende Übereinstimmungen verwenden unterschiedliche `vendor_data` und sind auf 5 begrenzt.",
                  "items": {
                    "type": "object",
                    "properties": {
                      "session_id": {
                        "type": "string",
                        "format": "uuid",
                        "nullable": true
                      },
                      "session_number": {
                        "type": "integer",
                        "nullable": true
                      },
                      "vendor_data": {
                        "type": "string",
                        "nullable": true
                      },
                      "verification_date": {
                        "type": "string",
                        "format": "date-time",
                        "nullable": true
                      },
                      "phone_number": {
                        "type": "string"
                      },
                      "status": {
                        "type": "string",
                        "nullable": true
                      },
                      "is_blocklisted": {
                        "type": "boolean"
                      },
                      "api_service": {
                        "type": "string",
                        "nullable": true
                      },
                      "source": {
                        "type": "string",
                        "enum": [
                          "session",
                          "list_entry"
                        ],
                        "description": "Woher diese Übereinstimmung stammt. `session` bedeutet, dass eine andere Verifizierungssitzung in Ihrer Anwendung mit diesem Wert übereinstimmte. `list_entry` bedeutet, dass der Wert mit einer von der Organisation verwalteten Liste (Allowlist/Sperrliste) übereinstimmte – siehe die Übersicht der Management-API-Listen unter `/management-api/lists/overview` zur Verwaltung dieser Listen."
                      }
                    }
                  }
                },
                "phone_intelligence": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/PhoneIntelligence"
                    }
                  ],
                  "description": "Telefon-Intelligence-Signale. Nur vorhanden, wenn das Telefon-Intelligence-Add-on für diese Nummer ausgeführt wurde."
                },
                "phone_social": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/PhoneSocialFootprint"
                    }
                  ],
                  "description": "Social Footprint der Nummer. Nur vorhanden, wenn das Social-Footprint-Add-on für diese Nummer ausgeführt wurde."
                }
              }
            }
          },
          "email_verifications": {
            "type": "array",
            "nullable": true,
            "description": "**Array von E-Mail-Verifizierungsberichten** – immer ein JSON-Array, niemals ein einzelnes `email`-Objekt. `null`, bis mindestens ein E-Mail-Schritt Daten erzeugt hat. Jeder Eintrag ist der vollständige Bericht, einschließlich `node_id`, `status` auf Funktionsebene, der E-Mail-Adresse, Daten zu Datenlecks, `lifecycle[]`, `matches[]` sowie `warnings[]`.",
            "items": {
              "type": "object",
              "properties": {
                "node_id": {
                  "type": "string",
                  "description": "Eindeutige Kennung für diesen E-Mail-Schritt im Workflow-Graphen."
                },
                "status": {
                  "type": "string",
                  "description": "Status auf Funktionsebene dieses Schritts der E-Mail-Verifizierung. Unabhängig vom `status` der übergeordneten Sitzung – eine Sitzung kann ihre Gesamtentscheidung erreichen, während eine einzelne Funktion `In Review` bleibt.",
                  "enum": [
                    "Not Finished",
                    "Approved",
                    "Declined",
                    "In Review",
                    "Expired"
                  ]
                },
                "email": {
                  "type": "string",
                  "description": "Die E-Mail-Adresse, die verifiziert wird"
                },
                "is_breached": {
                  "type": "boolean",
                  "description": "Gibt an, ob die E-Mail in bekannten Datenlecks gefunden wurde"
                },
                "breaches": {
                  "type": "array",
                  "description": "Liste bekannter Datenpannen, in denen diese E-Mail gefunden wurde",
                  "items": {
                    "type": "object",
                    "properties": {
                      "name": {
                        "type": "string",
                        "description": "Name des Verstoßes"
                      },
                      "domain": {
                        "type": "string",
                        "description": "Von der Sicherheitsverletzung betroffene Domain"
                      },
                      "logo_path": {
                        "type": "string",
                        "description": "URL zum Logo des von einer Datenschutzverletzung betroffenen Dienstes"
                      },
                      "breach_date": {
                        "type": "string",
                        "format": "date",
                        "description": "Datum, an dem der Verstoß auftrat"
                      },
                      "description": {
                        "type": "string",
                        "description": "Beschreibung des Verstoßes"
                      },
                      "is_verified": {
                        "type": "boolean",
                        "description": "Gibt an, ob das Datenleck verifiziert ist"
                      },
                      "data_classes": {
                        "type": "array",
                        "description": "Arten der bei der Datenpanne offengelegten Daten",
                        "items": {
                          "type": "string"
                        }
                      },
                      "breach_emails_count": {
                        "type": "integer",
                        "description": "Anzahl der vom Datenleck betroffenen E-Mail-Adressen"
                      }
                    }
                  }
                },
                "is_disposable": {
                  "type": "boolean",
                  "description": "Gibt an, ob die E-Mail von einem Wegwerf-Anbieter stammt"
                },
                "is_undeliverable": {
                  "type": "boolean",
                  "description": "Gibt an, ob die E-Mail-Adresse unzustellbar ist"
                },
                "verification_attempts": {
                  "type": "integer",
                  "description": "Anzahl der Verifizierungsversuche für diese E-Mail"
                },
                "verified_at": {
                  "type": "string",
                  "format": "date-time",
                  "description": "Zeitstempel, wann die E-Mail verifiziert wurde"
                },
                "warnings": {
                  "type": "array",
                  "description": "Liste von Warnungen bezüglich der E-Mail-Verifizierung",
                  "items": {
                    "type": "object",
                    "properties": {
                      "feature": {
                        "type": "string",
                        "enum": [
                          "ID_VERIFICATION",
                          "NFC",
                          "LIVENESS",
                          "FACEMATCH",
                          "PROOF_OF_ADDRESS",
                          "PHONE",
                          "EMAIL",
                          "AML",
                          "LOCATION",
                          "DATABASE_VALIDATION",
                          "QUESTIONNAIRE",
                          "DOCUMENT_AI",
                          "KYB_REGISTRY",
                          "KYB_DOCUMENTS",
                          "KYB_KEY_PEOPLE",
                          "GEOLOCATION",
                          "SIGNATURE"
                        ],
                        "description": "Die Funktion, die diese Warnung generiert hat. Der Wert identifiziert den Funktionsblock, zu dem die Warnung gehört. Das Warnungs-Array jedes Moduls verwendet typischerweise den zu seinem Modul passenden Wert (z. B. `PHONE` innerhalb von `phone_verifications[].warnings`), aber das obige Enum ist für alle Funktionswarnungen in der Entscheidungs-Payload maßgeblich."
                      },
                      "risk": {
                        "type": "string"
                      },
                      "additional_data": {
                        "type": "object",
                        "nullable": true
                      },
                      "log_type": {
                        "type": "string"
                      },
                      "short_description": {
                        "type": "string"
                      },
                      "long_description": {
                        "type": "string"
                      },
                      "node_id": {
                        "type": "string",
                        "description": "Die ID des Workflow-Graph-Knotens, der diese Warnung erzeugt hat"
                      }
                    }
                  }
                },
                "lifecycle": {
                  "type": "array",
                  "description": "Chronologische Liste der Ereignisse im Lebenszyklus der E-Mail-Verifizierung.",
                  "items": {
                    "type": "object",
                    "properties": {
                      "type": {
                        "type": "string"
                      },
                      "timestamp": {
                        "type": "string",
                        "format": "date-time"
                      },
                      "details": {
                        "type": "object",
                        "nullable": true,
                        "description": "Ereignisspezifische Payload. Sende-Ereignisse enthalten `status`, `reason`; Code-Prüfungs-Ereignisse enthalten `code_tried`, `status`; finale Status-Ereignisse enthalten `reason` – oder `null`, wenn kein Grund zu melden ist (z. B. `EMAIL_VERIFICATION_APPROVED`).",
                        "properties": {
                          "status": {
                            "type": "string"
                          },
                          "reason": {
                            "type": "string",
                            "nullable": true
                          },
                          "code_tried": {
                            "type": "string"
                          }
                        }
                      },
                      "fee": {
                        "type": "number"
                      }
                    }
                  }
                },
                "matches": {
                  "type": "array",
                  "description": "Für diese E-Mail-Adresse gefundene Übereinstimmungen. Jede Übereinstimmung hat eine `source`: `session` (eine andere Verifizierungssitzung in Ihrer Anwendung stimmte mit derselben E-Mail-Adresse überein, zurückgegeben mit `session_id`/`session_number`/`vendor_data`/`verification_date`) oder `list_entry` (die E-Mail-Adresse befindet sich auf einer von der Organisation verwalteten Erlaubnis-/Sperrliste – siehe `/management-api/lists/overview`). Sitzungsübergreifende Übereinstimmungen verwenden unterschiedliche `vendor_data` und sind auf 5 begrenzt.",
                  "items": {
                    "type": "object",
                    "properties": {
                      "session_id": {
                        "type": "string",
                        "format": "uuid",
                        "nullable": true
                      },
                      "session_number": {
                        "type": "integer",
                        "nullable": true
                      },
                      "vendor_data": {
                        "type": "string",
                        "nullable": true
                      },
                      "verification_date": {
                        "type": "string",
                        "format": "date-time",
                        "nullable": true
                      },
                      "email": {
                        "type": "string",
                        "format": "email"
                      },
                      "status": {
                        "type": "string",
                        "nullable": true
                      },
                      "is_blocklisted": {
                        "type": "boolean"
                      },
                      "api_service": {
                        "type": "string",
                        "nullable": true
                      },
                      "source": {
                        "type": "string",
                        "enum": [
                          "session",
                          "list_entry"
                        ],
                        "description": "Woher diese Übereinstimmung stammt. `session` bedeutet, dass eine andere Verifizierungssitzung in Ihrer Anwendung mit diesem Wert übereinstimmte. `list_entry` bedeutet, dass der Wert mit einer von der Organisation verwalteten Liste (Allowlist/Sperrliste) übereinstimmte – siehe die Übersicht der Management-API-Listen unter `/management-api/lists/overview` zur Verwaltung dieser Listen."
                      }
                    }
                  }
                },
                "email_intelligence": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/EmailIntelligence"
                    }
                  ],
                  "description": "E-Mail-Intelligence-Signale. Nur vorhanden, wenn das E-Mail-Intelligence-Add-on für diese Adresse ausgeführt wurde."
                },
                "email_social": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/EmailSocialFootprint"
                    }
                  ],
                  "description": "Social Footprint der Adresse. Nur vorhanden, wenn das Social-Footprint-Add-on für diese Adresse ausgeführt wurde."
                }
              }
            }
          },
          "poa_verifications": {
            "type": "array",
            "nullable": true,
            "description": "**Array von Adressnachweis-Berichten (POA)** – immer ein JSON-Array, niemals ein einzelnes `poa`-Objekt. `null`, bis mindestens ein POA-Schritt Daten erzeugt hat. Jeder Eintrag ist der vollständige Bericht, einschließlich `node_id`, `status` auf Funktionsebene, der Dokumentdatei-URL, Aussteller, Datumsangaben, geparster Adresse sowie `warnings[]`.",
            "items": {
              "type": "object",
              "properties": {
                "node_id": {
                  "type": "string",
                  "description": "Eindeutige Kennung für diesen POA-Schritt im Workflow-Graphen."
                },
                "status": {
                  "type": "string",
                  "description": "Status auf Funktionsebene dieses Schritts des Adressnachweises. Unabhängig vom `status` der übergeordneten Sitzung – eine Sitzung kann ihre Gesamtentscheidung erreichen, während eine einzelne Funktion `In Review` bleibt.",
                  "enum": [
                    "Not Finished",
                    "Approved",
                    "Declined",
                    "In Review",
                    "Resub Requested"
                  ]
                },
                "document_file": {
                  "type": "string",
                  "format": "uri",
                  "description": "URL des Adressnachweis-Dokuments"
                },
                "issuing_state": {
                  "type": "string",
                  "description": "Zweistelliger Ländercode des ausstellenden Staates"
                },
                "document_type": {
                  "type": "string",
                  "description": "Art des Adressnachweisdokuments"
                },
                "document_subtype": {
                  "type": "string",
                  "nullable": true,
                  "description": "Genauere Klassifizierung des Adressnachweisdokuments innerhalb seines `document_type`, sofern eines erkannt wurde. Andernfalls `null`."
                },
                "document_language": {
                  "type": "string",
                  "description": "Sprachcode des Dokuments"
                },
                "document_metadata": {
                  "type": "object",
                  "properties": {
                    "file_size": {
                      "type": "integer",
                      "description": "Größe des Dokuments"
                    },
                    "content_type": {
                      "type": "string",
                      "description": "Content-Type des Dokuments"
                    },
                    "creation_date": {
                      "type": "string",
                      "format": "date",
                      "description": "Datum, an dem das Dokument erstellt wurde"
                    },
                    "modified_date": {
                      "type": "string",
                      "format": "date",
                      "description": "Datum, an dem das Dokument geändert wurde"
                    },
                    "overlay_manipulation": {
                      "type": "object",
                      "nullable": true,
                      "description": "Forensische PDF-Analyse auf mutmaßliche Manipulation von Overlay-Text. Null, wenn keine Hinweise auf Overlay-Manipulation gefunden wurden oder das Dokument keine PDF-Datei war.",
                      "properties": {
                        "detected": {
                          "type": "boolean",
                          "description": "Gibt an, ob Hinweise auf eine Textüberlagerungsmanipulation erkannt wurden."
                        },
                        "analyzed": {
                          "type": "boolean",
                          "description": "Gibt an, ob das PDF analysiert werden konnte."
                        },
                        "analysis_incomplete": {
                          "type": "boolean",
                          "description": "Vorhanden und nur dann true, wenn die Datei nicht vollständig geprüft werden konnte. Was geprüft wurde, behält seine Ergebnisse, soweit möglich, und das Dokument gibt die Warnung zur nicht nachgewiesenen Textersetzung aus."
                        },
                        "signals": {
                          "type": "array",
                          "items": {
                            "type": "string"
                          },
                          "description": "Forensische Signale, die ausgelöst wurden, wie z. B. duplicate_font_subset oder glyph_fragmentation."
                        },
                        "manipulated_regions": {
                          "type": "array",
                          "description": "Mutmaßlich manipulierte Bereiche in Koordinaten der PDF-Seite.",
                          "items": {
                            "type": "object",
                            "properties": {
                              "page": {
                                "type": "integer"
                              },
                              "x": {
                                "type": "number"
                              },
                              "y": {
                                "type": "number"
                              },
                              "width": {
                                "type": "number"
                              },
                              "height": {
                                "type": "number"
                              },
                              "page_width": {
                                "type": "number"
                              },
                              "page_height": {
                                "type": "number"
                              }
                            }
                          }
                        }
                      }
                    },
                    "creator": {
                      "type": "string",
                      "nullable": true,
                      "description": "Ersteller-Anwendung, die in den Dokumenten-Metadaten erfasst ist."
                    },
                    "producer": {
                      "type": "string",
                      "nullable": true,
                      "description": "In den PDF-Metadaten erfasste Erstellungssoftware."
                    },
                    "software": {
                      "type": "string",
                      "nullable": true,
                      "description": "In den Datei-Metadaten erfasste Bearbeitungs-/Verarbeitungssoftware."
                    },
                    "encryption": {
                      "type": "string",
                      "nullable": true,
                      "description": "Verschlüsselungsschema des Dokuments, sofern verschlüsselt."
                    },
                    "is_signed": {
                      "type": "boolean",
                      "nullable": true,
                      "description": "Gibt an, ob das PDF eine digitale Signatur trägt."
                    },
                    "is_tampered": {
                      "type": "boolean",
                      "nullable": true,
                      "description": "Gibt an, ob die Signaturprüfung darauf hinweist, dass die Datei nach dem Signieren geändert wurde."
                    },
                    "signature_info": {
                      "type": "object",
                      "nullable": true,
                      "description": "Details der digitalen Signatur(en), sofern vorhanden."
                    },
                    "exif_original_date": {
                      "type": "string",
                      "nullable": true,
                      "description": "EXIF-Originalaufnahmedatum für Bild-Uploads."
                    },
                    "exif_digitized_date": {
                      "type": "string",
                      "nullable": true,
                      "description": "EXIF-Digitalisierungsdatum für Bild-Uploads."
                    },
                    "processed_by_known_editor": {
                      "type": "boolean",
                      "nullable": true,
                      "description": "Gibt an, ob die Dateimetadaten auf eine Verarbeitung durch einen bekannten Dokumenteneditor hinweisen."
                    },
                    "has_different_creation_mod_date": {
                      "type": "boolean",
                      "nullable": true,
                      "description": "Gibt an, ob das Erstellungs- und das Änderungsdatum voneinander abweichen — ein typisches Manipulationssignal."
                    }
                  },
                  "description": "Aus dem hochgeladenen POA-Dokument extrahierte forensische Dateimetadaten. Enthält immer die folgenden Schlüssel (Werte sind `null`, wenn nicht anwendbar, z. B. EXIF-Daten für PDFs). `null`, wenn keine Metadaten extrahiert werden konnten.",
                  "nullable": true
                },
                "issuer": {
                  "type": "string",
                  "description": "Name des Dokumentenausstellers"
                },
                "issue_date": {
                  "type": "string",
                  "format": "date",
                  "description": "Datum, an dem das Dokument ausgestellt wurde"
                },
                "expiration_date": {
                  "type": "string",
                  "format": "date",
                  "nullable": true,
                  "description": "Ablaufdatum des Dokuments, falls verfügbar"
                },
                "poa_address": {
                  "type": "string",
                  "description": "Unverarbeitete Adresse aus dem Adressnachweis-Dokument"
                },
                "poa_formatted_address": {
                  "type": "string",
                  "description": "Formatierte Adresse aus dem Adressnachweis-Dokument"
                },
                "poa_parsed_address": {
                  "type": "object",
                  "properties": {
                    "address_type": {
                      "type": "string",
                      "description": "Art der Adresse (Straße, Avenue usw.)"
                    },
                    "street_1": {
                      "type": "string",
                      "description": "Primäre Straßenadresse"
                    },
                    "street_2": {
                      "type": "string",
                      "nullable": true,
                      "description": "Zusätzliche Straßenadresse"
                    },
                    "city": {
                      "type": "string",
                      "description": "Name der Stadt"
                    },
                    "region": {
                      "type": "string",
                      "description": "Name der Region oder des Bundesstaats"
                    },
                    "country": {
                      "type": "string",
                      "description": "Zweistelliger Ländercode"
                    },
                    "postal_code": {
                      "type": "string",
                      "description": "Postleitzahl"
                    },
                    "document_location": {
                      "type": "object",
                      "properties": {
                        "latitude": {
                          "type": "number",
                          "description": "Breitengrad-Koordinate"
                        },
                        "longitude": {
                          "type": "number",
                          "description": "Längengrad-Koordinate"
                        }
                      }
                    }
                  }
                },
                "name_on_document": {
                  "type": "string",
                  "nullable": true,
                  "description": "Aus dem Adressnachweis-Dokument extrahierter Name des Kontoinhabers / Empfängers, der für den Namensabgleich verwendet wird. `null`, wenn kein Name extrahiert werden konnte."
                },
                "name_match_score_expected_details": {
                  "type": "number",
                  "nullable": true,
                  "description": "Ähnlichkeitswert (0–100) zwischen `name_on_document` und dem bei der Sitzungserstellung angegebenen erwarteten Namen. `null`, wenn eine der beiden Seiten fehlt."
                },
                "name_match_score_id_verification": {
                  "type": "number",
                  "nullable": true,
                  "description": "Ähnlichkeitswert (0–100) zwischen `name_on_document` und dem durch den Schritt der Ausweisverifizierung extrahierten Namen. `null`, wenn eine der beiden Seiten fehlt."
                },
                "expected_details_address": {
                  "type": "string",
                  "nullable": true,
                  "description": "Erwartete Rohadresse zur Verifizierung"
                },
                "expected_details_formatted_address": {
                  "type": "string",
                  "nullable": true,
                  "description": "Erwartete formatierte Adresse zur Verifizierung"
                },
                "expected_details_parsed_address": {
                  "type": "object",
                  "description": "Erwartete analysierte Adressdetails zur Verifizierung"
                },
                "extra_fields": {
                  "type": "object",
                  "description": "Aus dem Dokument extrahierte zusätzliche Bank- und Kontaktdaten.",
                  "properties": {
                    "bank_account_number": {
                      "type": "string",
                      "nullable": true
                    },
                    "bank_iban": {
                      "type": "string",
                      "nullable": true
                    },
                    "bank_sort_code": {
                      "type": "string",
                      "nullable": true
                    },
                    "bank_routing_number": {
                      "type": "string",
                      "nullable": true
                    },
                    "bank_swift_bic": {
                      "type": "string",
                      "nullable": true
                    },
                    "bank_branch_name": {
                      "type": "string",
                      "nullable": true
                    },
                    "bank_branch_address": {
                      "type": "string",
                      "nullable": true
                    },
                    "document_phone_number": {
                      "type": "string",
                      "nullable": true
                    },
                    "additional_names": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      }
                    }
                  }
                },
                "extra_files": {
                  "type": "array",
                  "items": {
                    "type": "string",
                    "format": "uri"
                  },
                  "description": "Zusätzliche Adressnachweisdateien"
                },
                "warnings": {
                  "type": "array",
                  "items": {
                    "type": "object",
                    "properties": {
                      "feature": {
                        "type": "string",
                        "enum": [
                          "ID_VERIFICATION",
                          "NFC",
                          "LIVENESS",
                          "FACEMATCH",
                          "PROOF_OF_ADDRESS",
                          "PHONE",
                          "EMAIL",
                          "AML",
                          "LOCATION",
                          "DATABASE_VALIDATION",
                          "QUESTIONNAIRE",
                          "DOCUMENT_AI",
                          "KYB_REGISTRY",
                          "KYB_DOCUMENTS",
                          "KYB_KEY_PEOPLE",
                          "GEOLOCATION",
                          "SIGNATURE"
                        ],
                        "description": "Die Funktion, die diese Warnung generiert hat. Der Wert identifiziert den Funktionsblock, zu dem die Warnung gehört. Das Warnungs-Array jedes Moduls verwendet typischerweise den zu seinem Modul passenden Wert (z. B. `PHONE` innerhalb von `phone_verifications[].warnings`), aber das obige Enum ist für alle Funktionswarnungen in der Entscheidungs-Payload maßgeblich."
                      },
                      "risk": {
                        "type": "string"
                      },
                      "additional_data": {
                        "type": "object",
                        "nullable": true
                      },
                      "log_type": {
                        "type": "string"
                      },
                      "short_description": {
                        "type": "string"
                      },
                      "long_description": {
                        "type": "string"
                      },
                      "node_id": {
                        "type": "string",
                        "description": "Die ID des Workflow-Graph-Knotens, der diese Warnung erzeugt hat"
                      }
                    }
                  }
                },
                "detected_codes": {
                  "type": "array",
                  "description": "Auf jeder verarbeiteten Seite des Dokuments erkannte QR-Codes und Barcodes. Leer, wenn keine gefunden wurden. Ein lokalisierter, aber nicht decodierbarer QR-Code weist `parsed_payload: null` auf.",
                  "items": {
                    "$ref": "#/components/schemas/DocumentAIDetectedCode"
                  }
                },
                "address_validation": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/AddressValidationResult"
                    }
                  ],
                  "nullable": true,
                  "description": "Adressvalidierung der Adresse auf diesem Adressnachweis: ob sie existiert und ihre normalisierte Form, wie sie aus dem Dokument ausgelesen wurde (eine spätere Korrektur von `poa_address` führt sie nicht erneut aus). Vorhanden, wenn dieser Adressnachweis-Schritt das Add-on Adressvalidierung aktiviert hatte und der Upload die Dokumentprüfungen bestanden hat; andernfalls `null`."
                }
              }
            }
          },
          "document_ai_documents": {
            "type": "array",
            "nullable": true,
            "description": "**Document AI-Berichte gruppiert nach Workflow-Knoten** — immer ein JSON-Array, niemals ein einzelnes Objekt. `null`, bis mindestens ein Document AI-Schritt Daten erzeugt hat. Nur vorhanden, wenn `session_kind = user`. Jeder Eintrag ist eine Knotengruppe mit einem aggregierten `status`, der `node_id`, einem `items[]`-Array der Ergebnisse pro Dokument (extrahierte Daten zugeordnet nach dem konfigurierten Feldschlüssel) und `warnings`.",
            "items": {
              "type": "object",
              "description": "Ergebnisse von Document AI, gruppiert nach Workflow-Knoten.",
              "properties": {
                "status": {
                  "type": "string",
                  "description": "Aggregierter Document AI-Status für diesen Knoten, zusammengefasst aus seinen `items[]`.",
                  "enum": [
                    "Approved",
                    "Declined",
                    "In Review",
                    "Not Finished"
                  ]
                },
                "node_id": {
                  "type": "string",
                  "nullable": true,
                  "description": "Eindeutige Kennung für diesen Document AI-Schritt im Workflow-Graphen."
                },
                "items": {
                  "type": "array",
                  "items": {
                    "type": "object",
                    "properties": {
                      "uuid": {
                        "type": "string",
                        "format": "uuid"
                      },
                      "node_id": {
                        "type": "string",
                        "nullable": true,
                        "description": "Workflow-Graph-Knoten, der dieses Dokument erstellt hat."
                      },
                      "document_key": {
                        "type": "string",
                        "description": "Schlüssel des konfigurierten Document-AI-Dokuments, dem diese Datei entspricht."
                      },
                      "original_filename": {
                        "type": "string",
                        "nullable": true,
                        "description": "Dateiname der vom Benutzer hochgeladenen Datei."
                      },
                      "file_size": {
                        "type": "integer",
                        "nullable": true,
                        "description": "Dateigröße in Bytes."
                      },
                      "file_url": {
                        "type": "string",
                        "format": "uri",
                        "nullable": true,
                        "description": "Kurzlebiger vorsignierter Link zur hochgeladenen Datei."
                      },
                      "status": {
                        "type": "string",
                        "enum": [
                          "Approved",
                          "Declined",
                          "In Review",
                          "Not Finished"
                        ],
                        "description": "Document AI-Status pro Dokument."
                      },
                      "extracted_data": {
                        "type": "object",
                        "additionalProperties": true,
                        "nullable": true,
                        "description": "Von Document AI extrahierte Werte, anhand des konfigurierten Felds `key`. Jeder Wert ist ein String, eine Zahl oder `null`."
                      },
                      "detected_codes": {
                        "type": "array",
                        "description": "Auf jeder verarbeiteten Seite erkannte QR-Codes und Barcodes. Leer, wenn keine gefunden wurden. Ein lokalisierter, aber nicht decodierbarer QR-Code weist `parsed_payload: null` auf.",
                        "items": {
                          "$ref": "#/components/schemas/DocumentAIDetectedCode"
                        }
                      },
                      "fields": {
                        "type": "array",
                        "description": "Die konfigurierten Extraktionsfelder für dieses Dokument.",
                        "items": {
                          "type": "object",
                          "properties": {
                            "key": {
                              "type": "string",
                              "description": "Stabiler Feldschlüssel, der als Schlüssel in `extracted_data` verwendet wird."
                            },
                            "name": {
                              "type": "string",
                              "description": "Lesbarer Feldname."
                            },
                            "instruction": {
                              "type": "string",
                              "description": "Dem Modell angezeigte Extraktionsanweisung."
                            },
                            "type": {
                              "type": "string",
                              "enum": [
                                "text",
                                "number",
                                "date"
                              ],
                              "description": "Erwarteter Werttyp des extrahierten Feldes."
                            },
                            "required": {
                              "type": "boolean",
                              "description": "Whether this field is required."
                            }
                          }
                        }
                      },
                      "document_metadata": {
                        "type": "object",
                        "nullable": true,
                        "description": "Aus dem hochgeladenen Dokument extrahierte forensische Dateimetadaten (z. B. `is_tampered`). `null`, wenn nichts extrahiert werden konnte."
                      },
                      "cross_check_result": {
                        "type": "object",
                        "nullable": true,
                        "description": "Abgleich der extrahierten Dokumentfelder mit anderen Sitzungsdaten. `null`, wenn kein Abgleich durchgeführt wurde."
                      },
                      "created_at": {
                        "type": "string",
                        "format": "date-time"
                      }
                    }
                  }
                },
                "warnings": {
                  "type": "array",
                  "nullable": true,
                  "items": {
                    "type": "object"
                  },
                  "description": "Für diesen Document-AI-Knoten ausgelöste Warnungsprotokolle."
                }
              }
            }
          },
          "questionnaire_responses": {
            "type": "array",
            "nullable": true,
            "description": "**Array von Fragebogen-Antwortberichten** – immer ein JSON-Array, niemals ein einzelnes `questionnaire`-Objekt. `null`, bis mindestens ein Fragebogenschritt Daten erzeugt hat. Jeder Eintrag ist der vollständige Bericht, einschließlich `node_id`, der Fragebogen-Metadaten, Abschnitten mit Formularelementen sowie den Antworten des Benutzers.",
            "items": {
              "type": "object",
              "properties": {
                "node_id": {
                  "type": "string",
                  "description": "Eindeutige Kennung für diesen Fragebogen-Schritt im Workflow-Graphen."
                },
                "questionnaire_id": {
                  "type": "string",
                  "description": "Eindeutige Kennung für den Fragebogen"
                },
                "title": {
                  "type": "string",
                  "description": "Titel des Fragebogens"
                },
                "description": {
                  "type": "string",
                  "description": "Beschreibung des Fragebogens"
                },
                "languages": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  },
                  "description": "Unterstützte Sprachen"
                },
                "default_language": {
                  "type": "string",
                  "description": "Standardsprache"
                },
                "is_active": {
                  "type": "boolean",
                  "description": "Gibt an, ob der Fragebogen aktiv ist"
                },
                "is_simple_questionnaire": {
                  "type": "boolean",
                  "description": "Gibt an, ob der Fragebogen ein einfaches lineares Formular ist (kein verzweigter Graph)."
                },
                "questionnaire_group_id": {
                  "type": "string",
                  "format": "uuid",
                  "nullable": true,
                  "description": "Stabiler Identifikator der Fragebogengruppe über Versionen hinweg."
                },
                "version": {
                  "type": "integer",
                  "nullable": true,
                  "description": "Versionsnummer des Fragebogens, der beantwortet wurde."
                },
                "published_at": {
                  "type": "string",
                  "format": "date-time",
                  "nullable": true,
                  "description": "Zeitstempel, zu dem diese Fragebogenversion veröffentlicht wurde."
                },
                "sections": {
                  "type": "array",
                  "items": {
                    "type": "object",
                    "properties": {
                      "title": {
                        "type": "string",
                        "nullable": true,
                        "description": "Abschnittstitel"
                      },
                      "description": {
                        "type": "string",
                        "nullable": true,
                        "description": "Abschnittsbeschreibung"
                      },
                      "items": {
                        "type": "array",
                        "items": {
                          "type": "object",
                          "properties": {
                            "uuid": {
                              "type": "string",
                              "description": "Eindeutige Kennung für das Element"
                            },
                            "value": {
                              "type": "string",
                              "nullable": true,
                              "description": "Stabile Knotenkennung dieses Formularelements innerhalb des Fragebogen-Graphen."
                            },
                            "element_type": {
                              "type": "string",
                              "description": "Art des Fragebogenelements"
                            },
                            "is_required": {
                              "type": "boolean",
                              "description": "Gibt an, ob das Element erforderlich ist"
                            },
                            "title": {
                              "type": "string",
                              "description": "Titel des Eintrags"
                            },
                            "description": {
                              "type": "string",
                              "nullable": true,
                              "description": "Beschreibung des Eintrags"
                            },
                            "placeholder": {
                              "type": "string",
                              "nullable": true,
                              "description": "Platzhaltertext"
                            },
                            "choices": {
                              "type": "array",
                              "nullable": true,
                              "items": {
                                "type": "object",
                                "properties": {
                                  "label": {
                                    "type": "string"
                                  },
                                  "value": {
                                    "type": "string"
                                  },
                                  "requires_text_input": {
                                    "type": "boolean",
                                    "description": "Gibt an, ob diese Auswahl eine zusätzliche Texteingabe erfordert",
                                    "nullable": true
                                  }
                                },
                                "required": [
                                  "label",
                                  "value"
                                ]
                              },
                              "description": "Optionen für Dropdown- oder Einzelauswahlelemente"
                            },
                            "max_files": {
                              "type": "integer",
                              "description": "Maximale Anzahl zulässiger Dateien",
                              "nullable": true
                            },
                            "answer": {
                              "type": "object",
                              "description": "Für das Element bereitgestellte Antwort",
                              "properties": {
                                "value": {
                                  "type": "string",
                                  "nullable": true
                                },
                                "text": {
                                  "type": "string",
                                  "nullable": true
                                },
                                "files": {
                                  "type": "array",
                                  "items": {
                                    "type": "string"
                                  },
                                  "nullable": true
                                }
                              }
                            },
                            "required_if": {
                              "type": "object",
                              "nullable": true,
                              "description": "Regel für bedingte Erforderlichkeit, wenn das Element nur bei bestimmten Antworten erforderlich ist."
                            },
                            "repeatable_config": {
                              "type": "object",
                              "nullable": true,
                              "description": "Konfiguration für wiederholbare Elementgruppen, falls zutreffend."
                            }
                          },
                          "required": [
                            "uuid",
                            "value",
                            "element_type",
                            "is_required",
                            "title"
                          ]
                        }
                      }
                    }
                  }
                },
                "status": {
                  "type": "string",
                  "description": "Status des Fragebogens"
                }
              }
            }
          },
          "bank_verifications": {
            "type": "array",
            "nullable": true,
            "description": "Ergebnisse der Bankverifizierung, ein Eintrag pro Schritt der Bankverifizierung, für die Benutzer- und Unternehmensverifizierung. `null`, bis ein Schritt ein Ergebnis erzeugt. Das Feld `method` jedes Eintrags gibt an, wie das Konto verifiziert wurde: `open_banking` (Bank-Anmeldung) oder `account_lookup` (Kontoabfrage) oder ein `statement`- bzw. `microdeposits`-Fallback, und `none`, wenn die Person vor der Auswertung eines Versuchs ohne Bank fortgefahren ist (`continued_without_bank`). Siehe [Bank-Verifizierungsmethoden](/de/core-technology/bank-verification/verification-methods).",
            "items": {
              "$ref": "#/components/schemas/BankVerificationResult"
            }
          },
          "signatures": {
            "type": "array",
            "description": "E-Signatur-Ergebnisse, ein Element pro Unterzeichner und Signaturschritt, für Benutzerverifizierung und Unternehmensverifizierung (KYB). Nur vorhanden, wenn der Workflow einen E-Signatur-Schritt enthält; ein leeres Array, bis ein Unterzeichner diesen erreicht. Siehe den [E-Signatur-Bericht](/de/core-technology/electronic-signature/report-electronic-signature).",
            "items": {
              "$ref": "#/components/schemas/SignatureResult"
            }
          },
          "aml_screenings": {
            "type": "array",
            "nullable": true,
            "description": "**Array von AML-Screening-Berichten** — immer ein JSON-Array, niemals ein einzelnes `aml`-Objekt. `null`, bis mindestens ein AML-Schritt Daten erzeugt hat. Jedes Element ist der vollständige Bericht, einschließlich `node_id`, `status` auf Funktionsebene, `total_hits`, `entity_type`, `hits[]`, `score`, `screened_data`, `is_ongoing_monitoring_enabled` und `warnings[]`.",
            "items": {
              "$ref": "#/components/schemas/AMLScreening"
            }
          },
          "ip_analyses": {
            "type": "array",
            "nullable": true,
            "description": "**Array von Geräte- und IP-Analyse-Berichten** – immer ein JSON-Array, niemals ein einzelnes `ip_analysis`-Objekt. `null`, bis mindestens ein IP-Analyseschritt Daten erzeugt hat. Jeder Eintrag ist der vollständige Bericht, einschließlich `node_id`, `status` auf Funktionsebene, IP- und Geolokalisierungsdaten, Geräte-Fingerprint sowie `warnings[]`. Einträge mit doppeltem `(node_id, ip_address, device_fingerprint)` werden serverseitig dedupliziert.",
            "items": {
              "type": "object",
              "properties": {
                "node_id": {
                  "type": "string",
                  "description": "Eindeutige Kennung für diesen Geräte- und IP-Analyse-Schritt im Workflow-Graphen."
                },
                "status": {
                  "type": "string",
                  "description": "Status auf Funktionsebene dieses Eintrags der Geräte- und IP-Analyse. Unabhängig vom `status` der übergeordneten Sitzung – eine Sitzung kann ihre Gesamtentscheidung erreichen, während eine einzelne Funktion `In Review` bleibt.",
                  "enum": [
                    "Not Finished",
                    "Approved",
                    "Declined",
                    "In Review",
                    "Resub Requested"
                  ]
                },
                "device_brand": {
                  "type": "string",
                  "description": "Marke des verwendeten Geräts"
                },
                "device_model": {
                  "type": "string",
                  "description": "Modell des verwendeten Geräts"
                },
                "browser_family": {
                  "type": "string",
                  "description": "Verwendete Browser-Familie"
                },
                "os_family": {
                  "type": "string",
                  "description": "Betriebssystemfamilie"
                },
                "platform": {
                  "type": "string",
                  "description": "Plattformtyp (mobile, desktop usw.)"
                },
                "device_fingerprint": {
                  "type": "string",
                  "nullable": true,
                  "description": "Eindeutige Kennung des Geräte-Fingerabdrucks"
                },
                "ip_country": {
                  "type": "string",
                  "description": "Über die IP erkanntes Land"
                },
                "ip_country_code": {
                  "type": "string",
                  "description": "Zweistelliger Ländercode anhand der IP"
                },
                "ip_state": {
                  "type": "string",
                  "description": "Anhand der IP ermitteltes Bundesland/Region"
                },
                "ip_city": {
                  "type": "string",
                  "description": "Anhand der Adresse erkannte Stadt"
                },
                "latitude": {
                  "type": "number",
                  "description": "Breitengrad-Koordinate des IP-Standorts"
                },
                "longitude": {
                  "type": "number",
                  "description": "Längengrad-Koordinate des IP-Standorts"
                },
                "ip_address": {
                  "type": "string",
                  "description": "Adresse"
                },
                "isp": {
                  "type": "string",
                  "nullable": true,
                  "description": "Internetanbieter"
                },
                "organization": {
                  "type": "string",
                  "nullable": true,
                  "description": "Mit der IP verknüpfte Organisation"
                },
                "is_vpn_or_tor": {
                  "type": "boolean",
                  "description": "Gibt an, ob die IP aus einem VPN- oder Tor-Netzwerk stammt"
                },
                "is_data_center": {
                  "type": "boolean",
                  "description": "Gibt an, ob die IP aus einem Rechenzentrum stammt"
                },
                "time_zone": {
                  "type": "string",
                  "description": "Aus der IP erkannte Zeitzone"
                },
                "time_zone_offset": {
                  "type": "string",
                  "description": "Zeitzonenverschiebung"
                },
                "ip": {
                  "type": "object",
                  "description": "IP-Geolokalisierung dieses Eintrags sowie Großkreisabstände (km) zur Adresse des Ausweisdokuments und zur Adresse des Adressnachweisdokuments. Die Abstände sind `null`, wenn eine der beiden Seiten keinen auflösbaren Standort hat.",
                  "properties": {
                    "location": {
                      "type": "object",
                      "nullable": true,
                      "properties": {
                        "latitude": {
                          "type": "number",
                          "example": 41.2706327
                        },
                        "longitude": {
                          "type": "number",
                          "example": 1.9770097
                        }
                      },
                      "description": "Koordinaten oder `null`, falls nicht verfügbar."
                    },
                    "distance_from_id_document": {
                      "type": "number",
                      "nullable": true,
                      "example": 23.4
                    },
                    "distance_from_poa_document": {
                      "type": "number",
                      "nullable": true,
                      "example": 12.3
                    }
                  }
                },
                "id_document": {
                  "type": "object",
                  "description": "Aus der Adresse des Ausweisdokuments extrahierter Standort zuzüglich Entfernungen (km) zur IP-Geolokalisierung und zur POA-Dokumentadresse. `location` ist `null`, wenn keine Dokumentadresse geokodiert werden konnte.",
                  "properties": {
                    "location": {
                      "type": "object",
                      "nullable": true,
                      "properties": {
                        "latitude": {
                          "type": "number",
                          "example": 41.2706327
                        },
                        "longitude": {
                          "type": "number",
                          "example": 1.9770097
                        }
                      },
                      "description": "Koordinaten oder `null`, falls nicht verfügbar."
                    },
                    "distance_from_ip": {
                      "type": "number",
                      "nullable": true,
                      "example": 23.4
                    },
                    "distance_from_poa_document": {
                      "type": "number",
                      "nullable": true,
                      "example": 18.7
                    }
                  }
                },
                "poa_document": {
                  "type": "object",
                  "description": "Aus dem Adressnachweisdokument extrahierter Standort zuzüglich Entfernungen (km) zur IP-Geolokalisierung und zur Ausweisdokumentadresse. `location` ist `null`, wenn die Sitzung keinen POA-Schritt enthält oder die Adresse nicht geokodiert werden konnte.",
                  "properties": {
                    "location": {
                      "type": "object",
                      "nullable": true,
                      "properties": {
                        "latitude": {
                          "type": "number",
                          "example": 41.2706327
                        },
                        "longitude": {
                          "type": "number",
                          "example": 1.9770097
                        }
                      },
                      "description": "Koordinaten oder `null`, falls nicht verfügbar."
                    },
                    "distance_from_ip": {
                      "type": "number",
                      "nullable": true,
                      "example": 12.3
                    },
                    "distance_from_id_document": {
                      "type": "number",
                      "nullable": true,
                      "example": 18.7
                    }
                  }
                },
                "warnings": {
                  "type": "array",
                  "items": {
                    "type": "object",
                    "properties": {
                      "feature": {
                        "type": "string",
                        "enum": [
                          "ID_VERIFICATION",
                          "NFC",
                          "LIVENESS",
                          "FACEMATCH",
                          "PROOF_OF_ADDRESS",
                          "PHONE",
                          "EMAIL",
                          "AML",
                          "LOCATION",
                          "DATABASE_VALIDATION",
                          "QUESTIONNAIRE",
                          "DOCUMENT_AI",
                          "KYB_REGISTRY",
                          "KYB_DOCUMENTS",
                          "KYB_KEY_PEOPLE",
                          "GEOLOCATION",
                          "SIGNATURE"
                        ],
                        "description": "Die Funktion, die diese Warnung generiert hat. Der Wert identifiziert den Funktionsblock, zu dem die Warnung gehört. Das Warnungs-Array jedes Moduls verwendet typischerweise den zu seinem Modul passenden Wert (z. B. `PHONE` innerhalb von `phone_verifications[].warnings`), aber das obige Enum ist für alle Funktionswarnungen in der Entscheidungs-Payload maßgeblich."
                      },
                      "risk": {
                        "type": "string"
                      },
                      "additional_data": {
                        "type": "object",
                        "nullable": true
                      },
                      "log_type": {
                        "type": "string"
                      },
                      "short_description": {
                        "type": "string"
                      },
                      "long_description": {
                        "type": "string"
                      },
                      "node_id": {
                        "type": "string",
                        "description": "Die ID des Workflow-Graph-Knotens, der diese Warnung erzeugt hat"
                      }
                    }
                  }
                },
                "matches": {
                  "type": "array",
                  "description": "Sitzungsübergreifende Übereinstimmungen, die für die Adresse oder die Geräteidentität dieses Eintrags gefunden wurden. Jede Übereinstimmung ist eine andere Verifizierungssitzung in Ihrer Anwendung (`source` ist immer `session`), die denselben Wert aufweist und stets zu einem anderen Benutzer des Anbieters / `vendor_data` als die aktuelle Sitzung gehört, begrenzt auf 5 pro Erfassungsmodul (`device_fingerprint` summiert zwei unabhängig begrenzte Erfassungsmodule, sodass bis zu 10 Einträge möglich sind). Jeder Eintrag enthält `match_source`, `confidence`, `match_mode`, `device_info` und `location_info`; die Schlüssel `recovery_similarity`, `tls_ja4_corroborated` und `recovery_gate_reason` sind nur vorhanden, wenn `match_source` den Wert `recovered_high` hat.",
                  "items": {
                    "type": "object",
                    "additionalProperties": false,
                    "properties": {
                      "session_id": {
                        "type": "string",
                        "format": "uuid",
                        "description": "Sitzungs-ID der übereinstimmenden Sitzung."
                      },
                      "session_number": {
                        "type": "integer",
                        "description": "Fortlaufende Nummer der übereinstimmenden Sitzung."
                      },
                      "vendor_data": {
                        "type": "string",
                        "nullable": true,
                        "description": "`vendor_data` der übereinstimmenden Sitzung — unterscheidet sich immer vom Benutzer des Anbieters der aktuellen Sitzung."
                      },
                      "verification_date": {
                        "type": "string",
                        "format": "date-time",
                        "nullable": true,
                        "description": "Erstellungsdatum der übereinstimmenden Sitzung (`YYYY-MM-DDTHH:MM:SSZ`)."
                      },
                      "match_type": {
                        "type": "string",
                        "enum": [
                          "ip_address",
                          "device_fingerprint"
                        ],
                        "description": "Gibt an, ob die Übereinstimmung auf der IP-Adresse oder dem Geräte-Fingerprint basierte"
                      },
                      "match_source": {
                        "type": "string",
                        "enum": [
                          "ip_address",
                          "persistent_id",
                          "legacy_fp",
                          "recovered_high"
                        ],
                        "description": "Wie diese Übereinstimmung erreicht wurde: `ip_address` (geteilte IP-Adresse – Netzwerk-Co-Location, kein Nachweis einer Geräteidentität), `persistent_id` (exakte gespeicherte persistente Gerätekennung), `legacy_fp` (Legacy-`didit-fp-*`-Geräte-Fingerprint-Hash) oder `recovered_high` (Fuzzy-Fingerprint-Wiederherstellungstreffer mit hoher Konfidenz). Wiederherstellungskandidaten mit geringerer Konfidenz erscheinen nur als Risikowarnungen, niemals in diesem Array."
                      },
                      "matched_value": {
                        "type": "string",
                        "nullable": true,
                        "description": "Der übereinstimmende Wert: die gemeinsame Adresse, die dauerhafte Gerätekennung oder der Legacy-Fingerprint-Hash oder – für `recovered_high` – die UUID des wiederhergestellten Geräts."
                      },
                      "status": {
                        "type": "string",
                        "description": "Lebenszyklusstatus der übereinstimmenden Sitzung."
                      },
                      "is_blocklisted": {
                        "type": "boolean",
                        "description": "Gibt an, ob der übereinstimmende Wert auf einer Sperrliste steht. Bei Geräte-/IP-Übereinstimmungen derzeit immer `false`."
                      },
                      "api_service": {
                        "type": "string",
                        "nullable": true,
                        "description": "Eigenständiger API-Service der zugehörigen Sitzung; `null` für Workflow-Sitzungen."
                      },
                      "source": {
                        "type": "string",
                        "enum": [
                          "session"
                        ],
                        "description": "Bei Geräte-/IP-Übereinstimmungen immer `session` – jede Übereinstimmung ist eine weitere Verifizierungssitzung in Ihrer Anwendung."
                      },
                      "device_info": {
                        "type": "object",
                        "description": "Auf der übereinstimmenden Sitzung erfasste Gerätedetails.",
                        "properties": {
                          "device_brand": {
                            "type": "string",
                            "nullable": true
                          },
                          "device_model": {
                            "type": "string",
                            "nullable": true
                          },
                          "browser_family": {
                            "type": "string",
                            "nullable": true
                          },
                          "os_family": {
                            "type": "string",
                            "nullable": true
                          },
                          "platform": {
                            "type": "string",
                            "nullable": true
                          },
                          "device_fingerprint": {
                            "type": "string",
                            "nullable": true
                          }
                        }
                      },
                      "location_info": {
                        "type": "object",
                        "description": "Netzwerk- und Geolokalisierungsdetails, die bei der übereinstimmenden Sitzung festgestellt wurden.",
                        "properties": {
                          "ip_address": {
                            "type": "string",
                            "nullable": true
                          },
                          "ip_country": {
                            "type": "string",
                            "nullable": true
                          },
                          "ip_country_code": {
                            "type": "string",
                            "nullable": true
                          },
                          "ip_state": {
                            "type": "string",
                            "nullable": true
                          },
                          "ip_city": {
                            "type": "string",
                            "nullable": true
                          },
                          "is_vpn_or_tor": {
                            "type": "boolean"
                          },
                          "is_data_center": {
                            "type": "boolean"
                          }
                        }
                      },
                      "confidence": {
                        "type": "number",
                        "minimum": 0,
                        "maximum": 1,
                        "description": "Serverseitige Identifikationskonfidenz, berechnet als `1 - P(false positive)`: `1.0` für deterministische Übereinstimmungen (`persistent_id` oder hardwarebasiertes `recovered_high`), `0.5` für `legacy_fp`, `0.0` für `ip_address` (nur Co-Location) und ein durch Bestätigung angepasster Wert unter `1.0` für probabilistische wiederhergestellte Übereinstimmungen (höher, wenn der TLS-JA4-Fingerprint und das IP-Land unabhängig voneinander übereinstimmen)."
                      },
                      "match_mode": {
                        "type": "string",
                        "enum": [
                          "deterministic",
                          "probabilistic",
                          "co_occurrence"
                        ],
                        "description": "Evidenzklasse der Übereinstimmung: `deterministic` (exakte gespeicherte oder hardwareverankerte Kennung, die zwischen physischen Geräten nicht kollidieren kann), `probabilistic` (unscharfe Fingerabdruckdaten) oder `co_occurrence` (nur gemeinsames Netzwerk, kein Anspruch auf Geräteidentität)."
                      },
                      "recovery_similarity": {
                        "type": "number",
                        "description": "Kosinusähnlichkeit der Übereinstimmung bei der Fingerabdruckwiederherstellung, gerundet auf 4 Dezimalstellen. Nur vorhanden, wenn `match_source` den Wert `recovered_high` hat."
                      },
                      "tls_ja4_corroborated": {
                        "type": "boolean",
                        "description": "Gibt an, ob die TLS-JA4-Fingerprints der beiden Beobachtungen übereinstimmen — ein serverseitig beobachtetes Signal, das der Browser nicht fälschen kann. Nur vorhanden, wenn `match_source` den Wert `recovered_high` hat."
                      },
                      "recovery_gate_reason": {
                        "type": "string",
                        "description": "Warum der Recovery-Abgleich das Hard Gate gegen falsch-positive Treffer bestanden hat: `hardware_root_match` (eine hardwarebasierte Gerätekennung stimmte exakt überein) oder bei Konfigurationen, die reine Probe-Nachweise zulassen, `exact_composite_plus_<n>_families` / `very_high_similarity_plus_<n>_families`. Nur vorhanden, wenn `match_source` den Wert `recovered_high` hat."
                      }
                    }
                  }
                },
                "browser_version": {
                  "type": "string",
                  "nullable": true
                },
                "os_version": {
                  "type": "string",
                  "nullable": true
                },
                "user_agent": {
                  "type": "string",
                  "nullable": true,
                  "description": "Der User-Agent-String des Browsers."
                },
                "accept_language": {
                  "type": "string",
                  "nullable": true,
                  "description": "Der vom Browser gesendete `Accept-Language`-Header."
                },
                "session_identifier": {
                  "type": "string",
                  "nullable": true,
                  "description": "Kennung der Browsersitzung, in der die Verifizierung durchgeführt wurde."
                },
                "session_age_ms": {
                  "type": "integer",
                  "nullable": true,
                  "description": "Alter dieser Browsersitzung in Millisekunden zum Zeitpunkt der Ausführung des Schritts."
                },
                "coords_accuracy": {
                  "type": "number",
                  "nullable": true,
                  "description": "Genauigkeitsradius der vom Gerät übermittelten Koordinaten in Metern."
                },
                "raw_device_data": {
                  "type": "object",
                  "nullable": true,
                  "additionalProperties": true,
                  "description": "Für den Schritt erfasste unverarbeitete Gerätesignale."
                }
              }
            }
          },
          "geolocation_checks": {
            "type": "array",
            "nullable": true,
            "description": "**Array von Standortverifizierungsergebnissen**, eines pro Standortverifizierungsschritt: der akzeptierte Versuch dieses Schritts. `null`, bis ein Standortverifizierungsschritt Daten erzeugt hat. Frühere Versuche desselben Schritts befinden sich in `geolocation_attempts`.",
            "items": {
              "$ref": "#/components/schemas/GeolocationCheck"
            }
          },
          "geolocation_attempts": {
            "type": "array",
            "nullable": true,
            "description": "Jeder Versuch jedes Standortverifizierungsschritts dieser Sitzung, der älteste zuerst. Versuche, die durch eine erneute Einreichung ersetzt wurden, werden ausgelassen. Ein Workflow, der `geolocation_checks` über seine Antwort-Attribute zurückhält, hält auch diese Liste zurück.",
            "items": {
              "$ref": "#/components/schemas/GeolocationAttempt"
            }
          },
          "database_validations": {
            "type": "array",
            "nullable": true,
            "description": "**Array von Berichten zur Datenbankvalidierung** — immer ein JSON-Array, niemals ein einzelnes `database_validation`-Objekt. `null`, bis mindestens ein Schritt der Datenbankvalidierung Daten erzeugt hat. Jedes Element ist der vollständige Bericht, einschließlich `node_id`, `status` auf Funktionsebene, `screened_data`, der dienstspezifischen `validations[]` (jeweils mit ihren Register-`source_data`) und `warnings[]`. Die Felder `screened_data` und `source_data` variieren je nach Land:\n\n**ARG (Argentinien)**: screened_data: {document_number, selfie, gender, first_name, last_name}. source_data: {identification_number, first_name, last_name, full_name, date_of_birth, date_of_death, tax_id, tax_id_type, face_match_score, sit_1_since, banks, last_position, highest_position, rejected_checks}. Verwendet die biometrische Validierung des Gesichtsabgleichs von RENAPER. Das Geschlecht wird automatisch aus der Gesichtsanalyse oder dem Vornamen abgeleitet, wenn es im Dokument nicht vorhanden ist (z. B. bei Führerscheinen)\n\n**BOL (Bolivien)**: screened_data: {document_number, date_of_birth, first_name, last_name}. source_data: {identification_number, first_name, last_name, full_name, date_of_birth, gender}\n\n**BRA (Brasilien)**: screened_data: {tax_number, first_name, last_name, date_of_birth}. source_data enthält für erfolgreiche CPF-Übereinstimmungen immer {identification_number, first_name, last_name, date_of_birth, lgpd_minor, minor_under_18, minor_under_16}. Erfolgreiche Abfragen für Erwachsene setzen diese Flags auf false. Der Dienst Receita Federal Consulta CPF kann HTTP 422 (Minderjährige unter 18) oder 451 (unter 16) mit durch das LGPD zurückgehaltenen Daten zurückgeben; in diesen Fällen setzt source_data die Minor-Flags entsprechend auf true, enthält den Upstream-HTTP-Status, und die Validierung auf Feldebene lautet no_match. Die vollständige Codeliste finden Sie im Abschnitt zu Brasilien in der Referenz zu den Ergebnis-Codes der Datenbankvalidierung.\n\n**CHL (Chile)**: screened_data: {personal_number, first_name, last_name, date_of_birth}. source_data: {identification_number, first_name, last_name, date_of_birth, gender}\n\n**COL (Kolumbien)**: screened_data: {document_number, document_type, first_name, last_name}. source_data: {identification_number, first_name, last_name, full_name, date_of_birth, document_type}\n\n**CRI (Costa Rica)**: screened_data: {personal_number, first_name, last_name}. source_data: {identification_number, first_name, last_name, full_name}\n\n**DOM (Dominikanische Republik)**: screened_data: {personal_number}. source_data: {identification_number} (gibt nur valid/invalid zurück)\n\n**ECU (Ecuador)**: screened_data: {personal_number, first_name, last_name}. source_data: {identification_number, first_name, last_name, street, formatted_address, gender, nationality, education, marital_status, spouse, mother_name, father_name, profession}\n\n**ESP (Spanien)**: screened_data: {personal_number, document_type, expiration_date, first_name, last_name}. source_data: {identification_number, first_name, last_name, full_name, document_type, expiration_date}\n\n**GTM (Guatemala)**: screened_data: {document_number, first_name, last_name}. source_data: {identification_number, first_name, last_name, full_name}\n\n**HND (Honduras)**: screened_data: {document_number, first_name, last_name}. source_data: {identification_number, first_name, last_name, full_name}\n\n**MEX (Mexiko)**: screened_data: {personal_number (CURP), first_name, last_name}. source_data: {identification_number, first_name, last_name, full_name, date_of_birth, gender, nationality, curp_status, state_of_birth, doc_probatorio, registration_year, registration_state, registration_municipality, num_acta, crip, issuing_state_code, foreign_registry_number, folio_carta, folio_certificado}. Verwendet das Zivilregister RENAPO. Für MEX ist außerdem ein separater INE-Gültigkeitsprüfungsdienst als zusätzliche Einzelvalidierung verfügbar.\n\n**PAN (Panama)**: screened_data: {personal_number, selfie}. source_data: {identification_number}. Verwendet die biometrische SIB-Validierung\n\n**PER (Peru)**: screened_data: {personal_number (DNI), first_name, last_name}. source_data: {identification_number, first_name, last_name, paternal_name, maternal_name, verification_number, verification_letter}\n\n**PRY (Paraguay)**: screened_data: {document_number, first_name, last_name}. source_data: {identification_number, first_name, last_name, full_name}\n\n**SLV (El Salvador)**: screened_data: {document_number, date_of_birth, first_name, last_name}. source_data: {identification_number, first_name, last_name, full_name}\n\n**URY (Uruguay)**: screened_data: {personal_number, date_of_birth, first_name, last_name}. source_data: {identification_number, first_name, last_name, full_name}\n\n**VEN (Venezuela)**: screened_data: {document_number, first_name, last_name}. source_data: {identification_number, first_name, last_name, full_name, gender, date_of_birth, document_type}",
            "items": {
              "type": "object",
              "properties": {
                "node_id": {
                  "type": "string",
                  "description": "Eindeutige Kennung für diesen Schritt der Datenbankvalidierung im Workflow-Graphen."
                },
                "issuing_state": {
                  "type": "string",
                  "description": "ISO 3166-1-Alpha-3-Code des Landes, dessen Behörden-/Registerquellen abgefragt wurden (z. B. `BRA`, `MEX`, `ESP`, `NGA`, `IDN`). Die Datenbankvalidierung deckt 60+ Länder in Nord- und Südamerika, Europa, Afrika, dem Nahen Osten und dem asiatisch-pazifischen Raum sowie globale länderübergreifende Quellen ab – die Abdeckung wird regelmäßig erweitert, behandeln Sie den Wert daher als offene Menge und nicht als festes Enum."
                },
                "validation_type": {
                  "type": "string",
                  "enum": [
                    "one_by_one",
                    "two_by_two",
                    "not_enabled"
                  ],
                  "description": "Wie das Ergebnis bestätigt wurde: `one_by_one` (Ergebnis eines einzelnen Dienstes), `two_by_two` (zwei oder mehr verschiedene Dienste stimmten unabhängig voneinander vollständig mit der Identifikationsnummer überein) oder `not_enabled` (gespeichert, wenn kein Dienst einen verwertbaren Treffer geliefert hat). Der Wert ist niemals `null`. Dedizierte biometrische 2x2-Validierungsmodi sind derzeit für `ECU` und `PER` verfügbar."
                },
                "screened_data": {
                  "type": "object",
                  "description": "Die für die Validierung verwendeten Eingabedaten. Die Felder variieren je nach Land – siehe die Dokumentation zur Datenbankvalidierung (`/core-technology/database-validation/overview`) für länderspezifische Formate.",
                  "properties": {
                    "last_name": {
                      "type": "string"
                    },
                    "first_name": {
                      "type": "string"
                    },
                    "tax_number": {
                      "type": "string",
                      "description": "Brasilien: CPF (11 Ziffern)"
                    },
                    "personal_number": {
                      "type": "string",
                      "description": "Chile: RUT, DOM: Cédula (11 Ziffern), ECU: Cédula (10 Ziffern), ESP: DNI/NIE, MEX: CURP (18 Zeichen), PER: DNI (8 Ziffern), URY: CI"
                    },
                    "document_number": {
                      "type": "string",
                      "description": "ARG: DNI, BOL: CI, COL: Cédula, GTM: DPI, HND: DNI, PAN: Cédula, PRY: CI, SLV: DUI, VEN: Cédula"
                    },
                    "date_of_birth": {
                      "type": "string",
                      "format": "date"
                    },
                    "document_type": {
                      "type": "string",
                      "description": "COL: CC/CE/TI/NIT, ESP: ID/PASSPORT"
                    },
                    "expiration_date": {
                      "type": "string",
                      "format": "date",
                      "description": "Erforderlich für ESP"
                    }
                  }
                },
                "validations": {
                  "type": "array",
                  "description": "Ein Eintrag pro Registerdienst, der eine Validierungs-Payload zurückgegeben hat. Jeder Eintrag identifiziert den Dienst (`service_id`, `service_name`) und enthält den feldweisen `validation`-Abgleich, den `outcome_code` / `outcome_detail` des Dienstes, sofern gemeldet, sowie den normalisierten Registerdatensatz in `source_data`.",
                  "items": {
                    "type": "object",
                    "properties": {
                      "service_id": {
                        "type": "string",
                        "description": "Kennung des Registerdienstes, der dieses Validierungsergebnis generiert hat.",
                        "example": "bra_cpf"
                      },
                      "service_name": {
                        "type": "string",
                        "description": "Lesbarer Name des Registerdienstes.",
                        "example": "Brazil - CPF status check"
                      },
                      "validation": {
                        "type": "object",
                        "description": "Die Ergebnisse der Feldvalidierungen.",
                        "properties": {
                          "full_name": {
                            "type": "string",
                            "description": "Übereinstimmungsergebnis für den vollständigen Namen (z. B. 'full_match', 'partial_match', 'no_match')."
                          },
                          "date_of_birth": {
                            "type": "string",
                            "description": "Übereinstimmungsergebnis für das Geburtsdatum."
                          },
                          "identification_number": {
                            "type": "string",
                            "description": "Übereinstimmungsergebnis für die Identifikationsnummer."
                          }
                        }
                      },
                      "outcome_code": {
                        "type": "string",
                        "nullable": true,
                        "description": "Maschinenlesbares Ergebnis der Registerabfrage (z. B. `MATCH`, `NO_MATCH`, `PARTIAL_MATCH`, `INCONCLUSIVE`, quellenspezifische Codes). Vorhanden, wenn der Dienst eines meldet."
                      },
                      "outcome_detail": {
                        "type": "string",
                        "nullable": true,
                        "description": "Lesbare Erklärung von `outcome_code`, sofern vom Dienst bereitgestellt."
                      },
                      "source_data": {
                        "type": "object",
                        "description": "Die aus der Regierungsdatenbank zurückgegebenen Daten. Häufige Felder: identification_number, first_name, last_name, full_name, date_of_birth, gender. Zusätzliche Felder nach Land: BRA enthält bei erfolgreichen CPF-Treffern immer lgpd_minor, minor_under_18 und minor_under_16; zudem enthält es den Upstream-HTTP-Status, wenn CPF-Daten gemäß LGPD einbehalten werden (HTTP 422/451). ECU fügt street, formatted_address, nationality, education, marital_status, spouse, mother_name, father_name, profession hinzu. PER fügt paternal_name, maternal_name, verification_number, verification_letter hinzu. ESP fügt document_type, expiration_date hinzu. VEN/COL fügen document_type hinzu.",
                        "additionalProperties": true
                      }
                    }
                  }
                },
                "errors": {
                  "type": "array",
                  "description": "Fehler, die von Registerdiensten während der Validierung zurückgegeben wurden, jeweils mit der `service_id` des Dienstes versehen, der den Fehler erzeugt hat. **Dieser Schlüssel wird vollständig weggelassen, wenn keine Fehler vorliegen.**",
                  "items": {
                    "type": "object",
                    "description": "Das Fehlerobjekt des vorgelagerten Dienstes unverändert übernommen – seine Schlüssel variieren je nach Dienst (üblicherweise eine Nachricht/ein Code und providerspezifische Details) – zuzüglich `service_id`, die den Dienst identifiziert, bei dem der Fehler aufgetreten ist.",
                    "properties": {
                      "service_id": {
                        "type": "string",
                        "nullable": true,
                        "description": "Kennung des Registerdienstes, bei dem ein Fehler aufgetreten ist."
                      }
                    },
                    "additionalProperties": true
                  }
                },
                "match_type": {
                  "type": "string",
                  "enum": [
                    "no_match",
                    "partial_match",
                    "full_match"
                  ],
                  "nullable": true,
                  "description": "Das aggregierte Übereinstimmungsergebnis über alle abgefragten Dienste hinweg. `null`, bis die Validierung ausgewertet wurde."
                },
                "status": {
                  "type": "string",
                  "description": "Status auf Funktionsebene dieser Datenbankvalidierung. Unabhängig vom `status` der übergeordneten Sitzung – eine Sitzung kann ihre Gesamtentscheidung erreichen, während eine einzelne Funktion `In Review` bleibt.",
                  "enum": [
                    "Not Finished",
                    "Approved",
                    "Declined",
                    "In Review",
                    "Resub Requested"
                  ]
                },
                "warnings": {
                  "type": "array",
                  "items": {
                    "type": "object",
                    "properties": {
                      "feature": {
                        "type": "string",
                        "enum": [
                          "ID_VERIFICATION",
                          "NFC",
                          "LIVENESS",
                          "FACEMATCH",
                          "PROOF_OF_ADDRESS",
                          "PHONE",
                          "EMAIL",
                          "AML",
                          "LOCATION",
                          "DATABASE_VALIDATION",
                          "QUESTIONNAIRE",
                          "DOCUMENT_AI",
                          "KYB_REGISTRY",
                          "KYB_DOCUMENTS",
                          "KYB_KEY_PEOPLE",
                          "GEOLOCATION",
                          "SIGNATURE"
                        ],
                        "description": "Die Funktion, die diese Warnung generiert hat. Der Wert identifiziert den Funktionsblock, zu dem die Warnung gehört. Das Warnungs-Array jedes Moduls verwendet typischerweise den zu seinem Modul passenden Wert (z. B. `PHONE` innerhalb von `phone_verifications[].warnings`), aber das obige Enum ist für alle Funktionswarnungen in der Entscheidungs-Payload maßgeblich."
                      },
                      "risk": {
                        "type": "string"
                      },
                      "additional_data": {
                        "type": "object",
                        "nullable": true
                      },
                      "log_type": {
                        "type": "string"
                      },
                      "short_description": {
                        "type": "string"
                      },
                      "long_description": {
                        "type": "string"
                      },
                      "node_id": {
                        "type": "string",
                        "description": "Die ID des Workflow-Graph-Knotens, der diese Warnung erzeugt hat"
                      }
                    }
                  },
                  "description": "Warnungen bezüglich der Datenbankvalidierung."
                }
              }
            }
          },
          "database_validation_not_performed_reason": {
            "type": "object",
            "nullable": true,
            "additionalProperties": true,
            "description": "Warum eine konfigurierte Datenbankvalidierung kein Ergebnis geliefert hat, als `{code, message}` plus Kontextfelder. Nur vorhanden, wenn `database_validations` den Wert `null` für einen Workflow hat, der diesen Schritt enthält, damit Sie unterscheiden können zwischen „das Register hat zugestimmt“ und „es wurde nichts ausgeführt“. Andernfalls `null`.",
            "properties": {
              "code": {
                "type": "string",
                "description": "Stabiler maschinenlesbarer Grund."
              },
              "message": {
                "type": "string",
                "description": "Lesbare Erklärung."
              }
            }
          },
          "reviews": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "user": {
                  "type": "string",
                  "description": "Wer die Prüfung durchgeführt hat. In der Regel die Kennung des Prüfers in der Console (seine E-Mail-Adresse), aber der Wert ist `\"API Client\"` für Statusaktualisierungen, die mit einem API-Schlüssel vorgenommen wurden, und `\"Unknown\"`, wenn kein Akteur aufgelöst werden konnte – analysieren Sie dieses Feld also nicht als E-Mail-Adresse."
                },
                "new_status": {
                  "type": "string"
                },
                "comment": {
                  "type": "string"
                },
                "created_at": {
                  "type": "string",
                  "format": "date-time"
                }
              }
            }
          },
          "assignee": {
            "type": "object",
            "nullable": true,
            "description": "Der Konsolen-Prüfer, dem die Sitzung zugewiesen ist, oder `null`, wenn sie niemandem zugewiesen ist.",
            "properties": {
              "email": {
                "type": "string",
                "format": "email"
              },
              "assigned_at": {
                "type": "string",
                "format": "date-time",
                "nullable": true
              }
            }
          },
          "waiting_since": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "description": "Wann die Sitzung begonnen hat, auf eine Prüfung zu warten. `null`, es sei denn, die Sitzung ist `In Review` und Ihre Anwendung legt eine Prüffrist fest."
          },
          "sla_due_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "description": "Wann die Prüfung fällig ist. `null`, es sei denn, die Sitzung ist `In Review` und Ihre Anwendung legt eine Prüffrist fest."
          },
          "created_at": {
            "type": "string",
            "format": "date-time",
            "description": "Zeitstempel, zu dem die Sitzung erstellt wurde (ISO 8601, UTC)."
          },
          "expires_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "description": "Zeitstempel, zu dem diese Sitzung planmäßig abläuft. Wird bei Benutzerverifizierungs-Sitzungen (KYC) festgelegt, wenn bei der Erstellung ein Ablauf konfiguriert wurde (oder sobald der Status `Approved` die KYC-Ablaufberechnung auslöst). `null` für Sitzungen ohne konfigurierten Ablauf und für Arten, die keinen Ablauf verwenden (z. B. Sitzungen zur Unternehmensverifizierung (KYB), die nie ein `expires_at` erhalten haben)."
          },
          "registry_checks": {
            "type": "array",
            "nullable": true,
            "description": "Prüfungen des Unternehmensregisters. Nur vorhanden, wenn `session_kind = business`. Jedes Element enthält die vollständige Unternehmensregister-Payload.",
            "items": {
              "type": "object",
              "description": "Eine Unternehmensregisterprüfung — die vollständige Unternehmensregister-Payload, angereichert mit Eigentümerstruktur und Warnungen. Nur vorhanden, wenn `session_kind = business`.",
              "properties": {
                "status": {
                  "type": "string",
                  "description": "Lebenszyklusstatus der Funktion."
                },
                "node_id": {
                  "type": "string",
                  "nullable": true
                },
                "data_resolved": {
                  "type": "boolean"
                },
                "company": {
                  "type": "object",
                  "description": "Vollständige Register-Payload für das Unternehmen (Registerdatensatz zusammengeführt mit vom Benutzer bereitgestellten oder in der Konsole bearbeiteten Daten).",
                  "properties": {
                    "uuid": {
                      "type": "string",
                      "format": "uuid"
                    },
                    "node_id": {
                      "type": "string",
                      "nullable": true
                    },
                    "status": {
                      "type": "string"
                    },
                    "registry_status": {
                      "type": "string",
                      "nullable": true
                    },
                    "data_resolved": {
                      "type": "boolean"
                    },
                    "company_name": {
                      "type": "string"
                    },
                    "registration_number": {
                      "type": "string",
                      "nullable": true
                    },
                    "country_code": {
                      "type": "string",
                      "description": "Gründungsland (ISO 3166-1 Alpha-2, z. B. `GB`, `DE`, `US`)."
                    },
                    "region": {
                      "type": "string",
                      "nullable": true,
                      "description": "ISO 3166-2-Unterteilungscode, sofern zutreffend (z. B. `CA`, `NY` für US-Bundesstaaten)."
                    },
                    "company_type": {
                      "type": "string",
                      "nullable": true
                    },
                    "incorporation_date": {
                      "type": "string",
                      "format": "date",
                      "nullable": true
                    },
                    "registered_address": {
                      "type": "string",
                      "nullable": true
                    },
                    "tax_number": {
                      "type": "string",
                      "nullable": true
                    },
                    "risk_level": {
                      "type": "string",
                      "enum": [
                        "LOW",
                        "MEDIUM",
                        "HIGH"
                      ],
                      "nullable": true
                    },
                    "verification_status": {
                      "type": "string",
                      "nullable": true
                    },
                    "is_from_registry": {
                      "type": "boolean"
                    },
                    "fetch_status": {
                      "type": "string",
                      "nullable": true
                    },
                    "alternative_names": {
                      "type": "string",
                      "nullable": true,
                      "description": "Alternative Namen, Handelsnamen, frühere Namen oder Unternehmensnamen in der Originalsprache als Text, sofern gemeldet."
                    },
                    "nature_of_business": {
                      "type": "string",
                      "nullable": true
                    },
                    "registered_capital": {
                      "type": "string",
                      "nullable": true
                    },
                    "registered_capital_amount": {
                      "type": "string",
                      "format": "decimal",
                      "nullable": true,
                      "description": "Eingetragenes Kapital/Stammkapital als Dezimal-String (z. B. `\"100.00\"`), aus der Registereinreichung geparst. `null`, wenn nicht verfügbar."
                    },
                    "registered_capital_currency": {
                      "type": "string",
                      "nullable": true,
                      "description": "ISO 4217-Währungscode von `registered_capital_amount` (z. B. `\"GBP\"`). `null`, wenn nicht verfügbar."
                    },
                    "website": {
                      "type": "string",
                      "nullable": true
                    },
                    "email": {
                      "type": "string",
                      "format": "email",
                      "nullable": true
                    },
                    "phone": {
                      "type": "string",
                      "nullable": true
                    },
                    "legal_entity_identifier": {
                      "type": "string",
                      "nullable": true
                    },
                    "location_of_registration": {
                      "type": "string",
                      "nullable": true
                    },
                    "vat_number": {
                      "type": "string",
                      "nullable": true,
                      "description": "EU-USt-IdNr., wenn während des gehosteten Registerschritts erfasst oder nachträglich bearbeitet."
                    },
                    "vat_validation_status": {
                      "type": "string",
                      "enum": [
                        "valid",
                        "invalid",
                        "format_valid",
                        "invalid_format",
                        "could_not_validate",
                        "not_applicable"
                      ],
                      "description": "Ergebnis der Validierung der USt-IdNr. oder, falls keine vorhanden ist, der `tax_number` bei der Registerübermittlung. `valid` / `invalid`: entschieden durch das offizielle Register des Landes (EU-VIES, Norwegen, Schweiz, Brasilien, Kolumbien, Costa Rica, Ecuador, Paraguay; Polen auch über sein nationales USt-Register). `format_valid` / `invalid_format`: entschieden durch die Format- und Prüfzifferregeln des Landes, wenn kein Register abgefragt werden kann. `could_not_validate`: das Register war nicht verfügbar. `not_applicable`: keine Nummer, ein Land ohne Register oder Regeln oder eine Sandbox-Sitzung."
                    },
                    "vat_validated_number": {
                      "type": "string",
                      "nullable": true,
                      "description": "Die geprüfte Nummer, wie sie der Quelle bekannt ist (beispielsweise die aus einer französischen SIREN oder einer niederländischen RSIN abgeleitete Umsatzsteuer-Identifikationsnummer). `null`, wenn keine Prüfung durchgeführt wurde."
                    },
                    "vat_validation_source": {
                      "type": "string",
                      "nullable": true,
                      "enum": [
                        "eu_vies",
                        "pl_vat_white_list",
                        "no_brreg",
                        "ch_uid_register",
                        "br_receita_federal",
                        "co_rues",
                        "cr_hacienda",
                        "ec_sri",
                        "py_dnit",
                        "format_rules",
                        null
                      ],
                      "description": "Die Quelle, die `vat_validation_status` festgelegt hat: ein offizielles Register oder `format_rules`. `null`, wenn keine Prüfung durchgeführt wurde."
                    },
                    "vat_validated_name": {
                      "type": "string",
                      "nullable": true,
                      "description": "Name, der bei der Quelle registriert ist, die die Nummer validiert hat, sofern sie einen offenlegt. Wird nur gesetzt, wenn der Status `valid` ist."
                    },
                    "vat_validated_address": {
                      "type": "string",
                      "nullable": true,
                      "description": "Bei der Quelle registrierte Adresse, die die Nummer validiert hat, sofern diese eine offenlegt. Wird nur festgelegt, wenn der Status `valid` ist."
                    },
                    "vat_checked_at": {
                      "type": "string",
                      "format": "date-time",
                      "nullable": true,
                      "description": "Zeitstempel der Prüfung. `null`, wenn keine Prüfung durchgeführt wurde."
                    },
                    "financial_summary": {
                      "type": "object",
                      "nullable": true
                    },
                    "officers": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "uuid": {
                            "type": "string",
                            "format": "uuid"
                          },
                          "name": {
                            "type": "string"
                          },
                          "designation": {
                            "type": "string",
                            "nullable": true
                          },
                          "role": {
                            "type": "string",
                            "nullable": true
                          },
                          "nationality": {
                            "type": "string",
                            "nullable": true
                          },
                          "is_active": {
                            "type": "boolean"
                          },
                          "kyc_status": {
                            "type": "string",
                            "enum": [
                              "Approved",
                              "Declined",
                              "Pending"
                            ],
                            "nullable": true
                          },
                          "kyc_session_url": {
                            "type": "string",
                            "format": "uri",
                            "nullable": true
                          },
                          "first_name": {
                            "type": "string",
                            "nullable": true,
                            "description": "Vorname, wenn vom Register ausdrücklich gemeldet; nicht aus dem vollständigen Namen abgeleitet."
                          },
                          "last_name": {
                            "type": "string",
                            "nullable": true,
                            "description": "Nachname, sofern vom Register explizit gemeldet."
                          },
                          "address": {
                            "type": "string",
                            "nullable": true,
                            "description": "Vom Register gemeldete Adresse des Amtsträgers."
                          },
                          "appointment_date": {
                            "type": "string",
                            "nullable": true,
                            "description": "Datum, an dem die Führungskraft bestellt wurde.",
                            "format": "date"
                          },
                          "termination_date": {
                            "type": "string",
                            "nullable": true,
                            "description": "Datum, an dem die Bestellung endete, sofern gemeldet.",
                            "format": "date"
                          },
                          "date_of_birth": {
                            "type": "string",
                            "nullable": true,
                            "description": "Vollständiges, vom Unternehmensregister gemeldetes Geburtsdatum. Null, wenn nur ein Geburtsjahr oder -monat bekannt ist.",
                            "format": "date"
                          },
                          "date_of_birth_year": {
                            "type": "integer",
                            "nullable": true,
                            "minimum": 1,
                            "maximum": 9999,
                            "description": "Vom Register gemeldetes Geburtsjahr, auch wenn das vollständige Datum nicht verfügbar ist."
                          },
                          "date_of_birth_month": {
                            "type": "integer",
                            "nullable": true,
                            "minimum": 1,
                            "maximum": 12,
                            "description": "Vom Register gemeldeter Geburtsmonat. Null, wenn nur das Jahr bekannt ist."
                          }
                        }
                      }
                    },
                    "beneficial_owners": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "uuid": {
                            "type": "string",
                            "format": "uuid"
                          },
                          "name": {
                            "type": "string"
                          },
                          "first_name": {
                            "type": "string",
                            "nullable": true
                          },
                          "last_name": {
                            "type": "string",
                            "nullable": true
                          },
                          "entity_type": {
                            "type": "string",
                            "enum": [
                              "person",
                              "company"
                            ]
                          },
                          "roles": {
                            "type": "array",
                            "items": {
                              "type": "string"
                            }
                          },
                          "ownership_min_shares": {
                            "type": "string",
                            "nullable": true,
                            "description": "Untergrenze des Eigentumsanteils in Prozent gemäß Registermeldung. Freitext-String (z. B. `\"25.00\"`, `\"50\"`); verwenden Sie `effective_ownership_percent` für einen geparsten numerischen Wert."
                          },
                          "ownership_max_shares": {
                            "type": "string",
                            "nullable": true,
                            "description": "Obere Grenze des Eigentumsanteils in Prozent gemäß Registerangabe. Freiform-Zeichenkette; verwenden Sie `effective_ownership_percent` für einen geparsten numerischen Wert."
                          },
                          "is_active": {
                            "type": "boolean"
                          },
                          "kyc_status": {
                            "type": "string",
                            "enum": [
                              "Approved",
                              "Declined",
                              "Pending"
                            ],
                            "nullable": true
                          },
                          "kyc_session_url": {
                            "type": "string",
                            "format": "uri",
                            "nullable": true
                          },
                          "effective_ownership_percent": {
                            "type": "number",
                            "nullable": true
                          },
                          "company_name": {
                            "type": "string",
                            "nullable": true
                          },
                          "registration_number": {
                            "type": "string",
                            "nullable": true
                          },
                          "country_of_birth": {
                            "type": "string",
                            "nullable": true
                          },
                          "email": {
                            "type": "string",
                            "nullable": true
                          },
                          "nationality": {
                            "type": "string",
                            "nullable": true
                          },
                          "designation": {
                            "type": "string",
                            "nullable": true
                          },
                          "voting_min_shares": {
                            "type": "string",
                            "nullable": true
                          },
                          "voting_max_shares": {
                            "type": "string",
                            "nullable": true
                          },
                          "date_of_birth": {
                            "type": "string",
                            "nullable": true,
                            "description": "Vollständiges Geburtsdatum, sofern gemeldet.",
                            "format": "date"
                          },
                          "appointment_date": {
                            "type": "string",
                            "nullable": true,
                            "description": "Datum der Bestellung, sofern gemeldet.",
                            "format": "date"
                          },
                          "shareholding": {
                            "$ref": "#/components/schemas/KYBRegistryShareholding"
                          }
                        }
                      }
                    },
                    "addresses": {
                      "type": "array",
                      "nullable": true,
                      "description": "Jede vom Register angegebene Adresse in einheitlicher Form. Null, wenn keine angegeben ist.",
                      "items": {
                        "$ref": "#/components/schemas/KYBRegistryAddress"
                      }
                    },
                    "industries": {
                      "type": "array",
                      "nullable": true,
                      "description": "Die Tätigkeiten, unter denen das Register das Unternehmen einstuft, in einem kanonischen Format. Null, wenn keine angegeben sind.",
                      "items": {
                        "$ref": "#/components/schemas/KYBRegistryIndustry"
                      }
                    },
                    "accounts": {
                      "type": "object",
                      "nullable": true,
                      "additionalProperties": true,
                      "description": "Register-Einreichungsdaten, sofern verfügbar. Jahresmeldungen und Hauptversammlungen verwenden last_annual_return_date und last_agm_date; sie unterscheiden sich von Finanzabschlüssen."
                    },
                    "registry_data": {
                      "$ref": "#/components/schemas/KYBRegistryData"
                    },
                    "user_provided_data": {
                      "type": "object",
                      "description": "Vom Endbenutzer bestätigte oder bearbeitete Daten."
                    },
                    "confirmed_by_user_at": {
                      "type": "string",
                      "format": "date-time",
                      "nullable": true
                    },
                    "last_console_edit_at": {
                      "type": "string",
                      "format": "date-time",
                      "nullable": true
                    },
                    "is_editable": {
                      "type": "boolean"
                    },
                    "ownership": {
                      "$ref": "#/components/schemas/KYBRegistryOwnership"
                    },
                    "registry_tier": {
                      "type": "string",
                      "nullable": true,
                      "description": "Die vom Workflow angeforderte Register-Stufe: `basic`, `shareholders` oder `ubo`. Auch in `ownership.tier_requested`."
                    },
                    "registry_tier_delivered": {
                      "type": "string",
                      "nullable": true,
                      "description": "Die vom Register gelieferte und abgerechnete Stufe. Auch in `ownership.tier_delivered`."
                    },
                    "registry_ownership_status": {
                      "type": "string",
                      "nullable": true,
                      "description": "`not_requested`, `pending`, `delivered`, `not_held` oder `unavailable`. Auch in `ownership.status`."
                    },
                    "registry_monitoring": {
                      "type": "object",
                      "nullable": true,
                      "description": "Der neueste Register-Monitor für das Unternehmen oder `null`, wenn keiner vorhanden ist.",
                      "properties": {
                        "uuid": {
                          "type": "string",
                          "format": "uuid"
                        },
                        "status": {
                          "type": "string"
                        },
                        "unavailable_reason": {
                          "type": "string",
                          "nullable": true
                        },
                        "enrolled_at": {
                          "type": "string",
                          "format": "date-time",
                          "nullable": true
                        },
                        "cancelled_at": {
                          "type": "string",
                          "format": "date-time",
                          "nullable": true
                        },
                        "last_bill_date": {
                          "type": "string",
                          "format": "date",
                          "nullable": true
                        },
                        "next_bill_date": {
                          "type": "string",
                          "format": "date",
                          "nullable": true
                        },
                        "last_event_at": {
                          "type": "string",
                          "format": "date-time",
                          "nullable": true
                        },
                        "events_count": {
                          "type": "integer"
                        },
                        "watched_fields": {
                          "description": "Die Unternehmensfelder, die der Monitor überwacht."
                        }
                      }
                    }
                  }
                },
                "ownership_structure": {
                  "$ref": "#/components/schemas/KYBOwnershipStructure"
                },
                "warnings": {
                  "type": "array",
                  "items": {
                    "type": "object"
                  }
                }
              }
            }
          },
          "key_people_checks": {
            "type": "array",
            "nullable": true,
            "description": "Aggregierte Prüfungen der Schlüsselpersonen. Nur vorhanden, wenn `session_kind = business`. Jedes Element verwendet die Zwei-Bucket-Struktur (`registry`, `submitted`, `ubo_kyc_summary`).",
            "items": {
              "type": "object",
              "description": "Aggregierte Prüfung über die Funktionsträger + wirtschaftlich Berechtigten des Unternehmens. Verwendet die Struktur `registry` / `submitted`. Nur vorhanden, wenn session_kind = business.",
              "properties": {
                "status": {
                  "type": "string"
                },
                "node_id": {
                  "type": "string",
                  "nullable": true
                },
                "registry": {
                  "type": "object",
                  "description": "Über die Registerprüfung ermittelte Parteien.",
                  "properties": {
                    "officers": {
                      "type": "array",
                      "description": "Über die Registerprüfung ermittelte Amtsträger, jeweils angereichert mit dem Status jeder für sie erstellten untergeordneten KYC-Sitzung und jedes für sie erstellten AML-Screenings.",
                      "items": {
                        "type": "object",
                        "properties": {
                          "uuid": {
                            "type": "string",
                            "format": "uuid"
                          },
                          "name": {
                            "type": "string",
                            "description": "Vollständiger Name des Amtsträgers, wie im Register erfasst."
                          },
                          "designation": {
                            "type": "string",
                            "nullable": true,
                            "description": "Freitext-Bezeichnung aus dem Register (z. B. `Director`, `Company Secretary`)."
                          },
                          "role": {
                            "type": "string",
                            "enum": [
                              "director",
                              "non_executive_director",
                              "secretary",
                              "chairman",
                              "ubo",
                              "shareholder",
                              "representative",
                              "founder",
                              "legal_advisor",
                              "authorized_signatory",
                              "trustee",
                              "beneficiary",
                              "settlor",
                              "protector",
                              "company_officer",
                              "investor",
                              "other"
                            ],
                            "description": "Normalisierte Rolle des Organmitglieds."
                          },
                          "nationality": {
                            "type": "string",
                            "nullable": true
                          },
                          "appointment_date": {
                            "type": "string",
                            "nullable": true,
                            "description": "Datum, an dem die Führungskraft bestellt wurde.",
                            "format": "date"
                          },
                          "termination_date": {
                            "type": "string",
                            "nullable": true,
                            "description": "Datum, an dem die Bestellung endete, sofern gemeldet.",
                            "format": "date"
                          },
                          "is_active": {
                            "type": "boolean"
                          },
                          "address": {
                            "type": "string",
                            "nullable": true,
                            "description": "Vom Register gemeldete Adresse des Amtsträgers."
                          },
                          "aml_status": {
                            "type": "string",
                            "enum": [
                              "Not Finished",
                              "Approved",
                              "Declined",
                              "In Review",
                              "Resub Requested"
                            ],
                            "nullable": true,
                            "description": "Status des für diesen Officer durchgeführten AML-Screenings. `null`, wenn kein AML-Screening durchgeführt wurde."
                          },
                          "kyc_status": {
                            "type": "string",
                            "enum": [
                              "Not Started",
                              "In Progress",
                              "Approved",
                              "Declined",
                              "In Review",
                              "Expired",
                              "Abandoned",
                              "Kyc Expired",
                              "Resubmitted",
                              "Awaiting User"
                            ],
                            "nullable": true,
                            "description": "Unverarbeiteter Lebenszyklus-Status der untergeordneten KYC-Sitzung, die für dieses Organmitglied erstellt wurde. Dies ist das vollständige Sitzungsstatus-Enum (keine reduzierte Menge aus Genehmigt/Abgelehnt/Ausstehend). `null`, wenn keine untergeordnete KYC-Sitzung existiert."
                          },
                          "kyc_session_url": {
                            "type": "string",
                            "format": "uri",
                            "nullable": true,
                            "description": "Teilbare URL der untergeordneten KYC-Sitzung. `null`, wenn keine untergeordnete Sitzung vorhanden ist."
                          },
                          "kyc_session_id": {
                            "type": "string",
                            "format": "uuid",
                            "nullable": true,
                            "description": "Sitzungs-ID der untergeordneten KYC-Sitzung. Übergeben Sie sie an denselben Entscheidungs-Endpoint, um den vollständigen KYC-Bericht der Person abzurufen. `null`, wenn keine untergeordnete Sitzung existiert."
                          },
                          "verification_workflow_type": {
                            "type": "string",
                            "nullable": true,
                            "description": "Basis-Workflow-Typ des Workflows der untergeordneten Sitzung (z. B. `kyc`). `null` für graphbasierte Workflows oder wenn keine untergeordnete Sitzung existiert."
                          },
                          "verification_workflow_id": {
                            "type": "string",
                            "format": "uuid",
                            "nullable": true,
                            "description": "Workflow-ID, die von der untergeordneten Sitzung verwendet wird. `null`, wenn keine untergeordnete Sitzung existiert."
                          },
                          "verification_workflow_label": {
                            "type": "string",
                            "nullable": true,
                            "description": "Lesbare Bezeichnung des Workflows der untergeordneten Sitzung. `null`, wenn nicht festgelegt."
                          },
                          "verification_workflow_features": {
                            "type": "array",
                            "nullable": true,
                            "description": "Fortschritt pro Funktion der untergeordneten Verifizierungssitzung, z. B. `[{\"feature\": \"ID_VERIFICATION\", \"status\": \"Approved\"}]`. `null`, wenn die untergeordnete Sitzung keine auflösbare Funktionsliste hat.",
                            "items": {
                              "type": "object",
                              "properties": {
                                "feature": {
                                  "type": "string",
                                  "description": "Anzeigename der Funktion (z. B. `ID_VERIFICATION`, `LIVENESS`, `AML`)."
                                },
                                "status": {
                                  "type": "string",
                                  "enum": [
                                    "Not Finished",
                                    "Approved",
                                    "Declined",
                                    "In Review",
                                    "Resub Requested"
                                  ],
                                  "description": "Status auf Funktionsebene innerhalb der untergeordneten Sitzung."
                                }
                              }
                            }
                          },
                          "didit_internal_id": {
                            "type": "string",
                            "nullable": true,
                            "description": "Stabile interne Kennung der verifizierten Person hinter der untergeordneten Sitzung – nützlich für sitzungsübergreifende Verknüpfungen. `null`, wenn keine untergeordnete Sitzung existiert oder der Benutzer noch nicht aufgelöst wurde."
                          },
                          "kyc_document_type": {
                            "type": "string",
                            "nullable": true,
                            "description": "Dokumenttyp, der in der untergeordneten KYC-Sitzung vorgelegt wurde (z. B. `P`, `ID`, `DL`). `null`, bis die untergeordnete Sitzung ein Ausweisverifizierungsergebnis hat."
                          },
                          "kyc_nationality": {
                            "type": "string",
                            "nullable": true,
                            "description": "Aus dem Dokument in der untergeordneten KYC-Sitzung extrahierte Staatsangehörigkeit. `null`, bis verfügbar."
                          },
                          "kyc_liveness_passed": {
                            "type": "boolean",
                            "nullable": true,
                            "description": "Gibt an, ob die Liveness-Prüfung der untergeordneten KYC-Sitzung bestanden wurde. `null`, wenn keine Liveness-Prüfung durchgeführt wurde."
                          },
                          "kyc_verified_at": {
                            "type": "string",
                            "format": "date-time",
                            "nullable": true,
                            "description": "Wann die untergeordnete KYC-Sitzung `Approved` erreicht hat. `null`, solange die untergeordnete Sitzung einen anderen Status hat."
                          },
                          "kyc_aml_categories": {
                            "type": "object",
                            "nullable": true,
                            "description": "Kategoriespezifische Zusammenfassung, die aus den AML-Treffern der Person abgeleitet wird. `null`, wenn keine Treffer vorliegen.",
                            "properties": {
                              "sanctions": {
                                "type": "string",
                                "enum": [
                                  "match",
                                  "clear"
                                ]
                              },
                              "pep": {
                                "type": "string",
                                "enum": [
                                  "match",
                                  "clear"
                                ]
                              },
                              "adverse_media": {
                                "type": "string",
                                "enum": [
                                  "match",
                                  "clear"
                                ]
                              },
                              "warnings": {
                                "type": "string",
                                "enum": [
                                  "match",
                                  "clear"
                                ]
                              }
                            }
                          },
                          "kyc_notification_sent_at": {
                            "type": "string",
                            "nullable": true,
                            "description": "ISO 8601-Zeitstempel der letzten Benachrichtigung mit Verifizierungseinladung, die für die untergeordnete Sitzung dieser Person gesendet wurde. `null`, wenn keine gesendet wurde."
                          },
                          "first_name": {
                            "type": "string",
                            "nullable": true,
                            "description": "Vorname, wenn vom Register ausdrücklich gemeldet; nicht aus dem vollständigen Namen abgeleitet."
                          },
                          "last_name": {
                            "type": "string",
                            "nullable": true,
                            "description": "Nachname, sofern vom Register explizit gemeldet."
                          },
                          "date_of_birth": {
                            "type": "string",
                            "nullable": true,
                            "description": "Vollständiges, vom Unternehmensregister gemeldetes Geburtsdatum. Null, wenn nur ein Geburtsjahr oder -monat bekannt ist.",
                            "format": "date"
                          },
                          "date_of_birth_year": {
                            "type": "integer",
                            "nullable": true,
                            "minimum": 1,
                            "maximum": 9999,
                            "description": "Vom Register gemeldetes Geburtsjahr, auch wenn das vollständige Datum nicht verfügbar ist."
                          },
                          "date_of_birth_month": {
                            "type": "integer",
                            "nullable": true,
                            "minimum": 1,
                            "maximum": 12,
                            "description": "Vom Register gemeldeter Geburtsmonat. Null, wenn nur das Jahr bekannt ist."
                          }
                        }
                      }
                    },
                    "beneficial_owners": {
                      "type": "array",
                      "description": "Über die Registerprüfung ermittelte wirtschaftlich Berechtigte, jeweils angereichert mit dem Status aller für sie erstellten untergeordneten KYC-Sitzungen und AML-Screenings.",
                      "items": {
                        "type": "object",
                        "properties": {
                          "uuid": {
                            "type": "string",
                            "format": "uuid"
                          },
                          "name": {
                            "type": "string",
                            "description": "Vollständiger Name des wirtschaftlich Berechtigten (oder Firmenname für wirtschaftlich Berechtigte von Unternehmen)."
                          },
                          "first_name": {
                            "type": "string",
                            "nullable": true
                          },
                          "last_name": {
                            "type": "string",
                            "nullable": true
                          },
                          "date_of_birth": {
                            "type": "string",
                            "nullable": true,
                            "description": "Vollständiges Geburtsdatum, sofern gemeldet.",
                            "format": "date"
                          },
                          "country_of_birth": {
                            "type": "string",
                            "nullable": true
                          },
                          "email": {
                            "type": "string",
                            "nullable": true
                          },
                          "company_name": {
                            "type": "string",
                            "nullable": true
                          },
                          "registration_number": {
                            "type": "string",
                            "nullable": true
                          },
                          "entity_type": {
                            "type": "string",
                            "enum": [
                              "person",
                              "company"
                            ]
                          },
                          "nationality": {
                            "type": "string",
                            "nullable": true
                          },
                          "designation": {
                            "type": "string",
                            "nullable": true
                          },
                          "roles": {
                            "type": "array",
                            "description": "Von diesem Eigentümer gehaltene Rollennamen, z. B. `[\"ubo\", \"shareholder\"]`.",
                            "items": {
                              "type": "string"
                            }
                          },
                          "ownership_min_shares": {
                            "type": "string",
                            "nullable": true,
                            "description": "Untergrenze des Eigentumsanteils in Prozent gemäß Registermeldung. Freitext-String (z. B. `\"25\"`, `\"25-50%\"`); verwenden Sie `effective_ownership_percent` für einen geparsten numerischen Wert."
                          },
                          "ownership_max_shares": {
                            "type": "string",
                            "nullable": true,
                            "description": "Obere Grenze des Eigentumsanteils in Prozent gemäß Registerangabe. Freiform-Zeichenkette; verwenden Sie `effective_ownership_percent` für einen geparsten numerischen Wert."
                          },
                          "is_active": {
                            "type": "boolean"
                          },
                          "aml_status": {
                            "type": "string",
                            "enum": [
                              "Not Finished",
                              "Approved",
                              "Declined",
                              "In Review",
                              "Resub Requested"
                            ],
                            "nullable": true,
                            "description": "Status des für diesen wirtschaftlich Berechtigten durchgeführten AML-Screenings. `null`, wenn kein AML-Screening durchgeführt wurde."
                          },
                          "kyc_status": {
                            "type": "string",
                            "enum": [
                              "Not Started",
                              "In Progress",
                              "Approved",
                              "Declined",
                              "In Review",
                              "Expired",
                              "Abandoned",
                              "Kyc Expired",
                              "Resubmitted",
                              "Awaiting User"
                            ],
                            "nullable": true,
                            "description": "Unverarbeiteter Lebenszyklus-Status der untergeordneten KYC-Sitzung, die für diesen wirtschaftlich Berechtigten erstellt wurde. Dies ist das vollständige Sitzungsstatus-Enum (keine reduzierte Menge aus Genehmigt/Abgelehnt/Ausstehend). `null`, wenn keine untergeordnete KYC-Sitzung existiert."
                          },
                          "kyc_session_url": {
                            "type": "string",
                            "format": "uri",
                            "nullable": true,
                            "description": "Teilbare URL der untergeordneten KYC-Sitzung. `null`, wenn keine untergeordnete Sitzung vorhanden ist."
                          },
                          "kyc_session_id": {
                            "type": "string",
                            "format": "uuid",
                            "nullable": true,
                            "description": "Sitzungs-ID der untergeordneten KYC-Sitzung. Übergeben Sie sie an denselben Entscheidungs-Endpoint, um den vollständigen KYC-Bericht der Person abzurufen. `null`, wenn keine untergeordnete Sitzung existiert."
                          },
                          "verification_workflow_type": {
                            "type": "string",
                            "nullable": true,
                            "description": "Basis-Workflow-Typ des Workflows der untergeordneten Sitzung (z. B. `kyc`). `null` für graphbasierte Workflows oder wenn keine untergeordnete Sitzung existiert."
                          },
                          "verification_workflow_id": {
                            "type": "string",
                            "format": "uuid",
                            "nullable": true,
                            "description": "Workflow-ID, die von der untergeordneten Sitzung verwendet wird. `null`, wenn keine untergeordnete Sitzung existiert."
                          },
                          "verification_workflow_label": {
                            "type": "string",
                            "nullable": true,
                            "description": "Lesbare Bezeichnung des Workflows der untergeordneten Sitzung. `null`, wenn nicht festgelegt."
                          },
                          "verification_workflow_features": {
                            "type": "array",
                            "nullable": true,
                            "description": "Fortschritt pro Funktion der untergeordneten Verifizierungssitzung, z. B. `[{\"feature\": \"ID_VERIFICATION\", \"status\": \"Approved\"}]`. `null`, wenn die untergeordnete Sitzung keine auflösbare Funktionsliste hat.",
                            "items": {
                              "type": "object",
                              "properties": {
                                "feature": {
                                  "type": "string",
                                  "description": "Anzeigename der Funktion (z. B. `ID_VERIFICATION`, `LIVENESS`, `AML`)."
                                },
                                "status": {
                                  "type": "string",
                                  "enum": [
                                    "Not Finished",
                                    "Approved",
                                    "Declined",
                                    "In Review",
                                    "Resub Requested"
                                  ],
                                  "description": "Status auf Funktionsebene innerhalb der untergeordneten Sitzung."
                                }
                              }
                            }
                          },
                          "didit_internal_id": {
                            "type": "string",
                            "nullable": true,
                            "description": "Stabile interne Kennung der verifizierten Person hinter der untergeordneten Sitzung – nützlich für sitzungsübergreifende Verknüpfungen. `null`, wenn keine untergeordnete Sitzung existiert oder der Benutzer noch nicht aufgelöst wurde."
                          },
                          "kyc_document_type": {
                            "type": "string",
                            "nullable": true,
                            "description": "Dokumenttyp, der in der untergeordneten KYC-Sitzung vorgelegt wurde (z. B. `P`, `ID`, `DL`). `null`, bis die untergeordnete Sitzung ein Ausweisverifizierungsergebnis hat."
                          },
                          "kyc_nationality": {
                            "type": "string",
                            "nullable": true,
                            "description": "Aus dem Dokument in der untergeordneten KYC-Sitzung extrahierte Staatsangehörigkeit. `null`, bis verfügbar."
                          },
                          "kyc_liveness_passed": {
                            "type": "boolean",
                            "nullable": true,
                            "description": "Gibt an, ob die Liveness-Prüfung der untergeordneten KYC-Sitzung bestanden wurde. `null`, wenn keine Liveness-Prüfung durchgeführt wurde."
                          },
                          "kyc_verified_at": {
                            "type": "string",
                            "format": "date-time",
                            "nullable": true,
                            "description": "Wann die untergeordnete KYC-Sitzung `Approved` erreicht hat. `null`, solange die untergeordnete Sitzung einen anderen Status hat."
                          },
                          "kyc_aml_categories": {
                            "type": "object",
                            "nullable": true,
                            "description": "Kategoriespezifische Zusammenfassung, die aus den AML-Treffern der Person abgeleitet wird. `null`, wenn keine Treffer vorliegen.",
                            "properties": {
                              "sanctions": {
                                "type": "string",
                                "enum": [
                                  "match",
                                  "clear"
                                ]
                              },
                              "pep": {
                                "type": "string",
                                "enum": [
                                  "match",
                                  "clear"
                                ]
                              },
                              "adverse_media": {
                                "type": "string",
                                "enum": [
                                  "match",
                                  "clear"
                                ]
                              },
                              "warnings": {
                                "type": "string",
                                "enum": [
                                  "match",
                                  "clear"
                                ]
                              }
                            }
                          },
                          "kyc_notification_sent_at": {
                            "type": "string",
                            "nullable": true,
                            "description": "ISO 8601-Zeitstempel der letzten Benachrichtigung mit Verifizierungseinladung, die für die untergeordnete Sitzung dieser Person gesendet wurde. `null`, wenn keine gesendet wurde."
                          },
                          "child_beneficial_owners": {
                            "type": "array",
                            "description": "Für UBOs von Unternehmen: die eigenen wirtschaftlich Berechtigten der Eigentümerentität als aus dem Register extrahierte Rohdatenobjekte. Leeres Array, falls nicht zutreffend.",
                            "items": {
                              "type": "object"
                            }
                          },
                          "effective_ownership_percent": {
                            "type": "number",
                            "nullable": true,
                            "description": "Geparster numerischer Eigentumsanteil — die Obergrenze, sofern verfügbar, andernfalls die Untergrenze. `null`, wenn keine der Grenzen geparst werden konnte."
                          },
                          "voting_min_shares": {
                            "type": "string",
                            "nullable": true
                          },
                          "voting_max_shares": {
                            "type": "string",
                            "nullable": true
                          },
                          "appointment_date": {
                            "type": "string",
                            "nullable": true,
                            "description": "Datum der Bestellung, sofern gemeldet.",
                            "format": "date"
                          }
                        }
                      }
                    }
                  }
                },
                "submitted": {
                  "type": "object",
                  "description": "Vom Unternehmensadministrator während des Ablaufs für Schlüsselpersonen übermittelte Parteien (BusinessParty-Zeilen mit source=USER).",
                  "properties": {
                    "parties": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "description": "Vom Unternehmensadministrator über den Ablauf für Schlüsselpersonen übermittelte Partei (source=USER).",
                        "properties": {
                          "uuid": {
                            "type": "string",
                            "format": "uuid"
                          },
                          "entity_type": {
                            "type": "string",
                            "enum": [
                              "person",
                              "company"
                            ]
                          },
                          "source": {
                            "type": "string",
                            "enum": [
                              "USER"
                            ],
                            "description": "Hier immer `USER` – dieser Bereich enthält nur Parteien, die vom Endbenutzer im Schlüsselpersonen-Workflow eingegeben oder bestätigt wurden (im Register ermittelte Personen erscheinen unter `registry`)."
                          },
                          "name": {
                            "type": "string"
                          },
                          "first_name": {
                            "type": "string",
                            "nullable": true
                          },
                          "last_name": {
                            "type": "string",
                            "nullable": true
                          },
                          "company_name": {
                            "type": "string",
                            "nullable": true
                          },
                          "registration_number": {
                            "type": "string",
                            "nullable": true
                          },
                          "email": {
                            "type": "string",
                            "format": "email",
                            "nullable": true
                          },
                          "nationality": {
                            "type": "string",
                            "nullable": true,
                            "description": "Staatsangehörigkeit für Personen; Gründungsland für beteiligte Unternehmen."
                          },
                          "phone_number": {
                            "type": "string",
                            "nullable": true
                          },
                          "date_of_birth": {
                            "type": "string",
                            "format": "date",
                            "nullable": true
                          },
                          "position": {
                            "type": "string",
                            "nullable": true,
                            "description": "Freitext-Berufsbezeichnung / Position (nur Personen)."
                          },
                          "custom_fields": {
                            "type": "object",
                            "description": "Vom Workflow definierte benutzerdefinierte Felder, die für diese Partei erfasst wurden; Schlüssel werden durch die Felddeskriptoren für Schlüsselpersonen des Workflows definiert."
                          },
                          "is_active": {
                            "type": "boolean"
                          },
                          "is_skipped": {
                            "type": "boolean",
                            "description": "True, wenn der Endbenutzer die Verifizierung für diese Partei übersprungen hat (nur möglich, wenn die Rolle das Überspringen erlaubt)."
                          },
                          "requires_verification": {
                            "type": "boolean",
                            "description": "True, wenn für diese Partei basierend auf Rolleneinstellungen und Eigentümerschwellenwerten eine untergeordnete KYC-/KYB-Sitzung erforderlich ist."
                          },
                          "roles": {
                            "type": "array",
                            "description": "Alle von dieser Partei ausgeübten Rollen, jeweils mit ihren eigenen Eigentums- und Stimmrechtsanteilen. Es gibt kein skalares `role`/`ownership_percent` auf der Partei selbst.",
                            "items": {
                              "type": "object",
                              "properties": {
                                "role": {
                                  "type": "string",
                                  "enum": [
                                    "director",
                                    "non_executive_director",
                                    "secretary",
                                    "chairman",
                                    "ubo",
                                    "shareholder",
                                    "representative",
                                    "founder",
                                    "legal_advisor",
                                    "authorized_signatory",
                                    "trustee",
                                    "beneficiary",
                                    "settlor",
                                    "protector",
                                    "company_officer",
                                    "investor",
                                    "other"
                                  ]
                                },
                                "ownership_percent": {
                                  "type": "number",
                                  "nullable": true
                                },
                                "voting_percent": {
                                  "type": "number",
                                  "nullable": true
                                }
                              }
                            }
                          },
                          "kyc_session_id": {
                            "type": "string",
                            "format": "uuid",
                            "nullable": true,
                            "description": "Untergeordnete KYC-Sitzungs-ID für Personenparteien, die eine Verifizierung erfordern. Andernfalls `null`."
                          },
                          "kyc_session_status": {
                            "type": "string",
                            "enum": [
                              "Not Started",
                              "In Progress",
                              "Approved",
                              "Declined",
                              "In Review",
                              "Expired",
                              "Abandoned",
                              "Kyc Expired",
                              "Resubmitted",
                              "Awaiting User"
                            ],
                            "nullable": true,
                            "description": "Lebenszyklusstatus der untergeordneten KYC-Sitzung. `null`, wenn keine untergeordnete KYC-Sitzung existiert."
                          },
                          "kyc_session_url": {
                            "type": "string",
                            "format": "uri",
                            "nullable": true
                          },
                          "kyb_sub_session_id": {
                            "type": "string",
                            "format": "uuid",
                            "nullable": true,
                            "description": "Untergeordnete KYB-Sub-Sitzungs-ID für Unternehmensparteien, die eine Verifizierung erfordern. Andernfalls `null`."
                          },
                          "kyb_sub_session_status": {
                            "type": "string",
                            "enum": [
                              "Not Started",
                              "In Progress",
                              "Approved",
                              "Declined",
                              "In Review",
                              "Expired",
                              "Abandoned",
                              "Kyc Expired",
                              "Resubmitted",
                              "Awaiting User"
                            ],
                            "nullable": true,
                            "description": "Lebenszyklusstatus der untergeordneten KYB-Sitzung. `null`, wenn keine untergeordnete KYB-Sitzung existiert."
                          },
                          "kyb_sub_session_url": {
                            "type": "string",
                            "format": "uri",
                            "nullable": true,
                            "description": "Teilbare URL der untergeordneten KYB-Untersitzung. `null`, wenn keine Untersitzung vorhanden ist."
                          },
                          "verification_workflow_type": {
                            "type": "string",
                            "nullable": true,
                            "description": "Basis-Workflow-Typ des Workflows der untergeordneten Sitzung (KYC-Sitzung bevorzugt, Fallback auf die untergeordnete KYB-Sitzung). `null` für graphbasierte Workflows oder wenn keine untergeordnete Sitzung existiert."
                          },
                          "verification_workflow_id": {
                            "type": "string",
                            "format": "uuid",
                            "nullable": true,
                            "description": "Workflow-ID, die von der untergeordneten Sitzung verwendet wird. `null`, wenn keine untergeordnete Sitzung existiert."
                          },
                          "verification_workflow_label": {
                            "type": "string",
                            "nullable": true,
                            "description": "Lesbare Bezeichnung des Workflows der untergeordneten Sitzung. `null`, wenn nicht festgelegt."
                          },
                          "verification_workflow_features": {
                            "type": "array",
                            "nullable": true,
                            "description": "Fortschritt pro Funktion der untergeordneten Verifizierungssitzung, z. B. `[{\"feature\": \"ID_VERIFICATION\", \"status\": \"Approved\"}]`. `null`, wenn die untergeordnete Sitzung keine auflösbare Funktionsliste hat.",
                            "items": {
                              "type": "object",
                              "properties": {
                                "feature": {
                                  "type": "string",
                                  "description": "Anzeigename der Funktion (z. B. `ID_VERIFICATION`, `LIVENESS`, `AML`)."
                                },
                                "status": {
                                  "type": "string",
                                  "enum": [
                                    "Not Finished",
                                    "Approved",
                                    "Declined",
                                    "In Review",
                                    "Resub Requested"
                                  ],
                                  "description": "Status auf Funktionsebene innerhalb der untergeordneten Sitzung."
                                }
                              }
                            }
                          },
                          "didit_internal_id": {
                            "type": "string",
                            "nullable": true,
                            "description": "Stabile interne Kennung der verifizierten Person hinter der untergeordneten Sitzung. `null`, wenn nicht aufgelöst."
                          }
                        }
                      }
                    }
                  }
                },
                "ubo_kyc_summary": {
                  "type": "object",
                  "nullable": true,
                  "description": "Aggregierter UBO-KYC-Fortschritt oder null, wenn keine UBOs verknüpfte KYC-Sitzungen haben.",
                  "properties": {
                    "total": {
                      "type": "integer"
                    },
                    "approved": {
                      "type": "integer"
                    },
                    "flagged": {
                      "type": "integer",
                      "description": "Wirtschaftlich Berechtigte, deren KYC abgelehnt oder in Prüfung ist."
                    },
                    "pending": {
                      "type": "integer"
                    }
                  }
                },
                "warnings": {
                  "type": "array",
                  "items": {
                    "type": "object"
                  }
                }
              }
            }
          },
          "document_verifications": {
            "type": "array",
            "nullable": true,
            "description": "Prüfungen der Dokumentenverifizierung, gruppiert nach Workflow-Knoten. Nur vorhanden, wenn `session_kind = business`.",
            "items": {
              "type": "object",
              "description": "Dokumente gruppiert nach Workflow-Knoten. Nur vorhanden, wenn session_kind = business.",
              "properties": {
                "status": {
                  "type": "string"
                },
                "node_id": {
                  "type": "string",
                  "nullable": true
                },
                "items": {
                  "type": "array",
                  "items": {
                    "type": "object",
                    "properties": {
                      "uuid": {
                        "type": "string",
                        "format": "uuid"
                      },
                      "document_type": {
                        "type": "string",
                        "enum": [
                          "LEGAL_PRESENCE",
                          "COMPANY_DETAILS",
                          "OWNERSHIP_STRUCTURE",
                          "REPRESENTATIVES_AUTHORIZATION",
                          "OTHER"
                        ],
                        "nullable": true,
                        "description": "Übergeordnete KYB-Dokumentengruppe, in die die Datei eingestuft wurde. `null`, solange sie nicht klassifiziert ist."
                      },
                      "document_subtype": {
                        "type": "string",
                        "nullable": true,
                        "description": "Spezifischer per OCR erkannter Subtyp (z. B. `CERTIFICATE_OF_INCORPORATION`, `SHAREHOLDER_REGISTRY`); `UNKNOWN`, wenn die OCR das Dokument nicht zuverlässig klassifizieren konnte."
                      },
                      "document_group": {
                        "type": "string",
                        "enum": [
                          "LEGAL_PRESENCE",
                          "COMPANY_DETAILS",
                          "OWNERSHIP_STRUCTURE",
                          "REPRESENTATIVES_AUTHORIZATION",
                          "OTHER"
                        ],
                        "nullable": true,
                        "description": "Alias von `document_type` – der von `groups` und `required_groups` verwendete Gruppenname."
                      },
                      "file_url": {
                        "type": "string",
                        "format": "uri",
                        "nullable": true,
                        "description": "Kurzlebiger vorsignierter Link zur hochgeladenen Datei. `null` für von Analysten erstellte Dokumentanforderungs-Platzhalter (`is_requested = true`), die noch nicht erfüllt wurden."
                      },
                      "original_filename": {
                        "type": "string",
                        "nullable": true,
                        "description": "Dateiname der vom Benutzer oder Analysten hochgeladenen Datei."
                      },
                      "file_size": {
                        "type": "integer",
                        "nullable": true,
                        "description": "Dateigröße in Bytes."
                      },
                      "status": {
                        "type": "string",
                        "enum": [
                          "Not Finished",
                          "Approved",
                          "Declined",
                          "In Review",
                          "Resub Requested"
                        ],
                        "description": "Verifizierungsstatus pro Dokument."
                      },
                      "created_at": {
                        "type": "string",
                        "format": "date-time"
                      },
                      "cross_check_result": {
                        "type": "object",
                        "nullable": true,
                        "description": "Abgleich der per OCR extrahierten Dokumentfelder mit dem Unternehmensprofil aus dem Unternehmensregister. Ein Objekt mit den Abschnitten `critical`, `non_critical` und `people`, die jeweils einen Feldnamen (z. B. `company_name`, `registration_number`, `incorporation_date`, `registered_address`) einem Vergleichsdatensatz wie `{\"document\": \"...\", \"registry\": \"...\", \"match\": true, \"score\": 0.97}` zuordnen. `null`, wenn das Dokument keine OCR-Daten enthielt oder kein Registerunternehmen zum Vergleich vorhanden war."
                      },
                      "document_metadata": {
                        "type": "object",
                        "nullable": true,
                        "description": "Aus dem hochgeladenen Unternehmensdokument extrahierte Metadaten. Wenn die Metadatenextraktion erfolgreich war, sind alle 16 Schlüssel immer vorhanden (einzelne Werte sind `null`, wenn sie für den Dateityp nicht zutreffen); das gesamte Objekt ist `null`, wenn nichts extrahiert werden konnte. Bei PDFs enthält `overlay_manipulation` eine forensische Overlay-Text-Analyse.",
                        "properties": {
                          "file_size": {
                            "type": "integer",
                            "nullable": true,
                            "description": "Größe des Dokuments."
                          },
                          "content_type": {
                            "type": "string",
                            "nullable": true,
                            "description": "Content-Type des Dokuments."
                          },
                          "creation_date": {
                            "type": "string",
                            "nullable": true,
                            "description": "Datum, an dem das Dokument erstellt wurde."
                          },
                          "modified_date": {
                            "type": "string",
                            "nullable": true,
                            "description": "Datum, an dem das Dokument geändert wurde."
                          },
                          "creator": {
                            "type": "string",
                            "nullable": true,
                            "description": "In den Dateimetadaten erfasstes Erstellungstool bzw. erfasster Benutzer (PDF `Creator`)."
                          },
                          "producer": {
                            "type": "string",
                            "nullable": true,
                            "description": "Software, die die Datei erstellt hat (PDF `Producer`)."
                          },
                          "software": {
                            "type": "string",
                            "nullable": true,
                            "description": "In den Datei-Metadaten erfasste Bearbeitungssoftware."
                          },
                          "encryption": {
                            "type": "string",
                            "nullable": true,
                            "description": "Verschlüsselungsschema der Datei, sofern verschlüsselt."
                          },
                          "is_signed": {
                            "type": "boolean",
                            "nullable": true,
                            "description": "Gibt an, ob das Dokument eine digitale Signatur trägt."
                          },
                          "is_tampered": {
                            "type": "boolean",
                            "nullable": true,
                            "description": "Gibt an, ob die Validierung der digitalen Signatur fehlgeschlagen ist (Modifikation nach der Signierung)."
                          },
                          "signature_info": {
                            "type": "object",
                            "nullable": true,
                            "description": "Details der digitalen Signatur(en), sofern vorhanden."
                          },
                          "exif_original_date": {
                            "type": "string",
                            "nullable": true,
                            "description": "EXIF-Originalaufnahmedatum für Bild-Uploads."
                          },
                          "exif_digitized_date": {
                            "type": "string",
                            "nullable": true,
                            "description": "EXIF-Digitalisierungsdatum für Bild-Uploads."
                          },
                          "processed_by_known_editor": {
                            "type": "boolean",
                            "nullable": true,
                            "description": "Gibt an, ob Metadaten darauf hinweisen, dass die Datei mit einem bekannten Bild-/PDF-Editor bearbeitet wurde."
                          },
                          "has_different_creation_mod_date": {
                            "type": "boolean",
                            "nullable": true,
                            "description": "Gibt an, ob Erstellungs- und Änderungsdatum voneinander abweichen – ein möglicher (aber nicht eindeutiger) Hinweis auf eine Bearbeitung."
                          },
                          "overlay_manipulation": {
                            "type": "object",
                            "nullable": true,
                            "description": "Forensische PDF-Analyse auf mutmaßliche Manipulation von Overlay-Text. Null, wenn keine Hinweise auf Overlay-Manipulation gefunden wurden oder das Dokument keine PDF-Datei war.",
                            "properties": {
                              "detected": {
                                "type": "boolean",
                                "description": "Gibt an, ob Hinweise auf eine Textüberlagerungsmanipulation erkannt wurden."
                              },
                              "analyzed": {
                                "type": "boolean",
                                "description": "Gibt an, ob das PDF analysiert werden konnte."
                              },
                              "analysis_incomplete": {
                                "type": "boolean",
                                "description": "Vorhanden und nur dann true, wenn die Datei nicht vollständig geprüft werden konnte. Was geprüft wurde, behält seine Ergebnisse, soweit möglich, und das Dokument gibt die Warnung zur nicht nachgewiesenen Textersetzung aus."
                              },
                              "signals": {
                                "type": "array",
                                "items": {
                                  "type": "string"
                                },
                                "description": "Forensische Signale, die ausgelöst wurden, wie z. B. duplicate_font_subset oder glyph_fragmentation."
                              },
                              "manipulated_regions": {
                                "type": "array",
                                "description": "Mutmaßlich manipulierte Bereiche in Koordinaten der PDF-Seite.",
                                "items": {
                                  "type": "object",
                                  "properties": {
                                    "page": {
                                      "type": "integer"
                                    },
                                    "x": {
                                      "type": "number"
                                    },
                                    "y": {
                                      "type": "number"
                                    },
                                    "width": {
                                      "type": "number"
                                    },
                                    "height": {
                                      "type": "number"
                                    },
                                    "page_width": {
                                      "type": "number"
                                    },
                                    "page_height": {
                                      "type": "number"
                                    }
                                  }
                                }
                              }
                            }
                          }
                        }
                      },
                      "description": {
                        "type": "string",
                        "nullable": true,
                        "description": "Vom Analysten angegebene Bezeichnung oder Begründung für eine Dokumentenanforderung. `null` bei regulären Uploads."
                      },
                      "is_requested": {
                        "type": "boolean",
                        "description": "True für von Analysten erstellte Dokumentanforderungs-Platzhalter, die auf einen Upload warten."
                      },
                      "ocr_data": {
                        "type": "object",
                        "nullable": true
                      },
                      "is_console_upload": {
                        "type": "boolean",
                        "description": "True für Dokumente, die über die Konsole und nicht über den Endbenutzer-Ablauf hochgeladen wurden. Konsolen-Uploads ändern niemals den aggregierten Status auf Funktionsebene."
                      },
                      "is_confirmed": {
                        "type": "boolean",
                        "description": "Console-Uploads beginnen mit `false` und wechseln zu `true`, sobald der Administrator sie bestätigt; Endbenutzer-Uploads sind immer `true`."
                      }
                    }
                  }
                },
                "groups": {
                  "type": "object",
                  "description": "Fortschrittszähler pro Gruppe, geschlüsselt nach Gruppenname (z. B. legal_presence, ownership_structure).",
                  "additionalProperties": {
                    "type": "object",
                    "properties": {
                      "total": {
                        "type": "integer"
                      },
                      "approved": {
                        "type": "integer"
                      },
                      "pending": {
                        "type": "integer"
                      },
                      "declined": {
                        "type": "integer"
                      },
                      "in_review": {
                        "type": "integer"
                      },
                      "other": {
                        "type": "integer"
                      },
                      "missing": {
                        "type": "integer",
                        "description": "Angeforderte Platzhalter, für die noch keine Datei hochgeladen wurde."
                      }
                    }
                  }
                },
                "required_groups": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  }
                },
                "warnings": {
                  "type": "array",
                  "items": {
                    "type": "object"
                  }
                }
              }
            }
          },
          "environment": {
            "type": "string",
            "enum": [
              "live",
              "sandbox"
            ],
            "description": "Gibt an, ob die Sitzung von einer Live-Anwendung (`live`) oder einer Sandbox-Anwendung (`sandbox`) erstellt wurde. Sandbox-Sitzungen sind kostenlos, vollständig simuliert und stellen niemals Credits in Rechnung."
          },
          "sandbox_scenario": {
            "type": "string",
            "nullable": true,
            "description": "Das Sandbox-Szenario, mit dem die Sitzung erstellt wurde. `null` für Live-Sitzungen und für Sandbox-Sitzungen, die ohne ein solches erstellt wurden."
          },
          "resubmissions": {
            "type": "array",
            "description": "Wird nur mit `include=resubmissions` zurückgegeben, für Benutzer- und Unternehmenssitzungen. Ein Eintrag pro erneuter Einreichungsanfrage, die ältesten zuerst. Jeder Eintrag enthält die Ergebnisse, die die erneut eingereichten Schritte vor der Anfrage zurückgegeben haben, sodass frühere Einreichungen lesbar bleiben. Durch das Löschen der Sitzung werden alle Einreichungen gelöscht.",
            "items": {
              "type": "object",
              "properties": {
                "number": {
                  "type": "integer",
                  "description": "1 für die erste erneute Einreichung der Sitzung, 2 für die zweite und so weiter."
                },
                "created_at": {
                  "type": "string",
                  "format": "date-time",
                  "description": "Wann die erneute Einreichung angefordert wurde."
                },
                "previous_status": {
                  "type": "string",
                  "description": "Der Sitzungsstatus unmittelbar vor der Anfrage."
                },
                "nodes": {
                  "type": "array",
                  "description": "Die an den Benutzer zurückgesendeten Workflow-Schritte.",
                  "items": {
                    "type": "object",
                    "properties": {
                      "node_id": {
                        "type": "string"
                      },
                      "feature": {
                        "type": "string"
                      }
                    }
                  }
                },
                "reasons": {
                  "type": "object",
                  "nullable": true,
                  "additionalProperties": {
                    "type": "string"
                  },
                  "description": "Der für jeden Schritt angegebene Grund, mit `node_id` als Schlüssel."
                },
                "requested_by": {
                  "type": "object",
                  "nullable": true,
                  "description": "Wer die erneute Einreichung angefordert hat.",
                  "properties": {
                    "name": {
                      "type": "string"
                    },
                    "email": {
                      "type": "string"
                    },
                    "type": {
                      "type": "string"
                    }
                  }
                },
                "results": {
                  "type": "object",
                  "additionalProperties": true,
                  "description": "Was die erneut eingereichten Schritte vor der Anfrage zurückgegeben haben, unter denselben Schlüsseln und in derselben Struktur wie die aktuellen Ergebnisse dieser Antwort (`id_verifications`, `nfc_verifications`, `liveness_checks`, `face_matches`, `poa_verifications`, `phone_verifications`, `email_verifications`, `aml_screenings`, `ip_analyses`, `database_validations`, `questionnaire_responses`, `document_ai_documents`, `geolocation_checks`; bei Unternehmenssitzungen auch `document_verifications`). Es erscheinen nur die Schlüssel der Schritte, die zurückgesendet wurden."
                }
              }
            }
          },
          "biometric_consent": {
            "type": "object",
            "nullable": true,
            "description": "Gibt an, ob die Sitzung eine ausdrückliche biometrische Einwilligung vor einer Gesichtserfassung erforderte, warum dies der Fall war und welcher Nachweis für die Antwort vorliegt. Nur für Sitzungen der Benutzerverifizierung (KYC); dasselbe Objekt befindet sich in der `decision` von Sitzungs-Webhooks. `null`, wenn die Sitzung nie ausgewertet wurde, beispielsweise bei einem Workflow ohne Gesichtserfassung. Felder ohne erfassten Wert sind `null`. Ein natives SDK unter Version 4.10.0 oder eines, das seine Version nicht meldet, kann den Einwilligungsschritt nicht anzeigen: Seine Gesichtserfassungen laufen wie bisher ab, und eine Sitzung, die eine Einwilligung erforderte, meldet dann `status: \"pending\"` mit `reason: \"BIOMETRIC_CONSENT_UNSUPPORTED_SDK\"`. Siehe [Biometrische Einwilligung](/de/getting-started/biometric-consent).",
            "properties": {
              "required": {
                "type": "boolean",
                "description": "Whether the session must collect explicit biometric consent. Never goes back to `false`."
              },
              "trigger": {
                "type": "string",
                "nullable": true,
                "enum": [
                  "declared_state",
                  "ip_state",
                  "ip_unknown",
                  "document_issuer",
                  "forced",
                  "customer_collected"
                ],
                "description": "Warum eine Einwilligung erforderlich ist oder wie diese Anforderung erfüllt wurde. `declared_state`: Sie haben einen betroffenen US-Bundesstaat deklariert (`user_state` oder eine US-Adresse in `expected_details`). `ip_state`: Die IP-Adresse der Person befindet sich in einem betroffenen US-Bundesstaat (Illinois, Texas, Colorado). `ip_unknown`: Die Nachweise verorten die Person in den USA, aber der Bundesstaat kann nicht ermittelt werden (die IP-Adresse befindet sich in den USA ohne Bundesstaat oder kann nicht lokalisiert werden, während Ihre Angaben oder das Dokument die Person in den USA verorten). `document_issuer`: Das Ausweisdokument wurde von einem betroffenen US-Bundesstaat ausgestellt. `forced`: Der Modus der Anwendung ist Always. `customer_collected`: Sie haben `biometric_consent` beim Erstellen der Sitzung übermittelt. `null`, solange nicht erforderlich."
              },
              "status": {
                "type": "string",
                "enum": [
                  "not_required",
                  "pending",
                  "given",
                  "declined"
                ],
                "description": "`not_required`; `pending` (erforderlich und nicht erteilt: die Person hat noch nicht geantwortet, oder `reason` gibt an, warum sie nicht erfasst wurde); `given`; `declined` (eine Ablehnung wurde protokolliert und die Sitzung endete als `Declined`; derzeit bietet kein Didit-Bildschirm eine Ablehnung an)."
              },
              "given_at": {
                "type": "string",
                "format": "date-time",
                "nullable": true,
                "description": "Zeitpunkt, zu dem die Einwilligung erteilt wurde. Für `customer_collected` das von Ihnen gesendete `given_at`."
              },
              "declined_at": {
                "type": "string",
                "format": "date-time",
                "nullable": true,
                "description": "Zeitpunkt, zu dem eine Ablehnung erfasst wurde."
              },
              "text_version": {
                "type": "string",
                "nullable": true,
                "description": "Versions-ID des Einwilligungstextes, den die Person beantwortet hat, oder des Textes, den Sie gesendet haben."
              },
              "text_hash": {
                "type": "string",
                "nullable": true,
                "description": "SHA-256 (Hex) des exakten angezeigten Einwilligungstextes in der Sprache, in der er angezeigt wurde."
              },
              "locale": {
                "type": "string",
                "nullable": true,
                "description": "Sprache, in der der Einwilligungstext angezeigt wurde."
              },
              "policy_url": {
                "type": "string",
                "format": "uri",
                "nullable": true,
                "description": "Die Richtlinie für biometrische Daten, auf die der Einwilligungsschritt verlinkt hat."
              },
              "step": {
                "type": "string",
                "nullable": true,
                "description": "Workflow-Schritt, an dem sich die Sitzung befand, als die Person geantwortet hat, beispielsweise `LIVENESS`."
              },
              "node_id": {
                "type": "string",
                "nullable": true,
                "description": "Workflow-Graph-Knoten, an dem sich die Sitzung befand, als die Person geantwortet hat."
              },
              "ip_address": {
                "type": "string",
                "nullable": true,
                "description": "IP-Adresse, von der die Antwort stammte."
              },
              "ip_country_code": {
                "type": "string",
                "nullable": true,
                "description": "ISO 3166-1-Alpha-2-Land der IP-Adresse der Antwort."
              },
              "ip_state": {
                "type": "string",
                "nullable": true,
                "description": "ISO 3166-2-Unterteilung der IP der Antwort, zum Beispiel `US-IL`."
              },
              "ip_city": {
                "type": "string",
                "nullable": true,
                "description": "Stadt der Adresse der Antwort."
              },
              "user_agent": {
                "type": "string",
                "nullable": true,
                "description": "User-Agent der Anfrage für die Antwort."
              },
              "detected_ip_address": {
                "type": "string",
                "nullable": true,
                "description": "Die Adresse der Person, von der aus die Anforderung zuletzt ausgewertet wurde. Kann sich von `ip_address` unterscheiden, wenn die Person auf einem anderen Gerät geantwortet hat."
              },
              "detected_country_code": {
                "type": "string",
                "nullable": true,
                "description": "ISO 3166-1-Alpha-2-Land der erkannten IP-Adresse."
              },
              "detected_state": {
                "type": "string",
                "nullable": true,
                "description": "ISO 3166-2-Unterteilung der erkannten IP."
              },
              "detected_city": {
                "type": "string",
                "nullable": true,
                "description": "Stadt der erkannten IP-Adresse."
              },
              "declared_state": {
                "type": "string",
                "nullable": true,
                "description": "ISO 3166-2-Unterteilung, die Sie angegeben haben: `user_state` oder der Bundesstaat einer US-Adresse in `expected_details`."
              },
              "document_state": {
                "type": "string",
                "nullable": true,
                "description": "ISO 3166-2-Unterteilung, die das Ausweisdokument ausgestellt hat, ausgelesen bei der Ausweiserfassung."
              },
              "jurisdictions": {
                "type": "array",
                "items": {
                  "type": "string"
                },
                "description": "US-Bundesstaaten (USPS-Codes, beispielsweise `IL`), deren Biometriegesetze die Person betreffen. `US`, wenn die Nachweise die Person in den USA verorten, der genaue Bundesstaat jedoch unbekannt ist. Leer, falls nicht zutreffend."
              },
              "retention_months": {
                "type": "integer",
                "nullable": true,
                "description": "Die kürzeste biometrische Aufbewahrungsfrist in Monaten in `jurisdictions`. `null`, wenn keine gilt."
              },
              "reason": {
                "type": "string",
                "nullable": true,
                "enum": [
                  "BIOMETRIC_CONSENT_UNSUPPORTED_SDK",
                  "BIOMETRIC_CONSENT_DECLINED"
                ],
                "description": "`BIOMETRIC_CONSENT_UNSUPPORTED_SDK`: Eine Einwilligung war erforderlich und ein natives SDK unter 4.10.0 oder ein SDK, das seine Version nicht gemeldet hat, hat ein Gesicht ohne den Einwilligungsschritt erfasst; `status` bleibt `pending` oder `given`, wenn die Person später im gehosteten Flow zugestimmt hat. `BIOMETRIC_CONSENT_DECLINED`: Eine Ablehnung wurde erfasst (ersetzt den SDK-Grund). Andernfalls `null` und immer `null`, wenn die Sitzung keine Einwilligung erforderte."
              },
              "decline_reason": {
                "type": "string",
                "nullable": true,
                "enum": [
                  "BIOMETRIC_CONSENT_DECLINED"
                ],
                "description": "`BIOMETRIC_CONSENT_DECLINED`, wenn eine erfasste Ablehnung die Sitzung beendet hat, andernfalls `null`."
              },
              "face_data_deleted_at": {
                "type": "string",
                "format": "date-time",
                "nullable": true,
                "description": "Wann durch die Ablehnung die Gesichtsbilder, Videos und Gesichts-Templates der Sitzung gelöscht wurden. `null`, sofern keine Ablehnung erfasst wurde."
              }
            }
          },
          "investigator": {
            "$ref": "#/components/schemas/InvestigatorBlock"
          },
          "biometric_retention": {
            "$ref": "#/components/schemas/BiometricRetention"
          },
          "fraud_check": {
            "type": "object",
            "nullable": true,
            "additionalProperties": true,
            "description": "Das Ergebnis eines Fraud-Check-API-Aufrufs. `null` für jede andere Sitzung."
          },
          "full_session_video": {
            "type": "string",
            "format": "uri",
            "nullable": true,
            "description": "Ablaufende URL der Gesamtsitzungsaufzeichnung. Wird nur zurückgegeben, wenn Ihre Organisation Videos der gesamten Sitzung aufzeichnet."
          },
          "full_session_video_recorded_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "description": "Wann die Aufzeichnung der gesamten Sitzung erstellt wurde. Wird nur zurückgegeben, wenn Ihre Organisation Videos der gesamten Sitzung aufzeichnet."
          }
        }
      },
      "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
      },
      "UserSessionListItem": {
        "title": "KYC session row (session_kind: user)",
        "type": "object",
        "description": "Zusammenfassungszeile für eine Benutzerverifizierungs-Sitzung (KYC). Identitätsfelder (`full_name`, `country`, `document_type`, `portrait_image`, Kontaktfelder) werden schrittweise ausgefüllt, während der Benutzer die Verifizierungsschritte abschließt, und sind `null`, bis der entsprechende Schritt abgeschlossen ist. Felder, die durch die Konfiguration der Antwortattribute des Workflows eingeschränkt sind, werden ebenfalls als `null` zurückgegeben.",
        "required": [
          "session_id",
          "session_kind",
          "session_number",
          "session_url",
          "portrait_image",
          "document_type",
          "full_name",
          "country",
          "status",
          "vendor_data",
          "didit_internal_id",
          "created_at",
          "features",
          "phone_number",
          "email_address",
          "additional_details"
        ],
        "properties": {
          "session_id": {
            "type": "string",
            "format": "uuid",
            "description": "Eindeutige Kennung der Verifizierungssitzung. Verwenden Sie sie mit `GET /v3/session/{sessionId}/decision/`, um die vollständige Entscheidungs-Payload abzurufen.",
            "example": "5b3720ed-d429-42ef-b67f-37ea805f48ee"
          },
          "session_kind": {
            "type": "string",
            "enum": [
              "user"
            ],
            "description": "Zeilen-Diskriminator. Immer `\"user\"` für KYC-Zeilen; Zeilen der Unternehmensverifizierung (KYB) enthalten `\"business\"` und haben eine andere Struktur.",
            "example": "user"
          },
          "session_number": {
            "type": "integer",
            "description": "Benutzerfreundliche fortlaufende Nummer der Sitzung innerhalb Ihrer Anwendung. Wird auch über den Parameter `search` gefunden.",
            "example": 720
          },
          "session_url": {
            "type": "string",
            "nullable": true,
            "description": "Gehostete Verifizierungs-URL, die der Endbenutzer öffnet, um den Ablauf abzuschließen. `null`, wenn die Sitzung keine gehostete URL hat.",
            "example": "https://verify.didit.me/session/CuXoBYCYVO5Y"
          },
          "portrait_image": {
            "type": "string",
            "nullable": true,
            "description": "Ablaufende (vorsignierte) URL des besten verfügbaren Porträts: das NFC-Chip-Foto, sofern verfügbar, andernfalls das Porträt des Ausweisdokuments, andernfalls das Liveness-Referenzbild. `null`, bis eines davon existiert. Bitte zeitnah herunterladen; der Link läuft ab.",
            "example": "https://<media-host>/portraits/5b3720ed.jpg?X-Amz-Expires=3600&X-Amz-Signature=..."
          },
          "document_type": {
            "type": "string",
            "nullable": true,
            "enum": [
              "Passport",
              "Identity Card",
              "Driver's License",
              "Residence Permit",
              "Health Insurance Card",
              "Tax Card"
            ],
            "description": "Für Menschen lesbarer Typ des verifizierten Ausweisdokuments. `null`, bevor die Dokumentenverifizierung abgeschlossen ist, sowie `null` nach Abschluss, wenn der verifizierte Code kein Anzeige-Mapping hat (`SSC`, `WP`, `VISA`, `PSC`, `BC`, `OTHER`). Hinweis: Der Abfrageparameter `document_type` filtert nach Kurzcodes (`P`, `ID`, `DL`, `RP`, ...), nicht nach diesen Anzeigewerten.",
            "example": "Passport"
          },
          "full_name": {
            "type": "string",
            "nullable": true,
            "description": "Bester verfügbarer vollständiger Name für die Sitzung, aufgelöst in dieser Reihenfolge: OCR des Ausweisdokuments, per AML geprüfte Daten, per Datenbankvalidierung geprüfte Daten, Adressnachweis-Dokument, dann die bei der Sitzungserstellung angegebenen erwarteten Details. `null`, wenn noch keiner verfügbar ist.",
            "example": "Jane Marie Doe"
          },
          "country": {
            "type": "string",
            "nullable": true,
            "description": "Der Sitzung zugeordnetes ISO 3166-1-Alpha-3-Land, aufgelöst in dieser Reihenfolge: Ausstellungsstaat des Ausweisdokuments, Ausstellungsstaat der Datenbankvalidierung, Ausstellungsstaat des Adressnachweises, erwartete Angaben, dann das Land des verifizierten Telefons. Kann von der Staatsangehörigkeit abweichen.",
            "example": "ESP"
          },
          "status": {
            "type": "string",
            "enum": [
              "Not Started",
              "In Progress",
              "Approved",
              "Declined",
              "In Review",
              "Expired",
              "Abandoned",
              "Kyc Expired",
              "Resubmitted",
              "Awaiting User"
            ],
            "description": "Gesamter Sitzungsstatus. Den Lebenszyklus finden Sie auf der Seite [Verifizierungsstatus](/de/integration/verification-statuses).",
            "example": "Approved"
          },
          "vendor_data": {
            "type": "string",
            "nullable": true,
            "description": "Ihre eigene Kennung für den Endbenutzer, exakt so zurückgegeben, wie bei der Sitzungserstellung übermittelt.",
            "example": "your-user-id-123"
          },
          "didit_internal_id": {
            "type": "string",
            "format": "uuid",
            "nullable": true,
            "description": "Didits interne Kennung für das verifizierte Benutzerprofil hinter dieser Sitzung. Stabil über mehrere Sitzungen desselben Benutzers hinweg; filterbar über den Abfrageparameter `didit_internal_id`.",
            "example": "d9e78474-6c8d-4f2a-bb90-6f5c2f3a1147"
          },
          "created_at": {
            "type": "string",
            "format": "date-time",
            "description": "UTC-Zeitstempel, zu dem die Sitzung erstellt wurde.",
            "example": "2026-06-09T12:26:54.328364Z"
          },
          "features": {
            "type": "array",
            "description": "Status pro Funktion für jeden im Workflow der Sitzung konfigurierten Verifizierungsschritt, in der Reihenfolge des Workflows.",
            "items": {
              "type": "object",
              "required": [
                "feature",
                "status"
              ],
              "properties": {
                "feature": {
                  "type": "string",
                  "enum": [
                    "ID_VERIFICATION",
                    "NFC",
                    "LIVENESS",
                    "FACE_MATCH",
                    "POA",
                    "QUESTIONNAIRE",
                    "EMAIL_VERIFICATION",
                    "PHONE",
                    "AML",
                    "IP_ANALYSIS",
                    "AGE_ESTIMATION",
                    "DATABASE_VALIDATION",
                    "GEOLOCATION"
                  ],
                  "description": "Kennung der Verifizierungsfunktion.",
                  "example": "ID_VERIFICATION"
                },
                "status": {
                  "type": "string",
                  "enum": [
                    "Not Finished",
                    "Approved",
                    "Declined",
                    "In Review",
                    "Resub Requested"
                  ],
                  "description": "Status dieser Funktion. `Not Finished`, bis der Schritt abgeschlossen ist.",
                  "example": "Approved"
                }
              }
            }
          },
          "phone_number": {
            "type": "object",
            "nullable": true,
            "description": "Mit der Sitzung verknüpfte Telefonnummer: die verifizierte Telefonnummer, wenn die Telefonverifizierung ausgeführt wurde, andernfalls die bei der Sitzungserstellung angegebene Kontakttelefonnummer. `null`, wenn keine von beiden vorhanden ist.",
            "required": [
              "number",
              "is_verified"
            ],
            "properties": {
              "number": {
                "type": "string",
                "description": "Telefonnummer im E.164-Format.",
                "example": "+14155552671"
              },
              "is_verified": {
                "type": "boolean",
                "description": "`true` nur, wenn die Funktion zur Telefonverifizierung diese Nummer genehmigt hat.",
                "example": true
              }
            }
          },
          "email_address": {
            "type": "object",
            "nullable": true,
            "description": "Mit der Sitzung verknüpfte E-Mail: die verifizierte E-Mail, wenn die E-Mail-Verifizierung durchgeführt wurde, andernfalls die bei der Sitzungserstellung angegebene Kontakt-E-Mail. `null`, wenn keine von beiden existiert.",
            "required": [
              "email",
              "is_verified"
            ],
            "properties": {
              "email": {
                "type": "string",
                "format": "email",
                "example": "jane@example.com"
              },
              "is_verified": {
                "type": "boolean",
                "description": "`true` nur, wenn die Funktion zur E-Mail-Verifizierung diese Adresse genehmigt hat.",
                "example": true
              }
            }
          },
          "additional_details": {
            "type": "object",
            "nullable": true,
            "description": "Kompakte Zusatzdaten pro Funktion. Nur Funktionen, die Daten generiert haben, erscheinen als Schlüssel; `null`, wenn keine Funktion Zusatzdaten generiert hat. Felder, die durch die Konfiguration der Antwortattribute des Workflows ausgeschlossen wurden, werden weggelassen.",
            "properties": {
              "aml": {
                "type": "object",
                "description": "Vorhanden, wenn das AML-Screening ausgeführt wurde.",
                "properties": {
                  "total_hits": {
                    "type": "integer",
                    "description": "Anzahl der Treffer beim AML-Screening.",
                    "example": 0
                  },
                  "entity_type": {
                    "type": "string",
                    "description": "Typ der überprüften Entität.",
                    "example": "person"
                  },
                  "is_adverse_media_fetched": {
                    "type": "boolean",
                    "example": false
                  },
                  "screened_data": {
                    "type": "object",
                    "description": "Teilmenge der Daten, die überprüft wurden. Nur nicht-leere Schlüssel sind enthalten.",
                    "properties": {
                      "nationality": {
                        "type": "string",
                        "example": "ESP"
                      },
                      "document_number": {
                        "type": "string",
                        "example": "XX1234567"
                      },
                      "date_of_birth": {
                        "type": "string",
                        "example": "1990-05-21"
                      }
                    }
                  }
                }
              },
              "database_validation": {
                "type": "object",
                "description": "Vorhanden, wenn die Datenbankvalidierung ausgeführt wurde.",
                "properties": {
                  "validation_type": {
                    "type": "string",
                    "example": "DOCUMENT_VALIDATION"
                  },
                  "match_type": {
                    "type": "string",
                    "example": "FULL_MATCH"
                  },
                  "identification_number": {
                    "type": "string",
                    "description": "Validierte Steuer-, Personen- oder Dokumentennummer (erste verfügbare).",
                    "example": "12345678Z"
                  }
                }
              },
              "poa": {
                "type": "object",
                "description": "Vorhanden, wenn der Adressnachweis ausgeführt wurde.",
                "properties": {
                  "document_type": {
                    "type": "string",
                    "example": "UTILITY_BILL"
                  },
                  "issuer": {
                    "type": "string",
                    "example": "Energy Co"
                  },
                  "address": {
                    "type": "string",
                    "example": "Calle Mayor 1, 28013 Madrid"
                  },
                  "name_on_document": {
                    "type": "string",
                    "example": "Jane Marie Doe"
                  }
                }
              },
              "liveness": {
                "type": "object",
                "description": "Vorhanden, wenn eine Liveness-Erkennung ausgeführt wurde.",
                "properties": {
                  "method": {
                    "type": "string",
                    "example": "PASSIVE"
                  },
                  "score": {
                    "type": "number",
                    "description": "Konfidenzwert der Liveness, auf 2 Nachkommastellen gerundet.",
                    "example": 0.98
                  }
                }
              },
              "face_match": {
                "type": "object",
                "description": "Vorhanden, wenn der Gesichtsabgleich ausgeführt wurde.",
                "properties": {
                  "score": {
                    "type": "number",
                    "description": "Ähnlichkeitswert des Gesichtsabgleichs, gerundet auf 2 Nachkommastellen.",
                    "example": 0.95
                  },
                  "source_image": {
                    "type": "string",
                    "description": "Ablaufende (vorsignierte) URL des Quell-Gesichtsbilds.",
                    "example": "https://<media-host>/faces/source.jpg?X-Amz-Expires=3600&..."
                  },
                  "target_image": {
                    "type": "string",
                    "description": "Ablaufende (vorsignierte) URL des Ziel-Gesichtsbilds.",
                    "example": "https://<media-host>/faces/target.jpg?X-Amz-Expires=3600&..."
                  }
                }
              },
              "phone_verification": {
                "type": "object",
                "description": "Vorhanden, wenn die Telefonverifizierung ausgeführt wurde.",
                "properties": {
                  "country_code": {
                    "type": "string",
                    "description": "ISO 3166-1-Alpha-2-Land der Telefonnummer.",
                    "example": "US"
                  },
                  "is_temporary": {
                    "type": "boolean",
                    "example": false
                  },
                  "is_ported": {
                    "type": "boolean",
                    "example": false
                  },
                  "is_blocked": {
                    "type": "boolean",
                    "example": false
                  }
                }
              },
              "email_verification": {
                "type": "object",
                "description": "Vorhanden, wenn die E-Mail-Verifizierung ausgeführt wurde.",
                "properties": {
                  "is_breached": {
                    "type": "boolean",
                    "example": false
                  },
                  "is_disposable": {
                    "type": "boolean",
                    "example": false
                  },
                  "is_undeliverable": {
                    "type": "boolean",
                    "example": false
                  },
                  "is_blocklisted": {
                    "type": "boolean",
                    "example": false
                  }
                }
              }
            }
          },
          "assignee": {
            "type": "object",
            "nullable": true,
            "description": "Der Konsolen-Prüfer, dem die Sitzung zugewiesen ist, oder `null`, wenn sie niemandem zugewiesen ist.",
            "properties": {
              "email": {
                "type": "string",
                "format": "email"
              },
              "assigned_at": {
                "type": "string",
                "format": "date-time",
                "nullable": true
              }
            }
          },
          "waiting_since": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "description": "Wann die Sitzung begonnen hat, auf eine Prüfung zu warten. `null`, es sei denn, die Sitzung ist `In Review`."
          },
          "sla_due_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "description": "Wann die Prüfung fällig ist, basierend auf der für Ihre Anwendung in der Console festgelegten Prüffrist. `null`, es sei denn, die Sitzung ist `In Review` und eine Frist ist festgelegt."
          },
          "top_warnings": {
            "type": "array",
            "description": "Bis zu einigen der wichtigsten Warnungen der Sitzung für eine schnelle Triage-Übersicht. Die vollständige Liste befindet sich in der Entscheidung.",
            "items": {
              "type": "object",
              "properties": {
                "risk": {
                  "type": "string",
                  "description": "Warncode, zum Beispiel `FACE_MATCH_LOW_SIMILARITY`."
                },
                "feature": {
                  "type": "string",
                  "description": "Die Funktion, die sie ausgelöst hat."
                },
                "log_type": {
                  "type": "string",
                  "nullable": true,
                  "description": "`error` oder `warning`; `null` für einen Legacy-Eintrag."
                },
                "short_description": {
                  "type": "string"
                }
              }
            }
          },
          "warnings_count": {
            "type": "integer",
            "description": "Anzahl der Warnungen zur Sitzung."
          }
        }
      },
      "BusinessSessionListItem": {
        "title": "KYB session row (session_kind: business)",
        "type": "object",
        "description": "Zusammenfassungszeile für eine Unternehmensverifizierungs-Sitzung (KYB). Wird nur zurückgegeben, wenn `session_kind` den Wert `business` oder `all` hat.",
        "required": [
          "session_id",
          "session_kind",
          "session_number",
          "status",
          "vendor_data",
          "created_at",
          "workflow_id",
          "workflow_type",
          "workflow_label",
          "company_name",
          "registration_number",
          "country"
        ],
        "properties": {
          "session_id": {
            "type": "string",
            "format": "uuid",
            "description": "Eindeutige Kennung der Unternehmensverifizierungssitzung.",
            "example": "8a1f63c2-1b9e-4f3a-9c41-2f6a1f0b7d52"
          },
          "session_kind": {
            "type": "string",
            "enum": [
              "business"
            ],
            "description": "Zeilen-Diskriminator. Immer `\"business\"` für KYB-Zeilen.",
            "example": "business"
          },
          "session_number": {
            "type": "integer",
            "description": "Benutzerfreundliche fortlaufende Nummer der Unternehmenssitzung innerhalb Ihrer Anwendung. Unabhängig von KYC-Sitzungen nummeriert.",
            "example": 42
          },
          "status": {
            "type": "string",
            "enum": [
              "Not Started",
              "In Progress",
              "Approved",
              "Declined",
              "In Review",
              "Expired",
              "Abandoned",
              "Kyc Expired",
              "Resubmitted",
              "Awaiting User"
            ],
            "description": "Gesamter Sitzungsstatus. Siehe die Seite [Verifizierungsstatus](/de/integration/verification-statuses).",
            "example": "Approved"
          },
          "vendor_data": {
            "type": "string",
            "nullable": true,
            "description": "Ihre eigene Kennung für das Unternehmen, exakt so zurückgegeben, wie bei der Sitzungserstellung übermittelt.",
            "example": "your-company-id-77"
          },
          "created_at": {
            "type": "string",
            "format": "date-time",
            "description": "UTC-Zeitstempel, zu dem die Sitzung erstellt wurde.",
            "example": "2026-06-08T09:14:02.118450Z"
          },
          "workflow_id": {
            "type": "string",
            "format": "uuid",
            "nullable": true,
            "description": "Kennung des Workflows, mit dem diese Sitzung erstellt wurde.",
            "example": "9f9b1234-aaaa-bbbb-cccc-1234567890ab"
          },
          "workflow_type": {
            "type": "string",
            "nullable": true,
            "description": "Workflow-Typ. `kyb` für Unternehmens-Workflows.",
            "example": "kyb"
          },
          "workflow_label": {
            "type": "string",
            "nullable": true,
            "description": "Anzeigename des Workflows.",
            "example": "Standard KYB"
          },
          "company_name": {
            "type": "string",
            "nullable": true,
            "description": "Name des zu verifizierenden Unternehmens aus dem mit der Sitzung verknüpften Registerunternehmen. `null`, bis ein Unternehmen ausgewählt wird.",
            "example": "Acme Holdings S.L."
          },
          "registration_number": {
            "type": "string",
            "nullable": true,
            "description": "Registernummer des mit der Sitzung verknüpften Unternehmens aus dem Register.",
            "example": "B12345678"
          },
          "country": {
            "type": "string",
            "nullable": true,
            "description": "Ländercode des mit der Sitzung verknüpften Registerunternehmens.",
            "example": "ES"
          }
        }
      },
      "TransactionVerificationSessionAction": {
        "title": "Verification session",
        "type": "object",
        "properties": {
          "type": {
            "type": "string",
            "enum": [
              "verification_session"
            ]
          },
          "url": {
            "type": "string",
            "format": "uri",
            "description": "Gehostete Verifizierungs-URL, die für den Endbenutzer geöffnet werden soll."
          },
          "session_id": {
            "type": "string",
            "format": "uuid",
            "description": "ID der Verifizierungssitzung."
          },
          "session_token": {
            "type": "string",
            "description": "Sitzungs-Token, das von den mobilen SDKs verwendet wird, um den Ablauf nativ zu starten."
          },
          "status": {
            "type": "string",
            "description": "Status der Verifizierungssitzung."
          }
        },
        "required": [
          "type",
          "url"
        ]
      },
      "TransactionWalletOwnershipAction": {
        "title": "Wallet ownership",
        "type": "object",
        "properties": {
          "type": {
            "type": "string",
            "enum": [
              "wallet_ownership"
            ]
          },
          "url": {
            "type": "string",
            "format": "uri",
            "description": "URL des gehosteten Widgets zum Nachweis der Wallet-Inhaberschaft. Öffnen Sie sie in einer echten Browseroberfläche – verwenden Sie auf Mobilgeräten SFSafariViewController oder einen Chrome Custom Tab, niemals eine eingebettete Webview."
          },
          "widget_session_id": {
            "type": "string",
            "format": "uuid",
            "description": "Sitzungs-ID des Wallet-Eigentums-Widgets."
          },
          "expires_at": {
            "type": "string",
            "format": "date-time",
            "description": "Wann die Widget-Sitzung abläuft."
          }
        },
        "required": [
          "type",
          "url"
        ]
      },
      "TransactionRuleActionAddScore": {
        "type": "object",
        "required": [
          "type",
          "value"
        ],
        "properties": {
          "type": {
            "type": "string",
            "enum": [
              "add_score"
            ]
          },
          "value": {
            "type": "integer",
            "description": "Punkte, die zum Risiko-Score der Transaktion hinzugefügt werden. Kann negativ sein."
          }
        },
        "description": "Punkte zum kumulativen Risiko-Score der Transaktion hinzufügen; der Gesamtwert entscheidet anhand der Prüfungs-/Ablehnungsschwellenwerte der Anwendung über den Status."
      },
      "TransactionRuleActionChangeStatus": {
        "type": "object",
        "required": [
          "type",
          "value"
        ],
        "properties": {
          "type": {
            "type": "string",
            "enum": [
              "change_status"
            ]
          },
          "value": {
            "type": "string",
            "enum": [
              "APPROVED",
              "IN_REVIEW",
              "DECLINED",
              "AWAITING_USER"
            ],
            "description": "Sofort festzulegender Status, unabhängig vom Score. Alias-Schlüssel: status."
          },
          "workflow_id": {
            "type": "string",
            "format": "uuid",
            "description": "ERFORDERLICH, wenn der Wert AWAITING_USER ist: der Verifizierungs-Workflow, den das Subjekt ausfüllen soll. Alias-Schlüssel: remediation_workflow_id. Didit erstellt eine gehostete Remediation-Sitzung für das Subjekt, wenn die Regel ausgelöst wird."
          }
        },
        "description": "Den Transaktionsstatus direkt festlegen. DECLINED hat unter den zutreffenden Regeln immer Vorrang."
      },
      "TransactionRuleActionAddTags": {
        "type": "object",
        "required": [
          "type"
        ],
        "properties": {
          "type": {
            "type": "string",
            "enum": [
              "add_tags"
            ]
          },
          "tag_uuid": {
            "type": "string",
            "format": "uuid",
            "description": "Vorhandenes Anwendungs-Tag, das angehängt werden soll."
          },
          "tag_name": {
            "type": "string",
            "description": "Name des anzuhängenden Tags; wird bei der ersten Verwendung erstellt (in Großbuchstaben gespeichert). Geben Sie tag_uuid oder tag_name an."
          },
          "tag_color": {
            "type": "string",
            "description": "Hex-Farbe, die verwendet wird, wenn tag_name ein neues Tag erstellt, z. B. #007AFE."
          }
        },
        "description": "Ein Anwendungs-Tag an die übereinstimmende Transaktion anhängen."
      },
      "TransactionRuleActionAddNote": {
        "type": "object",
        "required": [
          "type",
          "note"
        ],
        "properties": {
          "type": {
            "type": "string",
            "enum": [
              "add_note"
            ]
          },
          "note": {
            "type": "string",
            "description": "Notiztext, der an die Transaktion angehängt ist (Autor: Rule Engine). Alias-Schlüssel: Wert."
          }
        },
        "description": "Eine automatisierte Analystennotiz an die übereinstimmende Transaktion anhängen."
      },
      "TransactionRuleActionAddToList": {
        "type": "object",
        "required": [
          "type",
          "list_id"
        ],
        "properties": {
          "type": {
            "type": "string",
            "enum": [
              "add_to_list"
            ]
          },
          "list_id": {
            "type": "string",
            "format": "uuid",
            "description": "Liste, zu der vendor_data des Subjekts hinzugefügt werden soll."
          }
        },
        "description": "Fügen Sie die vendor_data der betroffenen Person einer Sperrliste, Positivliste oder benutzerdefinierten Liste hinzu."
      },
      "TransactionRuleActionOpenCase": {
        "type": "object",
        "required": [
          "type"
        ],
        "properties": {
          "type": {
            "type": "string",
            "enum": [
              "open_case"
            ]
          },
          "blueprint": {
            "type": "string",
            "format": "uuid",
            "description": "UUID der Fallvorlage; standardmäßig die Standardvorlage der Anwendung."
          },
          "grouping": {
            "type": "string",
            "enum": [
              "by_applicant",
              "by_rule_and_applicant"
            ],
            "description": "Gibt an, ob wiederholte Übereinstimmungen zu einem Fall pro Antragsteller oder zu einem Fall pro Regel+Antragsteller zusammengeführt werden."
          },
          "attach_matched_transaction": {
            "type": "boolean",
            "description": "Die übereinstimmende Transaktion an den Fall anhängen."
          }
        },
        "description": "Einen Untersuchungsfall eröffnen (oder zu einem hinzufügen). Nur die erste open_case-Aktion einer Regel wird angewendet."
      },
      "KYBRegistrySearchResults": {
        "type": "object",
        "properties": {
          "companies": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "kyb_response_id": {
                  "type": "string",
                  "nullable": true,
                  "description": "Handle für diesen Kandidaten – übergeben Sie ihn an `POST /v3/kyb/select/`, um das vollständige Profil abzurufen. Flüchtig und auf diese Suche beschränkt: Speichern Sie ihn nicht langfristig; führen Sie die Suche erneut durch, um einen neuen zu erhalten.",
                  "example": "69aeeb95febb0f1704042259"
                },
                "name": {
                  "type": "string",
                  "nullable": true,
                  "description": "Eingetragener Unternehmensname.",
                  "example": "Tesco PLC"
                },
                "registration_number": {
                  "type": "string",
                  "nullable": true,
                  "description": "Registernummer im Register.",
                  "example": "00445790"
                },
                "status": {
                  "type": "string",
                  "nullable": true,
                  "description": "Normalisierter Registerstatus des Unternehmens (z. B. `active`, `dissolved`, `inactive`, `struck off`).",
                  "example": "active"
                },
                "type": {
                  "type": "string",
                  "nullable": true,
                  "description": "Rechtsform gemäß Unternehmensregister.",
                  "example": "Public Limited Company"
                },
                "registered_address": {
                  "type": "string",
                  "nullable": true,
                  "description": "Eingetragene Adresse des Treffers, sofern das Register eine zurückgibt. Verwenden Sie diese zusammen mit der Registernummer, um gleichnamige Unternehmen zu unterscheiden: In den Vereinigten Staaten kann ein Treffer unter dem Bundesstaat geführt werden, in dem das Unternehmen tätig ist, und nicht unter dem gesuchten Bundesstaat.",
                  "example": "Tesco House, Shire Park, Kestrel Way, Welwyn Garden City, AL7 1GA"
                },
                "risk_level": {
                  "type": "string",
                  "nullable": true,
                  "description": "Vom Register gemeldete Risikostufe, sofern verfügbar. Zum Zeitpunkt der Suche üblicherweise `null`."
                },
                "fetch_status": {
                  "type": "string",
                  "nullable": true,
                  "description": "Für Suchkandidaten immer `pending` – das vollständige Unternehmensprofil wird erst abgerufen (und abgerechnet), wenn Sie den Kandidaten auswählen.",
                  "example": "pending"
                }
              }
            },
            "description": "Duplikatbereinigte Kandidatenliste. Leer, solange `search_resolved=false` (Webhook-Modus) oder wenn keine Übereinstimmungen gefunden wurden."
          },
          "pagination": {
            "type": "object",
            "properties": {
              "total": {
                "type": "integer",
                "description": "Anzahl der zurückgegebenen Kandidaten."
              },
              "page": {
                "type": "integer"
              },
              "per_page": {
                "type": "integer",
                "example": 25
              }
            }
          },
          "search_status": {
            "type": "string",
            "nullable": true,
            "enum": [
              "pending",
              "resolved"
            ],
            "description": "Lebenszyklusstatus der Registersuche."
          },
          "search_resolved": {
            "type": "boolean",
            "description": "`true`, sobald die Kandidatenliste endgültig ist."
          }
        }
      },
      "KYBRegistryCandidateRequest": {
        "type": "object",
        "required": [
          "kyb_response_id"
        ],
        "properties": {
          "kyb_response_id": {
            "type": "string",
            "maxLength": 1024,
            "description": "Kandidaten-Handle aus `POST /v3/kyb/search/` (`kyb_registry.companies[].kyb_response_id`). Flüchtig: Verwenden Sie es kurz nach der Suche, die es erzeugt hat. Handles können lang sein; speichern und senden Sie den Wert daher genau so, wie er zurückgegeben wurde, ohne ihn zu kürzen oder eine bestimmte Länge anzunehmen.",
            "example": "69aeeb95febb0f1704042259"
          },
          "vendor_data": {
            "type": "string",
            "description": "Ihre Kennung für dieses Unternehmen; wird zurückgegeben und mit der Unternehmenssitzung gespeichert."
          },
          "metadata": {
            "type": "object",
            "nullable": true,
            "description": "Freiform-JSON, das mit der Unternehmenssitzung gespeichert und zurückgegeben wird."
          },
          "save_api_request": {
            "type": "boolean",
            "default": true,
            "description": "Muss `true` sein (Standardwert). Auswahlen aus dem KYB-Register werden immer dauerhaft gespeichert, damit Abrechnung und Abruf nachverfolgt werden können; `false` gibt `400` zurück."
          }
        }
      },
      "WebhookEventEnvelope": {
        "type": "object",
        "description": "Felder, die Didit jeder signierten Webhook-Zustellung unabhängig vom Ereignistyp hinzufügt. Lesen Sie `webhook_type`, um zu erfahren, welche Payload Sie erhalten haben.",
        "required": [
          "event_id",
          "webhook_type",
          "timestamp",
          "created_at",
          "application_id",
          "environment"
        ],
        "properties": {
          "event_id": {
            "type": "string",
            "format": "uuid",
            "description": "Kennung des Ereignisses. Jedes Ziel empfängt denselben Wert und eine erneute Zustellung behält ihn bei; nutzen Sie ihn daher zur Deduplizierung."
          },
          "webhook_type": {
            "$ref": "#/components/schemas/WebhookEvent"
          },
          "timestamp": {
            "type": "integer",
            "description": "Unix-Zeit in Sekunden, zu der diese Zustellung signiert wurde. Entspricht dem `X-Timestamp`-Header; ein erneuter Zustellversuch enthält einen neuen Wert."
          },
          "created_at": {
            "type": "integer",
            "description": "Unix-Zeit in Sekunden der Änderung, die das Ereignis ausgelöst hat."
          },
          "application_id": {
            "type": "string",
            "format": "uuid",
            "description": "Die Anwendung, zu der das Ereignis gehört."
          },
          "environment": {
            "type": "string",
            "enum": [
              "live",
              "sandbox"
            ],
            "description": "`sandbox` für Sandbox-Sitzungen und Sandbox-Anwendungen, andernfalls `live`."
          }
        }
      },
      "SessionWebhookEventData": {
        "type": "object",
        "description": "Sitzungsfelder `status.updated` und `data.updated`. Optionale Felder werden weggelassen, niemals als `null` gesendet, wenn sie nicht zutreffen. Unternehmenssitzungen (KYB) fügen `business_session_id`, `session_kind` und `vendor_business_id` hinzu.",
        "required": [
          "session_id",
          "status",
          "sandbox_scenario"
        ],
        "properties": {
          "session_id": {
            "type": "string",
            "format": "uuid",
            "description": "Die Verifizierungssitzung."
          },
          "business_session_id": {
            "type": "string",
            "format": "uuid",
            "description": "Nur für Unternehmenssitzungen (KYB): derselbe Wert wie `session_id`."
          },
          "session_kind": {
            "type": "string",
            "enum": [
              "business"
            ],
            "description": "Nur für Unternehmenssitzungen (KYB). Sitzungsereignisse für Benutzer (KYC) enthalten kein `session_kind` auf oberster Ebene; lesen Sie stattdessen `decision.session_kind` aus."
          },
          "status": {
            "type": "string",
            "enum": [
              "Not Started",
              "In Progress",
              "Approved",
              "Declined",
              "In Review",
              "Expired",
              "Abandoned",
              "Kyc Expired",
              "Resubmitted",
              "Awaiting User"
            ],
            "description": "Sitzungsstatus nach der Änderung."
          },
          "trigger": {
            "type": "string",
            "description": "Vorhanden, wenn das Ereignis nicht durch den Verifizierungs-Workflow selbst erzeugt wurde, zum Beispiel `manual_review`, `manual_step_update`, `ongoing_monitoring`, `webhook_reconciliation` (ein erneut gesendetes `status.updated`, weil der erste finale Webhook nie erstellt wurde, sodass Sie möglicherweise ein zweites Ereignis für eine bereits erhaltene Entscheidung erhalten: Deduplizierung anhand von `session_id` und `status`), `manual_webhook_recovery`, `kyb_registry_change`, `biometric_retention` (ein gesendetes `data.updated`, wenn die Live-Biometriedaten der Sitzung planmäßig gelöscht werden) oder eine `console_*`-Bearbeitung wie `console_registry_edit`, `console_key_people_skip` oder `console_key_people_regenerate`."
          },
          "workflow_id": {
            "type": "string",
            "format": "uuid",
            "description": "Der Workflow der Sitzung. Wird weggelassen, wenn die Sitzung keinen hat."
          },
          "workflow_version": {
            "type": "integer",
            "description": "Version des Workflows, den die Sitzung ausgeführt hat. Wird zusammen mit `workflow_id` gesendet."
          },
          "vendor_data": {
            "type": "string",
            "description": "Ihre `vendor_data` für die Sitzung. Wird weggelassen, wenn leer."
          },
          "vendor_business_id": {
            "type": "string",
            "description": "Nur für Unternehmenssitzungen (KYB): das Unternehmen, zu dem die Sitzung gehört. Wird weggelassen, wenn keines vorhanden ist."
          },
          "metadata": {
            "type": "object",
            "additionalProperties": true,
            "description": "Ihre Sitzungs-`metadata`. Wird weggelassen, wenn leer."
          },
          "decision": {
            "$ref": "#/components/schemas/SessionDecision"
          },
          "resubmit_info": {
            "type": "object",
            "description": "Nur wenn `status` gleich `Resubmitted` ist: die Schritte, die der Benutzer wiederholen muss, und der Grund dafür.",
            "required": [
              "nodes_to_resubmit",
              "reasons"
            ],
            "properties": {
              "nodes_to_resubmit": {
                "type": "array",
                "items": {
                  "type": "object",
                  "required": [
                    "node_id",
                    "feature"
                  ],
                  "properties": {
                    "node_id": {
                      "type": "string",
                      "description": "Knotenbezeichner, wie er in der Workflow-Definition der Sitzung vorkommt (z. B. `feature_ocr`, `feature_liveness`).",
                      "example": "feature_poa"
                    },
                    "feature": {
                      "type": "string",
                      "description": "Funktionstyp des Knotens, zum Beispiel `OCR`, `LIVENESS` oder `PROOF_OF_ADDRESS`.",
                      "example": "PROOF_OF_ADDRESS"
                    }
                  }
                },
                "description": "Workflow-Schritte, die der Benutzer wiederholen muss. Dieselben `{node_id, feature}`-Einträge wie `nodes_to_resubmit` in [Status aktualisieren](#patch-/v3/session/-sessionId-/update-status/)."
              },
              "reasons": {
                "type": "object",
                "additionalProperties": true,
                "description": "Grund pro `node_id` in `nodes_to_resubmit`."
              }
            }
          },
          "sandbox_scenario": {
            "type": "string",
            "nullable": true,
            "description": "Das simulierte Ergebnis, das für eine Sandbox-Sitzung aktiviert wurde, oder `null`. Immer `null` für Produktionssitzungen."
          }
        }
      },
      "SessionStatusUpdatedEvent": {
        "description": "Eine Verifizierungssitzung hat ihren Status geändert. `decision` wird nur für `Approved`, `Declined`, `In Review` und `Abandoned` gesendet; es entspricht dem Format von `GET /v3/session/{sessionId}/decision/` für Ziele mit Webhook-Version 3 (Standard) und dem älteren reduzierten Format für Ziele der Version 1 oder 2. Unternehmenssitzungen erhalten immer die Unternehmensentscheidung der Version 3.",
        "allOf": [
          {
            "$ref": "#/components/schemas/WebhookEventEnvelope"
          },
          {
            "$ref": "#/components/schemas/SessionWebhookEventData"
          },
          {
            "type": "object",
            "properties": {
              "webhook_type": {
                "type": "string",
                "enum": [
                  "status.updated"
                ],
                "description": "Immer `status.updated`."
              }
            },
            "required": [
              "webhook_type"
            ]
          }
        ]
      },
      "SessionDataUpdatedEvent": {
        "description": "Daten einer Verifizierungssitzung wurden ohne Statusänderung geändert, beispielsweise nach einer Bearbeitung bei der manuellen Prüfung, dem Überschreiben eines Schritts oder einem erneuten Screening im Rahmen der laufenden Überwachung. `decision` wird nur für `Approved`, `Declined`, `In Review` und `Abandoned` gesendet; es hat die Struktur von `GET /v3/session/{sessionId}/decision/` für Ziele mit Webhook-Version 3 (Standard) und die ältere reduzierte Struktur für Ziele mit Version 1 oder 2. Unternehmenssitzungen erhalten immer die Unternehmensentscheidung der Version 3.",
        "allOf": [
          {
            "$ref": "#/components/schemas/WebhookEventEnvelope"
          },
          {
            "$ref": "#/components/schemas/SessionWebhookEventData"
          },
          {
            "type": "object",
            "properties": {
              "webhook_type": {
                "type": "string",
                "enum": [
                  "data.updated"
                ],
                "description": "Immer `data.updated`."
              }
            },
            "required": [
              "webhook_type"
            ]
          }
        ]
      },
      "UserStatusUpdatedEvent": {
        "description": "Ein Benutzer hat seinen Status geändert. Wird nicht gesendet, wenn der Benutzer erstellt wird.",
        "allOf": [
          {
            "$ref": "#/components/schemas/WebhookEventEnvelope"
          },
          {
            "type": "object",
            "properties": {
              "webhook_type": {
                "type": "string",
                "enum": [
                  "user.status.updated"
                ],
                "description": "Immer `user.status.updated`."
              },
              "vendor_user_id": {
                "type": "string",
                "format": "uuid",
                "description": "Der Benutzer, um den es bei dem Ereignis geht."
              },
              "vendor_data": {
                "type": "string",
                "nullable": true,
                "description": "Ihre `vendor_data` für den Benutzer oder `null`."
              },
              "status": {
                "type": "string",
                "enum": [
                  "ACTIVE",
                  "IN_REVIEW",
                  "FLAGGED",
                  "BLOCKED"
                ],
                "description": "Benutzerstatus nach der Änderung."
              },
              "previous_status": {
                "type": "string",
                "enum": [
                  "ACTIVE",
                  "IN_REVIEW",
                  "FLAGGED",
                  "BLOCKED"
                ],
                "description": "Status vor der Änderung."
              }
            },
            "required": [
              "webhook_type",
              "vendor_user_id",
              "vendor_data",
              "status",
              "previous_status"
            ]
          }
        ]
      },
      "UserDataUpdatedEvent": {
        "description": "Felder eines Benutzers wurden geändert. Wird bei der Erstellung des Benutzers nicht gesendet. Ein einziger Speichervorgang kann sowohl ein Status- als auch ein Datenereignis erzeugen.",
        "allOf": [
          {
            "$ref": "#/components/schemas/WebhookEventEnvelope"
          },
          {
            "type": "object",
            "properties": {
              "webhook_type": {
                "type": "string",
                "enum": [
                  "user.data.updated"
                ],
                "description": "Immer `user.data.updated`."
              },
              "vendor_user_id": {
                "type": "string",
                "format": "uuid",
                "description": "Der Benutzer, um den es bei dem Ereignis geht."
              },
              "vendor_data": {
                "type": "string",
                "nullable": true,
                "description": "Ihre `vendor_data` für den Benutzer oder `null`."
              },
              "status": {
                "type": "string",
                "enum": [
                  "ACTIVE",
                  "IN_REVIEW",
                  "FLAGGED",
                  "BLOCKED"
                ],
                "description": "Benutzerstatus nach der Änderung."
              },
              "changed_fields": {
                "type": "array",
                "items": {
                  "type": "string",
                  "enum": [
                    "vendor_data",
                    "display_name",
                    "full_name",
                    "date_of_birth",
                    "metadata",
                    "portrait_image",
                    "issuing_states",
                    "approved_emails",
                    "approved_phones",
                    "features",
                    "session_count",
                    "approved_count",
                    "declined_count",
                    "in_review_count",
                    "first_session_at",
                    "last_session_at"
                  ]
                },
                "description": "Namen der Felder, die geändert wurden."
              },
              "changes": {
                "type": "object",
                "additionalProperties": {
                  "type": "object",
                  "properties": {
                    "previous": {
                      "nullable": true,
                      "description": "Wert vor der Änderung. Datumsangaben sind ISO-8601-Strings."
                    },
                    "current": {
                      "nullable": true,
                      "description": "Wert nach der Änderung. Datumsangaben sind ISO-8601-Strings."
                    }
                  }
                },
                "description": "Vorheriger und aktueller Wert jedes geänderten Felds, mit dem Feldnamen als Schlüssel. Werte können personenbezogene Daten sein (Namen, Geburtsdaten, Porträt-Links, E-Mail-Adressen, Telefonnummern); behandeln Sie diese entsprechend."
              }
            },
            "required": [
              "webhook_type",
              "vendor_user_id",
              "vendor_data",
              "status",
              "changed_fields",
              "changes"
            ]
          }
        ]
      },
      "BusinessStatusUpdatedEvent": {
        "description": "Ein Unternehmen hat den Status geändert. Wird nicht gesendet, wenn das Unternehmen erstellt wird.",
        "allOf": [
          {
            "$ref": "#/components/schemas/WebhookEventEnvelope"
          },
          {
            "type": "object",
            "properties": {
              "webhook_type": {
                "type": "string",
                "enum": [
                  "business.status.updated"
                ],
                "description": "Immer `business.status.updated`."
              },
              "vendor_business_id": {
                "type": "string",
                "format": "uuid",
                "description": "Das Unternehmen, um das es bei dem Ereignis geht."
              },
              "vendor_data": {
                "type": "string",
                "nullable": true,
                "description": "Ihre `vendor_data` für das Unternehmen oder `null`."
              },
              "status": {
                "type": "string",
                "enum": [
                  "ACTIVE",
                  "IN_REVIEW",
                  "FLAGGED",
                  "BLOCKED"
                ],
                "description": "Unternehmensstatus nach der Änderung."
              },
              "previous_status": {
                "type": "string",
                "enum": [
                  "ACTIVE",
                  "IN_REVIEW",
                  "FLAGGED",
                  "BLOCKED"
                ],
                "description": "Status vor der Änderung."
              }
            },
            "required": [
              "webhook_type",
              "vendor_business_id",
              "vendor_data",
              "status",
              "previous_status"
            ]
          }
        ]
      },
      "BusinessDataUpdatedEvent": {
        "description": "Felder eines Unternehmens wurden geändert. Wird bei der Erstellung des Unternehmens nicht gesendet. Ein einziger Speichervorgang kann sowohl ein Status- als auch ein Datenereignis erzeugen.",
        "allOf": [
          {
            "$ref": "#/components/schemas/WebhookEventEnvelope"
          },
          {
            "type": "object",
            "properties": {
              "webhook_type": {
                "type": "string",
                "enum": [
                  "business.data.updated"
                ],
                "description": "Immer `business.data.updated`."
              },
              "vendor_business_id": {
                "type": "string",
                "format": "uuid",
                "description": "Das Unternehmen, um das es bei dem Ereignis geht."
              },
              "vendor_data": {
                "type": "string",
                "nullable": true,
                "description": "Ihre `vendor_data` für das Unternehmen oder `null`."
              },
              "status": {
                "type": "string",
                "enum": [
                  "ACTIVE",
                  "IN_REVIEW",
                  "FLAGGED",
                  "BLOCKED"
                ],
                "description": "Unternehmensstatus nach der Änderung."
              },
              "changed_fields": {
                "type": "array",
                "items": {
                  "type": "string",
                  "enum": [
                    "vendor_data",
                    "display_name",
                    "metadata",
                    "legal_name",
                    "registration_number",
                    "country_code",
                    "session_count",
                    "approved_count",
                    "declined_count",
                    "in_review_count",
                    "features",
                    "first_session_at",
                    "last_session_at"
                  ]
                },
                "description": "Namen der Felder, die geändert wurden."
              },
              "changes": {
                "type": "object",
                "additionalProperties": {
                  "type": "object",
                  "properties": {
                    "previous": {
                      "nullable": true,
                      "description": "Wert vor der Änderung. Datumsangaben sind ISO-8601-Strings."
                    },
                    "current": {
                      "nullable": true,
                      "description": "Wert nach der Änderung. Datumsangaben sind ISO-8601-Strings."
                    }
                  }
                },
                "description": "Vorheriger und aktueller Wert jedes geänderten Felds, mit dem Feldnamen als Schlüssel."
              }
            },
            "required": [
              "webhook_type",
              "vendor_business_id",
              "vendor_data",
              "status",
              "changed_fields",
              "changes"
            ]
          }
        ]
      },
      "TransactionCreatedEvent": {
        "description": "Eine Transaktion wurde erstellt und gescreent. Wird nur für Live-Anwendungen gesendet.",
        "allOf": [
          {
            "$ref": "#/components/schemas/WebhookEventEnvelope"
          },
          {
            "type": "object",
            "properties": {
              "webhook_type": {
                "type": "string",
                "enum": [
                  "transaction.created"
                ],
                "description": "Immer `transaction.created`."
              },
              "transaction_id": {
                "type": "string",
                "format": "uuid",
                "description": "Didits Kennung der Transaktion."
              },
              "txn_id": {
                "type": "string",
                "nullable": true,
                "description": "Die `transaction_id`, die Sie bei der Erstellung angegeben haben, oder `null`."
              },
              "status": {
                "type": "string",
                "enum": [
                  "APPROVED",
                  "IN_REVIEW",
                  "DECLINED",
                  "AWAITING_USER"
                ],
                "description": "Überwachungsstatus nach der Änderung."
              },
              "score": {
                "type": "integer",
                "description": "Durch Regeln kumulierter Risiko-Score."
              },
              "severity": {
                "type": "string",
                "nullable": true,
                "enum": [
                  "UNKNOWN",
                  "LOW",
                  "MEDIUM",
                  "HIGH",
                  "CRITICAL",
                  null
                ],
                "description": "Risiko-Schweregrad oder `null`, bis eine Regel oder ein Anbieter einen festlegt."
              },
              "amount": {
                "type": "string",
                "description": "Transaktionsbetrag als Dezimalstring. Im Gegensatz zur API ist er nicht normalisiert, sodass er nachgestellte Nullen enthalten kann (bis zu 18 Dezimalstellen)."
              },
              "currency": {
                "type": "string",
                "description": "Währungscode oder Krypto-Asset-Symbol von `amount`."
              },
              "direction": {
                "type": "string",
                "enum": [
                  "INBOUND",
                  "OUTBOUND"
                ],
                "description": "Richtung relativ zur betreffenden Entität."
              },
              "action_required": {
                "type": "object",
                "nullable": true,
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/TransactionVerificationSessionAction"
                  },
                  {
                    "$ref": "#/components/schemas/TransactionWalletOwnershipAction"
                  }
                ],
                "discriminator": {
                  "propertyName": "type",
                  "mapping": {
                    "verification_session": "#/components/schemas/TransactionVerificationSessionAction",
                    "wallet_ownership": "#/components/schemas/TransactionWalletOwnershipAction"
                  }
                },
                "description": "Ausstehende Endbenutzer-Aktion oder `null`. Dasselbe Objekt wie `action_required` bei der Transaktion; `session_token` ist eine Anmeldeinformation, daher niemals loggen."
              }
            },
            "required": [
              "webhook_type",
              "transaction_id",
              "txn_id",
              "status",
              "score",
              "severity",
              "amount",
              "currency",
              "direction",
              "action_required"
            ]
          }
        ]
      },
      "TransactionStatusUpdatedEvent": {
        "description": "Eine Transaktion hat ihren Status geändert, durch eine Regel, eine Prüfung oder eine Aktion des Endbenutzers. Wird nur für Live-Anwendungen gesendet.",
        "allOf": [
          {
            "$ref": "#/components/schemas/WebhookEventEnvelope"
          },
          {
            "type": "object",
            "properties": {
              "webhook_type": {
                "type": "string",
                "enum": [
                  "transaction.status.updated"
                ],
                "description": "Immer `transaction.status.updated`."
              },
              "transaction_id": {
                "type": "string",
                "format": "uuid",
                "description": "Didits Kennung der Transaktion."
              },
              "txn_id": {
                "type": "string",
                "nullable": true,
                "description": "Die `transaction_id`, die Sie bei der Erstellung angegeben haben, oder `null`."
              },
              "status": {
                "type": "string",
                "enum": [
                  "APPROVED",
                  "IN_REVIEW",
                  "DECLINED",
                  "AWAITING_USER"
                ],
                "description": "Überwachungsstatus nach der Änderung."
              },
              "score": {
                "type": "integer",
                "description": "Durch Regeln kumulierter Risiko-Score."
              },
              "severity": {
                "type": "string",
                "nullable": true,
                "enum": [
                  "UNKNOWN",
                  "LOW",
                  "MEDIUM",
                  "HIGH",
                  "CRITICAL",
                  null
                ],
                "description": "Risiko-Schweregrad oder `null`, bis eine Regel oder ein Anbieter einen festlegt."
              },
              "amount": {
                "type": "string",
                "description": "Transaktionsbetrag als Dezimalstring. Im Gegensatz zur API ist er nicht normalisiert, sodass er nachgestellte Nullen enthalten kann (bis zu 18 Dezimalstellen)."
              },
              "currency": {
                "type": "string",
                "description": "Währungscode oder Krypto-Asset-Symbol von `amount`."
              },
              "direction": {
                "type": "string",
                "enum": [
                  "INBOUND",
                  "OUTBOUND"
                ],
                "description": "Richtung relativ zur betreffenden Entität."
              },
              "action_required": {
                "type": "object",
                "nullable": true,
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/TransactionVerificationSessionAction"
                  },
                  {
                    "$ref": "#/components/schemas/TransactionWalletOwnershipAction"
                  }
                ],
                "discriminator": {
                  "propertyName": "type",
                  "mapping": {
                    "verification_session": "#/components/schemas/TransactionVerificationSessionAction",
                    "wallet_ownership": "#/components/schemas/TransactionWalletOwnershipAction"
                  }
                },
                "description": "Ausstehende Endbenutzer-Aktion oder `null`. Dasselbe Objekt wie `action_required` bei der Transaktion; `session_token` ist eine Anmeldeinformation, daher niemals loggen."
              }
            },
            "required": [
              "webhook_type",
              "transaction_id",
              "txn_id",
              "status",
              "score",
              "severity",
              "amount",
              "currency",
              "direction",
              "action_required"
            ]
          }
        ]
      },
      "TravelRuleStatusUpdatedEvent": {
        "description": "Ein Travel-Rule-Austausch hat den Status geändert. Wird bei jedem Übergang bis einschließlich `FINISHED`, `CANCELLED` oder `EXPIRED` gesendet, danach nie wieder. Wird für Live-Anwendungen gesendet und bei Travel-Rule-Austauschen auch für Sandbox-Anwendungen (`environment: sandbox`). Es gibt keinen übergeordneten `status`.",
        "allOf": [
          {
            "$ref": "#/components/schemas/WebhookEventEnvelope"
          },
          {
            "type": "object",
            "properties": {
              "webhook_type": {
                "type": "string",
                "enum": [
                  "travel_rule.status.updated"
                ],
                "description": "Immer `travel_rule.status.updated`."
              },
              "transaction_id": {
                "type": "string",
                "format": "uuid",
                "description": "Die Transaktion, zu der der Austausch gehört."
              },
              "txn_id": {
                "type": "string",
                "nullable": true,
                "description": "Die `transaction_id`, die Sie bei der Erstellung angegeben haben, oder `null`."
              },
              "travel_rule_status": {
                "type": "string",
                "enum": [
                  "AWAITING_COUNTERPARTY",
                  "ON_HOLD",
                  "COMPLETED",
                  "FINISHED",
                  "CANCELLED",
                  "EXPIRED",
                  "COUNTERPARTY_MISMATCHED_DATA",
                  "COUNTERPARTY_VASP_NOT_FOUND",
                  "COUNTERPARTY_VASP_NOT_REACHABLE",
                  "UNCONFIRMED_OWNERSHIP",
                  "COUNTERPARTY_VASP_GENERAL_DECLINE",
                  "NOT_ENOUGH_COUNTERPARTY_DATA",
                  "NOT_APPLICABLE"
                ],
                "description": "Status des Austauschs nach der Änderung."
              },
              "rail": {
                "type": "string",
                "enum": [
                  "",
                  "INTERNAL",
                  "TRP",
                  "GTR",
                  "TRUST",
                  "VERIFYVASP",
                  "SYGNA",
                  "EMAIL",
                  "TEST_VASP"
                ],
                "description": "Netzwerk, auf dem die Börse betrieben wird, oder ein leerer String, wenn keines aufgelöst werden konnte. `TEST_VASP` ist ein Sandbox-Transfer, den der Didit Test VASP beantwortet hat."
              },
              "test_vasp": {
                "type": "boolean",
                "description": "Nur bei einem von der Didit Test-VASP beantworteten Sandbox-Transfer vorhanden und `true`."
              },
              "test_vasp_scenario": {
                "type": "string",
                "description": "Nur bei `test_vasp` vorhanden: das Sandbox-Szenario, das über das Ergebnis entschieden hat, oder ein leerer String."
              },
              "direction": {
                "type": "string",
                "enum": [
                  "INBOUND",
                  "OUTBOUND"
                ],
                "description": "Richtung des Transfers."
              }
            },
            "required": [
              "webhook_type",
              "transaction_id",
              "txn_id",
              "travel_rule_status",
              "rail",
              "direction"
            ]
          }
        ]
      },
      "WorkflowComplianceChangedEvent": {
        "description": "Der Compliance-Status eines veröffentlichten Workflows hat sich nach einer Neubewertung geändert. Ein Ereignis pro Workflow. Es gibt keinen übergeordneten `status`.",
        "allOf": [
          {
            "$ref": "#/components/schemas/WebhookEventEnvelope"
          },
          {
            "type": "object",
            "properties": {
              "webhook_type": {
                "type": "string",
                "enum": [
                  "workflow.compliance_changed"
                ],
                "description": "Immer `workflow.compliance_changed`."
              },
              "workflow_id": {
                "type": "string",
                "format": "uuid",
                "description": "Der Workflow, der geändert wurde."
              },
              "workflow_version": {
                "type": "integer",
                "description": "Version, die ausgewertet wurde."
              },
              "workflow_label": {
                "type": "string",
                "nullable": true,
                "description": "Anzeigename des Workflows."
              },
              "transition": {
                "type": "object",
                "required": [
                  "from",
                  "to"
                ],
                "properties": {
                  "from": {
                    "type": "string",
                    "enum": [
                      "compliant",
                      "gaps_detected",
                      "pending_change",
                      "unknown_coverage",
                      "not_evaluated"
                    ],
                    "description": "Status vor der Neubewertung."
                  },
                  "to": {
                    "type": "string",
                    "enum": [
                      "compliant",
                      "gaps_detected",
                      "pending_change",
                      "unknown_coverage",
                      "not_evaluated"
                    ],
                    "description": "Status nach der Neubewertung."
                  }
                }
              },
              "severity": {
                "type": "string",
                "enum": [
                  "actionable",
                  "indicative",
                  "informative"
                ],
                "description": "`actionable`, wenn Lücken erkannt wurden, `indicative` bei einer ausstehenden Änderung, `informative`, wenn Lücken behoben wurden."
              },
              "kb_version": {
                "type": "string",
                "description": "Version der verwendeten regulatorischen Wissensdatenbank."
              }
            },
            "required": [
              "webhook_type",
              "workflow_id",
              "workflow_version",
              "workflow_label",
              "transition",
              "severity",
              "kb_version"
            ]
          }
        ]
      },
      "WebhookEventPayload": {
        "description": "Body einer signierten Webhook-Zustellung, unterschieden nach `webhook_type`. `activity.created` kann abonniert werden, wird derzeit jedoch nicht gesendet. Behandeln Sie jeden anderen `webhook_type` als neuen Ereignistyp und behalten Sie den Roh-Body bei.",
        "oneOf": [
          {
            "$ref": "#/components/schemas/SessionStatusUpdatedEvent"
          },
          {
            "$ref": "#/components/schemas/SessionDataUpdatedEvent"
          },
          {
            "$ref": "#/components/schemas/UserStatusUpdatedEvent"
          },
          {
            "$ref": "#/components/schemas/UserDataUpdatedEvent"
          },
          {
            "$ref": "#/components/schemas/BusinessStatusUpdatedEvent"
          },
          {
            "$ref": "#/components/schemas/BusinessDataUpdatedEvent"
          },
          {
            "$ref": "#/components/schemas/TransactionCreatedEvent"
          },
          {
            "$ref": "#/components/schemas/TransactionStatusUpdatedEvent"
          },
          {
            "$ref": "#/components/schemas/TravelRuleStatusUpdatedEvent"
          },
          {
            "$ref": "#/components/schemas/WorkflowComplianceChangedEvent"
          },
          {
            "$ref": "#/components/schemas/TransactionRuleSuggestionsCreatedEvent"
          }
        ],
        "discriminator": {
          "propertyName": "webhook_type",
          "mapping": {
            "status.updated": "#/components/schemas/SessionStatusUpdatedEvent",
            "data.updated": "#/components/schemas/SessionDataUpdatedEvent",
            "user.status.updated": "#/components/schemas/UserStatusUpdatedEvent",
            "user.data.updated": "#/components/schemas/UserDataUpdatedEvent",
            "business.status.updated": "#/components/schemas/BusinessStatusUpdatedEvent",
            "business.data.updated": "#/components/schemas/BusinessDataUpdatedEvent",
            "transaction.created": "#/components/schemas/TransactionCreatedEvent",
            "transaction.status.updated": "#/components/schemas/TransactionStatusUpdatedEvent",
            "travel_rule.status.updated": "#/components/schemas/TravelRuleStatusUpdatedEvent",
            "workflow.compliance_changed": "#/components/schemas/WorkflowComplianceChangedEvent",
            "transaction_rule_suggestions.created": "#/components/schemas/TransactionRuleSuggestionsCreatedEvent"
          }
        }
      },
      "KYBRegistrySearchResolvedCallback": {
        "type": "object",
        "description": "Body des Callbacks, der an die `webhook_url` von `POST /v3/kyb/search/` gesendet wird, sobald die Registersuche abgeschlossen ist. Er ist nicht signiert: Die Anfrage enthält `X-Didit-Unsigned-Callback: true` und keine der Signatur-Header. Bestätigen Sie ihn daher, indem Sie `request_id` mit einer von Ihnen gestarteten Suche abgleichen. Verwendet `event_type`, nicht `webhook_type`.",
        "required": [
          "event_id",
          "event_type",
          "request_id",
          "vendor_data",
          "metadata",
          "search_status",
          "search_resolved",
          "kyb_registry",
          "timestamp",
          "created_at"
        ],
        "properties": {
          "event_id": {
            "type": "string",
            "format": "uuid",
            "description": "Kennung des Callbacks."
          },
          "event_type": {
            "type": "string",
            "enum": [
              "kyb.registry_search.resolved"
            ],
            "description": "Immer `kyb.registry_search.resolved`."
          },
          "request_id": {
            "type": "string",
            "format": "uuid",
            "description": "Die von `POST /v3/kyb/search/` zurückgegebene `request_id`."
          },
          "vendor_data": {
            "type": "string",
            "nullable": true,
            "description": "Wiedergabe der von Ihnen gesendeten `vendor_data`."
          },
          "metadata": {
            "type": "object",
            "nullable": true,
            "additionalProperties": true,
            "description": "Rückgabe der von Ihnen gesendeten `metadata`."
          },
          "search_status": {
            "type": "string",
            "description": "Aktuell immer `resolved`."
          },
          "search_resolved": {
            "type": "boolean",
            "description": "`true`, wenn `search_status` gleich `resolved` ist."
          },
          "kyb_registry": {
            "$ref": "#/components/schemas/KYBRegistrySearchResults"
          },
          "timestamp": {
            "type": "integer",
            "description": "Unix-Zeit in Sekunden, zu der der Callback in die Warteschlange eingereiht wurde."
          },
          "created_at": {
            "type": "integer",
            "description": "Unix-Zeit in Sekunden, zu der der Callback in die Warteschlange eingereiht wurde."
          }
        }
      },
      "AMLScreening": {
        "type": "object",
        "properties": {
          "node_id": {
            "type": "string",
            "description": "Eindeutige Kennung für diesen AML-Schritt im Workflow-Graphen."
          },
          "status": {
            "type": "string",
            "description": "Status auf Funktionsebene dieses AML-Screenings. Unabhängig vom `status` der übergeordneten Sitzung – eine Sitzung kann ihre Gesamtentscheidung erreichen, während eine einzelne Funktion `In Review` bleibt.",
            "enum": [
              "Not Finished",
              "Approved",
              "Declined",
              "In Review",
              "Resub Requested"
            ]
          },
          "total_hits": {
            "type": "integer",
            "description": "Gesamtzahl der gefundenen Übereinstimmungen"
          },
          "entity_type": {
            "type": "string",
            "description": "Art der gescreenten Entität: Person oder Unternehmen"
          },
          "hits": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string",
                  "description": "Didits stabiler Bezeichner für den Treffer: `hit_`, gefolgt von 24 Hexadezimalzeichen. Dieselbe übereinstimmende Entität behält dieselbe `id`, wenn die betreffende Entität erneut überprüft wird. Übergeben Sie sie als `hit_id` an die Endpoints zur AML-Trefferprüfung."
                },
                "url": {
                  "type": "string",
                  "format": "uri",
                  "description": "Quell-URL für den Treffer"
                },
                "match": {
                  "type": "boolean",
                  "description": "Gibt an, ob dies eine bestätigte Übereinstimmung ist"
                },
                "score": {
                  "type": "number",
                  "format": "float",
                  "nullable": true,
                  "minimum": 0,
                  "maximum": 1,
                  "description": "Veralteter gewichteter Übereinstimmungswert im Bereich 0–1 (z. B. `0.73`). Verwenden Sie stattdessen `match_score` (0–100).",
                  "deprecated": true
                },
                "target": {
                  "type": "boolean",
                  "nullable": true,
                  "description": "Gibt an, ob die übereinstimmende Entität das direkte Ziel des Eintrags ist (im Gegensatz zu einer verbundenen Partei). `null`, wenn die Quelle dies nicht angibt."
                },
                "caption": {
                  "type": "string",
                  "description": "Bildunterschrift oder Titel des Treffers"
                },
                "datasets": {
                  "type": "array",
                  "items": {
                    "type": "string",
                    "enum": [
                      "PEP",
                      "PEP Level 1",
                      "PEP Level 2",
                      "PEP Level 3",
                      "PEP Level 4",
                      "Sanctions",
                      "Adverse Media",
                      "Warnings and Regulatory Enforcement",
                      "Fitness and Probity",
                      "SIP",
                      "SIE",
                      "Insolvency",
                      "Other Lists"
                    ]
                  },
                  "description": "Liste der Datensatzkategorien, in denen die Übereinstimmung gefunden wurde. Gibt an, ob die Entität in PEP-Listen (mit Stufe), Sanktionsdatenbanken, negativen Medienberichten, Warnungen/behördlichen Durchsetzungsmaßnahmen oder anderen Compliance-Datensätzen aufgetaucht ist. `Other Lists`, wenn die Quelle der Entität keine dieser Kategorien angibt."
                },
                "features": {
                  "type": "object",
                  "nullable": true,
                  "description": "Zusätzliche Merkmale der Übereinstimmung"
                },
                "rca_name": {
                  "type": "string",
                  "description": "RCA-Name, falls zutreffend"
                },
                "last_seen": {
                  "type": "string",
                  "format": "date-time",
                  "description": "Datum, an dem die Übereinstimmung zuletzt festgestellt wurde"
                },
                "risk_view": {
                  "type": "object",
                  "properties": {
                    "crimes": {
                      "type": "object",
                      "properties": {
                        "score": {
                          "type": "integer"
                        },
                        "weightage": {
                          "type": "integer"
                        },
                        "risk_level": {
                          "type": "string"
                        },
                        "risk_scores": {
                          "type": "object"
                        }
                      }
                    },
                    "countries": {
                      "type": "object",
                      "properties": {
                        "score": {
                          "type": "integer"
                        },
                        "weightage": {
                          "type": "integer"
                        },
                        "risk_level": {
                          "type": "string"
                        },
                        "risk_scores": {
                          "type": "object"
                        }
                      }
                    },
                    "categories": {
                      "type": "object",
                      "properties": {
                        "score": {
                          "type": "integer"
                        },
                        "weightage": {
                          "type": "integer"
                        },
                        "risk_level": {
                          "type": "string"
                        },
                        "risk_scores": {
                          "type": "object"
                        }
                      }
                    },
                    "custom_list": {
                      "type": "object"
                    }
                  }
                },
                "first_seen": {
                  "type": "string",
                  "format": "date-time",
                  "description": "Datum, an dem die Übereinstimmung erstmals festgestellt wurde"
                },
                "properties": {
                  "type": "object",
                  "properties": {
                    "name": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      }
                    },
                    "alias": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      }
                    },
                    "notes": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      }
                    },
                    "title": {
                      "type": "string",
                      "nullable": true
                    },
                    "gender": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      }
                    },
                    "height": {
                      "type": "string",
                      "nullable": true
                    },
                    "topics": {
                      "type": "string",
                      "nullable": true
                    },
                    "weight": {
                      "type": "string",
                      "nullable": true
                    },
                    "address": {
                      "type": "string",
                      "nullable": true
                    },
                    "country": {
                      "type": "string",
                      "nullable": true
                    },
                    "website": {
                      "type": "string",
                      "nullable": true
                    },
                    "eyeColor": {
                      "type": "string",
                      "nullable": true
                    },
                    "keywords": {
                      "type": "string",
                      "nullable": true
                    },
                    "lastName": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      }
                    },
                    "position": {
                      "type": "string",
                      "nullable": true
                    },
                    "religion": {
                      "type": "string",
                      "nullable": true
                    },
                    "birthDate": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      }
                    },
                    "education": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      }
                    },
                    "ethnicity": {
                      "type": "string",
                      "nullable": true
                    },
                    "firstName": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      }
                    },
                    "hairColor": {
                      "type": "string",
                      "nullable": true
                    },
                    "weakAlias": {
                      "type": "string",
                      "nullable": true
                    },
                    "birthPlace": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      }
                    },
                    "modifiedAt": {
                      "type": "string",
                      "nullable": true
                    },
                    "wikidataId": {
                      "type": "string",
                      "nullable": true
                    },
                    "citizenship": {
                      "type": "string",
                      "nullable": true
                    },
                    "nationality": {
                      "type": "string",
                      "nullable": true
                    }
                  }
                },
                "match_score": {
                  "type": "number",
                  "description": "Gewichteter Identitäts-Konfidenzwert (0-100), berechnet aus Namensähnlichkeit, Geburtsdatum und Länderabgleich. Wird verwendet, um zu bestimmen, ob ein Treffer falsch positiv oder eine mögliche Übereinstimmung ist.",
                  "format": "float",
                  "nullable": true
                },
                "risk_score": {
                  "type": "number",
                  "description": "Risiko-Score der Entität (0-100). Wird verwendet, um den endgültigen AML-Status (Approved/In Review/Declined) basierend auf dem höchsten risk_score unter Treffern, die nicht falsch positiv sind, zu bestimmen."
                },
                "review_status": {
                  "type": "string",
                  "description": "Prüfstatus für diesen Treffer. Kann 'Unreviewed', 'Confirmed Match', 'False Positive' oder 'Inconclusive' sein.",
                  "enum": [
                    "Unreviewed",
                    "Confirmed Match",
                    "False Positive",
                    "Inconclusive"
                  ]
                },
                "score_breakdown": {
                  "type": "object",
                  "description": "Detaillierte Aufschlüsselung, wie der match_score berechnet wurde.",
                  "properties": {
                    "name_score": {
                      "type": "integer",
                      "description": "Unverarbeiteter Prozentsatz der Namensähnlichkeit (0-100)."
                    },
                    "name_weight": {
                      "type": "integer",
                      "description": "Ursprüngliche Gewichtung für den Namen aus der Konfiguration (0-100)."
                    },
                    "name_weight_normalized": {
                      "type": "number",
                      "description": "Normalisierte Gewichtung für den Namen nach Neugewichtung für fehlende Daten (0–100)."
                    },
                    "name_contribution": {
                      "type": "number",
                      "description": "Vom Namen zum Gesamtergebnis beigetragene Punkte."
                    },
                    "dob_score": {
                      "type": "integer",
                      "description": "Übereinstimmungswert des Geburtsdatums (-100 bis 100)."
                    },
                    "dob_weight": {
                      "type": "integer",
                      "description": "Ursprüngliche Gewichtung für das Geburtsdatum aus der Konfiguration (0-100)."
                    },
                    "dob_weight_normalized": {
                      "type": "number",
                      "description": "Normalisierte Gewichtung für das Geburtsdatum nach Neugewichtung für fehlende Daten (0–100)."
                    },
                    "dob_contribution": {
                      "type": "number",
                      "description": "Vom Geburtsdatum zum Gesamtergebnis beigetragene Punkte."
                    },
                    "country_score": {
                      "type": "integer",
                      "description": "Länder-Übereinstimmungswert (-100 bis 100)."
                    },
                    "country_weight": {
                      "type": "integer",
                      "description": "Ursprüngliche Gewichtung für das Land aus der Konfiguration (0-100)."
                    },
                    "country_weight_normalized": {
                      "type": "number",
                      "description": "Normalisierte Gewichtung für das Land nach Neugewichtung für fehlende Daten (0–100)."
                    },
                    "country_contribution": {
                      "type": "number",
                      "description": "Vom Land zum Gesamtergebnis beigetragene Punkte."
                    },
                    "document_number_match_type": {
                      "type": "string",
                      "description": "Ergebnis der Auswertung des Dokumentennummern-„Golden Key“.",
                      "enum": [
                        "MATCH",
                        "NEUTRAL",
                        "HARD_MISMATCH"
                      ]
                    },
                    "document_number_effect": {
                      "type": "string",
                      "description": "Lesbare Beschreibung der Auswirkung der Dokumentennummer auf den Score."
                    },
                    "total_score": {
                      "type": "integer",
                      "description": "Endgültiger gewichteter Übereinstimmungswert (0-100)."
                    }
                  }
                },
                "pep_matches": {
                  "type": "array",
                  "items": {
                    "type": "object",
                    "properties": {
                      "aliases": {
                        "type": "array",
                        "items": {
                          "type": "string"
                        }
                      },
                      "education": {
                        "type": "array",
                        "items": {
                          "type": "string"
                        }
                      },
                      "list_name": {
                        "type": "string"
                      },
                      "publisher": {
                        "type": "string"
                      },
                      "source_url": {
                        "type": "string",
                        "format": "uri"
                      },
                      "description": {
                        "type": "string"
                      },
                      "matched_name": {
                        "type": "string"
                      },
                      "pep_position": {
                        "type": "string"
                      },
                      "date_of_birth": {
                        "type": "string"
                      },
                      "other_sources": {
                        "type": "array",
                        "items": {
                          "type": "string"
                        }
                      },
                      "place_of_birth": {
                        "type": "string"
                      }
                    }
                  }
                },
                "linked_entities": {
                  "type": "array",
                  "items": {
                    "type": "object",
                    "properties": {
                      "name": {
                        "type": "array",
                        "items": {
                          "type": "string"
                        }
                      },
                      "active": {
                        "type": "array",
                        "items": {
                          "type": "string"
                        }
                      },
                      "status": {
                        "type": "array",
                        "items": {
                          "type": "string"
                        }
                      },
                      "details": {
                        "type": "array",
                        "items": {
                          "type": "string"
                        }
                      },
                      "relation": {
                        "type": "array",
                        "items": {
                          "type": "string"
                        }
                      }
                    }
                  }
                },
                "warning_matches": {
                  "type": "array",
                  "description": "Liste von Treffern zu Warnungen und behördlichen Durchsetzungsmaßnahmen. Enthält Einträge aus den Kategorien: Warning, SIP, Warnings and Regulatory Enforcement, Fitness and Probity, SIE und Insolvency.",
                  "items": {
                    "type": "object",
                    "properties": {
                      "list_name": {
                        "type": "string",
                        "description": "Name des Herausgebers der Warnliste"
                      },
                      "matched_name": {
                        "type": "string",
                        "description": "Übereinstimmender Name in der Warnliste"
                      },
                      "description": {
                        "type": "string",
                        "description": "Beschreibung des Warnungseintrags"
                      },
                      "publisher": {
                        "type": "string",
                        "description": "Herausgeber oder Quelle der Warnung"
                      },
                      "source_url": {
                        "type": "string",
                        "format": "uri",
                        "description": "URL zur Quelle der Warnung"
                      },
                      "other_sources": {
                        "type": "array",
                        "items": {
                          "type": "string"
                        },
                        "description": "Zusätzliche Quell-URLs"
                      },
                      "countries": {
                        "type": "array",
                        "items": {
                          "type": "string"
                        },
                        "nullable": true,
                        "description": "Mit der Warnung verknüpfte Länder"
                      },
                      "created_at": {
                        "type": "string",
                        "nullable": true,
                        "description": "Datum, an dem der Warnungseintrag erstellt wurde"
                      },
                      "updated_at": {
                        "type": "string",
                        "nullable": true,
                        "description": "Datum, an dem der Warnungseintrag zuletzt aktualisiert wurde"
                      },
                      "additional_data": {
                        "type": "object",
                        "description": "Zusätzliche Daten aus der Warnungsquelle. Kann ein `data`-Objekt mit einem `case_details`-Array enthalten.",
                        "properties": {
                          "data": {
                            "type": "object",
                            "properties": {
                              "case_details": {
                                "type": "array",
                                "description": "Details zu Warnungsfällen, die mit dieser Übereinstimmung verknüpft sind",
                                "items": {
                                  "type": "object",
                                  "properties": {
                                    "case_type": {
                                      "type": "string",
                                      "description": "Art des Warnungsfalls",
                                      "enum": [
                                        "Accusation",
                                        "Arrest",
                                        "Bribery",
                                        "Criminal",
                                        "Fraud",
                                        "Illegal Fundraising",
                                        "Non-conviction Terror",
                                        "Proclaimed Offender",
                                        "Regulatory Enforcement",
                                        "Terrorism",
                                        "Terrorism-related",
                                        "Terrorism-related listing"
                                      ]
                                    }
                                  }
                                }
                              }
                            }
                          }
                        }
                      }
                    }
                  }
                },
                "sanction_matches": {
                  "type": "array",
                  "description": "Liste der für diese Entität gefundenen Sanktionslisten-Übereinstimmungen.",
                  "items": {
                    "type": "object",
                    "properties": {
                      "list_name": {
                        "type": "array",
                        "items": {
                          "type": "string"
                        },
                        "nullable": true,
                        "description": "Name(n) der Sanktionsliste(n)"
                      },
                      "matched_name": {
                        "type": "string",
                        "description": "Übereinstimmender Name in der Sanktionsliste"
                      },
                      "description": {
                        "type": "string",
                        "description": "Beschreibung des Sanktionseintrags"
                      },
                      "reason": {
                        "type": "string",
                        "nullable": true,
                        "description": "Freitext-Begründung, warum die Entität sanktioniert wurde. Zusammengeführt aus den Begründungseinträgen der Sanktionsliste. Beispiele: 'Executive Order 13224 (Terrorism)', 'Support for actions undermining Ukraine's sovereignty', 'Listed due to national security concerns.'"
                      },
                      "source_url": {
                        "type": "string",
                        "format": "uri",
                        "description": "URL zur Quelle der Sanktion"
                      },
                      "other_sources": {
                        "type": "array",
                        "items": {
                          "type": "string"
                        },
                        "description": "Zusätzliche Quell-URLs"
                      },
                      "details": {
                        "type": "array",
                        "items": {
                          "type": "string"
                        },
                        "description": "Zusätzliche Details zur Sanktion"
                      },
                      "legal_basis": {
                        "type": "array",
                        "items": {
                          "type": "string"
                        },
                        "description": "Rechtsgrundlage für die Sanktion"
                      },
                      "listed_on": {
                        "type": "array",
                        "items": {
                          "type": "string"
                        },
                        "nullable": true,
                        "description": "Datum bzw. Daten, an denen die Entität gelistet war"
                      },
                      "sanction_list": {
                        "type": "array",
                        "items": {
                          "type": "string"
                        },
                        "nullable": true,
                        "description": "Sanktionslisten-Identifikator(en)"
                      },
                      "sanction_program": {
                        "type": "array",
                        "items": {
                          "type": "string"
                        },
                        "description": "Sanktionsprogramm(e), unter denen die Entität aufgeführt ist"
                      },
                      "sanctioning_authority": {
                        "type": "array",
                        "items": {
                          "type": "string"
                        },
                        "description": "Behörde/Behörden, die die Sanktion verhängt hat/haben"
                      },
                      "updated_on": {
                        "type": "array",
                        "items": {
                          "type": "string"
                        },
                        "description": "Datum/Daten, an dem/denen der Sanktionseintrag zuletzt aktualisiert wurde"
                      },
                      "additional_data": {
                        "type": "object",
                        "description": "Zusätzliche Daten aus der Sanktionsquelle, die nicht in den Hauptfeldern erfasst wurden"
                      }
                    }
                  }
                },
                "adverse_media_details": {
                  "type": "object",
                  "properties": {
                    "sentiment": {
                      "type": "string"
                    },
                    "entity_type": {
                      "type": "string"
                    },
                    "sentiment_score": {
                      "type": "integer"
                    },
                    "adverse_keywords": {
                      "type": "object",
                      "additionalProperties": {
                        "type": "integer"
                      }
                    }
                  }
                },
                "adverse_media_matches": {
                  "type": "array",
                  "items": {
                    "type": "object",
                    "properties": {
                      "country": {
                        "type": "string"
                      },
                      "summary": {
                        "type": "string"
                      },
                      "headline": {
                        "type": "string"
                      },
                      "sentiment": {
                        "type": "string"
                      },
                      "thumbnail": {
                        "type": "string",
                        "format": "uri"
                      },
                      "source_url": {
                        "type": "string",
                        "format": "uri"
                      },
                      "author_name": {
                        "type": "string",
                        "nullable": true
                      },
                      "other_sources": {
                        "type": "array",
                        "items": {
                          "type": "string"
                        }
                      },
                      "adverse_keywords": {
                        "type": "array",
                        "items": {
                          "type": "string"
                        }
                      },
                      "sentiment_score": {
                        "type": "integer"
                      },
                      "publication_date": {
                        "type": "string",
                        "format": "date-time"
                      }
                    }
                  }
                },
                "additional_information": {
                  "type": "object"
                }
              }
            }
          },
          "score": {
            "type": "number",
            "format": "float",
            "nullable": true,
            "minimum": 0,
            "maximum": 100,
            "description": "Gesamter AML-Screening-Score — der höchste Risiko-Score über alle Treffer hinweg (Gleitkommazahl, 0-100). `null`, bis er berechnet wurde."
          },
          "screened_data": {
            "type": "object",
            "properties": {
              "full_name": {
                "type": "string"
              },
              "nationality": {
                "type": "string"
              },
              "date_of_birth": {
                "type": "string",
                "format": "date"
              },
              "document_number": {
                "type": "string",
                "nullable": true
              }
            }
          },
          "is_ongoing_monitoring_enabled": {
            "type": "boolean",
            "description": "Gibt an, ob die laufende AML-Überwachung für dieses Screening aktiviert ist. Wenn `true`, wird die Entität regelmäßig erneut überprüft und alle neuen Treffer aktualisieren den Bericht."
          },
          "next_ongoing_monitoring_bill_date": {
            "type": "string",
            "format": "date",
            "nullable": true,
            "description": "Datum (JJJJ-MM-TT), an dem dieses Abonnement für die laufende Überwachung als Nächstes abgerechnet wird. Berechnet als Datum der letzten Abrechnung für die laufende Überwachung plus 365 Tage, wenn `is_ongoing_monitoring_enabled = true`; andernfalls `null`. Dies ist ein Abrechnungsdatum, kein Screening-Datum – verwenden Sie dafür `last_ongoing_screening_at`."
          },
          "last_ongoing_screening_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "description": "Wann die laufende Überwachung zuletzt ein erneutes Screening dieses Datensatzes abgeschlossen hat, unabhängig davon, ob sich das Ergebnis geändert hat. `null`, wenn der Datensatz noch nie erneut überprüft wurde; der Wert wird niemals rückwirkend ab dem Aktivierungs- oder Abrechnungsdatum ausgefüllt."
          },
          "last_ongoing_screening_datasets_updated_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "description": "Das letzte Aktualisierungsdatum des AML-Datensatzes, das der Anbieter zum Zeitpunkt dieses Screenings gemeldet hat. `null`, wenn der Anbieter keine Datumsangaben zum Datensatz gemeldet hat; wird niemals geschätzt."
          },
          "warnings": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "feature": {
                  "type": "string",
                  "enum": [
                    "ID_VERIFICATION",
                    "NFC",
                    "LIVENESS",
                    "FACEMATCH",
                    "PROOF_OF_ADDRESS",
                    "PHONE",
                    "EMAIL",
                    "AML",
                    "LOCATION",
                    "DATABASE_VALIDATION",
                    "QUESTIONNAIRE",
                    "DOCUMENT_AI",
                    "KYB_REGISTRY",
                    "KYB_DOCUMENTS",
                    "KYB_KEY_PEOPLE",
                    "GEOLOCATION",
                    "SIGNATURE"
                  ],
                  "description": "Die Funktion, die diese Warnung generiert hat. Der Wert identifiziert den Funktionsblock, zu dem die Warnung gehört. Innerhalb eines AML-Screenings ist dies typischerweise `AML`, aber das obige Enum ist für alle Funktionswarnungen in der Decision-Payload maßgeblich."
                },
                "risk": {
                  "type": "string"
                },
                "additional_data": {
                  "type": "object",
                  "nullable": true
                },
                "log_type": {
                  "type": "string"
                },
                "short_description": {
                  "type": "string"
                },
                "long_description": {
                  "type": "string"
                },
                "node_id": {
                  "type": "string",
                  "description": "Die ID des Workflow-Graph-Knotens, der diese Warnung erzeugt hat"
                }
              }
            }
          }
        }
      },
      "MonitoringEvent": {
        "type": "object",
        "description": "Ein gespeichertes Überwachungsereignis, wie es von den Endpoints für Listen und Subjekt-Zeitachsen zurückgegeben wird. Eingeschränkte Nachweise (Payload, Gerätekontext, Regelbeweise) werden nur von `GET /v3/events/{event_uuid}/` zurückgegeben.",
        "required": [
          "event_uuid",
          "event_id",
          "event_category",
          "action_type",
          "occurred_at",
          "received_at",
          "status",
          "score",
          "subject_vendor_data",
          "subject_entity_type",
          "subject_uuid",
          "counterparty_vendor_data",
          "session_id",
          "device_fingerprint",
          "ip_address",
          "ip_country",
          "amount",
          "currency",
          "game_id",
          "round_id",
          "bonus_id",
          "affiliate_code",
          "payment_reference_id",
          "retention_class",
          "rules_matched_count",
          "correlation_pending",
          "is_droppable"
        ],
        "properties": {
          "event_uuid": {
            "type": "string",
            "format": "uuid",
            "description": "Didit-Kennung des Ereignisses. Verwenden Sie sie als `{event_uuid}` bei den Abruf- und Löschaufrufen."
          },
          "event_id": {
            "type": "string",
            "maxLength": 128,
            "description": "Ihre eigene Kennung, der von Ihnen übermittelte Idempotenzschlüssel."
          },
          "event_category": {
            "type": "string",
            "enum": [
              "auth",
              "session",
              "gameplay",
              "bonus",
              "affiliate",
              "payment",
              "dispute",
              "security",
              "responsible_gambling",
              "custom"
            ],
            "description": "Ereigniskategorie."
          },
          "action_type": {
            "type": "string",
            "maxLength": 128,
            "description": "Was innerhalb der Kategorie passiert ist, so wie Sie es gesendet haben."
          },
          "occurred_at": {
            "type": "string",
            "format": "date-time",
            "description": "Wann das Ereignis auf Ihrer Seite stattgefunden hat."
          },
          "received_at": {
            "type": "string",
            "format": "date-time",
            "description": "Wann Didit das Ereignis akzeptiert hat."
          },
          "status": {
            "type": "string",
            "enum": [
              "ACCEPTED",
              "APPROVED",
              "IN_REVIEW",
              "DECLINED"
            ],
            "description": "`ACCEPTED`: gespeichert, keine zutreffende Regel hat den Status geändert (die normale Antwort für die meisten Ereignisse und immer die Antwort in einer Sandbox-Anwendung, in der keine Regeln ausgeführt werden). `APPROVED`: eine Regel hat gegriffen und der Score blieb unter Ihrem Prüfungsschwellenwert. `IN_REVIEW`: eine Regel hat den Score über den Prüfungsschwellenwert verschoben oder den Status gesetzt. `DECLINED`: eine Regel hat es abgelehnt oder der Score hat Ihren Ablehnungsschwellenwert überschritten."
          },
          "score": {
            "type": "integer",
            "description": "Akkumulierter Regelwert. Beginnt bei 0; `add_score`-Regelaktionen verändern ihn (negative Werte sind zulässig)."
          },
          "subject_vendor_data": {
            "type": "string",
            "maxLength": 255,
            "description": "`subject.vendor_data` des Ereignisses: Ihre ID für den Benutzer oder das Unternehmen."
          },
          "subject_entity_type": {
            "type": "string",
            "description": "`individual` oder `company`: welche Art von Subjekt `subject_vendor_data` bezeichnet.",
            "example": "individual"
          },
          "subject_uuid": {
            "type": "string",
            "format": "uuid",
            "nullable": true,
            "description": "UUID des Benutzers (Einzelperson) oder Unternehmens, zu dem das Ereignis aufgelöst wurde, oder null, wenn dieser Datensatz nicht mehr existiert."
          },
          "counterparty_vendor_data": {
            "type": "string",
            "nullable": true,
            "description": "Der andere Beteiligte eines P2P-Ereignisses (hochgestuft aus `payload.counterparty_vendor_data`).",
            "maxLength": 255
          },
          "session_id": {
            "type": "string",
            "nullable": true,
            "description": "`session.session_id`, die mit dem Ereignis gesendet wurde.",
            "maxLength": 255
          },
          "device_fingerprint": {
            "type": "string",
            "nullable": true,
            "description": "`device_context.fingerprint`, der mit dem Ereignis gesendet wurde.",
            "maxLength": 255
          },
          "ip_address": {
            "type": "string",
            "nullable": true,
            "description": "Adresse des Ereignisses. Auf dem Serverpfad ist dies `device_context.network_context.ip_address`, wie von Ihnen gesendet; auf dem Gerätepfad ist es die IP der Anfrage.",
            "maxLength": 64
          },
          "ip_country": {
            "type": "string",
            "nullable": true,
            "description": "Ländercode von `ip_address` aus der IP-Anreicherung oder null, wenn die Adresse nicht angereichert wurde (fehlende, private oder geringwertige Telemetriedaten, deren Adresse noch nicht bekannt war).",
            "example": "ES"
          },
          "amount": {
            "type": "string",
            "nullable": true,
            "description": "Betrag als Dezimal-String mit 18 Nachkommastellen, aus `transaction_context.amount`, `payload.amount` oder `payload.stake_amount`, in dieser Reihenfolge.",
            "example": "250.000000000000000000"
          },
          "currency": {
            "type": "string",
            "nullable": true,
            "description": "Währung aus `transaction_context.currency` oder `payload.currency`.",
            "maxLength": 10
          },
          "game_id": {
            "type": "string",
            "nullable": true,
            "description": "Übernommen aus `payload.game_id`.",
            "maxLength": 128
          },
          "round_id": {
            "type": "string",
            "nullable": true,
            "description": "Übernommen aus `payload.round_id`.",
            "maxLength": 128
          },
          "bonus_id": {
            "type": "string",
            "nullable": true,
            "description": "Aus `payload.bonus_id` übernommen.",
            "maxLength": 128
          },
          "affiliate_code": {
            "type": "string",
            "nullable": true,
            "description": "Aus `payload.affiliate_code` übernommen.",
            "maxLength": 128
          },
          "payment_reference_id": {
            "type": "string",
            "nullable": true,
            "description": "Zahlungsreferenz aus `transaction_context.payment_reference_id` oder `payload.payment_reference_id`.",
            "maxLength": 255
          },
          "retention_class": {
            "type": "string",
            "enum": [
              "low_value",
              "standard",
              "risk_relevant",
              "monetary_or_compliance"
            ],
            "description": "Aufbewahrungsklasse. Zahlungs- und Streitfall-Ereignisse sind `monetary_or_compliance`; Sicherheits- und Spielerschutz-Ereignisse sind `risk_relevant`; `session.page_view`, `session.sdk_heartbeat`, `session.sdk_loaded`, `session.device_seen`, `session.bot_signal_observed`, `bonus.promotion_viewed` und `affiliate.referral_clicked` sind `low_value`; alles andere ist `standard`. Ein Ereignis, auf das eine aktive Regel zutrifft, wird auf `risk_relevant` hochgestuft (niemals herabgestuft)."
          },
          "rules_matched_count": {
            "type": "integer",
            "minimum": 0,
            "description": "Anzahl der Regeln, die auf das Ereignis zutrafen, einschließlich Regeln im `TEST`-Modus (die Nachweise aufzeichnen, aber keine Aktionen anwenden)."
          },
          "correlation_pending": {
            "type": "boolean",
            "description": "`true`, solange eine asynchrone Regel (subjektübergreifende Korrelation oder eine Sequenz von mehr als 24 Stunden) für dieses Ereignis noch ausgeführt werden muss. Sie wird innerhalb von Minuten aufgelöst, und `status`, `score` sowie `rules_matched_count` werden direkt aktualisiert."
          },
          "is_droppable": {
            "type": "boolean",
            "description": "Gibt an, ob ein SDK unter Systemüberlastung (Backpressure) Ereignisse dieser Art verwerfen darf. `false` für jedes `security`-, `payment`-, `dispute`- und `responsible_gambling`-Ereignis sowie für `gameplay.bet_placed`, `gameplay.bet_settled` und `gameplay.p2p_settlement`."
          }
        }
      },
      "MonitoringEventDetail": {
        "description": "Ein Überwachungsereignis mit vollständigem Envelope, Anreicherung und Regelnachweisen. Jedes Feld von `MonitoringEvent` plus die unten stehenden Felder.",
        "allOf": [
          {
            "$ref": "#/components/schemas/MonitoringEvent"
          },
          {
            "type": "object",
            "required": [
              "payload",
              "custom_values",
              "device_context",
              "field_sources",
              "session_sequence",
              "table_id",
              "hand_id",
              "match_id",
              "market_id",
              "side",
              "role",
              "net_result_amount",
              "payment_fingerprint",
              "instrument_reference_hash",
              "withdrawal_address_hash",
              "dispute_id",
              "chargeback_id",
              "changed_field",
              "identity_match_ref",
              "schema_version",
              "expires_at",
              "rules_evaluated_count",
              "rule_runs",
              "ip_enrichment",
              "subject_profile",
              "tags"
            ],
            "properties": {
              "payload": {
                "type": "object",
                "additionalProperties": true,
                "description": "Die Kategoriefelder, die Sie in `payload` gesendet haben."
              },
              "custom_values": {
                "type": "object",
                "additionalProperties": true,
                "description": "Die von Ihnen gesendeten skalaren `custom_values`. Didit fügt `vpn_or_proxy_detected: true` oder `is_data_center: true` hinzu, wenn die IP-Anreicherung die Adresse markiert und Sie diese nicht festgelegt haben."
              },
              "device_context": {
                "type": "object",
                "additionalProperties": true,
                "description": "Der gespeicherte Gerätekontext: Ihr `device_context` (einschließlich `fingerprint`, `persistent_device_id` und `bot_score`, falls gesendet) mit `network_context`, ergänzt durch IP-Anreicherung (`ip_country`, `ip_country_code`, `ip_city`, `asn_number`, `asn_organization`, `is_vpn_or_tor`, `is_data_center`, `proxy_type`, `connection_type`) für Schlüssel, die Sie leer gelassen haben."
              },
              "field_sources": {
                "type": "object",
                "additionalProperties": {
                  "type": "string",
                  "enum": [
                    "customer",
                    "sdk",
                    "server"
                  ]
                },
                "description": "Feldpfad zur Herkunft: `customer` (von Ihrem Backend gesendet), `sdk` (über die Gerätespur gesendet) oder `server` (von Didit abgeleitet, wie z. B. `received_at` und angereicherte Netzwerkfelder). Prüfen Sie diesen vor Maßnahmen bei einer Übereinstimmung."
              },
              "session_sequence": {
                "type": "integer",
                "format": "int64",
                "nullable": true,
                "description": "`session.sequence`, die mit dem Ereignis gesendet wurde."
              },
              "table_id": {
                "type": "string",
                "nullable": true,
                "description": "Übernommen aus `payload.table_id`.",
                "maxLength": 128
              },
              "hand_id": {
                "type": "string",
                "nullable": true,
                "description": "Übernommen aus `payload.hand_id`.",
                "maxLength": 128
              },
              "match_id": {
                "type": "string",
                "nullable": true,
                "description": "Übernommen aus `payload.match_id`.",
                "maxLength": 128
              },
              "market_id": {
                "type": "string",
                "nullable": true,
                "description": "Übernommen aus `payload.market_id`.",
                "maxLength": 128
              },
              "side": {
                "type": "string",
                "nullable": true,
                "description": "Übernommen aus `payload.side`.",
                "maxLength": 64
              },
              "role": {
                "type": "string",
                "nullable": true,
                "description": "Übernommen aus `payload.role`.",
                "maxLength": 64
              },
              "net_result_amount": {
                "type": "string",
                "nullable": true,
                "description": "Übernommen aus `payload.net_result_amount`, als Dezimal-String mit 18 Dezimalstellen.",
                "example": "-120.000000000000000000"
              },
              "payment_fingerprint": {
                "type": "string",
                "nullable": true,
                "description": "Übernommen aus `payload.payment_fingerprint`.",
                "maxLength": 255
              },
              "instrument_reference_hash": {
                "type": "string",
                "nullable": true,
                "description": "Übernommen aus `payload.instrument_reference_hash`.",
                "maxLength": 255
              },
              "withdrawal_address_hash": {
                "type": "string",
                "nullable": true,
                "description": "Übernommen aus `payload.withdrawal_address_hash` (oder `payload.destination_reference_hash`).",
                "maxLength": 255
              },
              "dispute_id": {
                "type": "string",
                "nullable": true,
                "description": "Übernommen aus `payload.dispute_id`.",
                "maxLength": 255
              },
              "chargeback_id": {
                "type": "string",
                "nullable": true,
                "description": "Übernommen aus `payload.chargeback_id`.",
                "maxLength": 255
              },
              "changed_field": {
                "type": "string",
                "nullable": true,
                "description": "Übernommen aus `payload.changed_field` (Sicherheitsänderungsereignisse).",
                "maxLength": 128
              },
              "identity_match_ref": {
                "type": "string",
                "nullable": true,
                "description": "Übernommen aus `payload.identity_match_ref` (Treffer im Register für verantwortungsvolles Spielen).",
                "maxLength": 255
              },
              "schema_version": {
                "type": "integer",
                "description": "Version des Ereignis-Envelope-Schemas. Derzeit `1`.",
                "example": 1
              },
              "expires_at": {
                "type": "string",
                "format": "date-time",
                "nullable": true,
                "description": "Wann das Ereignis gemäß seiner Aufbewahrungsklasse abläuft und gelöscht wird: `occurred_at` zuzüglich der Klassenfrist (standardmäßig 14, 30 oder 90 Tage, anpassbar pro Anwendung). Null für `monetary_or_compliance`-Ereignisse, die der Transaktionsaufbewahrung folgen."
              },
              "rules_evaluated_count": {
                "type": "integer",
                "minimum": 0,
                "description": "Anzahl der für dieses Ereignis ausgewerteten Ereignisregeln."
              },
              "rule_runs": {
                "type": "array",
                "description": "Jede Regel, die auf das Ereignis zutraf, die neueste zuerst.",
                "items": {
                  "$ref": "#/components/schemas/MonitoringEventRuleRun"
                }
              },
              "ip_enrichment": {
                "type": "object",
                "nullable": true,
                "description": "Anreicherung der Adresse des Ereignisses oder null, wenn die Adresse nicht angereichert wurde. Siehe [Anreicherung der Adresse](https://docs.didit.me/de/transaction-monitoring/ip-enrichment).",
                "properties": {
                  "ip_country_code": {
                    "type": "string",
                    "nullable": true,
                    "description": "Ländercode der Adresse."
                  },
                  "ip_city": {
                    "type": "string",
                    "nullable": true,
                    "description": "Stadt der Adresse."
                  },
                  "asn_number": {
                    "type": "integer",
                    "nullable": true,
                    "description": "Nummer des autonomen Systems."
                  },
                  "asn_organization": {
                    "type": "string",
                    "nullable": true,
                    "description": "Organisation, die das autonome System betreibt."
                  },
                  "is_vpn_or_tor": {
                    "type": "boolean",
                    "description": "Gibt an, ob die Adresse ein bekannter VPN- oder Tor-Exit-Node ist."
                  },
                  "is_data_center": {
                    "type": "boolean",
                    "description": "Gibt an, ob die Adresse zu einem Hosting- oder Rechenzentrumsnetzwerk gehört."
                  },
                  "proxy_type": {
                    "type": "string",
                    "nullable": true,
                    "description": "Proxy-Klassifizierung der Adresse als opaker String oder null."
                  },
                  "last_enriched_at": {
                    "type": "string",
                    "format": "date-time",
                    "nullable": true,
                    "description": "Wann die Adresse zuletzt angereichert wurde."
                  }
                },
                "required": [
                  "ip_country_code",
                  "ip_city",
                  "asn_number",
                  "asn_organization",
                  "is_vpn_or_tor",
                  "is_data_center",
                  "proxy_type",
                  "last_enriched_at"
                ]
              },
              "subject_profile": {
                "type": "object",
                "nullable": true,
                "description": "Gecachte E-Mail- und Telefon-Risikosignale der Person, oder null, wenn kein Profil für die Person existiert.",
                "properties": {
                  "email_risk_score": {
                    "type": "integer",
                    "nullable": true,
                    "description": "E-Mail-Risiko-Score."
                  },
                  "email_deliverability": {
                    "type": "string",
                    "nullable": true,
                    "description": "Ergebnis zur E-Mail-Zustellbarkeit."
                  },
                  "email_is_disposable": {
                    "type": "boolean",
                    "nullable": true,
                    "description": "Gibt an, ob es sich um eine Wegwerf-E-Mail-Adresse handelt."
                  },
                  "email_is_breached": {
                    "type": "boolean",
                    "nullable": true,
                    "description": "Gibt an, ob die E-Mail-Adresse in bekannten Datenlecks vorkommt."
                  },
                  "email_social_count": {
                    "type": "integer",
                    "nullable": true,
                    "description": "Anzahl der mit der E-Mail-Adresse verknüpften Online-Konten."
                  },
                  "email_social_providers": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    },
                    "description": "Namen der Online-Dienste, bei denen ein mit der E-Mail-Adresse verknüpftes Konto gefunden wurde."
                  },
                  "phone_risk_score": {
                    "type": "integer",
                    "nullable": true,
                    "description": "Telefon-Risiko-Score."
                  },
                  "phone_line_type": {
                    "type": "string",
                    "nullable": true,
                    "description": "Telefonleitungstyp."
                  },
                  "phone_carrier": {
                    "type": "string",
                    "nullable": true,
                    "description": "Name des Mobilfunkanbieters."
                  },
                  "phone_social_count": {
                    "type": "integer",
                    "nullable": true,
                    "description": "Anzahl der mit der Telefonnummer verknüpften Online-Konten."
                  },
                  "phone_social_providers": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    },
                    "description": "Namen der Online-Dienste, bei denen ein mit der Telefonnummer verknüpftes Konto gefunden wurde."
                  },
                  "source_provider": {
                    "type": "string",
                    "nullable": true,
                    "description": "Opake Kennung der Quelle des Profils."
                  },
                  "last_enriched_at": {
                    "type": "string",
                    "format": "date-time",
                    "nullable": true,
                    "description": "Wann das Profil zuletzt aktualisiert wurde."
                  }
                },
                "required": [
                  "email_risk_score",
                  "email_deliverability",
                  "email_is_disposable",
                  "email_is_breached",
                  "email_social_count",
                  "email_social_providers",
                  "phone_risk_score",
                  "phone_line_type",
                  "phone_carrier",
                  "phone_social_count",
                  "phone_social_providers",
                  "source_provider",
                  "last_enriched_at"
                ]
              },
              "tags": {
                "type": "array",
                "items": {
                  "type": "string"
                },
                "description": "Namen der an das Ereignis angehängten Tags (`add_tags`-Aktionen der Regel)."
              }
            }
          }
        ]
      },
      "MonitoringEventRuleRun": {
        "type": "object",
        "properties": {
          "rule_uuid": {
            "type": "string",
            "format": "uuid",
            "description": "UUID der Transaktionsüberwachungsregel."
          },
          "rule_title": {
            "type": "string",
            "description": "Titel der Regel."
          },
          "library_key": {
            "type": "string",
            "nullable": true,
            "description": "Bibliotheksschlüssel, wenn die Regel aus der Regelbibliothek installiert wurde, andernfalls null."
          },
          "matched": {
            "type": "boolean",
            "description": "Immer `true`: Es werden nur übereinstimmende Durchläufe erfasst."
          },
          "mode": {
            "type": "string",
            "enum": [
              "ACTIVE",
              "TEST"
            ],
            "description": "Modus der Regel bei ihrer Ausführung. Eine `TEST`-Ausführung zeichnet Nachweise auf, wendet jedoch keine Aktionen an."
          },
          "is_async": {
            "type": "boolean",
            "description": "`true`, wenn der Durchlauf aus dem asynchronen Korrelationsdurchlauf statt aus der Ingest-Anfrage stammte."
          },
          "severity": {
            "type": "string",
            "nullable": true,
            "enum": [
              "UNKNOWN",
              "LOW",
              "MEDIUM",
              "HIGH",
              "CRITICAL",
              null
            ],
            "description": "Schweregrad der Regel. Null für `TEST`-Durchläufe und für Regeln ohne Schweregrad."
          },
          "score_delta": {
            "type": "integer",
            "description": "Wie stark dieser Durchlauf den Score des Ereignisses verändert hat (0 für `TEST`-Durchläufe)."
          },
          "action_summary": {
            "type": "string",
            "nullable": true,
            "description": "Kurze Zusammenfassung der angewendeten Aktionen, zum Beispiel `score +40; add_tag:VPN_LOGIN`. Null, wenn nichts angewendet wurde."
          },
          "matched_payload": {
            "type": "array",
            "description": "Die Bedingungen und Aggregationen, die übereinstimmten. Bedingungseinträge enthalten `field`, `operator`, `expected_value`, `current_value`, `matched`, `group_index`, `group_logic` und `field_source` (`server`, `sdk` oder `customer`); Aggregationseinträge enthalten `metric`, `field`, `operator`, `expected_value`, `computed_value`, `window`, `filters`, `matched` und `sample_references`.",
            "items": {
              "type": "object",
              "additionalProperties": true
            }
          },
          "created_at": {
            "type": "string",
            "format": "date-time",
            "description": "Wann die Regelausführung protokolliert wurde."
          }
        },
        "required": [
          "rule_uuid",
          "rule_title",
          "library_key",
          "matched",
          "mode",
          "is_async",
          "severity",
          "score_delta",
          "action_summary",
          "matched_payload",
          "created_at"
        ]
      },
      "MonitoringEventPage": {
        "type": "object",
        "description": "Eine Seite mit Überwachungsereignissen, der neueste Wert von `occurred_at` zuerst.",
        "required": [
          "count",
          "next",
          "previous",
          "results"
        ],
        "properties": {
          "count": {
            "type": "integer",
            "description": "Anzahl der übereinstimmenden Ereignisse, exakt bis 100 und darüber auf 100 begrenzt. Berechnen Sie daraus keine Seitenzahlen; folgen Sie `next`, bis es null ist."
          },
          "next": {
            "type": "string",
            "format": "uri",
            "nullable": true,
            "description": "URL der nächsten Seite oder null auf der letzten Seite."
          },
          "previous": {
            "type": "string",
            "format": "uri",
            "nullable": true,
            "description": "URL der vorherigen Seite oder null auf der ersten Seite."
          },
          "results": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/MonitoringEvent"
            }
          }
        }
      },
      "MonitoringEventCreateRequest": {
        "type": "object",
        "description": "Der Event-Envelope, identisch für jede Kategorie. camelCase-Aliase werden akzeptiert: `eventId`, `eventCategory` (oder `category`), `actionType`, `occurredAt`, `timeZone` (oder `zoneId`), `deviceContext` (oder `device`), `transactionContext`, `customValues` (oder `props`); innerhalb von `subject`: `vendorData`, `entityType`, `fullName`; innerhalb von `session`: `sessionId`, `pageUrl`; innerhalb von `transaction_context`: `paymentReferenceId`.",
        "required": [
          "event_id",
          "event_category",
          "action_type",
          "occurred_at",
          "subject"
        ],
        "properties": {
          "event_id": {
            "type": "string",
            "maxLength": 128,
            "description": "Ihre Kennung für das Ereignis, eindeutig pro Anwendung. Sie ist der Idempotenzschlüssel: Das erneute Senden derselben Werte für `event_category`, `action_type`, `occurred_at`, `subject.vendor_data` und `payload` unter dieser Kennung ist eine Wiederholung, jede Abweichung ist ein Konflikt.",
            "example": "login-2026-10-17-000001"
          },
          "event_category": {
            "type": "string",
            "enum": [
              "auth",
              "session",
              "gameplay",
              "bonus",
              "affiliate",
              "payment",
              "dispute",
              "security",
              "responsible_gambling",
              "custom"
            ],
            "description": "Ereigniskategorie.",
            "example": "auth"
          },
          "action_type": {
            "type": "string",
            "minLength": 1,
            "maxLength": 128,
            "description": "Was innerhalb der Kategorie passiert ist. Offenes Vokabular; die in [Ereigniserfassung](https://docs.didit.me/de/transaction-monitoring/events) aufgeführten verwalteten Aktionen (beispielsweise `login`, `deposit_completed`, `chargeback_opened`) schalten eine typisierte Validierung und verwaltete Regelfelder frei. Führende und nachfolgende Leerzeichen werden gekürzt.",
            "example": "login"
          },
          "occurred_at": {
            "type": "string",
            "format": "date-time",
            "description": "Wann das Ereignis auf Ihrer Seite stattgefunden hat, ISO 8601 (ein Wert ohne Offset wird als UTC interpretiert). Darf nicht mehr als 7 Tage in der Vergangenheit und nicht mehr als 5 Minuten in der Zukunft liegen.",
            "example": "2026-10-17T09:15:02.481Z"
          },
          "time_zone": {
            "type": "string",
            "nullable": true,
            "maxLength": 64,
            "description": "Zeitzone des Ereignisses auf Ihrer Seite, zum Beispiel `Europe/Madrid`. Wird mit dem Ereignis gespeichert; wird von den Lese-Endpoints nicht zurückgegeben."
          },
          "subject": {
            "type": "object",
            "description": "Der Benutzer oder das Unternehmen, zu dem das Ereignis gehört. Es verweist auf den Benutzer (oder das Unternehmen) mit diesen `vendor_data` in Ihrer Anwendung; falls keines vorhanden ist, wird eines erstellt.",
            "required": [
              "vendor_data"
            ],
            "properties": {
              "vendor_data": {
                "type": "string",
                "minLength": 1,
                "maxLength": 255,
                "description": "Ihre ID für das Subjekt.",
                "example": "user-42"
              },
              "entity_type": {
                "type": "string",
                "maxLength": 32,
                "default": "individual",
                "description": "`company` löst das Subjekt zu einem Unternehmen auf; jeder andere Wert (Standard `individual`) löst es zu einer Einzelperson auf. Dasselbe `vendor_data` kann jeweils ein Unternehmen und eine Einzelperson benennen.",
                "example": "individual"
              },
              "full_name": {
                "type": "string",
                "nullable": true,
                "maxLength": 512,
                "description": "Anzeigename, der nur verwendet wird, wenn dieses Ereignis den Benutzer oder das Unternehmen erstellt."
              },
              "email": {
                "type": "string",
                "format": "email",
                "nullable": true,
                "description": "Als E-Mail-Adresse validiert; wird nicht im Ereignis gespeichert."
              },
              "phone": {
                "type": "string",
                "nullable": true,
                "maxLength": 32,
                "description": "Validiert; wird nicht im Ereignis gespeichert."
              },
              "country": {
                "type": "string",
                "nullable": true,
                "maxLength": 3,
                "description": "Validiert; wird nicht im Ereignis gespeichert."
              }
            }
          },
          "business": {
            "type": "object",
            "description": "Das Unternehmen, zu dem das Ereignis gehört, sofern es sich vom Subjekt unterscheidet. Es wird nur `vendor_data` gelesen.",
            "additionalProperties": true,
            "properties": {
              "vendor_data": {
                "type": "string",
                "maxLength": 255,
                "description": "Ihre ID für das Unternehmen. Filterbar als `business_vendor_data`.",
                "example": "merchant-7"
              }
            }
          },
          "session": {
            "type": "object",
            "description": "Ihr Sitzungskontext für das Ereignis.",
            "properties": {
              "session_id": {
                "type": "string",
                "nullable": true,
                "maxLength": 255,
                "description": "Ihre Sitzungskennung. Filterbar und als `session_id` zurückgegeben."
              },
              "sequence": {
                "type": "integer",
                "nullable": true,
                "description": "Position des Ereignisses innerhalb der Sitzung. Wird als `session_sequence` zurückgegeben."
              },
              "page_url": {
                "type": "string",
                "nullable": true,
                "maxLength": 2048,
                "description": "Validiert; wird nicht im Ereignis gespeichert."
              },
              "referrer": {
                "type": "string",
                "nullable": true,
                "maxLength": 2048,
                "description": "Validiert; wird nicht im Ereignis gespeichert."
              }
            }
          },
          "device_context": {
            "type": "object",
            "additionalProperties": true,
            "description": "Geräte- und Netzwerkkontext, wird so gespeichert, wie er gesendet wird, und von `GET /v3/events/{event_uuid}/` zurückgegeben. Auf dieser Serverstrecke sieht Didit die Verbindung des Endbenutzers nicht, daher ist die IP, die angereichert und von Regeln verwendet wird, `network_context.ip_address`, wie Sie sie übermitteln.",
            "properties": {
              "fingerprint": {
                "type": "string",
                "maxLength": 255,
                "description": "Geräte-Fingerprint. Filterbar als `device_fingerprint`."
              },
              "persistent_device_id": {
                "type": "string",
                "maxLength": 255,
                "description": "Ihre persistente Gerätekennung."
              },
              "bot_score": {
                "type": "integer",
                "description": "Bot-Score aus Ihrer eigenen Erkennung als Ganzzahl."
              },
              "network_context": {
                "type": "object",
                "additionalProperties": true,
                "properties": {
                  "ip_address": {
                    "type": "string",
                    "maxLength": 64,
                    "description": "Adresse des Endbenutzers. Öffentliche Adressen werden einmal pro eindeutiger Adresse angereichert.",
                    "example": "203.0.113.42"
                  }
                }
              }
            }
          },
          "transaction_context": {
            "type": "object",
            "description": "Finanzkontext. Nicht leere Werte hier erfüllen auch die erforderlichen Payload-Schlüssel der Aktion.",
            "properties": {
              "amount": {
                "type": "string",
                "nullable": true,
                "description": "Betrag als Dezimal-String (eine Zahl wird ebenfalls akzeptiert).",
                "example": "1000.00"
              },
              "currency": {
                "type": "string",
                "nullable": true,
                "maxLength": 10,
                "description": "Währungscode."
              },
              "direction": {
                "type": "string",
                "nullable": true,
                "maxLength": 16,
                "description": "Richtung der Geldbewegung, zum Beispiel `inbound` oder `outbound`."
              },
              "payment_reference_id": {
                "type": "string",
                "nullable": true,
                "maxLength": 255,
                "description": "Ihre Zahlungsreferenz. Filterbar als `payment_reference_id`."
              }
            }
          },
          "payload": {
            "type": "object",
            "additionalProperties": true,
            "description": "Die Domänenfelder der Kategorie, nach der JSON-Codierung maximal 16384 Bytes groß. Einige Aktionen erfordern Schlüssel (in `payload` oder `transaction_context`): `gameplay.p2p_settlement` erfordert `game_id`, `counterparty_vendor_data`, `stake_amount`, `net_result_amount`, `role` und eines von `hand_id`, `round_id`, `match_id`; `gameplay.bet_placed` und `gameplay.bet_settled` erfordern `game_id`; `payment.deposit_initiated`, `payment.deposit_completed`, `payment.withdrawal_requested` und `payment.withdrawal_completed` erfordern `payment_reference_id`, `amount`, `currency`, `payment_method`, `status`; `payment.withdrawal_address_changed` erfordert `withdrawal_address_hash`; `dispute.chargeback_opened`, `dispute.chargeback_won` und `dispute.chargeback_lost` erfordern `payment_reference_id` und eines von `dispute_id`, `chargeback_id`; `session.bot_signal_observed` erfordert `telemetry_schema_version` und eines von `bot_score`, `actions_per_minute`, `timing_variance_ms`, `pointer_entropy`, `keystroke_entropy`, `reaction_time_ms_p50`; `responsible_gambling.self_exclusion_match` erfordert `registry_source`, `exclusion_status`, `identity_match_ref`. Jede `security`-Aktion, die auf `_changed` endet, erfordert `changed_field` sowie `previous_reference_hash` oder `new_reference_hash`, wenn das Feld `password`, `mfa_method`, `mfa`, `email`, `phone`, `withdrawal_address`, `payout_method` oder `api_key` ist. Senden Sie Hashes und Referenzen, niemals eine Kartennummer, eine vollständige Auszahlungsadresse, einen Passwort-Hash oder ein MFA-Geheimnis."
          },
          "custom_values": {
            "type": "object",
            "description": "Bis zu 100 eigene Schlüssel, die aus Regeln als `custom_values.<key>` adressierbar sind. Werte müssen Skalare sein (Zeichenfolge, Zahl, boolescher Wert oder null); verschachtelte Objekte und Arrays werden abgelehnt.",
            "additionalProperties": {
              "nullable": true,
              "oneOf": [
                {
                  "type": "string"
                },
                {
                  "type": "number"
                },
                {
                  "type": "boolean"
                }
              ]
            }
          }
        },
        "example": {
          "event_id": "login-2026-10-17-000001",
          "event_category": "auth",
          "action_type": "login",
          "occurred_at": "2026-10-17T09:15:02.481Z",
          "time_zone": "Europe/Madrid",
          "subject": {
            "vendor_data": "user-42",
            "entity_type": "individual"
          },
          "session": {
            "session_id": "web-session-abc",
            "sequence": 142
          },
          "device_context": {
            "fingerprint": "fp-a8c1",
            "network_context": {
              "ip_address": "203.0.113.42"
            }
          },
          "payload": {
            "method": "password"
          },
          "custom_values": {
            "vip_tier": "gold"
          }
        }
      },
      "MonitoringEventIngestResult": {
        "type": "object",
        "description": "Ergebnis der Erfassung eines Ereignisses. Für ein neues Ereignis und eine idempotente Wiederholung wird dieselbe Struktur zurückgegeben.",
        "required": [
          "event_uuid",
          "event_id",
          "status",
          "score",
          "rules_evaluated_count",
          "rules_matched_count",
          "correlation_pending",
          "retention_class",
          "expires_at",
          "idempotent_replay",
          "rule_matches"
        ],
        "properties": {
          "event_uuid": {
            "type": "string",
            "format": "uuid",
            "description": "Didit-Kennung des gespeicherten Ereignisses."
          },
          "event_id": {
            "type": "string",
            "description": "Ihre `event_id`."
          },
          "status": {
            "type": "string",
            "enum": [
              "ACCEPTED",
              "APPROVED",
              "IN_REVIEW",
              "DECLINED"
            ],
            "description": "Status nach Ausführung der Echtzeitregeln. Siehe `MonitoringEvent.status`."
          },
          "score": {
            "type": "integer",
            "description": "Score nach Ausführung der Echtzeitregeln."
          },
          "rules_evaluated_count": {
            "type": "integer",
            "minimum": 0,
            "description": "Anzahl der in der Anfrage ausgewerteten Ereignisregeln. 0 in einer Sandbox-Anwendung, in der keine Regeln ausgeführt werden."
          },
          "rules_matched_count": {
            "type": "integer",
            "minimum": 0,
            "description": "Anzahl der zutreffenden Regeln, einschließlich Regeln im `TEST`-Modus."
          },
          "correlation_pending": {
            "type": "boolean",
            "description": "`true`, wenn eine asynchrone Regel noch ausgeführt werden muss. Rufen Sie einige Minuten später `GET /v3/events/{event_uuid}/` auf, um den endgültigen `status` und `score` zu erhalten."
          },
          "retention_class": {
            "type": "string",
            "enum": [
              "low_value",
              "standard",
              "risk_relevant",
              "monetary_or_compliance"
            ],
            "description": "Aufbewahrungsklasse nach einer Hochstufung durch eine zutreffende Regel."
          },
          "expires_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "description": "Wann das Ereignis gemäß seiner Aufbewahrungsklasse abläuft und gelöscht wird. Null für `monetary_or_compliance`-Ereignisse (Zahlungen und Streitfälle)."
          },
          "idempotent_replay": {
            "type": "boolean",
            "description": "`true`, wenn ein Ereignis mit dieser `event_id` und demselben Inhalt bereits gespeichert war; die Werte entsprechen denen des gespeicherten Ereignisses und es wurde keine Regel erneut ausgeführt."
          },
          "rule_matches": {
            "type": "array",
            "description": "Regeln, die auf das Ereignis zutrafen.",
            "items": {
              "type": "object",
              "required": [
                "rule_id",
                "library_key",
                "mode",
                "is_async"
              ],
              "properties": {
                "rule_id": {
                  "type": "string",
                  "format": "uuid",
                  "description": "UUID der Regel."
                },
                "library_key": {
                  "type": "string",
                  "nullable": true,
                  "description": "Bibliotheksschlüssel, wenn die Regel aus der Regelbibliothek installiert wurde, andernfalls null."
                },
                "mode": {
                  "type": "string",
                  "enum": [
                    "ACTIVE",
                    "TEST"
                  ],
                  "description": "`TEST`-Regeln erfassen die Übereinstimmung, wenden aber keine Aktionen an."
                },
                "is_async": {
                  "type": "boolean",
                  "description": "`true`, wenn die Übereinstimmung aus dem asynchronen Durchlauf stammt."
                }
              }
            }
          }
        }
      },
      "ComplianceList": {
        "type": "object",
        "description": "Eine Sperrliste, Positivliste oder benutzerdefinierte Liste einer Anwendung.",
        "required": [
          "uuid",
          "name",
          "description",
          "list_type",
          "entry_type",
          "is_system",
          "entry_count",
          "last_entry_added_at",
          "created_at",
          "updated_at"
        ],
        "properties": {
          "uuid": {
            "type": "string",
            "format": "uuid",
            "description": "Listen-Identifikator. Verwenden Sie ihn als `list_uuid` in den Listen- und Eintrag-Endpoints sowie als Wert einer Workflow- oder Transaktionsregel-Bedingung mit `value_type: \"list\"`."
          },
          "name": {
            "type": "string",
            "maxLength": 255,
            "description": "Listenname, eindeutig unter den Listen der Anwendung."
          },
          "description": {
            "type": "string",
            "description": "Freitext-Beschreibung. Leere Zeichenkette, wenn nicht festgelegt."
          },
          "list_type": {
            "type": "string",
            "enum": [
              "blocklist",
              "allowlist",
              "custom"
            ],
            "description": "`blocklist`: Eine Übereinstimmung lehnt die Sitzung oder Transaktion ab (nur Systemlisten, eine pro Eintragstyp). `allowlist`: Übereinstimmende Elemente gelten als vertrauenswürdig, beispielsweise überspringt eine Gesichts-Allowlist die Aktion für doppelte Gesichter; überschreibt niemals eine Sperrlisten-Übereinstimmung. `custom`: Wird in Workflow- und Transaktionsregel-Bedingungen verwendet (`value_type: \"list\"`)."
          },
          "entry_type": {
            "type": "string",
            "enum": [
              "face",
              "document",
              "phone",
              "email",
              "ip_address",
              "device_fingerprint",
              "wallet_address",
              "bank_account",
              "country",
              "user",
              "business",
              "key"
            ],
            "description": "Was die Liste enthält: `face`, `document` (Dokumentennummer), `phone`, `email`, `ip_address` (Adresse oder CIDR-Bereich), `device_fingerprint`, `wallet_address`, `bank_account`, `country` (ISO 3166-1 Alpha-3), `user` oder `business` (Ihre `vendor_data`) oder `key` (eine beliebige Zeichenkette). Damit wird bestimmt, wie Eintragswerte validiert und abgeglichen werden."
          },
          "is_system": {
            "type": "boolean",
            "description": "`true` für die von Didit bereitgestellten Listen: eine Sperrliste pro Eintragstyp (`face`, `document`, `phone`, `email`, `ip_address`, `device_fingerprint`, `wallet_address`, `bank_account`, `user`, `business`), die benutzerdefinierte Liste **High Risk Countries** und System-Positivlisten. Systemlisten können weder umbenannt noch bearbeitet oder gelöscht werden; Sie können deren Einträge hinzufügen und löschen."
          },
          "entry_count": {
            "type": "integer",
            "minimum": 0,
            "description": "Anzahl der Einträge, die sich derzeit in der Liste befinden."
          },
          "last_entry_added_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "description": "Wann der neueste aktuelle Eintrag hinzugefügt wurde. `null` bei einer leeren Liste."
          },
          "created_at": {
            "type": "string",
            "format": "date-time",
            "description": "Wann die Liste erstellt wurde."
          },
          "updated_at": {
            "type": "string",
            "format": "date-time",
            "description": "Wann die Liste zuletzt aktualisiert wurde."
          }
        }
      },
      "ComplianceListEntry": {
        "type": "object",
        "description": "Ein Wert in einer Liste.",
        "required": [
          "uuid",
          "value",
          "display_label",
          "comment",
          "added_by",
          "reference_session_id",
          "reference_session_number",
          "reference_session_type",
          "reference_object_uuid",
          "metadata",
          "created_at"
        ],
        "properties": {
          "uuid": {
            "type": "string",
            "format": "uuid",
            "description": "Eintrags-ID. Verwenden Sie sie als `entry_uuid` in „Listeneintrag löschen“."
          },
          "value": {
            "type": "string",
            "description": "Der gelistete Wert: eine Telefonnummer in E.164, eine E-Mail-Adresse, eine Dokumentennummer, eine IP-Adresse oder ein CIDR-Bereich, ein Geräte-Fingerprint, eine Wallet-Adresse, ein Bankkonto, ein Ländercode nach ISO 3166-1 Alpha-3, ein `vendor_data`, eine beliebige Zeichenfolge auf einer `key`-Liste oder die UUID des gespeicherten Gesichts auf einer Gesichtsliste. Von Ihnen gesendete Werte werden in Kleinbuchstaben gespeichert, mit Ausnahme von Telefonnummern und Ländercodes. Der Abgleich erfolgt ohne Berücksichtigung der Groß-/Kleinschreibung."
          },
          "display_label": {
            "type": "string",
            "nullable": true,
            "maxLength": 512,
            "description": "Lesbare Bezeichnung. Didit füllt sie für aus einer Sitzung übernommene Einträge aus (beispielsweise Name und Dokumentennummer des Inhabers), wenn Sie keine übermitteln."
          },
          "comment": {
            "type": "string",
            "description": "Freitext-Notiz. Leere Zeichenkette, wenn nicht festgelegt."
          },
          "added_by": {
            "type": "string",
            "nullable": true,
            "description": "Wer den Eintrag hinzugefügt hat: `api` (ein API-Schlüssel), die E-Mail-Adresse eines Benutzers der Konsole oder `console`, `system` oder `migration` (von Didit erstellte Einträge) oder `rule` (eine Transaktions- oder Überwachungsregel-Aktion)."
          },
          "reference_session_id": {
            "type": "string",
            "format": "uuid",
            "nullable": true,
            "description": "Verifizierungssitzung, aus der der Eintrag übernommen wurde. `null`, wenn der Eintrag als Wert hinzugefügt wurde."
          },
          "reference_session_number": {
            "type": "integer",
            "nullable": true,
            "description": "Nummer dieser Sitzung innerhalb der Anwendung, wie in der Console angezeigt."
          },
          "reference_session_type": {
            "type": "string",
            "nullable": true,
            "enum": [
              "kyc",
              "kyb",
              null
            ],
            "description": "`kyc` für eine Sitzung zur Personenverifizierung, `kyb` für eine Sitzung zur Unternehmensverifizierung, `null`, wenn keine Sitzung vorhanden ist."
          },
          "reference_object_uuid": {
            "type": "string",
            "format": "uuid",
            "nullable": true,
            "description": "Der Datensatz, für den der Eintrag steht: der aus einer Sitzung gelesene Gesichts-, Dokumenten-, Telefon- oder E-Mail-Datensatz, das über Ein Gesicht zu einer Liste hochladen erstellte Gesicht oder die von Ihnen gesendete UUID (z. B. eine Transaktions-UUID oder die `didit_internal_id` eines Benutzers)."
          },
          "metadata": {
            "type": "object",
            "nullable": true,
            "additionalProperties": true,
            "description": "Zusätzlicher Kontext. Enthält die von Didit festgelegten Schlüssel (hier aufgeführt), zusammengeführt mit allen `metadata`, die Sie beim Erstellen des Eintrags gesendet haben, zurückgegeben wie gespeichert. `null`, wenn keine vorhanden sind.",
            "properties": {
              "reference_image_url": {
                "type": "string",
                "description": "Gesichtseinträge: kurzlebige signierte URL, die bei jedem Aufruf neu ausgestellt wird; `null` für einen berechtigungseingeschränkten API-Schlüssel ohne `media: read`. Fehlt, wenn kein Bild zum Eintrag gehört."
              },
              "front_image_url": {
                "type": "string",
                "description": "Dokumenteneinträge, die ein Bild der Dokumentenvorderseite enthalten: kurzlebige signierte URL, die bei jedem Aufruf neu ausgestellt wird; `null` für einen berechtigungseingeschränkten API-Schlüssel ohne `media: read`."
              },
              "full_name": {
                "type": "string",
                "description": "Aus einer Sitzung übernommene Dokumenteneinträge: vollständiger Name des Inhabers."
              },
              "issuing_state": {
                "type": "string",
                "description": "Aus einer Sitzung übernommene Dokumenteneinträge: Ausstellungsland nach ISO 3166-1 Alpha-3."
              },
              "document_type": {
                "type": "string",
                "description": "Aus einer Sitzung übernommene Dokumenteneinträge: Dokumenttyp-Code, zum Beispiel `P`, `ID` oder `DL`."
              },
              "region": {
                "type": "string",
                "description": "Aus einer Sitzung übernommene Dokumenteneinträge: Ausstellungs-Bundesstaat oder -Provinz eines regional ausgestellten Dokuments, leer, falls nicht zutreffend. Wird durch „Sitzungselemente zur Sperrliste hinzufügen“ nicht gesetzt."
              },
              "document_number": {
                "type": "string",
                "description": "Aus einer Sitzung übernommene Dokumenteneinträge: die Dokumentennummer."
              },
              "face_image_source": {
                "type": "string",
                "enum": [
                  "front_image_camera_front",
                  "back_image_camera_front"
                ],
                "description": "Aus einem Selfie bei der Dokumentenerfassung übernommene Gesichtseinträge: welches Selfie. Fehlt bei Liveness-Gesichtern."
              },
              "reference_node_id": {
                "type": "string",
                "nullable": true,
                "description": "Aus einem Selfie bei der Dokumentenerfassung übernommene Gesichtseinträge: der Ausweisverifizierungs-Knoten, aus dem das Selfie stammt."
              },
              "fingerprint_tier": {
                "type": "string",
                "nullable": true,
                "enum": [
                  "persistent_id",
                  "composite_hash",
                  "legacy_fp",
                  "unknown",
                  null
                ],
                "description": "Aus einer Sitzung erfasste Geräte-Fingerprint-Einträge: wie der Fingerprint abgeleitet wurde. `persistent_id` identifiziert ein einzelnes Gerät; `composite_hash` und `legacy_fp` können von Geräten desselben Modells geteilt werden."
              },
              "sandbox": {
                "type": "boolean",
                "description": "`true` bei einem Gesichtseintrag, der in einer Sandbox-Anwendung hochgeladen wurde; ein solcher Eintrag stimmt mit nichts überein."
              },
              "reference_type": {
                "type": "string",
                "enum": [
                  "transaction",
                  "vendor_user",
                  "vendor_business"
                ],
                "description": "Von Ihnen festgelegt: Worauf `reference_object_uuid` verweist, damit die Console darauf zurückverlinkt."
              },
              "reference_id": {
                "type": "string",
                "description": "Von Ihnen festgelegt: Kennung des Quelldatensatzes."
              }
            }
          },
          "created_at": {
            "type": "string",
            "format": "date-time",
            "description": "Wann der Eintrag hinzugefügt wurde."
          }
        }
      },
      "BlocklistedItem": {
        "type": "object",
        "description": "Ein Gesicht, Ausweisdokument, eine Telefonnummer oder E-Mail-Adresse auf der Sperrliste einer Verifizierungssitzung. Felder, die für den `type` des Eintrags nicht zutreffen, sind `null`.",
        "required": [
          "type",
          "session_id",
          "session_number",
          "blocklisted_at",
          "face_image",
          "document_type",
          "document_number",
          "front_image",
          "phone_number",
          "country_code",
          "email"
        ],
        "properties": {
          "type": {
            "type": "string",
            "enum": [
              "face",
              "document",
              "phone",
              "email"
            ],
            "description": "Was auf die Sperrliste gesetzt wurde."
          },
          "session_id": {
            "type": "string",
            "format": "uuid",
            "description": "Verifizierungssitzung, zu der das Element gehört."
          },
          "session_number": {
            "type": "integer",
            "nullable": true,
            "description": "Nummer dieser Sitzung innerhalb der Anwendung, wie in der Console angezeigt."
          },
          "blocklisted_at": {
            "type": "string",
            "format": "date-time",
            "description": "Wann das Element zuletzt auf die Sperrliste gesetzt wurde."
          },
          "face_image": {
            "type": "string",
            "nullable": true,
            "description": "Gesichtselemente: kurzlebige signierte URL, die bei jedem Aufruf neu ausgestellt wird; `null` für einen berechtigungseingeschränkten API-Schlüssel ohne `media: read`. Ebenfalls `null`, wenn kein Referenzbild gespeichert ist."
          },
          "document_type": {
            "type": "string",
            "nullable": true,
            "description": "Dokumentenelemente: Dokumenttyp-Code, zum Beispiel `P` (Reisepass), `ID` (Personalausweis), `DL` (Führerschein) oder `RP` (Aufenthaltstitel)."
          },
          "document_number": {
            "type": "string",
            "nullable": true,
            "description": "Dokumentenelemente: die Dokumentennummer oder die persönliche Nummer, falls das Dokument keine Nummer aufweist."
          },
          "front_image": {
            "type": "string",
            "nullable": true,
            "description": "Dokumentenelemente: Vorderseitenbild des Dokuments, kurzlebige signierte URL, die bei jedem Aufruf neu ausgestellt wird; `null` für einen berechtigungseingeschränkten API-Schlüssel ohne `media: read`."
          },
          "phone_number": {
            "type": "string",
            "nullable": true,
            "description": "Telefonelemente: die Telefonnummer im E.164-Format."
          },
          "country_code": {
            "type": "string",
            "nullable": true,
            "description": "Telefonelemente: ISO 3166-1 alpha-2-Land der Nummer."
          },
          "email": {
            "type": "string",
            "nullable": true,
            "description": "E-Mail-Elemente: die E-Mail-Adresse."
          }
        }
      },
      "TransactionNote": {
        "type": "object",
        "description": "Eine Notiz in der Prüfungs-Timeline einer überwachten Transaktion.",
        "required": [
          "uuid",
          "note",
          "actor_email",
          "actor_name",
          "metadata",
          "created_at"
        ],
        "properties": {
          "uuid": {
            "type": "string",
            "format": "uuid",
            "description": "Notizkennung."
          },
          "note": {
            "type": "string",
            "description": "Notiztext als Klartext."
          },
          "actor_email": {
            "type": "string",
            "format": "email",
            "nullable": true,
            "description": "E-Mail des Console-Benutzers, der die Notiz verfasst oder den Status geändert hat. `null` für mit einem API-Schlüssel erstellte Notizen und für Notizen, die Didit automatisch hinzufügt."
          },
          "actor_name": {
            "type": "string",
            "nullable": true,
            "description": "Anzeigename des Console-Benutzers (seine E-Mail-Adresse, wenn er keinen Namen hat). `Rule Engine` bei Notizen, die Didit automatisch hinzufügt. `null` bei Notizen, die mit einem API-Schlüssel erstellt wurden."
          },
          "metadata": {
            "type": "object",
            "description": "Unterscheidet die Notiztypen. Über die API oder die Console verfasste Notizen enthalten `mentioned_emails`. Eine in der Console vorgenommene Statusänderung enthält `type: status_change` mit `previous_status`, `new_status`, `reason_code` und `reason_label`. Von Didit hinzugefügte Notizen enthalten `source`: `rule_action` (mit `rule_uuid`) für die Aktion `add_note` einer Regel oder `remediation_session` für ein Problem beim Erstellen der Verifizierungssitzung für Benutzeraktionen.",
            "properties": {
              "mentioned_emails": {
                "type": "array",
                "items": {
                  "type": "string",
                  "format": "email"
                },
                "description": "Erwähnte Organisationsmitglieder, in Kleinbuchstaben und dedupliziert. Leer, wenn niemand erwähnt wurde."
              },
              "type": {
                "type": "string",
                "enum": [
                  "status_change"
                ],
                "description": "Vorhanden bei Notizen, die eine in der Console vorgenommene Statusänderung festhalten."
              },
              "previous_status": {
                "type": "string",
                "enum": [
                  "APPROVED",
                  "IN_REVIEW",
                  "DECLINED",
                  "AWAITING_USER"
                ],
                "description": "Status vor der Änderung."
              },
              "new_status": {
                "type": "string",
                "enum": [
                  "APPROVED",
                  "IN_REVIEW",
                  "DECLINED",
                  "AWAITING_USER"
                ],
                "description": "Status nach der Änderung."
              },
              "reason_code": {
                "type": "string",
                "nullable": true,
                "description": "Mit der Änderung angegebener Ursachencode."
              },
              "reason_label": {
                "type": "string",
                "nullable": true,
                "description": "Mit der Änderung angegebene Ursachenbezeichnung."
              },
              "source": {
                "type": "string",
                "enum": [
                  "rule_action",
                  "remediation_session"
                ],
                "description": "Vorhanden bei Notizen, die Didit automatisch hinzufügt."
              },
              "rule_uuid": {
                "type": "string",
                "format": "uuid",
                "description": "Regel, deren `add_note`-Aktion die Notiz verfasst hat (mit `source: rule_action`)."
              }
            }
          },
          "created_at": {
            "type": "string",
            "format": "date-time",
            "description": "Wann die Notiz gespeichert wurde."
          }
        }
      },
      "TransactionSummary": {
        "type": "object",
        "description": "Zusammenfassung einer überwachten Transaktion in der Form, die `GET /v3/transactions/` auflistet. Rufen Sie `GET /v3/transactions/{transaction_id}/` mit `uuid` für Beteiligte, Alerts und Regelausführungen auf.",
        "properties": {
          "uuid": {
            "type": "string",
            "format": "uuid",
            "description": "Didit-Transaktions-UUID. Verwenden Sie sie als `{transaction_id}` an den Transaktions-Endpoints."
          },
          "transaction_number": {
            "type": "integer",
            "nullable": true,
            "description": "Fortlaufende Nummer innerhalb der Anwendung, wie in der Console angezeigt."
          },
          "txn_id": {
            "type": "string",
            "nullable": true,
            "description": "Ihre eigene Kennung aus dem Aufruf zur Erstellung. Eindeutig pro Anwendung."
          },
          "transaction_type": {
            "type": "string",
            "description": "Kategorie wie gespeichert: `finance`, `kyc`, `travelRule`, `userPlatformEvent`, `gamblingBet`, `gamblingLimitChange`, `gamblingBonusChange` oder `auditTrailEvent`."
          },
          "action_type": {
            "type": "string",
            "description": "Untertyp innerhalb der Kategorie, zum Beispiel `withdrawal`."
          },
          "status": {
            "type": "string",
            "enum": [
              "APPROVED",
              "IN_REVIEW",
              "DECLINED",
              "AWAITING_USER"
            ],
            "description": "Aktuelles Überwachungsergebnis."
          },
          "source": {
            "type": "string",
            "enum": [
              "LIVE",
              "IMPORTED"
            ],
            "description": "`LIVE` für Transaktionen, die zur Überwachung übermittelt wurden, `IMPORTED` für historische Importe."
          },
          "direction": {
            "type": "string",
            "enum": [
              "INBOUND",
              "OUTBOUND"
            ],
            "description": "Richtung relativ zur betreffenden Entität."
          },
          "amount": {
            "type": "string",
            "description": "Betrag als Dezimal-String ohne nachgestellte Nullen (bis zu 18 Nachkommastellen)."
          },
          "currency": {
            "type": "string",
            "description": "Währungscode oder Krypto-Asset-Symbol von `amount`."
          },
          "currency_type": {
            "type": "string",
            "nullable": true,
            "description": "`fiat` oder `crypto`, sofern bekannt."
          },
          "preferred_currency_amount": {
            "type": "string",
            "nullable": true,
            "description": "`amount` umgerechnet in die bevorzugte Währung der Anwendung, sofern ein Wechselkurs verfügbar war."
          },
          "preferred_currency_code": {
            "type": "string",
            "nullable": true,
            "description": "Währung von `preferred_currency_amount`."
          },
          "payment_details": {
            "type": "string",
            "nullable": true,
            "description": "Freitext-Zahlungsreferenz."
          },
          "txn_date": {
            "type": "string",
            "format": "date-time",
            "description": "Wann die Transaktion stattgefunden hat."
          },
          "created_at": {
            "type": "string",
            "format": "date-time",
            "description": "Wann Didit dies aufgezeichnet hat."
          },
          "score": {
            "type": "integer",
            "description": "Risiko-Score. Höher ist riskanter."
          },
          "severity": {
            "type": "string",
            "nullable": true,
            "enum": [
              "UNKNOWN",
              "LOW",
              "MEDIUM",
              "HIGH",
              "CRITICAL",
              null
            ],
            "description": "Risiko-Schweregrad, `null`, bis ein Wert festgelegt wird."
          },
          "decision_reason_code": {
            "type": "string",
            "nullable": true,
            "description": "Maschinenlesbarer Grund für den aktuellen `status`."
          },
          "decision_reason_label": {
            "type": "string",
            "nullable": true,
            "description": "Lesbare Bezeichnung für `decision_reason_code`."
          },
          "tags": {
            "type": "array",
            "description": "Tags für die Transaktion.",
            "items": {
              "type": "object",
              "properties": {
                "uuid": {
                  "type": "string",
                  "format": "uuid"
                },
                "name": {
                  "type": "string"
                },
                "color": {
                  "type": "string",
                  "description": "Hex-Farbe, zum Beispiel `#F59E0B`."
                },
                "description": {
                  "type": "string",
                  "nullable": true
                },
                "source": {
                  "type": "string",
                  "enum": [
                    "didit",
                    "custom"
                  ],
                  "description": "Vordefiniertes Didit- oder benutzerdefiniertes Tag."
                }
              }
            }
          },
          "subject_name": {
            "type": "string",
            "nullable": true,
            "description": "Vollständiger Name der Partei `APPLICANT`."
          },
          "subject_vendor_data": {
            "type": "string",
            "nullable": true,
            "description": "Ihre `vendor_data` für den Antragsteller."
          },
          "subject_type": {
            "type": "string",
            "nullable": true,
            "enum": [
              "user",
              "business",
              null
            ],
            "description": "Gibt an, ob der Antragsteller mit einem Didit-Benutzer oder -Unternehmen verknüpft ist; `null`, wenn er mit keinem von beidem verknüpft ist."
          },
          "subject_uuid": {
            "type": "string",
            "format": "uuid",
            "nullable": true,
            "description": "UUID des Didit-Benutzers oder -Unternehmens, mit dem der Antragsteller verknüpft ist."
          },
          "subject_country": {
            "type": "string",
            "nullable": true,
            "description": "Ländercode des Antragstellers."
          },
          "counterparty_name": {
            "type": "string",
            "nullable": true,
            "description": "Vollständiger Name der Partei `COUNTERPARTY`, falls vorhanden."
          },
          "counterparty_vendor_data": {
            "type": "string",
            "nullable": true,
            "description": "Ihre `vendor_data` für die Gegenpartei."
          },
          "counterparty_country": {
            "type": "string",
            "nullable": true,
            "description": "Ländercode der Gegenpartei."
          },
          "assigned_to_name": {
            "type": "string",
            "nullable": true,
            "description": "Name des Console-Prüfers, der der Transaktion zugewiesen ist."
          },
          "travel_rule_status": {
            "type": "string",
            "nullable": true,
            "description": "Status des Travel-Rule-Transfers der Transaktion oder `null`, wenn keiner vorhanden ist."
          },
          "application_id": {
            "type": "string",
            "format": "uuid",
            "description": "Anwendung, zu der die Transaktion gehört."
          },
          "application_name": {
            "type": "string",
            "nullable": true,
            "description": "Name dieser Anwendung."
          },
          "organization_id": {
            "type": "string",
            "format": "uuid",
            "description": "Organisation, der die Anwendung gehört."
          },
          "organization_name": {
            "type": "string",
            "nullable": true,
            "description": "Name dieser Organisation."
          }
        }
      },
      "ApplicationAnalyticsDataPoint": {
        "type": "object",
        "description": "Sitzungsanzahl für einen Tag, nach Erstellungsdatum (UTC). Jede Anzahl spiegelt den aktuellen Status der Sitzung wider. Datenpunkte des vorherigen Zeitraums enthalten mindestens die erforderlichen Felder.",
        "required": [
          "rounded_date",
          "total",
          "approved",
          "declined",
          "canceled",
          "pending"
        ],
        "properties": {
          "rounded_date": {
            "type": "string",
            "format": "date",
            "description": "Der Tag, `YYYY-MM-DD`."
          },
          "total": {
            "type": "integer",
            "description": "An diesem Tag erstellte Sitzungen."
          },
          "approved": {
            "type": "integer",
            "description": "Davon Sitzungen mit Status `Approved` oder `Kyc Expired`."
          },
          "declined": {
            "type": "integer",
            "description": "Sitzungen mit Status `Declined`."
          },
          "canceled": {
            "type": "integer",
            "description": "Sitzungen mit Status `Expired` oder `Abandoned`."
          },
          "pending": {
            "type": "integer",
            "description": "Sitzungen mit Status `Not Started`, `In Progress` oder `In Review`."
          },
          "in_review": {
            "type": "integer",
            "description": "Sitzungen mit Status `In Review`."
          },
          "expired": {
            "type": "integer",
            "description": "Sitzungen mit Status `Expired`."
          },
          "abandoned": {
            "type": "integer",
            "description": "Sitzungen mit Status `Abandoned`."
          },
          "in_progress": {
            "type": "integer",
            "description": "Sitzungen mit Status `In Progress`."
          },
          "not_started": {
            "type": "integer",
            "description": "Sitzungen mit Status `Not Started`."
          },
          "manually_approved": {
            "type": "integer",
            "description": "Sitzungen, die ein Prüfer genehmigt hat, nachdem der Workflow ein anderes Ergebnis geliefert hatte."
          },
          "manually_declined": {
            "type": "integer",
            "description": "Sitzungen, die ein Prüfer abgelehnt hat, nachdem der Workflow ein anderes Ergebnis geliefert hatte."
          }
        }
      },
      "ApplicationAnalyticsRequestBreakdown": {
        "type": "object",
        "description": "Statussummen für den Zeitraum. Die Aufschlüsselung des vorherigen Zeitraums enthält mindestens die erforderlichen Felder.",
        "required": [
          "total_approved",
          "total_in_review",
          "total_declined",
          "total_canceled",
          "total_pending"
        ],
        "properties": {
          "total_approved": {
            "type": "integer",
            "description": "Sitzungen mit Status `Approved` oder `Kyc Expired`."
          },
          "total_in_review": {
            "type": "integer",
            "description": "Sitzungen mit Status `In Review`."
          },
          "total_declined": {
            "type": "integer",
            "description": "Sitzungen mit Status `Declined`."
          },
          "total_canceled": {
            "type": "integer",
            "description": "Sitzungen mit Status `Expired` oder `Abandoned`."
          },
          "total_pending": {
            "type": "integer",
            "description": "Sitzungen mit Status `Not Started`, `In Progress` oder `In Review` (einschließlich `total_in_review`)."
          },
          "total_expired": {
            "type": "integer",
            "description": "Sitzungen mit Status `Expired`."
          },
          "total_abandoned": {
            "type": "integer",
            "description": "Sitzungen mit Status `Abandoned`."
          },
          "total_in_progress": {
            "type": "integer",
            "description": "Sitzungen mit Status `In Progress`."
          },
          "total_not_started": {
            "type": "integer",
            "description": "Sitzungen mit Status `Not Started`."
          },
          "total_manually_approved": {
            "type": "integer",
            "description": "Von einem Prüfer genehmigt."
          },
          "total_manually_declined": {
            "type": "integer",
            "description": "Von einem Prüfer abgelehnt."
          }
        }
      },
      "ApplicationAnalyticsCountryCount": {
        "type": "object",
        "properties": {
          "country": {
            "type": "string",
            "description": "Ländername."
          },
          "country_code": {
            "type": "string",
            "description": "Zweistelliger Ländercode."
          },
          "session_count": {
            "type": "integer",
            "description": "Sitzungen aus diesem Land."
          }
        }
      },
      "ApplicationAnalyticsLocationStats": {
        "type": "object",
        "properties": {
          "ip_countries": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ApplicationAnalyticsCountryCount"
            },
            "description": "Länder der IP-Adressen der Benutzer, die meisten Sitzungen zuerst."
          },
          "countries": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ApplicationAnalyticsCountryCount"
            },
            "description": "Dieselbe Liste wie `ip_countries`."
          },
          "id_countries": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ApplicationAnalyticsCountryCount"
            },
            "description": "Ausstellungsländer der verifizierten Ausweisdokumente, die meisten Sitzungen zuerst."
          },
          "conversion_by_country": {
            "type": "array",
            "description": "Pro Dokument-Ausstellungsland: abgeschlossene Sitzungen (genehmigt, abgelehnt oder in Prüfung) und wie viele genehmigt wurden. Die meisten abgeschlossenen zuerst.",
            "items": {
              "type": "object",
              "properties": {
                "country": {
                  "type": "string"
                },
                "country_code": {
                  "type": "string"
                },
                "finished": {
                  "type": "integer"
                },
                "approved": {
                  "type": "integer"
                }
              }
            }
          },
          "cities": {
            "type": "array",
            "description": "Bis zu 100 IP-Städte, die meisten Sitzungen zuerst.",
            "items": {
              "type": "object",
              "properties": {
                "location": {
                  "type": "string",
                  "description": "`City, Country`."
                },
                "session_count": {
                  "type": "integer"
                },
                "latitude": {
                  "type": "number",
                  "nullable": true
                },
                "longitude": {
                  "type": "number",
                  "nullable": true
                }
              }
            }
          }
        }
      },
      "ApplicationAnalyticsDemographicStats": {
        "type": "object",
        "properties": {
          "age_distribution": {
            "type": "object",
            "description": "Sitzungen pro Altersgruppe aus dem Ausweisdokument. Leer, wenn keine Daten vorliegen.",
            "properties": {
              "under_18": {
                "type": "integer"
              },
              "18_24": {
                "type": "integer"
              },
              "25_34": {
                "type": "integer"
              },
              "35_44": {
                "type": "integer"
              },
              "45_64": {
                "type": "integer"
              },
              "65_plus": {
                "type": "integer"
              }
            },
            "additionalProperties": {
              "type": "integer"
            }
          },
          "gender_distribution": {
            "type": "object",
            "description": "Sitzungen pro Dokumentengeschlechtscode: `M`, `F` oder `U` (unbekannt).",
            "additionalProperties": {
              "type": "integer"
            }
          }
        }
      },
      "ApplicationAnalyticsDeviceDetails": {
        "type": "object",
        "description": "Die fünf häufigsten jedes Typs, die meisten Sitzungen zuerst.",
        "properties": {
          "device_models": {
            "type": "array",
            "description": "Gerätemarken: `Apple`, `Android`, `LG`, alles andere wird als `Other` gruppiert.",
            "items": {
              "type": "object",
              "properties": {
                "device": {
                  "type": "string"
                },
                "count": {
                  "type": "integer"
                }
              }
            }
          },
          "browsers": {
            "type": "array",
            "description": "Browser: `Chrome`, `Safari`, `Didit App`, `Firefox`, alles andere wird unter `Other` zusammengefasst.",
            "items": {
              "type": "object",
              "properties": {
                "browser": {
                  "type": "string"
                },
                "count": {
                  "type": "integer"
                }
              }
            }
          },
          "operating_systems": {
            "type": "array",
            "description": "Betriebssysteme.",
            "items": {
              "type": "object",
              "properties": {
                "os": {
                  "type": "string"
                },
                "count": {
                  "type": "integer"
                }
              }
            }
          }
        }
      },
      "ApplicationAnalyticsWorkflowFunnel": {
        "type": "object",
        "description": "Nach Workflow-ID gegliedert. `total` gibt die in diesem Workflow gestarteten Sitzungen an; `steps` zählt die Sitzungen, die den jeweiligen Schritt erreicht haben (`OCR`, `LIVENESS`, `FACE_MATCH`, `AML`, `POA`, `PHONE`, `EMAIL`, `NFC`, `DATABASE_VALIDATION`, `QUESTIONNAIRE`, `IP_ANALYSIS`, `AGE_ESTIMATION`, `KYB_REGISTRY`, `KYB_DOCUMENTS`, `KYB_KEY_PEOPLE`). Das Erreichen eines Schritts bedeutet nicht, dass er erfolgreich bestanden wurde.",
        "additionalProperties": {
          "type": "object",
          "properties": {
            "total": {
              "type": "integer"
            },
            "steps": {
              "type": "object",
              "additionalProperties": {
                "type": "object",
                "properties": {
                  "reached": {
                    "type": "integer"
                  }
                }
              }
            }
          }
        }
      },
      "ApplicationAnalyticsVerificationTimeStats": {
        "type": "object",
        "description": "Aktive Zeit, die Benutzer mit der Verifizierung verbracht haben, Leerlaufzeiten ausgenommen. Ein leeres Objekt, wenn keine Daten vorliegen.",
        "properties": {
          "overall_avg_seconds": {
            "type": "number",
            "description": "Durchschnitt pro Sitzung, eine Nachkommastelle."
          },
          "overall_count": {
            "type": "integer",
            "description": "Gemessene Sitzungen."
          },
          "per_feature": {
            "type": "object",
            "description": "Nach Funktion gegliedert, zum Beispiel `OCR` oder `LIVENESS`.",
            "additionalProperties": {
              "type": "object",
              "properties": {
                "avg_seconds": {
                  "type": "number"
                },
                "total_seconds": {
                  "type": "number"
                },
                "count": {
                  "type": "integer"
                }
              }
            }
          },
          "per_sub_step": {
            "type": "object",
            "description": "Nach Funktion gegliedert, dann nach Teilschritt, zum Beispiel `front_id_photo`.",
            "additionalProperties": {
              "type": "object",
              "additionalProperties": {
                "type": "object",
                "properties": {
                  "avg_seconds": {
                    "type": "number"
                  },
                  "total_seconds": {
                    "type": "number"
                  },
                  "count": {
                    "type": "integer"
                  }
                }
              }
            }
          }
        }
      },
      "ApplicationAnalyticsResubmissionStats": {
        "type": "object",
        "properties": {
          "first_pass": {
            "type": "integer",
            "description": "Beendete Sitzungen ohne erneute Einreichung."
          },
          "second": {
            "type": "integer",
            "description": "Beendete Sitzungen, die einmal erneut eingereicht wurden."
          },
          "third_plus": {
            "type": "integer",
            "description": "Beendete Sitzungen, die zwei- oder mehrmals erneut eingereicht wurden."
          },
          "abandoned": {
            "type": "integer",
            "description": "Abgebrochene Sitzungen."
          }
        }
      },
      "ApplicationAnalyticsOriginalStatusStats": {
        "type": "object",
        "description": "Die automatische Entscheidung des Workflows, bevor ein Prüfer sie geändert hat.",
        "properties": {
          "approved": {
            "type": "integer"
          },
          "in_review": {
            "type": "integer"
          },
          "declined": {
            "type": "integer"
          }
        }
      },
      "ApplicationAnalyticsWarningStats": {
        "type": "object",
        "description": "Nach Funktion gegliedert (`ID_VERIFICATION`, `LIVENESS`, `FACEMATCH`, `AML`, `PROOF_OF_ADDRESS`, `PHONE`, `EMAIL`, `NFC`, `LOCATION`, `DATABASE_VALIDATION`, `QUESTIONNAIRE` und die KYB-Funktionen). `total` gibt die Sitzungen an, die die Funktion erreicht haben; `risks` zählt Sitzungen pro Warnungscode und Stufe.",
        "additionalProperties": {
          "type": "object",
          "properties": {
            "total": {
              "type": "integer"
            },
            "risks": {
              "type": "object",
              "additionalProperties": {
                "type": "object",
                "properties": {
                  "error": {
                    "type": "integer"
                  },
                  "warning": {
                    "type": "integer"
                  },
                  "information": {
                    "type": "integer"
                  }
                }
              }
            }
          }
        }
      },
      "ApplicationAnalyticsDemographicPoint": {
        "type": "object",
        "properties": {
          "date": {
            "type": "string",
            "description": "Periodenschlüssel: `YYYY-MM-DD` für einen Tag, den Montag einer Woche oder `YYYY-MM` für einen Monat, entsprechend `grouping_mode`."
          },
          "age_distribution": {
            "type": "object",
            "additionalProperties": {
              "type": "integer"
            }
          },
          "gender_distribution": {
            "type": "object",
            "additionalProperties": {
              "type": "integer"
            }
          }
        }
      },
      "ApplicationAnalyticsDevicePoint": {
        "type": "object",
        "properties": {
          "date": {
            "type": "string",
            "description": "Periodenschlüssel: `YYYY-MM-DD` für einen Tag, den Montag einer Woche oder `YYYY-MM` für einen Monat, entsprechend `grouping_mode`."
          },
          "devices": {
            "type": "object",
            "additionalProperties": {
              "type": "integer"
            }
          },
          "browsers": {
            "type": "object",
            "additionalProperties": {
              "type": "integer"
            }
          },
          "operating_systems": {
            "type": "object",
            "additionalProperties": {
              "type": "integer"
            }
          }
        }
      },
      "ApplicationAnalyticsVerificationTimePoint": {
        "type": "object",
        "properties": {
          "date": {
            "type": "string",
            "description": "Periodenschlüssel: `YYYY-MM-DD` für einen Tag, den Montag einer Woche oder `YYYY-MM` für einen Monat, entsprechend `grouping_mode`."
          },
          "overall_avg": {
            "type": "number",
            "description": "Durchschnittliche aktive Sekunden pro Sitzung."
          },
          "per_feature": {
            "type": "object",
            "description": "Durchschnittliche aktive Sekunden pro Funktion.",
            "additionalProperties": {
              "type": "number"
            }
          }
        }
      },
      "ApplicationAnalyticsResubmissionPoint": {
        "type": "object",
        "properties": {
          "date": {
            "type": "string",
            "description": "Periodenschlüssel: `YYYY-MM-DD` für einen Tag, den Montag einer Woche oder `YYYY-MM` für einen Monat, entsprechend `grouping_mode`."
          },
          "first_pass": {
            "type": "integer"
          },
          "second": {
            "type": "integer"
          },
          "third_plus": {
            "type": "integer"
          },
          "abandoned": {
            "type": "integer"
          }
        }
      },
      "ApplicationAnalyticsOriginalStatusPoint": {
        "type": "object",
        "properties": {
          "date": {
            "type": "string",
            "description": "Periodenschlüssel: `YYYY-MM-DD` für einen Tag, den Montag einer Woche oder `YYYY-MM` für einen Monat, entsprechend `grouping_mode`."
          },
          "approved": {
            "type": "integer"
          },
          "in_review": {
            "type": "integer"
          },
          "declined": {
            "type": "integer"
          }
        }
      },
      "ApplicationAnalyticsSummary": {
        "type": "object",
        "description": "Zusammenfassung der Benutzerverifizierung (KYC), die zurückgegeben wird, wenn weder `scope` noch `widget_keys` gesendet werden.",
        "required": [
          "data_points",
          "request_breakdown",
          "previous_data_points",
          "previous_request_breakdown",
          "conversion_rate",
          "location_stats",
          "demographic_stats",
          "device_details",
          "workflow_funnel_stats",
          "verification_time_stats",
          "resubmission_stats",
          "warning_stats",
          "original_status_stats",
          "grouping_mode",
          "demographic_time_series",
          "device_time_series",
          "verification_time_time_series",
          "resubmission_time_series",
          "original_status_time_series"
        ],
        "properties": {
          "data_points": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ApplicationAnalyticsDataPoint"
            },
            "description": "Ein Datenpunkt pro Tag, vom ersten Tag mit Sitzungen im Zeitraum bis `end_date`. Immer täglich, unabhängig vom Wert für `grouping_mode`."
          },
          "request_breakdown": {
            "$ref": "#/components/schemas/ApplicationAnalyticsRequestBreakdown"
          },
          "previous_data_points": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ApplicationAnalyticsDataPoint"
            },
            "description": "Tägliche Datenpunkte für den Zeitraum derselben Länge direkt vor `start_date`."
          },
          "previous_request_breakdown": {
            "$ref": "#/components/schemas/ApplicationAnalyticsRequestBreakdown"
          },
          "conversion_rate": {
            "type": "number",
            "nullable": true,
            "description": "`total_approved / (total_approved + total_declined + total_in_review) x 100`, eine Nachkommastelle. `null`, wenn noch nichts abgeschlossen wurde."
          },
          "location_stats": {
            "$ref": "#/components/schemas/ApplicationAnalyticsLocationStats"
          },
          "demographic_stats": {
            "$ref": "#/components/schemas/ApplicationAnalyticsDemographicStats"
          },
          "device_details": {
            "$ref": "#/components/schemas/ApplicationAnalyticsDeviceDetails"
          },
          "workflow_funnel_stats": {
            "$ref": "#/components/schemas/ApplicationAnalyticsWorkflowFunnel"
          },
          "verification_time_stats": {
            "$ref": "#/components/schemas/ApplicationAnalyticsVerificationTimeStats"
          },
          "resubmission_stats": {
            "$ref": "#/components/schemas/ApplicationAnalyticsResubmissionStats"
          },
          "warning_stats": {
            "$ref": "#/components/schemas/ApplicationAnalyticsWarningStats"
          },
          "original_status_stats": {
            "$ref": "#/components/schemas/ApplicationAnalyticsOriginalStatusStats"
          },
          "grouping_mode": {
            "type": "string",
            "enum": [
              "day",
              "week",
              "month"
            ],
            "description": "Wie die `*_time_series`-Listen gruppiert sind: `day` für bis zu 14 Tage, `week` bis zu 90, `month` darüber hinaus. Gemessen ab dem ersten Tag mit Sitzungen im Bereich."
          },
          "demographic_time_series": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ApplicationAnalyticsDemographicPoint"
            }
          },
          "device_time_series": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ApplicationAnalyticsDevicePoint"
            }
          },
          "verification_time_time_series": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ApplicationAnalyticsVerificationTimePoint"
            }
          },
          "resubmission_time_series": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ApplicationAnalyticsResubmissionPoint"
            }
          },
          "original_status_time_series": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ApplicationAnalyticsOriginalStatusPoint"
            }
          }
        }
      },
      "ApplicationAnalyticsWidget": {
        "type": "object",
        "description": "Ein Dashboard-Widget. Jedes Widget hat `kind` und `title`; die weiteren Felder hängen von `kind` ab. Die Sitzungs-Widgets verwenden die Zusammenfassungsobjekte (`data_points`, `request_breakdown`, `workflow_funnel_stats` usw.) wieder; Listen-Widgets platzieren ihre Einträge in `items`; Transaktionsmetriken verwenden `value`.",
        "required": [
          "kind",
          "title"
        ],
        "properties": {
          "kind": {
            "type": "string",
            "enum": [
              "sessions_volume",
              "workflow_funnel",
              "average_verification_time",
              "country_distribution",
              "warning_insights",
              "conversion_rate",
              "conversion_by_country",
              "resubmission_insights",
              "original_status_distribution",
              "database_validation_coverage",
              "database_validation_latency",
              "demographics",
              "device_details",
              "horizontal_bar",
              "kyb_registry_coverage",
              "kyb_registry_data_completeness",
              "metric",
              "time_series",
              "breakdown",
              "status_time_series",
              "leaderboard",
              "histogram"
            ],
            "description": "Widget-Typ."
          },
          "title": {
            "type": "string",
            "description": "Anzeigetitel, zum Beispiel `Verification volume`."
          },
          "grouping_mode": {
            "type": "string",
            "enum": [
              "day",
              "week",
              "month"
            ],
            "description": "Wie die `*_time_series`-Listen gruppiert sind: `day` für bis zu 14 Tage, `week` bis zu 90, `month` darüber hinaus. Gemessen ab dem ersten Tag mit Sitzungen im Bereich."
          },
          "data_points": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ApplicationAnalyticsDataPoint"
            }
          },
          "request_breakdown": {
            "$ref": "#/components/schemas/ApplicationAnalyticsRequestBreakdown"
          },
          "previous_data_points": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ApplicationAnalyticsDataPoint"
            }
          },
          "previous_request_breakdown": {
            "$ref": "#/components/schemas/ApplicationAnalyticsRequestBreakdown"
          },
          "conversion_rate": {
            "type": "number",
            "nullable": true
          },
          "workflow_funnel_stats": {
            "$ref": "#/components/schemas/ApplicationAnalyticsWorkflowFunnel"
          },
          "verification_time_stats": {
            "$ref": "#/components/schemas/ApplicationAnalyticsVerificationTimeStats"
          },
          "verification_time_time_series": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ApplicationAnalyticsVerificationTimePoint"
            }
          },
          "warning_stats": {
            "$ref": "#/components/schemas/ApplicationAnalyticsWarningStats"
          },
          "resubmission_stats": {
            "$ref": "#/components/schemas/ApplicationAnalyticsResubmissionStats"
          },
          "resubmission_time_series": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ApplicationAnalyticsResubmissionPoint"
            }
          },
          "original_status_stats": {
            "$ref": "#/components/schemas/ApplicationAnalyticsOriginalStatusStats"
          },
          "original_status_time_series": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ApplicationAnalyticsOriginalStatusPoint"
            }
          },
          "demographic_stats": {
            "$ref": "#/components/schemas/ApplicationAnalyticsDemographicStats"
          },
          "demographic_time_series": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ApplicationAnalyticsDemographicPoint"
            }
          },
          "device_details": {
            "$ref": "#/components/schemas/ApplicationAnalyticsDeviceDetails"
          },
          "device_time_series": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ApplicationAnalyticsDevicePoint"
            }
          },
          "items": {
            "type": "array",
            "description": "Einträge eines Listen-Widgets. `country_distribution` (KYC): `country`, `country_code`, `session_count`. `conversion_by_country`: `country`, `country_code`, `finished`, `approved`. `time_series`: `date`, `value`. `status_time_series`: `date`, `approved`, `declined`, `flagged`. `breakdown`: `transaction_type` oder `action_type` mit `count` und `volume`, oder `tag_id`, `tag_name`, `count`. `leaderboard`: `rule_title`, `trigger_count` oder `assignee`, `handled_count`, `average_processing_seconds`, jeweils mit `approved_percentage`, `declined_percentage`, `flagged_percentage`. `histogram`: `score`, `count`.",
            "items": {
              "type": "object",
              "additionalProperties": {}
            }
          },
          "previous_items": {
            "type": "array",
            "description": "Transaktionszeitreihe für den Zeitraum gleicher Länge direkt vor `start_date`.",
            "items": {
              "type": "object",
              "additionalProperties": {}
            }
          },
          "value": {
            "type": "number",
            "description": "`metric`-Widgets: der Wert für den Bereich."
          },
          "currency": {
            "type": "string",
            "nullable": true,
            "description": "Widgets für Transaktionsvolumen und -betrag: die Standard-Transaktionswährung der Anwendung."
          },
          "thresholds": {
            "type": "object",
            "description": "`histogram`-Widget: die Schwellenwerte für Überprüfung und Ablehnung der Anwendung.",
            "properties": {
              "review": {
                "type": "integer"
              },
              "decline": {
                "type": "integer"
              }
            }
          },
          "search": {
            "type": "object",
            "description": "`kyb_registry_coverage`-Widget: Gesamtzahlen der Registersuche.",
            "properties": {
              "searches_total": {
                "type": "integer"
              },
              "searches_with_no_candidates": {
                "type": "integer"
              }
            }
          }
        }
      },
      "ApplicationAnalyticsWidgetResponse": {
        "type": "object",
        "description": "Dashboard-Widgets, die zurückgegeben werden, wenn `scope` oder `widget_keys` gesendet wird.",
        "required": [
          "scope",
          "available_widget_keys",
          "requested_widget_keys",
          "widgets"
        ],
        "properties": {
          "scope": {
            "type": "string",
            "enum": [
              "home",
              "kyc",
              "kyb",
              "transactions"
            ],
            "description": "Dashboard-Tab."
          },
          "available_widget_keys": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Jeder Widget-Schlüssel, den dieser Scope akzeptiert."
          },
          "requested_widget_keys": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Die beantworteten Widget-Schlüssel in der folgenden Reihenfolge: Ihre gültigen `widget_keys` oder die Standardwerte des Scopes."
          },
          "widgets": {
            "type": "object",
            "description": "Nach Widget-Schlüssel gegliedert, in der Reihenfolge von `requested_widget_keys`.",
            "additionalProperties": {
              "$ref": "#/components/schemas/ApplicationAnalyticsWidget"
            }
          }
        }
      },
      "ApplicationAnalyticsToday": {
        "type": "object",
        "description": "Heutige Verifizierungen nach lokaler Stunde im Vergleich zum selben Wochentag der Vorwoche.",
        "required": [
          "time_zone",
          "date",
          "current_hour",
          "previous_date",
          "hours",
          "previous_hours",
          "total",
          "previous_total_so_far",
          "outcomes"
        ],
        "properties": {
          "time_zone": {
            "type": "string",
            "description": "Die IANA-Zeitzone, in der der Tag und seine Uhrzeiten liegen.",
            "example": "Europe/Madrid"
          },
          "date": {
            "type": "string",
            "format": "date",
            "description": "Heute in dieser Zeitzone.",
            "example": "2026-10-30"
          },
          "current_hour": {
            "type": "integer",
            "minimum": 0,
            "maximum": 23,
            "description": "Die aktuelle lokale Stunde.",
            "example": 14
          },
          "previous_date": {
            "type": "string",
            "format": "date",
            "description": "Der Vergleichstag: derselbe Wochentag eine Woche zuvor.",
            "example": "2026-10-23"
          },
          "hours": {
            "type": "array",
            "items": {
              "type": "integer",
              "minimum": 0
            },
            "minItems": 24,
            "maxItems": 24,
            "description": "Heute erstellte Verifizierungen, pro lokaler Stunde ab 00:00 Uhr. Die noch kommenden Stunden sind 0."
          },
          "previous_hours": {
            "type": "array",
            "items": {
              "type": "integer",
              "minimum": 0
            },
            "minItems": 24,
            "maxItems": 24,
            "description": "Verifizierungen, die am Vergleichstag erstellt wurden, pro lokaler Stunde ab 00:00 Uhr."
          },
          "total": {
            "type": "integer",
            "minimum": 0,
            "description": "Bisher heute erstellte Verifizierungen.",
            "example": 165
          },
          "previous_total_so_far": {
            "type": "integer",
            "minimum": 0,
            "description": "Verifizierungen, die am Vergleichstag bis zur selben lokalen Uhrzeit erstellt wurden.",
            "example": 151
          },
          "outcomes": {
            "type": "object",
            "description": "Von den heutigen Verifizierungen: wie viele aktuell genehmigt sind, in Prüfung warten oder abgelehnt wurden. Die restlichen sind noch nicht abgeschlossen.",
            "required": [
              "approved",
              "in_review",
              "declined"
            ],
            "properties": {
              "approved": {
                "type": "integer",
                "minimum": 0
              },
              "in_review": {
                "type": "integer",
                "minimum": 0
              },
              "declined": {
                "type": "integer",
                "minimum": 0
              }
            }
          }
        }
      },
      "WebhookConfigDestination": {
        "type": "object",
        "description": "Ein Webhook-Ziel wie in der Webhook-Konfiguration aufgeführt, ohne Zustellungsmetriken. `GET /v3/webhook/destinations/{destination_uuid}/` fügt dessen Zustellungsübersicht hinzu.",
        "required": [
          "uuid",
          "label",
          "url",
          "enabled",
          "webhook_version",
          "secret_shared_key",
          "subscribed_events",
          "created_at",
          "updated_at"
        ],
        "properties": {
          "uuid": {
            "type": "string",
            "format": "uuid",
            "description": "Ziel-ID."
          },
          "label": {
            "type": "string",
            "maxLength": 255,
            "description": "Für Menschen lesbarer Name."
          },
          "url": {
            "type": "string",
            "format": "uri",
            "maxLength": 2000,
            "description": "HTTPS-Endpoint, an den Didit Ereignisse sendet."
          },
          "enabled": {
            "type": "boolean",
            "description": "`false` pausiert Zustellungen an dieses Ziel."
          },
          "webhook_version": {
            "type": "string",
            "enum": [
              "v1",
              "v2",
              "v3"
            ],
            "description": "Payload-Version, die an dieses Ziel gesendet wird."
          },
          "secret_shared_key": {
            "type": "string",
            "description": "Das Signaturgeheimnis dieses Ziels (URL-sicherer Token mit 43 Zeichen). Verifizieren Sie jeden Webhook mit dem Geheimnis des Ziels, an das er gesendet wurde. Aufrufer mit API-Schlüssel erhalten es immer vollständig; Console-Benutzer ohne `read:webhooks` erhalten eine leere Zeichenfolge."
          },
          "subscribed_events": {
            "type": "array",
            "uniqueItems": true,
            "description": "Ereignistypen, die an dieses Ziel zugestellt werden. Leer, wenn das Ziel ohne Ereignisse erstellt wurde; in diesem Fall empfängt es nichts.",
            "items": {
              "$ref": "#/components/schemas/WebhookEvent"
            }
          },
          "created_at": {
            "type": "string",
            "format": "date-time"
          },
          "updated_at": {
            "type": "string",
            "format": "date-time"
          }
        }
      },
      "WebhookConfig": {
        "type": "object",
        "description": "Webhook-Konfiguration auf Anwendungsebene, Aufbewahrungsrichtlinie und Hosts für die Rückgabe der Digital-ID-Wallet sowie alle Webhook-Ziele.",
        "required": [
          "webhook_url",
          "webhook_version",
          "secret_shared_key",
          "capture_method",
          "data_retention_months",
          "face_retention_policy",
          "face_retention_days",
          "available_events",
          "allowed_return_hosts",
          "endpoints"
        ],
        "properties": {
          "webhook_url": {
            "type": "string",
            "format": "uri",
            "nullable": true,
            "description": "Webhook-URL auf Anwendungsebene (Legacy). Didit sendet nur daran, solange die Anwendung kein aktiviertes Ziel hat, und dann nur `status.updated` und `data.updated`. Jedes Erstellen, Aktualisieren oder Löschen eines Ziels setzt sie auf die URL des ältesten aktivierten Ziels bzw. auf `null`, wenn keines aktiviert ist."
          },
          "webhook_version": {
            "type": "string",
            "enum": [
              "v1",
              "v2",
              "v3"
            ],
            "description": "Payload-Version der Legacy-`webhook_url`. Jedes Ziel hat eine eigene `webhook_version`."
          },
          "secret_shared_key": {
            "type": "string",
            "description": "Signaturgeheimnis auf Anwendungsebene (43 Zeichen langes URL-sicheres Token). Es signiert ausschließlich Zustellungen an die Legacy-`webhook_url`; jedes Ziel signiert mit seinem eigenen `secret_shared_key`. Aufrufer mit API-Schlüssel erhalten es immer vollständig; Console-Benutzer ohne `read:webhooks` erhalten eine leere Zeichenfolge."
          },
          "capture_method": {
            "type": "string",
            "enum": [
              "MOBILE",
              "MOBILE_AND_DESKTOP"
            ],
            "description": "Veraltete Anwendungseinstellung. Der Verifizierungsablauf liest diesen Wert nicht aus: Erfassungsoptionen werden pro Workflow konfiguriert."
          },
          "data_retention_months": {
            "type": "integer",
            "nullable": true,
            "minimum": 1,
            "maximum": 120,
            "description": "Automatisches Löschfenster. Sitzungen zur Benutzerverifizierung, die vor mehr als der angegebenen Anzahl von Monaten erstellt wurden (ein Monat entspricht 30 Tagen), werden automatisch gelöscht, und diese Löschung ist unwiderruflich. `null` bedeutet, dass Sitzungen niemals automatisch gelöscht werden. Siehe [Datenaufbewahrung](https://docs.didit.me/de/console/data-retention)."
          },
          "face_retention_policy": {
            "type": "string",
            "enum": [
              "delete_with_session",
              "retain_until_user_deleted"
            ],
            "description": "Was mit dem Gesichts-Embedding einer Sitzung passiert, wenn die Sitzung gelöscht wird. `delete_with_session` (Standard) löscht es mit der Sitzung. `retain_until_user_deleted` ist das Opt-in für die [Aufbewahrung biometrischer Templates](https://docs.didit.me/de/console/data-retention#aufbewahrung-biometrischer-templates): Ein mit dem Benutzer verknüpftes bildfreies biometrisches Template wird separat verwaltet, bis seine Aufbewahrungsfrist endet, der Benutzer gelöscht wird oder Sie es bereinigen."
          },
          "face_retention_days": {
            "type": "integer",
            "nullable": true,
            "minimum": 1,
            "maximum": 3650,
            "description": "Aufbewahrungsfrist in Tagen für biometrische Templates unter `retain_until_user_deleted`. Erforderlich, wenn diese Richtlinie festgelegt ist."
          },
          "biometric_consent_mode": {
            "type": "string",
            "enum": [
              "auto",
              "always",
              "never"
            ],
            "description": "Wann der gehostete Ablauf und die nativen SDKs die Person vor einer Gesichtserfassung um eine ausdrückliche biometrische Einwilligung bitten. `auto` (Standard) fragt nur ab, wenn ein Auslöser zutrifft: Ein angegebener Bundesstaat, die IP-Adresse der Person oder der Aussteller des Ausweisdokuments liegt in Illinois, Texas oder Colorado, oder die Person scheint sich ohne bekannten Bundesstaat in den USA zu befinden. `always` fragt jede Person ab, deren Workflow ein Gesicht erfasst. `never` zeigt den Schritt nie an, und Sie holen die Einwilligung vor dem Selfie selbst ein. Jede Änderung wird im Audit-Log protokolliert. Siehe [Biometrische Einwilligung](https://docs.didit.me/de/getting-started/biometric-consent)."
          },
          "available_events": {
            "type": "array",
            "description": "Jeder Ereignistyp, den ein Ziel abonnieren kann, mit einer Anzeigebezeichnung.",
            "items": {
              "type": "object",
              "required": [
                "value",
                "label"
              ],
              "properties": {
                "value": {
                  "$ref": "#/components/schemas/WebhookEvent"
                },
                "label": {
                  "type": "string",
                  "description": "Anzeigebezeichnung, zum Beispiel `Session status updated`."
                }
              }
            }
          },
          "allowed_return_hosts": {
            "type": "array",
            "maxItems": 20,
            "description": "Hostnamen (exakte Übereinstimmung, nur HTTPS), zu denen eine eigenständige Digital-ID-Wallet-Verifizierung den Benutzer mit ihrer `return_url` zurücksenden darf. Ihre White-Label-Domain ist ebenfalls stets zulässig. Siehe [Registrieren Sie Ihr Rückkehrziel](https://docs.didit.me/de/standalone-apis/digital-id-wallets#ihr-rückgabeziel-registrieren).",
            "items": {
              "type": "string",
              "maxLength": 253
            }
          },
          "endpoints": {
            "type": "array",
            "description": "Jedes Webhook-Ziel der Anwendung, das älteste zuerst, jeweils mit seinem Signaturgeheimnis. Hier schreibgeschützt: Verwalten Sie Ziele über die `/v3/webhook/destinations/`-Endpoints.",
            "items": {
              "$ref": "#/components/schemas/WebhookConfigDestination"
            }
          },
          "allowed_domains": {
            "type": "array",
            "maxItems": 50,
            "items": {
              "type": "string",
              "maxLength": 300
            },
            "description": "Origins (zum Beispiel `https://app.example.com`; `http` nur für `localhost`), in die der gehostete Verifizierungs-Workflow eingebettet werden darf und an die der Benutzer mit einem Sitzungs-Callback zurückgeleitet werden darf. Server-zu-Server-Aufrufe sind davon nicht betroffen. Eine leere Liste bedeutet keine Einschränkung. Didit speichert jeden Origin in Kleinbuchstaben ohne Standard-Port. Ein ungültiger Eintrag schlägt mit `400` bei `allowed_domains` fehl.",
            "example": [
              "https://app.example.com"
            ]
          }
        }
      },
      "WebhookDestinationDelivery": {
        "type": "object",
        "description": "Ein Zustellungsversuch an ein Webhook-Ziel. Das erste Senden eines Ereignisses, jeder automatische Wiederholungsversuch und jedes erneute Senden sind separate Zustellungen.",
        "required": [
          "uuid",
          "session_id",
          "request_url",
          "response_status",
          "response_time_ms",
          "status",
          "webhook_type",
          "created_at"
        ],
        "properties": {
          "uuid": {
            "type": "string",
            "format": "uuid",
            "description": "Zustellungs-ID für den Abruf von Details und das erneute Senden."
          },
          "session_id": {
            "type": "string",
            "format": "uuid",
            "nullable": true,
            "description": "Benutzerverifizierungssitzung, auf die sich das Ereignis bezieht. `null` bei Ereignissen zu Unternehmenssitzungen, Benutzern, Unternehmen, Transaktionen, Travel Rule und Workflows."
          },
          "request_url": {
            "type": "string",
            "format": "uri",
            "nullable": true,
            "description": "URL, an die die Zustellung gesendet wurde: die URL des Ziels zum Zeitpunkt der Ereigniserstellung."
          },
          "response_status": {
            "type": "integer",
            "nullable": true,
            "description": "HTTP-Status, den Ihr Endpoint zurückgegeben hat. `null`, solange die Zustellung in der Warteschlange steht und noch nicht versucht wurde. Wenn keine HTTP-Antwort empfangen wurde, erfasst Didit einen eigenen Status: `504`, wenn Ihr Endpoint nicht innerhalb von 5 Sekunden geantwortet hat, `503` bei einem Verbindungsfehler, `400`, wenn die URL als unsicher abgelehnt wurde (z. B. eine private oder interne Adresse), und `404` bei jedem anderen Anfragefehler. `400` oder höher gilt als fehlgeschlagene Zustellung."
          },
          "response_time_ms": {
            "type": "integer",
            "nullable": true,
            "minimum": 0,
            "description": "Dauer des Versuchs in Millisekunden. `null`, solange die Zustellung in der Warteschlange ist."
          },
          "status": {
            "type": "string",
            "nullable": true,
            "description": "Status, den das Ereignis bei seiner Erstellung gemeldet hat: der Sitzungsstatus für Sitzungsereignisse (zum Beispiel `Approved` oder `In Review`), der Status der Person oder des Unternehmens für Benutzer- und Unternehmensereignisse und der Transaktionsstatus für Transaktionsereignisse. `null` für Ereignisse ohne Status."
          },
          "webhook_type": {
            "$ref": "#/components/schemas/WebhookEvent"
          },
          "created_at": {
            "type": "string",
            "format": "date-time",
            "description": "Wann die Zustellung erstellt wurde."
          }
        }
      },
      "WebhookDestinationDeliveryDetail": {
        "type": "object",
        "description": "Ein Zustellungsversuch an ein Webhook-Ziel mit den exakten Anfrage-Headern und dem Body, den Didit gesendet hat.",
        "required": [
          "uuid",
          "session_id",
          "request_url",
          "response_status",
          "response_time_ms",
          "status",
          "webhook_type",
          "created_at",
          "request_header",
          "request_body"
        ],
        "properties": {
          "uuid": {
            "type": "string",
            "format": "uuid",
            "description": "Zustellungs-ID für den Abruf von Details und das erneute Senden."
          },
          "session_id": {
            "type": "string",
            "format": "uuid",
            "nullable": true,
            "description": "Benutzerverifizierungssitzung, auf die sich das Ereignis bezieht. `null` bei Ereignissen zu Unternehmenssitzungen, Benutzern, Unternehmen, Transaktionen, Travel Rule und Workflows."
          },
          "request_url": {
            "type": "string",
            "format": "uri",
            "nullable": true,
            "description": "URL, an die die Zustellung gesendet wurde: die URL des Ziels zum Zeitpunkt der Ereigniserstellung."
          },
          "response_status": {
            "type": "integer",
            "nullable": true,
            "description": "HTTP-Status, den Ihr Endpoint zurückgegeben hat. `null`, solange die Zustellung in der Warteschlange steht und noch nicht versucht wurde. Wenn keine HTTP-Antwort empfangen wurde, erfasst Didit einen eigenen Status: `504`, wenn Ihr Endpoint nicht innerhalb von 5 Sekunden geantwortet hat, `503` bei einem Verbindungsfehler, `400`, wenn die URL als unsicher abgelehnt wurde (z. B. eine private oder interne Adresse), und `404` bei jedem anderen Anfragefehler. `400` oder höher gilt als fehlgeschlagene Zustellung."
          },
          "response_time_ms": {
            "type": "integer",
            "nullable": true,
            "minimum": 0,
            "description": "Dauer des Versuchs in Millisekunden. `null`, solange die Zustellung in der Warteschlange ist."
          },
          "status": {
            "type": "string",
            "nullable": true,
            "description": "Status, den das Ereignis bei seiner Erstellung gemeldet hat: der Sitzungsstatus für Sitzungsereignisse (zum Beispiel `Approved` oder `In Review`), der Status der Person oder des Unternehmens für Benutzer- und Unternehmensereignisse und der Transaktionsstatus für Transaktionsereignisse. `null` für Ereignisse ohne Status."
          },
          "webhook_type": {
            "$ref": "#/components/schemas/WebhookEvent"
          },
          "created_at": {
            "type": "string",
            "format": "date-time",
            "description": "Wann die Zustellung erstellt wurde."
          },
          "request_header": {
            "type": "string",
            "description": "JSON-Text (ein String) der von Didit gesendeten Anfrage-Header: `Content-Type`, `X-Signature`, `X-Signature-V2`, `X-Signature-Simple`, `X-Timestamp` und `User-Agent`. Parsen Sie ihn mit einem JSON-Parser. Er enthält Signaturen, niemals das Signiergeheimnis."
          },
          "request_body": {
            "type": "string",
            "description": "JSON-Text (ein String) der exakten Payload, die Didit gesendet hat, mit sortierten Schlüsseln, einschließlich `event_id` und `timestamp`. Parsen Sie ihn mit einem JSON-Parser; siehe [Payload-Struktur](https://docs.didit.me/de/integration/webhooks#payload-struktur). Bei einem berechtigungseingeschränkten Schlüssel ohne `media: read` sind Medien-URLs darin `null`; ohne `sessions: write` sind Sitzungs-Token und Links zur gehosteten Verifizierungsseite `null`. Ein auf diese Weise veränderter Body stimmt nicht mehr mit seinen Signaturen überein. Didit speichert den von Ihrem Endpoint zurückgegebenen Antwort-Body nicht."
          }
        }
      },
      "SessionWebhookDelivery": {
        "type": "object",
        "description": "Ein für eine Verifizierungssitzung aufgezeichneter Webhook-Zustellversuch mit den exakten Anfrage-Headern und dem Body, die Didit gesendet hat.",
        "required": [
          "uuid",
          "session_id",
          "request_url",
          "response_status",
          "status",
          "webhook_type",
          "request_header",
          "request_body",
          "created_at"
        ],
        "properties": {
          "uuid": {
            "type": "string",
            "format": "uuid",
            "description": "Zustellungs-ID. Verwenden Sie diese als `{webhook_uuid}`, um diese Zustellung abzurufen oder erneut zu senden."
          },
          "session_id": {
            "type": "string",
            "format": "uuid",
            "description": "Die Sitzung, zu der die Zustellung gehört (die Sitzung im Pfad)."
          },
          "request_url": {
            "type": "string",
            "format": "uri",
            "nullable": true,
            "description": "URL, an die die Zustellung gesendet wurde."
          },
          "response_status": {
            "type": "integer",
            "nullable": true,
            "description": "HTTP-Status, den Ihr Endpoint zurückgegeben hat. `null`, solange die Zustellung in der Warteschlange steht und noch nicht versucht wurde. Wenn keine HTTP-Antwort empfangen wurde, erfasst Didit einen eigenen Status: `504`, wenn Ihr Endpoint nicht innerhalb von 5 Sekunden geantwortet hat, `503` bei einem Verbindungsfehler, `400`, wenn die URL als unsicher abgelehnt wurde (z. B. eine private oder interne Adresse), und `404` bei jedem anderen Anfragefehler. `400` oder höher gilt als fehlgeschlagene Zustellung."
          },
          "status": {
            "type": "string",
            "nullable": true,
            "description": "Sitzungsstatus zum Zeitpunkt der Ereigniserstellung, beispielsweise `In Progress`, `Approved` oder `Declined`."
          },
          "webhook_type": {
            "$ref": "#/components/schemas/WebhookEvent"
          },
          "request_header": {
            "type": "string",
            "description": "JSON-Text (ein String) der von Didit gesendeten Anfrage-Header: `Content-Type`, `X-Signature`, `X-Signature-V2`, `X-Signature-Simple`, `X-Timestamp` und `User-Agent`. Parsen Sie ihn mit einem JSON-Parser. Er enthält Signaturen, niemals das Signiergeheimnis."
          },
          "request_body": {
            "type": "string",
            "description": "JSON-Text (ein String) der exakten Payload, die Didit gesendet hat, mit sortierten Schlüsseln, einschließlich `event_id` und `timestamp`. Parsen Sie ihn mit einem JSON-Parser; siehe [Payload-Struktur](https://docs.didit.me/de/integration/webhooks#payload-struktur). Bei einem berechtigungseingeschränkten Schlüssel ohne `media: read` sind Medien-URLs darin `null`; ohne `sessions: write` sind Sitzungs-Token und Links zur gehosteten Verifizierungsseite `null`. Ein auf diese Weise veränderter Body stimmt nicht mehr mit seinen Signaturen überein. Didit speichert den von Ihrem Endpoint zurückgegebenen Antwort-Body nicht."
          },
          "created_at": {
            "type": "string",
            "format": "date-time",
            "description": "Wann die Zustellung erstellt wurde."
          }
        }
      },
      "SessionEvent": {
        "type": "object",
        "description": "Ein Eintrag in der Ereignis-Timeline einer Verifizierungssitzung.",
        "required": [
          "uuid",
          "event_type",
          "created_at",
          "component",
          "feature_step",
          "step",
          "details",
          "ip_address",
          "user_agent",
          "device_info",
          "file_url",
          "sent_at"
        ],
        "properties": {
          "uuid": {
            "type": "string",
            "format": "uuid",
            "description": "Ereigniskennung."
          },
          "event_type": {
            "type": "string",
            "enum": [
              "SESSION_CREATED",
              "SESSION_COMPLETED",
              "SESSION_STATUS_CHANGED",
              "LINK_OPENED",
              "FORM_SUBMITTED",
              "BUTTON_CLICKED",
              "FILE_UPLOADED",
              "ATTEMPT_FAILED",
              "FEATURE_STEP_CHANGED",
              "STEP_RENDERED",
              "NOTE_ADDED",
              "MANUAL_REVIEW_STARTED",
              "WORKFLOW_BRANCH_EVALUATED",
              "WORKFLOW_STATUS_NODE_REACHED",
              "LOG"
            ],
            "description": "Was passiert ist. Vom Gerät während des gehosteten Flows oder SDKs gemeldet: `LINK_OPENED`, `STEP_RENDERED`, `BUTTON_CLICKED`, `FORM_SUBMITTED`, `FILE_UPLOADED`, `ATTEMPT_FAILED` und `LOG` (Debugging). Vom Server aufgezeichnet: `SESSION_CREATED`, `SESSION_STATUS_CHANGED` (`details.old_status`, `details.current_status`), `FEATURE_STEP_CHANGED` (`details.old_feature_step`, `details.current_feature_step`), `WORKFLOW_BRANCH_EVALUATED` und `WORKFLOW_STATUS_NODE_REACHED` (der Workflow-Routing-Trace). `SESSION_COMPLETED`, `NOTE_ADDED` und `MANUAL_REVIEW_STARTED` können bei älteren Sitzungen vorkommen."
          },
          "created_at": {
            "type": "string",
            "format": "date-time",
            "description": "Wann Didit das Ereignis gespeichert hat. Ereignisse werden asynchron gespeichert, einige Sekunden nach `sent_at`."
          },
          "component": {
            "type": "string",
            "nullable": true,
            "description": "UI-Komponente, die das Ereignis gemeldet hat (nur Geräteereignisse)."
          },
          "feature_step": {
            "type": "string",
            "nullable": true,
            "enum": [
              "OCR",
              "OCR_BACK",
              "NFC",
              "AML",
              "FACE",
              "LIVENESS",
              "FACE_MATCH",
              "IP_ANALYSIS",
              "AGE_ESTIMATION",
              "PROOF_OF_ADDRESS",
              "PHONE_VERIFICATION",
              "EMAIL_VERIFICATION",
              "FACE_SEARCH",
              "DATABASE_VALIDATION",
              "QUESTIONNAIRE",
              "KYB_REGISTRY",
              "KYB_DOCUMENTS",
              "KYB_KEY_PEOPLE",
              "DOCUMENT_AI",
              "GEOLOCATION",
              null
            ],
            "description": "Verifizierungsfunktion, in der sich die Sitzung befand, als das Ereignis eintrat."
          },
          "step": {
            "type": "string",
            "nullable": true,
            "description": "Bildschirm innerhalb der Funktion, beispielsweise `DOCUMENT_CAPTURE_FRONT` oder `FACE_PASSIVE_LIVENESS`."
          },
          "details": {
            "type": "object",
            "nullable": true,
            "additionalProperties": true,
            "description": "Ereignisspezifische Daten. Die Schlüssel hängen von `event_type` ab."
          },
          "ip_address": {
            "type": "string",
            "nullable": true,
            "description": "Adresse, von der das Gerät das Ereignis gemeldet hat. `null` für serverseitig erfasste Ereignisse."
          },
          "user_agent": {
            "type": "string",
            "nullable": true,
            "description": "User-Agent des Geräts. `null` bei serverseitig erfassten Ereignissen."
          },
          "device_info": {
            "type": "object",
            "nullable": true,
            "additionalProperties": true,
            "description": "Gerätedetails, die das SDK oder der Browser gemeldet hat."
          },
          "file_url": {
            "type": "string",
            "format": "uri",
            "nullable": true,
            "description": "Kurzlebiger vorsignierter Link zu einer an das Ereignis angehängten Datei (zum Beispiel ein aufgenommenes Bild). `null`, wenn keine vorhanden ist, und immer `null` für einen berechtigungseingeschränkten API-Schlüssel ohne `media: read`."
          },
          "sent_at": {
            "type": "integer",
            "format": "int64",
            "description": "Wann das Ereignis stattgefunden hat, als Unix-Zeitstempel in Millisekunden. Die Ergebnisse werden danach sortiert."
          }
        }
      },
      "AMLDatasetSourceFreshness": {
        "type": "object",
        "description": "Aktualität einer Familie von AML-Datensätzen.",
        "required": [
          "last_updated_at",
          "oldest_updated_at",
          "dataset_count",
          "dated_dataset_count"
        ],
        "properties": {
          "last_updated_at": {
            "type": "string",
            "format": "date-time",
            "description": "Neueste Aktualisierung eines beliebigen Datensatzes in der Familie."
          },
          "oldest_updated_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "description": "Aktualitätsgrenze: Jeder Datensatz in der Familie ist mindestens so aktuell. `null`, wenn mindestens ein Datensatz in der Familie kein Aktualisierungsdatum gemeldet hat, da die Grenze dann unbekannt ist."
          },
          "dataset_count": {
            "type": "integer",
            "description": "Anzahl der Datensätze in der Familie."
          },
          "dated_dataset_count": {
            "type": "integer",
            "description": "Anzahl der Datensätze, die ein Aktualisierungsdatum gemeldet haben."
          }
        }
      },
      "AMLDatasetFreshness": {
        "type": "object",
        "description": "Wie aktuell die AML-Datensätze bei der Durchführung eines Screenings waren. Datumsangaben werden niemals geschätzt.",
        "required": [
          "captured_at",
          "provider",
          "catalog_version",
          "sources"
        ],
        "properties": {
          "captured_at": {
            "type": "string",
            "format": "date-time",
            "description": "Wann Didit den Datensatzkatalog gelesen hat, aus dem diese Aktualität stammt."
          },
          "provider": {
            "type": "string",
            "description": "Opake Kennung der AML-Datenquelle. Als opaken String behandeln; nicht danach verzweigen.",
            "example": "aml_data_source"
          },
          "catalog_version": {
            "type": "string",
            "nullable": true,
            "description": "Versionskennung des Datensatzkatalogs, sofern die Quelle eine meldet."
          },
          "sources": {
            "type": "object",
            "description": "Aktualität pro Datensatzfamilie. Eine Familie, deren Datensätze kein Aktualisierungsdatum gemeldet haben, fehlt, anstatt mit `null` gefüllt zu werden.",
            "properties": {
              "sanctions": {
                "$ref": "#/components/schemas/AMLDatasetSourceFreshness"
              },
              "pep": {
                "$ref": "#/components/schemas/AMLDatasetSourceFreshness"
              },
              "warnings": {
                "$ref": "#/components/schemas/AMLDatasetSourceFreshness"
              },
              "adverse_media": {
                "$ref": "#/components/schemas/AMLDatasetSourceFreshness"
              }
            }
          }
        }
      },
      "AMLScreeningRun": {
        "type": "object",
        "description": "Ein abgeschlossenes Re-Screening einer AML-Prüfung im Rahmen der laufenden Überwachung.",
        "required": [
          "uuid",
          "run_id",
          "completed_at",
          "started_at",
          "outcome",
          "trigger",
          "provider",
          "status",
          "score",
          "total_hits",
          "new_hits",
          "entities_screened",
          "dataset_freshness"
        ],
        "properties": {
          "uuid": {
            "type": "string",
            "format": "uuid",
            "description": "Kennung dieses Screening-Laufs."
          },
          "run_id": {
            "type": "string",
            "format": "uuid",
            "description": "Der Überwachungslauf, zu dem dieses Screening gehört. Jede im selben Lauf überprüfte Verifizierung hat denselben Lauf."
          },
          "completed_at": {
            "type": "string",
            "format": "date-time",
            "description": "Wann das erneute Screening dieses Subjekts abgeschlossen wurde. Die Ergebnisse sind danach sortiert, neueste zuerst."
          },
          "started_at": {
            "type": "string",
            "format": "date-time",
            "description": "Wann der Überwachungs-Batch begann, zu dem diese erneute Überprüfung gehört."
          },
          "outcome": {
            "type": "string",
            "enum": [
              "NO_CHANGE",
              "CHANGED",
              "FAILED"
            ],
            "description": "`NO_CHANGE`: Abgeschlossen und das Ergebnis hat sich nicht geändert. `CHANGED`: Abgeschlossen und der Score, Status, die Trefferanzahl oder die Treffer haben sich geändert. `FAILED`: Keine verwertbare Antwort für dieses Subjekt, daher blieb die Prüfung unverändert."
          },
          "trigger": {
            "type": "string",
            "enum": [
              "ONGOING_MONITORING"
            ],
            "description": "Was das Screening gestartet hat. Derzeit immer `ONGOING_MONITORING`."
          },
          "provider": {
            "type": "string",
            "description": "Opake Kennung der AML-Datenquelle, die geantwortet hat. Als opaken String behandeln; nicht danach verzweigen.",
            "example": "aml_data_source"
          },
          "status": {
            "type": "string",
            "nullable": true,
            "enum": [
              "Not Finished",
              "Approved",
              "Declined",
              "In Review",
              "Resub Requested",
              null
            ],
            "description": "Status der AML-Prüfung, den diese nach diesem Lauf hatte."
          },
          "score": {
            "type": "number",
            "format": "float",
            "nullable": true,
            "minimum": 0,
            "maximum": 100,
            "description": "AML-Score, den die Prüfung nach diesem Lauf hatte."
          },
          "total_hits": {
            "type": "integer",
            "nullable": true,
            "description": "Anzahl der Treffer, mit denen dieser Durchlauf die Prüfung hinterlassen hat."
          },
          "new_hits": {
            "type": "integer",
            "nullable": true,
            "description": "Anzahl der Treffer, die dieser Durchlauf gefunden hat und die die Prüfung zuvor nicht aufwies. `0`, wenn nichts Neues gefunden wurde; `null`, wenn der Durchlauf fehlschlug oder aufgezeichnet wurde, bevor diese Zählung existierte."
          },
          "entities_screened": {
            "type": "integer",
            "minimum": 0,
            "maximum": 1,
            "description": "Anzahl der Entitäten, die dieser Durchlauf für die Verifizierung überprüft hat: `1`, wenn das Subjekt überprüft wurde, `0`, wenn der Durchlauf fehlgeschlagen ist."
          },
          "dataset_freshness": {
            "allOf": [
              {
                "$ref": "#/components/schemas/AMLDatasetFreshness"
              }
            ],
            "nullable": true,
            "description": "Aktualität des Datensatzes hinter diesem Durchlauf oder `null`, wenn keine Datumsangaben verfügbar waren."
          }
        }
      },
      "KYBKeyPeopleParty": {
        "type": "object",
        "description": "Eine Partei aus den Schlüsselpersonen einer Sitzung zur Unternehmensverifizierung (KYB) mit ihrer untergeordneten Verifizierung. Dieselbe Partei erscheint in `key_people_checks[].submitted.parties[]` der Entscheidung zur Unternehmenssitzung.",
        "required": [
          "uuid",
          "entity_type",
          "source",
          "name",
          "is_active",
          "is_skipped",
          "requires_verification",
          "roles",
          "kyc_session_deleted",
          "kyb_sub_session_deleted"
        ],
        "properties": {
          "uuid": {
            "type": "string",
            "format": "uuid",
            "description": "Parteien-ID."
          },
          "entity_type": {
            "type": "string",
            "enum": [
              "person",
              "company"
            ],
            "description": "Gibt an, ob die Partei eine Einzelperson oder ein Unternehmen ist."
          },
          "source": {
            "type": "string",
            "enum": [
              "REGISTRY",
              "USER"
            ],
            "description": "`REGISTRY`: Aus dem Unternehmensregister übernommen. `USER`: Im Bildschirm „Schlüsselpersonen“ eingegeben."
          },
          "name": {
            "type": "string",
            "description": "Anzeigename der Partei."
          },
          "first_name": {
            "type": "string",
            "nullable": true,
            "description": "Vorname (Personen)."
          },
          "last_name": {
            "type": "string",
            "nullable": true,
            "description": "Nachname (Personen)."
          },
          "company_name": {
            "type": "string",
            "nullable": true,
            "description": "Unternehmensname (Unternehmensparteien)."
          },
          "registration_number": {
            "type": "string",
            "nullable": true,
            "description": "Unternehmensregisternummer (Unternehmensparteien)."
          },
          "email": {
            "type": "string",
            "format": "email",
            "nullable": true,
            "description": "E-Mail-Adresse, an die der Verifizierungslink gesendet wird."
          },
          "nationality": {
            "type": "string",
            "nullable": true,
            "description": "Staatsangehörigkeit für Personen, Gründungsland für Unternehmen."
          },
          "phone_number": {
            "type": "string",
            "nullable": true,
            "description": "Für die Partei erfasste Telefonnummer."
          },
          "date_of_birth": {
            "type": "string",
            "format": "date",
            "nullable": true,
            "description": "Geburtsdatum (Personen)."
          },
          "position": {
            "type": "string",
            "nullable": true,
            "description": "Freitext-Berufsbezeichnung (Personen)."
          },
          "custom_fields": {
            "type": "object",
            "additionalProperties": true,
            "description": "Vom Workflow definierte benutzerdefinierte Felder, die für die Partei erfasst wurden, indiziert nach Feldschlüssel."
          },
          "is_active": {
            "type": "boolean",
            "description": "Gibt an, ob die Partei aktiv ist."
          },
          "is_skipped": {
            "type": "boolean",
            "description": "Gibt an, ob die Partei von der Verifizierung ausgenommen ist. Ein erneutes Generieren hebt dies auf."
          },
          "requires_verification": {
            "type": "boolean",
            "description": "Gibt an, ob die Rollen- und Eigentümerstruktur-Regeln eine Verifizierung für diese Partei vorschreiben."
          },
          "roles": {
            "type": "array",
            "description": "Rollen, die die Partei im Unternehmen innehat.",
            "items": {
              "type": "object",
              "required": [
                "role",
                "ownership_percent",
                "voting_percent"
              ],
              "properties": {
                "role": {
                  "type": "string",
                  "enum": [
                    "director",
                    "non_executive_director",
                    "secretary",
                    "chairman",
                    "ubo",
                    "shareholder",
                    "representative",
                    "founder",
                    "legal_advisor",
                    "authorized_signatory",
                    "trustee",
                    "beneficiary",
                    "settlor",
                    "protector",
                    "company_officer",
                    "investor",
                    "other"
                  ],
                  "description": "Rollencode."
                },
                "ownership_percent": {
                  "type": "number",
                  "nullable": true,
                  "description": "Eigentumsanteil in Prozent für diese Rolle, sofern bekannt."
                },
                "voting_percent": {
                  "type": "number",
                  "nullable": true,
                  "description": "Stimmrechtsanteil für diese Rolle, sofern bekannt."
                }
              }
            }
          },
          "kyc_session_id": {
            "type": "string",
            "format": "uuid",
            "nullable": true,
            "description": "Untergeordnete individuelle KYC-Sitzung (Personen)."
          },
          "kyc_session_status": {
            "type": "string",
            "nullable": true,
            "enum": [
              "Not Started",
              "In Progress",
              "Approved",
              "Declined",
              "In Review",
              "Expired",
              "Abandoned",
              "Kyc Expired",
              "Resubmitted",
              "Awaiting User",
              null
            ],
            "description": "Status der untergeordneten KYC-Sitzung. Eine gelöschte Sitzung behält den Status, den sie zum Zeitpunkt der Löschung hatte."
          },
          "kyc_session_url": {
            "type": "string",
            "format": "uri",
            "nullable": true,
            "description": "Gehosteter Link der untergeordneten KYC-Sitzung. `null`, wenn keine vorhanden ist oder sie gelöscht wurde, sowie bei einem berechtigungseingeschränkten API-Schlüssel ohne `sessions: write`."
          },
          "kyc_session_deleted": {
            "type": "boolean",
            "description": "Die untergeordnete KYC-Sitzung wurde gelöscht, sodass sie niemals abgeschlossen werden kann."
          },
          "kyb_sub_session_id": {
            "type": "string",
            "format": "uuid",
            "nullable": true,
            "description": "Untergeordnete KYB-Sitzung (Unternehmensparteien)."
          },
          "kyb_sub_session_status": {
            "type": "string",
            "nullable": true,
            "enum": [
              "Not Started",
              "In Progress",
              "Approved",
              "Declined",
              "In Review",
              "Expired",
              "Abandoned",
              "Kyc Expired",
              "Resubmitted",
              "Awaiting User",
              null
            ],
            "description": "Status der untergeordneten KYB-Sitzung."
          },
          "kyb_sub_session_url": {
            "type": "string",
            "format": "uri",
            "nullable": true,
            "description": "Gehosteter Link der untergeordneten KYB-Sitzung, mit denselben `null`-Regeln wie bei `kyc_session_url`."
          },
          "kyb_sub_session_deleted": {
            "type": "boolean",
            "description": "Unternehmensbezogenes Gegenstück zu `kyc_session_deleted`."
          },
          "verification_workflow_type": {
            "type": "string",
            "nullable": true,
            "enum": [
              "kyc",
              "kyb",
              "adaptive_age_verification",
              "biometric_authentication",
              "address_verification",
              "questionnaire_verification",
              "email_verification",
              "phone_verification",
              null
            ],
            "description": "Typ des Workflows, den die untergeordnete Sitzung ausführt."
          },
          "verification_workflow_id": {
            "type": "string",
            "format": "uuid",
            "nullable": true,
            "description": "Workflow, den die untergeordnete Sitzung ausführt."
          },
          "verification_workflow_label": {
            "type": "string",
            "nullable": true,
            "description": "Bezeichnung dieses Workflows."
          },
          "verification_workflow_features": {
            "type": "array",
            "nullable": true,
            "description": "Funktionen des Workflows der untergeordneten Sitzung mit ihrem aktuellen Status.",
            "items": {
              "type": "object",
              "required": [
                "feature",
                "status"
              ],
              "properties": {
                "feature": {
                  "type": "string",
                  "description": "Funktionscode, zum Beispiel `ID_VERIFICATION` oder `LIVENESS`."
                },
                "status": {
                  "type": "string",
                  "description": "Funktionsstatus, `Not Finished`, bis sie ausgeführt wird."
                }
              }
            }
          },
          "didit_internal_id": {
            "type": "string",
            "format": "uuid",
            "nullable": true,
            "description": "Didits Kennung der verifizierten Person, sobald bekannt."
          }
        }
      },
      "TravelRuleDelivery": {
        "type": "object",
        "description": "Status der neuesten Nachricht, die der Transfer der anderen Seite schuldet. Didit kontaktiert die Gegenpartei, nachdem die Anfrage zurückgegeben wurde, die den Transfer erstellt oder geändert hat. Dieses Objekt gibt daher an, ob diese Nachricht durchgegangen ist: in der Warteschlange, wird gesendet, wartet auf Wiederholungsversuch nach einem Fehler, zugestellt oder fehlgeschlagen. Bei einem Fehler, von dem sich das Netzwerk noch erholen kann (keine rechtzeitige Antwort, fehlgeschlagene Verbindung, HTTP `408`, `429` oder `5xx`), wird der Versuch nach 30 Sekunden, 2 Minuten, 10 Minuten, 30 Minuten und 1 Stunde wiederholt. Wenn eine erste Nachricht (`kind: SEND`) endgültig fehlschlägt, weil das Netzwerk sie abgelehnt hat oder auch der sechste Versuch fehlgeschlagen ist, wechselt der Transfer zu `COUNTERPARTY_VASP_NOT_REACHABLE` mit `last_error` in seiner `timeline`; jede andere Nachricht, die endgültig fehlschlägt, wird in der `timeline` vermerkt. Der `status` des Transfers bleibt die maßgebliche Quelle für den Austausch selbst.",
        "required": [
          "kind",
          "status",
          "rail",
          "attempts",
          "last_error",
          "next_attempt_at",
          "delivered_at"
        ],
        "properties": {
          "kind": {
            "type": "string",
            "enum": [
              "SEND",
              "ANSWER",
              "TXID",
              "CANCEL",
              "POLL"
            ],
            "description": "Was die Nachricht übermittelt. `SEND`: die erste Nachricht des Transfers an die Gegenpartei (ausgehend; das Übertragungsnetzwerk wird beim Senden ausgewählt). `ANSWER`: Ihre Annahme oder Ablehnung gegenüber dem anfragenden Netzwerk (eingehend). `TXID`: der On-Chain-Transaktions-Hash, nachdem Sie den Transfer abgeschlossen haben. `CANCEL`: die Stornierung, nachdem Sie ihn abgebrochen haben. `POLL`: eine Statusabfrage an ein Netzwerk, das dies anbietet, die alle 5 Minuten wiederholt wird, während der Transfer auf die Gegenpartei wartet."
          },
          "status": {
            "type": "string",
            "enum": [
              "QUEUED",
              "SENDING",
              "RETRYING",
              "DELIVERED",
              "FAILED"
            ],
            "description": "`QUEUED`: Wartet auf den Versand. `SENDING`: Ein Versuch läuft. `RETRYING`: Ein Versuch ist fehlgeschlagen und der nächste erfolgt um `next_attempt_at`. `DELIVERED`: Die Gegenseite hat die Nachricht entgegengenommen. `FAILED`: Die Gegenseite hat sie abgelehnt oder der letzte Versuch ist fehlgeschlagen."
          },
          "rail": {
            "type": "string",
            "enum": [
              "INTERNAL",
              "TRP",
              "GTR",
              "TRUST",
              "VERIFYVASP",
              "SYGNA",
              "EMAIL",
              ""
            ],
            "description": "Die Schiene (Rail), die die Nachricht übermittelt. Leer, bis Didit eine für eine erste Nachricht ausgewählt hat."
          },
          "attempts": {
            "type": "integer",
            "minimum": 0,
            "description": "Bisher durchgeführte Versuche für diese Nachricht. Für eine Nachricht, die keine Statusabfrage ist, werden maximal 6 Versuche unternommen."
          },
          "last_error": {
            "type": "string",
            "description": "Die Art des Fehlers, der beim letzten Versuch aufgetreten ist, `\"\"`, wenn keiner aufgetreten ist: beispielsweise `email undeliverable`, `trp identity endpoint unreachable` oder `trp transfer inquiry delivery failed`. Sie enthält niemals die eigene Antwort der Gegenpartei, die in der `timeline` des Transfers verbleibt.\nWenn GTR mit einem Fehler antwortet, sind dessen eigener Statuscode und dessen Nachricht enthalten. Antwortinhalte sind niemals enthalten.",
            "example": "email undeliverable"
          },
          "next_attempt_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "description": "Wann der nächste Versuch ausgeführt wird, während die Nachricht `QUEUED` oder `RETRYING` ist."
          },
          "delivered_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "description": "Wann die Gegenseite die Nachricht entgegengenommen hat."
          }
        }
      },
      "TravelRuleDiscoveryStep": {
        "type": "object",
        "description": "Ein Schritt der Gegenpartei-Ermittlung, die Didit für einen ausgehenden Transfer durchgeführt hat, in der Reihenfolge der Ausführung. Der erste Schritt, der einen VASP mit einer Route benennt, beendet die Kette.",
        "properties": {
          "step": {
            "type": "string",
            "enum": [
              "internal_address_book",
              "wallet_attribution",
              "network_lookup",
              "customer_hint",
              "end_user"
            ],
            "description": "`internal_address_book`: ein anderer Didit-Kunde, der die Kontrolle über die Ziel-Wallet nachgewiesen hat. `wallet_attribution`: die Blockchain-Analyse-Zuordnung der Wallet. `network_lookup`: ein Netzwerk, das angeben kann, welcher VASP die Adresse hält. `customer_hint`: der VASP-Name, der LEI oder die Jurisdiktion, die Sie in `beneficiary_data` übermittelt haben. `end_user`: die Gegenpartei, die der Endbenutzer (oder Sie) ausgewählt hat, oder die Aufforderung, eine auszuwählen."
          },
          "outcome": {
            "type": "string",
            "enum": [
              "match",
              "miss",
              "skipped"
            ],
            "description": "`match`: Der Schritt hat eine Gegenpartei benannt. `miss`: Er wurde ausgeführt und hat keine gefunden. `skipped`: Er konnte nicht ausgeführt werden, und `reason` gibt den Grund an."
          },
          "reason": {
            "type": "string",
            "description": "Maschinenlesbarer Grund, `\"\"` bei einer Übereinstimmung: `no_proven_internal_wallet`, `attribution_disabled`, `already_attributed`, `no_attributed_entity`, `directory_match_no_route`, `gtr_address_lookup_runs_on_dispatch`, `no_membership`, `network_switched_off`, `no_network_address_lookup`, `no_directory_match`, `awaiting_end_user` oder `picked_member_without_proven_wallet`."
          },
          "vasp": {
            "type": "string",
            "format": "uuid",
            "nullable": true,
            "description": "Der Verzeichnis-VASP, den der Schritt benannt hat, sofern einer benannt wurde."
          },
          "rail": {
            "type": "string",
            "nullable": true,
            "description": "Die Schiene (Rail), die diese Gegenpartei erreicht, sofern der Schritt eine gefunden hat."
          },
          "at": {
            "type": "string",
            "format": "date-time"
          }
        }
      },
      "TravelRuleNextAction": {
        "type": "object",
        "description": "Eine Maßnahme, die einen Transfer mit dem Status `COUNTERPARTY_VASP_NOT_FOUND` oder `COUNTERPARTY_VASP_NOT_REACHABLE` voranbringt. Siehe [Warum ein Transfer festhängt](/de/transaction-monitoring/travel-rule#warum-ein-transfer-blockiert-ist).",
        "properties": {
          "action": {
            "type": "string",
            "enum": [
              "select_counterparty_vasp",
              "declare_self_hosted",
              "add_vasp_hint",
              "update_compliance_email",
              "resend"
            ],
            "description": "`select_counterparty_vasp`: Der Endbenutzer wählt die Ziel-VASP im Widget zum Wallet-Eigentumsnachweis aus, oder Sie senden einen PATCH mit `action=beneficiary_vasp`. `declare_self_hosted`: Der Endbenutzer deklariert die Wallet im Widget als selbstverwahrt. `add_vasp_hint`: Teilen Sie Didit über einen VASP-Namen, LEI oder eine Travel Address (beispielsweise eine `travel_address` im Adressbucheintrag der Ziel-Wallet) mit, wer die Gegenpartei ist, und senden Sie die Anfrage erneut. `update_compliance_email` und `resend` sind `action`-Werte von `PATCH /v3/transactions/{transaction_id}/travel-rule/`: Geben Sie die Compliance-E-Mail der Gegenpartei erneut an und führen Sie das Routing noch einmal durch."
          },
          "url": {
            "type": "string",
            "format": "uri",
            "description": "Der Link zum Wallet-Ownership-Widget, bei `select_counterparty_vasp` und `declare_self_hosted`, solange der Transfer eine offene Widget-Sitzung hat."
          }
        },
        "required": [
          "action"
        ]
      },
      "TransactionTravelRule": {
        "type": "object",
        "description": "Der Travel-Rule-Transfer einer Transaktion, wie `GET /v3/transactions/{transaction_id}/`, der `201`-Status von `POST /v3/transactions/` und jede Zeile von `GET /v3/transactions/` ihn zurückgeben. `direction`, `rail`, `counterparty_vasp`, `delivery`, `discovery`, `reason` und `next_actions` haben dieselbe Struktur wie bei `PATCH /v3/transactions/{transaction_id}/travel-rule/`, sodass ein einziger Lesevorgang einer Transaktion zeigt, warum ihr Transfer feststeckt und was ihn weiterbringt.",
        "properties": {
          "uuid": {
            "type": "string",
            "format": "uuid"
          },
          "status": {
            "type": "string"
          },
          "protocol": {
            "type": "string",
            "nullable": true
          },
          "required": {
            "type": "boolean"
          },
          "obligations_count": {
            "type": "integer"
          },
          "originator_data": {
            "type": "object",
            "description": "Auftraggeber-Partei. Bei einer eingehenden Überweisung werden die Werte der Gegenpartei maskiert, bis die Eigentümerstruktur bestätigt ist."
          },
          "beneficiary_data": {
            "type": "object",
            "description": "Begünstigter. Bei eingehenden Übertragungen werden die Werte der Gegenpartei maskiert, bis die Eigentümerschaft bestätigt ist."
          },
          "name_match": {
            "type": "object",
            "nullable": true,
            "description": "Der Namensabgleich, der über den Transfer entschieden hat (Wert und Strenge). Null, bis einer ausgeführt wurde. Die verglichenen Namen werden zusammen mit den Parteien maskiert."
          },
          "data_match": {
            "$ref": "#/components/schemas/TravelRuleDataMatch"
          },
          "mismatched_fields": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Kürzel für `data_match.mismatched_fields`. Leer, wenn keine Unterschiede vorliegen."
          },
          "data_unmasked": {
            "$ref": "#/components/schemas/TravelRuleDataUnmasked"
          },
          "data_masked": {
            "type": "boolean",
            "description": "Wahr, solange die personenbezogenen Daten der Gegenpartei in dieser Antwort maskiert sind."
          },
          "metadata": {
            "type": "object"
          },
          "direction": {
            "type": "string",
            "enum": [
              "INBOUND",
              "OUTBOUND"
            ],
            "description": "Welche Seite des Austauschs diese Überweisung darstellt."
          },
          "rail": {
            "type": "string",
            "nullable": true,
            "description": "Die Schiene (Rail), über die der Transfer lief: `INTERNAL`, `TRP`, `GTR`, `TRUST`, `VERIFYVASP`, `SYGNA` oder `EMAIL` (`TEST_VASP` bei einer Sandbox-Anwendung, wenn der Didit Test VASP geantwortet hat), oder `null`, bis eine Schiene ausgewählt ist."
          },
          "counterparty_vasp": {
            "type": "object",
            "nullable": true,
            "properties": {
              "name": {
                "type": "string"
              },
              "lei": {
                "type": "string"
              },
              "dd_score": {
                "type": "integer",
                "description": "Due-Diligence-Score von 0 bis 100, wobei ein höherer Wert besser ist. Gleiche Skala wie im VASP-Verzeichnis."
              },
              "dd_score_breakdown": {
                "type": "object",
                "description": "Beiträge pro Komponente zu dd_score, ein Objekt pro Komponente wie im VASP-Verzeichnis (jurisdiction, verification, protocol, lei, history, essentials, responsiveness), jeweils {points, max, reason, detail}. {}, bis die Gegenpartei bewertet wurde.",
                "additionalProperties": {
                  "type": "object",
                  "properties": {
                    "points": {
                      "type": "number",
                      "description": "Für diese Komponente vergebene Punkte."
                    },
                    "max": {
                      "type": "integer",
                      "description": "Maximale Punktzahl, die diese Komponente vergeben kann."
                    },
                    "reason": {
                      "type": "string",
                      "description": "Maschinenlesbarer Code der Entscheidung der Komponente."
                    },
                    "detail": {
                      "type": "string",
                      "description": "Für Menschen lesbare Begründung für die vergebenen Punkte."
                    }
                  }
                }
              },
              "dd_assessed_at": {
                "type": "string",
                "format": "date-time",
                "nullable": true,
                "description": "Wann die Due-Diligence-Bewertung zuletzt durchgeführt wurde. Null, bis die Gegenpartei bewertet wurde."
              }
            },
            "description": "Der Verzeichniseintrag der Gegenpartei oder `null`, wenn der Transfer mit keinem verknüpft ist."
          },
          "delivery": {
            "nullable": true,
            "allOf": [
              {
                "$ref": "#/components/schemas/TravelRuleDelivery"
              }
            ],
            "description": "Die neueste Nachricht, die der Transfer einer anderen Partei schuldet. `null`, wenn er keine geschuldet hat, beispielsweise unter `threshold_amount` oder bei einer deklarierten selbstverwahrten Wallet."
          },
          "discovery": {
            "type": "array",
            "description": "Wie Didit nach der Gegenpartei gesucht hat, ein Eintrag pro ausgeführtem Schritt. Leer, wenn keine Ermittlung stattgefunden hat, beispielsweise bei einem eingehenden Transfer.",
            "items": {
              "$ref": "#/components/schemas/TravelRuleDiscoveryStep"
            }
          },
          "reason": {
            "type": "string",
            "description": "Warum ein Transfer mit `COUNTERPARTY_VASP_NOT_FOUND` oder `COUNTERPARTY_VASP_NOT_REACHABLE` feststeckt; `\"\"` für jeden anderen Status. Eine fehlgeschlagene Zustellung bestimmt dies zuerst, ausschließlich bei `COUNTERPARTY_VASP_NOT_REACHABLE`: `email_undeliverable` (der E-Mail-Provider hat die Compliance-E-Mail abgelehnt und es bleibt keine Adresse mehr zum Ausprobieren: beim Senden, bei einer Erinnerung oder als später gemeldeter permanenter Bounce) oder `delivery_failed` (die zustellende Schiene ist endgültig fehlgeschlagen: eine Netzwerkschiene hat die Nachricht abgelehnt oder keine Wiederholungsversuche mehr übrig, ein `TRP`-Identitäts-Host hat nicht geantwortet oder der `TRP`-Host der Gegenpartei hat die Anfrage nicht akzeptiert). Andernfalls bestimmt es der `discovery`-Trace: `awaiting_end_user` (kein Schritt hat eine Gegenpartei benannt, die Didit erreichen kann), `directory_match_no_route` (ein Schritt hat einen Verzeichnis-VASP benannt, der keine Route hat), `picked_member_without_proven_wallet` (der Endbenutzer hat einen Didit-Kunden ausgewählt, der die Kontrolle über die Wallet nicht nachgewiesen hat) oder `no_directory_match`, wenn der Trace keinen anderen Grund liefert. Ein erneutes Senden bringt den Transfer voran, sodass der Grund zurückgesetzt wird. Siehe [Warum ein Transfer feststeckt](/de/transaction-monitoring/travel-rule#warum-ein-transfer-blockiert-ist)."
          },
          "next_actions": {
            "type": "array",
            "description": "Was den Transfer voranbringt; `[]` für jeden Status außer `COUNTERPARTY_VASP_NOT_FOUND` oder `COUNTERPARTY_VASP_NOT_REACHABLE`. `email_undeliverable` bietet `update_compliance_email`, dann `resend`. `delivery_failed` bietet `resend`. Ein Discovery-Grund bietet `select_counterparty_vasp`, `declare_self_hosted`, `add_vasp_hint` und `resend`.",
            "items": {
              "$ref": "#/components/schemas/TravelRuleNextAction"
            }
          },
          "chain_details": {
            "$ref": "#/components/schemas/TravelRuleChainDetails"
          }
        }
      },
      "NetworkListCounts": {
        "type": "object",
        "description": "Netzwerkanzahlen für die Ansichten und Filteroptionen der Liste, wobei jedes Netzwerk einmal gezählt wird. Wird nur zurückgegeben, wenn `summary` nicht `false` ist. `scopes` zählt jedes für die Anwendung sichtbare Netzwerk. `views` zählt die sichtbaren Netzwerke innerhalb des ausgewählten `scope`. `facets` zählt die Netzwerke im ausgewählten `scope` und der `status`-Ansicht (verworfene Netzwerke werden ausgelassen, es sei denn, `status` enthält sie). Die anderen Listenfilter ändern diese Anzahlen nicht.",
        "properties": {
          "scopes": {
            "type": "object",
            "description": "Sichtbare Netzwerke nach Produkt.",
            "properties": {
              "all": {
                "type": "integer"
              },
              "identity": {
                "type": "integer",
                "description": "Jedes andere Netzwerk."
              },
              "transactions": {
                "type": "integer",
                "description": "Netzwerke, deren Mitglieder alle Transaktionsparteien sind."
              }
            }
          },
          "views": {
            "type": "object",
            "description": "Sichtbare Netzwerke innerhalb des ausgewählten `scope`, nach Status, plus zwei gespeicherte Ansichten.",
            "properties": {
              "all": {
                "type": "integer"
              },
              "active": {
                "type": "integer"
              },
              "in_review": {
                "type": "integer"
              },
              "resolved": {
                "type": "integer"
              },
              "dismissed": {
                "type": "integer"
              },
              "mine": {
                "type": "integer",
                "description": "Netzwerke, die dem aufrufenden Console-Mitglied zugewiesen sind. Bei einem API-Schlüssel immer 0."
              },
              "high_risk": {
                "type": "integer",
                "description": "Netzwerke mit einem Risiko-Score von mindestens 80, die nicht verworfen wurden."
              }
            }
          },
          "facets": {
            "type": "object",
            "description": "Anzahlen für jede Filteroption innerhalb des ausgewählten `scope` und der Statusansicht.",
            "properties": {
              "total": {
                "type": "integer",
                "description": "Netzwerke im ausgewählten `scope` und der Statusansicht."
              },
              "last_activity_days": {
                "type": "object",
                "description": "Netzwerke mit Aktivität in den letzten 7, 30 und 90 Tagen, aufgeschlüsselt nach der Anzahl der Tage.",
                "properties": {
                  "7": {
                    "type": "integer"
                  },
                  "30": {
                    "type": "integer"
                  },
                  "90": {
                    "type": "integer"
                  }
                }
              },
              "risk_min": {
                "type": "object",
                "description": "Netzwerke mit einem Risiko-Score von mindestens 50 und mindestens 80, aufgeschlüsselt nach dem Schwellenwert.",
                "properties": {
                  "50": {
                    "type": "integer"
                  },
                  "80": {
                    "type": "integer"
                  }
                }
              },
              "signal_types": {
                "type": "object",
                "description": "Netzwerke mit mindestens einem Signal jedes Typs.",
                "properties": {
                  "ip_address": {
                    "type": "integer"
                  },
                  "device": {
                    "type": "integer"
                  },
                  "face": {
                    "type": "integer"
                  },
                  "document_number": {
                    "type": "integer"
                  },
                  "phone": {
                    "type": "integer"
                  },
                  "email": {
                    "type": "integer"
                  },
                  "address": {
                    "type": "integer"
                  }
                }
              },
              "priority": {
                "type": "object",
                "description": "Netzwerke nach Priorität. `none` zählt Netzwerke ohne Priorität.",
                "properties": {
                  "low": {
                    "type": "integer"
                  },
                  "medium": {
                    "type": "integer"
                  },
                  "high": {
                    "type": "integer"
                  },
                  "none": {
                    "type": "integer"
                  }
                }
              },
              "assignee": {
                "type": "object",
                "description": "Netzwerke nach zugewiesener Person.",
                "properties": {
                  "me": {
                    "type": "integer",
                    "description": "Dem aufrufenden Console-Mitglied zugewiesen. Bei einem API-Schlüssel immer 0."
                  },
                  "unassigned": {
                    "type": "integer",
                    "description": "Niemandem zugewiesen."
                  },
                  "users": {
                    "type": "array",
                    "description": "Ein Eintrag pro Beauftragtem, diejenigen mit den meisten Netzwerken zuerst.",
                    "items": {
                      "type": "object",
                      "properties": {
                        "uuid": {
                          "type": "string",
                          "format": "uuid"
                        },
                        "full_name": {
                          "type": "string",
                          "description": "Der Name der zugewiesenen Person oder deren E-Mail-Adresse, wenn kein Name festgelegt ist."
                        },
                        "email": {
                          "type": "string"
                        },
                        "count": {
                          "type": "integer"
                        }
                      }
                    }
                  }
                }
              },
              "has_case": {
                "type": "integer",
                "description": "Netzwerke, für die diese Anwendung einen Fall eröffnet hat."
              },
              "min_size": {
                "type": "object",
                "description": "Netzwerke mit mindestens 10 Mitgliedern, aufgeschlüsselt nach der Mindestgröße.",
                "properties": {
                  "10": {
                    "type": "integer"
                  }
                }
              }
            }
          }
        }
      },
      "NetworkTag": {
        "type": "object",
        "description": "Einer der Tags Ihrer Anwendung im Netzwerk.",
        "properties": {
          "uuid": {
            "type": "string",
            "format": "uuid",
            "description": "Die UUID des Tags, derselbe Wert, den Sie als `tag_uuid` übergeben."
          },
          "name": {
            "type": "string"
          },
          "color": {
            "type": "string",
            "description": "Hex-Farbe, zum Beispiel `#6366F1`."
          },
          "source": {
            "type": "string",
            "enum": [
              "didit",
              "custom"
            ],
            "description": "`didit` für ein von Didit vorgegebenes Tag, `custom` für ein von Ihrem Team erstelltes Tag."
          },
          "added_by": {
            "type": "string",
            "nullable": true,
            "description": "E-Mail des Console-Mitglieds, das den Tag hinzugefügt hat. Null, wenn er über einen API-Schlüssel hinzugefügt wurde."
          },
          "added_at": {
            "type": "string",
            "format": "date-time"
          }
        }
      },
      "NetworkOutcomes": {
        "type": "object",
        "description": "Status der Personen und Unternehmen des Netzwerks. Jedes Mitglied, das Sie sehen dürfen, zählt einmal, nach dem Status seiner jüngsten Verifizierung, die eine Entscheidung erreicht hat. Transaktionsparteien werden nicht mitgezählt.",
        "properties": {
          "approved": {
            "type": "integer",
            "description": "Mitglieder, deren letzte entschiedene Verifizierung genehmigt wurde."
          },
          "declined": {
            "type": "integer",
            "description": "Mitglieder, deren letzte entschiedene Verifizierung abgelehnt wurde."
          },
          "in_review": {
            "type": "integer",
            "description": "Mitglieder, deren letzte entschiedene Verifizierung in Prüfung ist."
          },
          "total": {
            "type": "integer",
            "description": "Mitglieder mit mindestens einer Verifizierung, entschieden oder nicht. Ein Mitglied, dessen Verifizierungen alle unentschieden sind (nicht gestartet, in Bearbeitung, abgelaufen oder abgebrochen), wird hier und in keinem anderen Schlüssel gezählt."
          }
        }
      },
      "NetworkPatternScore": {
        "type": "object",
        "description": "Wie ähnlich eine Art von Daten der Mitglieder über das gesamte Netzwerk hinweg ist. Ein Muster ist kein Signal: Kein geteilter Wert verknüpft die Mitglieder.",
        "properties": {
          "type": {
            "type": "string",
            "enum": [
              "background"
            ],
            "description": "`background`: die mittlere Ähnlichkeit jedes Paars von Selfie-Hintergründen von Mitgliedern, wobei die Person maskiert ist. Es liest das neueste Selfie jeder Person aus, maximal die 50 neuesten, und lässt Altersüberprüfungssitzungen aus. Es deckt das gesamte Netzwerk ab, nicht nur die Mitglieder Ihrer Anwendungen."
          },
          "score": {
            "type": "number",
            "nullable": true,
            "minimum": 0,
            "maximum": 1,
            "description": "Von 0 bis 1, gerundet auf 4 Dezimalstellen. Null, wenn `reason` gesetzt ist."
          },
          "members": {
            "type": "integer",
            "nullable": true,
            "description": "Wie viele Selfies von Mitgliedern der Score verglichen hat. Ein Selfie, das nicht gelesen werden kann oder zu wenig Hintergrund zeigt, wird nicht verglichen. Null während `computing`; 0 oder 1 bei `not_enough_selfies`."
          },
          "reason": {
            "type": "string",
            "enum": [
              "computing",
              "not_enough_selfies"
            ],
            "nullable": true,
            "description": "Warum kein Score vorhanden ist. `computing`: Der Score für die aktuellen Mitglieder wird berechnet; lesen Sie das Netzwerk später erneut aus. `not_enough_selfies`: Weniger als zwei Mitglieder haben ein verwendbares Selfie. Null, wenn ein Score vorhanden ist."
          },
          "computed_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "description": "Wann der Score berechnet wurde. Null während `computing`."
          }
        }
      },
      "NetworkDetailResponse": {
        "description": "Die Netzwerkdetails sowie der Freigabemodus der Organisation, ob organisationsübergreifende Signale darauf zutreffen, die Tags Ihrer Anwendung im Netzwerk, Mitgliedsergebnisse und Musterscores.",
        "allOf": [
          {
            "$ref": "#/components/schemas/NetworkDetail"
          },
          {
            "type": "object",
            "properties": {
              "sharing_mode": {
                "type": "string",
                "enum": [
                  "off",
                  "private",
                  "global"
                ],
                "description": "Der organisationsübergreifende Freigabemodus der Organisation. Nur `global` vergleicht Netzwerke über Organisationen hinweg; `private` und `off` beschränken sie auf den eigenen Verlauf der Organisation.",
                "example": "global"
              },
              "cross_org_available": {
                "type": "boolean",
                "description": "Gibt an, ob organisationsübergreifende Signale für diese Organisation gelten. Sie erfordern sowohl den Enterprise-Tarif als auch den Freigabemodus `global`.",
                "example": true
              },
              "cross_org_unavailable_reason": {
                "type": "string",
                "enum": [
                  "plan",
                  "sharing_mode"
                ],
                "nullable": true,
                "description": "Warum organisationsübergreifende Signale nicht greifen, geprüft in dieser Reihenfolge. `plan`: Der Tarif der Organisation enthält das organisationsübergreifende Betrugsnetzwerk nicht (erfordert den Enterprise-Tarif), unabhängig vom Freigabemodus. `sharing_mode`: Der Tarif enthält es, aber der Freigabemodus ist `private` oder `off`. Null, wenn `cross_org_available` `true` ist.",
                "example": null
              },
              "tags": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/NetworkTag"
                },
                "description": "Die Tags Ihrer Anwendung im Netzwerk, älteste zuerst. Jede Anwendung sieht nur ihre eigenen Tags. `fraud_tags` ist separat und unverändert: die Tags, die die Mitglieder des Netzwerks tragen."
              },
              "outcomes": {
                "$ref": "#/components/schemas/NetworkOutcomes"
              },
              "patterns": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/NetworkPatternScore"
                },
                "description": "Muster-Scores über das gesamte Netzwerk. Aktuell ein Element, `background`."
              }
            }
          }
        ]
      },
      "NetworkTagRequest": {
        "type": "object",
        "required": [
          "tag_uuid"
        ],
        "properties": {
          "tag_uuid": {
            "type": "string",
            "format": "uuid",
            "description": "UUID eines der Tags Ihrer Anwendung."
          }
        },
        "example": {
          "tag_uuid": "7c9e6679-7425-40de-944b-e07fc1f90ae7"
        }
      },
      "NetworkTimeline": {
        "title": "Default timeline (no contract)",
        "type": "object",
        "description": "Ohne `contract`: Die netzwerkeigenen Ereignisse, älteste zuerst, nicht paginiert.",
        "properties": {
          "results": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/NetworkTimelineEvent"
            }
          }
        }
      },
      "NetworkTimelinePage": {
        "title": "Typed timeline page (contract=2)",
        "type": "object",
        "description": "Mit `contract=2`: Eine Seite typisierter Ereignisse, neueste zuerst.",
        "properties": {
          "results": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/NetworkTypedTimelineEvent"
            }
          },
          "next_cursor": {
            "type": "string",
            "nullable": true,
            "description": "Als `cursor` übergeben, um die nächste Seite zu lesen. Null auf der letzten Seite."
          }
        }
      },
      "NetworkTypedTimelineEvent": {
        "type": "object",
        "description": "Ein typisiertes Timeline-Ereignis: die vier Standardfelder plus dessen ID, der Zeitpunkt der Speicherung durch Didit, das zugehörige Mitgliedskonto und der Datensatz sowie der Detailblock seines Ereignistyps. Die anderen Detailblöcke sind null.",
        "properties": {
          "id": {
            "type": "string",
            "description": "`<source>:<uuid>`, eindeutig innerhalb der Timeline.",
            "example": "session:3fa85f64-5717-4562-b3fc-2c963f66afa6"
          },
          "event_type": {
            "type": "string",
            "enum": [
              "network_detected",
              "signal_observed",
              "network_active",
              "network_in_review",
              "network_resolved",
              "network_dismissed",
              "verification_attempt",
              "transaction",
              "login",
              "rule_hit",
              "case_linked",
              "note_added"
            ]
          },
          "occurred_at": {
            "type": "string",
            "format": "date-time",
            "description": "Wann es stattgefunden hat."
          },
          "ingested_at": {
            "type": "string",
            "format": "date-time",
            "description": "Wann Didit dies gespeichert hat."
          },
          "label": {
            "type": "string",
            "description": "Ein kurzes englisches Label, zum Beispiel `Verification attempt 2 of 3`."
          },
          "metadata": {
            "type": "object",
            "description": "Für die eigenen Ereignisse des Netzwerks: dieselben Metadaten wie bei der Standard-Timeline. Andernfalls leer."
          },
          "account": {
            "allOf": [
              {
                "$ref": "#/components/schemas/NetworkTimelineAccount"
              }
            ],
            "nullable": true,
            "description": "Das Mitgliedskonto. Null für die eigenen Ereignisse des Netzwerks, `case_linked` und `note_added`."
          },
          "source_ref": {
            "allOf": [
              {
                "$ref": "#/components/schemas/NetworkTimelineSourceRef"
              }
            ],
            "nullable": true,
            "description": "Der Quelldatensatz. Null für die eigenen Ereignisse des Netzwerks und `note_added`."
          },
          "verification_attempt": {
            "allOf": [
              {
                "$ref": "#/components/schemas/NetworkTimelineAttempt"
              }
            ],
            "nullable": true,
            "description": "Wird bei `verification_attempt`-Ereignissen gesetzt."
          },
          "transaction": {
            "allOf": [
              {
                "$ref": "#/components/schemas/NetworkTimelineTransaction"
              }
            ],
            "nullable": true,
            "description": "Wird bei `transaction`-Ereignissen gesetzt."
          },
          "login": {
            "allOf": [
              {
                "$ref": "#/components/schemas/NetworkTimelineLogin"
              }
            ],
            "nullable": true,
            "description": "Wird bei `login`-Ereignissen gesetzt."
          },
          "rule_hit": {
            "allOf": [
              {
                "$ref": "#/components/schemas/NetworkTimelineRuleHit"
              }
            ],
            "nullable": true,
            "description": "Wird bei `rule_hit`-Ereignissen gesetzt."
          },
          "case_linked": {
            "allOf": [
              {
                "$ref": "#/components/schemas/NetworkTimelineCaseLinked"
              }
            ],
            "nullable": true,
            "description": "Wird bei `case_linked`-Ereignissen gesetzt."
          },
          "note_added": {
            "allOf": [
              {
                "$ref": "#/components/schemas/NetworkTimelineNoteAdded"
              }
            ],
            "nullable": true,
            "description": "Wird bei `note_added`-Ereignissen gesetzt. Wird niemals an einen API-Schlüssel zurückgegeben."
          }
        }
      },
      "NetworkTimelineAccount": {
        "type": "object",
        "description": "Das Mitgliedskonto, zu dem das Ereignis gehört.",
        "properties": {
          "node_id": {
            "type": "string",
            "description": "`<kind>:<uuid>`, wobei kind `vendor_user`, `vendor_business` oder `transaction_party` ist.",
            "example": "vendor_user:3fa85f64-5717-4562-b3fc-2c963f66afa6"
          },
          "node_type": {
            "type": "string",
            "enum": [
              "account",
              "business_account",
              "transaction_party"
            ]
          },
          "uuid": {
            "type": "string",
            "format": "uuid"
          },
          "vendor_data": {
            "type": "string",
            "nullable": true
          },
          "display_name": {
            "type": "string",
            "nullable": true
          },
          "ownership": {
            "type": "string",
            "enum": [
              "owned",
              "organization"
            ],
            "description": "`owned`, wenn der Datensatz zu der Anwendung gehört, die Sie aufgerufen haben (für ein Konsolenmitglied zu einer Anwendung, für die ihm Zugriff gewährt wurde). `organization`, wenn er zu einer anderen Anwendung Ihrer Organisation gehört."
          },
          "route": {
            "$ref": "#/components/schemas/NetworkTimelineRoute"
          }
        }
      },
      "NetworkTimelineSourceRef": {
        "type": "object",
        "description": "Der Datensatz, aus dem das Ereignis gelesen wurde.",
        "properties": {
          "kind": {
            "type": "string",
            "enum": [
              "session",
              "business_session",
              "transaction",
              "monitoring_event",
              "case"
            ]
          },
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "ownership": {
            "type": "string",
            "enum": [
              "owned",
              "organization"
            ],
            "description": "`owned`, wenn der Datensatz zu der Anwendung gehört, die Sie aufgerufen haben (für ein Konsolenmitglied zu einer Anwendung, für die ihm Zugriff gewährt wurde). `organization`, wenn er zu einer anderen Anwendung Ihrer Organisation gehört."
          },
          "route": {
            "allOf": [
              {
                "$ref": "#/components/schemas/NetworkTimelineRoute"
              }
            ],
            "description": "Nicht vorhanden für `monitoring_event` und `case`."
          }
        }
      },
      "NetworkTimelineRoute": {
        "type": "object",
        "description": "Wo der Datensatz geöffnet wird: seine Art, seine UUID und die Anwendung, zu der er gehört.",
        "properties": {
          "kind": {
            "type": "string",
            "description": "`user`, `business` oder `transaction_party` für ein Konto; `session`, `business_session` oder `transaction` für einen Quelldatensatz."
          },
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "application_id": {
            "type": "string",
            "format": "uuid"
          }
        }
      },
      "NetworkTimelineAttempt": {
        "type": "object",
        "description": "Eine Verifizierungssitzung des Kontos.",
        "properties": {
          "session_id": {
            "type": "string",
            "format": "uuid",
            "description": "Die Sitzungs-UUID oder die Business-Sitzungs-UUID für ein Unternehmen."
          },
          "session_number": {
            "type": "integer",
            "nullable": true
          },
          "attempt": {
            "type": "integer",
            "description": "Die Position dieser Sitzung unter den Sitzungen des Kontos, geordnet nach Erstellungsdatum."
          },
          "attempt_count": {
            "type": "integer",
            "description": "Wie viele Sitzungen das Konto hat."
          },
          "status": {
            "type": "string",
            "description": "Der Sitzungsstatus, zum Beispiel `Approved` oder `Declined`."
          },
          "status_changed_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "decline_reasons": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/NetworkTimelineDeclineReason"
            },
            "description": "Nur für eine abgelehnte Sitzung: deren Warnungen, älteste zuerst, einmal pro Warnung. Andernfalls leer."
          }
        }
      },
      "NetworkTimelineDeclineReason": {
        "type": "object",
        "properties": {
          "risk": {
            "type": "string",
            "description": "Der Warncode."
          },
          "feature": {
            "type": "string",
            "description": "Die Funktion, die die Warnung ausgelöst hat."
          },
          "short_description": {
            "type": "string"
          }
        }
      },
      "NetworkTimelineTransaction": {
        "type": "object",
        "description": "Eine Transaktion, an der ein Mitgliedskonto beteiligt war, datiert mit dem Transaktionsdatum.",
        "properties": {
          "transaction_id": {
            "type": "string",
            "format": "uuid"
          },
          "transaction_number": {
            "type": "integer",
            "nullable": true
          },
          "transaction_type": {
            "type": "string"
          },
          "action_type": {
            "type": "string"
          },
          "amount": {
            "allOf": [
              {
                "$ref": "#/components/schemas/NetworkTimelineAmount"
              }
            ],
            "nullable": true,
            "description": "Null, wenn die Transaktion keinen Betrag hat."
          },
          "status": {
            "type": "string"
          },
          "decision_reason_code": {
            "type": "string",
            "nullable": true
          },
          "decision_reason_label": {
            "type": "string",
            "nullable": true
          },
          "party_role": {
            "type": "string",
            "description": "Die Rolle des Kontos in der Transaktion: `APPLICANT`, `REMITTER`, `BENEFICIARY` oder `COUNTERPARTY`."
          }
        }
      },
      "NetworkTimelineAmount": {
        "type": "object",
        "properties": {
          "value": {
            "type": "string",
            "description": "Dezimalbetrag als Zeichenkette."
          },
          "currency": {
            "type": "string"
          },
          "direction": {
            "type": "string",
            "nullable": true
          }
        }
      },
      "NetworkTimelineLogin": {
        "type": "object",
        "description": "Ein Anmeldeereignis, das Sie für eine Person über die Events-API übermittelt haben.",
        "properties": {
          "action": {
            "type": "string",
            "description": "`<event_category>.<action_type>`: `auth.login` oder `security.login_succeeded` für eine Anmeldung, `auth.login_failed` oder `security.login_failed` für eine fehlgeschlagene Anmeldung."
          },
          "succeeded": {
            "type": "boolean"
          },
          "status": {
            "type": "string",
            "description": "Der Status des Ereignisses."
          },
          "ip": {
            "allOf": [
              {
                "$ref": "#/components/schemas/NetworkTimelineIP"
              }
            ],
            "nullable": true,
            "description": "Null, wenn das Ereignis keine IP-Adresse hat."
          },
          "device": {
            "allOf": [
              {
                "$ref": "#/components/schemas/NetworkTimelineDevice"
              }
            ],
            "nullable": true,
            "description": "Null, wenn das Ereignis keinen Geräte-Fingerabdruck oder Kontext hat."
          },
          "is_first_login": {
            "type": "boolean",
            "description": "Die erste verzeichnete erfolgreiche Anmeldung des Kontos."
          },
          "is_new_device": {
            "type": "boolean",
            "description": "Eine erfolgreiche Anmeldung von einem Gerät, von dem keine der früheren erfolgreichen Anmeldungen des Kontos stammte. Niemals true bei der ersten Anmeldung."
          }
        }
      },
      "NetworkTimelineIP": {
        "type": "object",
        "properties": {
          "address": {
            "type": "string"
          },
          "country_code": {
            "type": "string",
            "nullable": true
          },
          "city": {
            "type": "string",
            "nullable": true
          },
          "connection_type": {
            "type": "string",
            "nullable": true,
            "description": "Die Bezeichnung des Verbindungstyps für die Adresse als Freitext."
          },
          "is_vpn_or_tor": {
            "type": "boolean"
          },
          "is_data_center": {
            "type": "boolean"
          }
        }
      },
      "NetworkTimelineDevice": {
        "type": "object",
        "properties": {
          "fingerprint": {
            "type": "string",
            "nullable": true
          },
          "label": {
            "type": "string",
            "nullable": true,
            "description": "Ein lesbares Geräte-Label, das aus dem Gerätekontext des Ereignisses erstellt wurde."
          }
        }
      },
      "NetworkTimelineRuleHit": {
        "type": "object",
        "description": "Eine aktive Regel, die auf eine Transaktion oder ein Ereignis eines Mitglieds zutraf. Treffer im Testmodus sind nicht enthalten.",
        "properties": {
          "rule_id": {
            "type": "string",
            "format": "uuid"
          },
          "rule_title": {
            "type": "string"
          },
          "rule_category": {
            "type": "string"
          },
          "rule_source": {
            "type": "string"
          },
          "severity": {
            "type": "string",
            "nullable": true
          },
          "score_delta": {
            "type": "integer"
          },
          "status_target": {
            "type": "string",
            "nullable": true
          },
          "action_summary": {
            "type": "string",
            "nullable": true
          }
        }
      },
      "NetworkTimelineCaseLinked": {
        "type": "object",
        "description": "Ein für das Netzwerk in Ihrer Organisation eröffneter Fall. `source_ref.ownership` gibt an, ob er zu der von Ihnen aufgerufenen Anwendung gehört.",
        "properties": {
          "case_id": {
            "type": "string",
            "format": "uuid"
          },
          "case_number": {
            "type": "string",
            "nullable": true
          },
          "status": {
            "type": "string"
          },
          "author_email": {
            "type": "string",
            "nullable": true
          },
          "author_name": {
            "type": "string",
            "nullable": true
          }
        }
      },
      "NetworkTimelineNoteAdded": {
        "type": "object",
        "description": "Eine im Netzwerk hinterlassene Notiz. Der Notiztext ist nicht enthalten.",
        "properties": {
          "note_id": {
            "type": "string",
            "format": "uuid"
          },
          "author_email": {
            "type": "string"
          }
        }
      },
      "FeatureStatusOverride": {
        "type": "object",
        "description": "Eine Überschreibung eines Prüfungs- bzw. Funktionsstatus, vorgenommen mit `PATCH /v3/session/{sessionId}/features/{nodeId}/update-status/`: was geändert wird, ob sie angewendet wurde oder noch darauf wartet, dass die Person den Flow abschließt, wer die Anfrage gestellt hat und warum.",
        "required": [
          "id",
          "node_id",
          "feature_type",
          "feature_model",
          "previous_status",
          "new_status",
          "state",
          "forced",
          "reason",
          "requested_by",
          "requested_at",
          "applied_at",
          "cancelled_at",
          "cancel_reason"
        ],
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "description": "Kennung des Overrides. Übergeben Sie sie an den Cancel-Endpoint.",
            "example": "7c9e6679-7425-40de-944b-e07fc1f90ae7"
          },
          "node_id": {
            "type": "string",
            "description": "Der in der Anfrage angegebene Workflow-Knoten (`default` für einen Schritt ohne Knoten).",
            "example": "feature_ocr_1"
          },
          "feature_type": {
            "type": "string",
            "description": "Der von der Anfrage übergebene `feature_type` oder eine leere Zeichenkette, wenn keiner übergeben wurde.",
            "example": ""
          },
          "feature_model": {
            "type": "string",
            "description": "Die Art der Prüfung, die überschrieben wurde, beispielsweise `KYC`, `Face`, `AML` oder `GeolocationCheck`.",
            "example": "KYC"
          },
          "previous_status": {
            "type": "string",
            "enum": [
              "Not Finished",
              "Approved",
              "Declined",
              "In Review",
              "Resub Requested"
            ],
            "description": "Der Status der Überprüfung zum Zeitpunkt der Anfrage des Overrides.",
            "example": "In Review"
          },
          "new_status": {
            "type": "string",
            "enum": [
              "Approved",
              "Declined",
              "In Review"
            ],
            "description": "Der Status, den die Überschreibung festlegt.",
            "example": "Approved"
          },
          "state": {
            "type": "string",
            "enum": [
              "applied",
              "pending_until_flow_finishes",
              "cancelled"
            ],
            "description": "`applied`: Die Prüfung hat den neuen Status. `pending_until_flow_finishes`: Das Override wartet und greift, wenn die Person den Ablauf beendet. `cancelled`: Es hat gewartet und wurde nie angewendet (siehe `cancel_reason`).",
            "example": "applied"
          },
          "forced": {
            "type": "boolean",
            "description": "`true`, wenn die Überschreibung sofort angewendet wurde, während die Person sich noch im Ablauf befand.",
            "example": false
          },
          "reason": {
            "type": "string",
            "nullable": true,
            "description": "Der mit der Anfrage gesendete `comment` oder `null`.",
            "example": "Document manually verified by compliance."
          },
          "requested_by": {
            "type": "object",
            "nullable": true,
            "description": "Wer die Übersteuerung angefordert hat, oder `null`, wenn dies nicht bekannt ist.",
            "properties": {
              "email": {
                "type": "string",
                "format": "email",
                "nullable": true,
                "description": "E-Mail des Console-Benutzers oder `null` für API-Schlüssel und das System.",
                "example": "reviewer@example.com"
              },
              "name": {
                "type": "string",
                "nullable": true,
                "description": "Anzeigename des Anfragenden oder `null`.",
                "example": "Alex Reviewer"
              },
              "type": {
                "type": "string",
                "enum": [
                  "CONSOLE_USER",
                  "API_KEY",
                  "SYSTEM"
                ],
                "description": "Wer die Anfrage gestellt hat: ein Benutzer der Konsole, ein API-Schlüssel oder Didit selbst.",
                "example": "CONSOLE_USER"
              }
            }
          },
          "requested_at": {
            "type": "string",
            "format": "date-time",
            "description": "Wann die Übersteuerung angefordert wurde.",
            "example": "2026-10-13T09:15:00Z"
          },
          "applied_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "description": "Wann die Überprüfung den neuen Status angenommen hat, oder `null`, während sie wartet oder sobald sie storniert wurde.",
            "example": "2026-10-13T09:15:00Z"
          },
          "cancelled_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "description": "Wann ein wartender Override abgebrochen wurde, oder `null`.",
            "example": null
          },
          "cancel_reason": {
            "type": "string",
            "nullable": true,
            "enum": [
              "cancelled_by_reviewer",
              "replaced",
              "check_changed",
              "session_closed",
              null
            ],
            "description": "Warum ein wartendes Override nie angewendet wurde, oder `null`. `cancelled_by_reviewer`: über den Abbrechen-Endpoint storniert. `replaced`: ein neueres Override für denselben Check hat es ersetzt. `check_changed`: die Person hat die Prüfung vor dem Abschluss des Ablaufs wiederholt. `session_closed`: die Sitzung wurde beendet, bevor die Person den Ablauf abgeschlossen hat (abgebrochen, abgelaufen oder mitten im Ablauf entschieden).",
            "example": null
          }
        }
      },
      "SandboxSimulateRequest": {
        "type": "object",
        "description": "Den Status einer Sandbox-Sitzung erzwingen. Jedes Feld ist optional, es ist jedoch mindestens eines von `new_status`, `scenario` oder `risk` erforderlich.",
        "properties": {
          "new_status": {
            "type": "string",
            "enum": [
              "Approved",
              "Declined",
              "In Review",
              "Expired",
              "Abandoned"
            ],
            "description": "Der festzulegende Status. Wenn Sie ihn weglassen, wird standardmäßig der Standardstatus des Risikofalls verwendet (`risk` oder das erste Risiko, das die magischen Werte des Szenarios tragen), andernfalls der Standardstatus des Szenarios.",
            "example": "Declined"
          },
          "comment": {
            "type": "string",
            "maxLength": 500,
            "description": "Notiz, die dem Aktivitätseintrag hinzugefügt wurde, den die Statusänderung protokolliert.",
            "example": "Testing the decline path"
          },
          "scenario": {
            "type": "string",
            "maxLength": 100,
            "description": "Ein Szenario-Slug aus dem Katalog (`GET /v1/sandbox/scenarios/`). Er liefert den Standardstatus und, ohne `risk`, die Warnung, die seine magischen Werte mitbringen. Ein unbekannter Slug gibt `400` zurück.",
            "example": "decline_aml_hit"
          },
          "risk": {
            "type": "string",
            "maxLength": 128,
            "description": "Ein Risikofall aus dem Katalog. Dessen Warnung wird der Sitzung hinzugefügt, mit einem Log-Typ, der `new_status` folgt. Ein unbekannter Wert gibt `400` zurück.",
            "example": "POSSIBLE_MATCH_FOUND"
          },
          "node_id": {
            "type": "string",
            "maxLength": 128,
            "description": "Workflow-Knoten, mit dem die Risikowarnung verknüpft ist. Standardmäßig der aktuelle Knoten der Sitzung.",
            "example": "feature_aml_1"
          },
          "send_webhooks": {
            "type": "boolean",
            "default": true,
            "description": "`true` sendet genau die Webhooks, die eine echte Statusänderung an die Ziele der Sandbox-Anwendung sendet: `status.updated`, plus die durch die Änderung ausgelösten Ereignisse `user.status.updated` / `user.data.updated` (oder `business.status.updated` / `business.data.updated`) für Ziele, die diese abonniert haben. `false` ändert den Status, ohne einen Webhook zu protokollieren oder zu senden: Die Wiederherstellung verpasster Webhooks sendet diese Entscheidung niemals erneut, die Konsole aktualisiert sich weiterhin live und die nächste Statusänderung der Sitzung sendet Webhooks wie gewohnt.",
            "example": true
          }
        }
      },
      "SandboxSimulateResponse": {
        "type": "object",
        "required": [
          "session_id",
          "previous_status",
          "status",
          "scenario",
          "risk",
          "send_webhooks"
        ],
        "properties": {
          "session_id": {
            "type": "string",
            "format": "uuid",
            "example": "3fa85f64-5717-4562-b3fc-2c963f66afa6"
          },
          "previous_status": {
            "type": "string",
            "enum": [
              "Not Started",
              "In Progress",
              "Approved",
              "Declined",
              "In Review",
              "Expired",
              "Abandoned",
              "Kyc Expired",
              "Resubmitted",
              "Awaiting User"
            ],
            "description": "Der Status der Sitzung vor der Simulation.",
            "example": "In Progress"
          },
          "status": {
            "type": "string",
            "enum": [
              "Approved",
              "Declined",
              "In Review",
              "Expired",
              "Abandoned"
            ],
            "description": "Der Status, den die Simulation festgelegt hat.",
            "example": "Declined"
          },
          "scenario": {
            "type": "string",
            "nullable": true,
            "description": "Der übergebene Szenario-Slug oder `null`.",
            "example": "decline_aml_hit"
          },
          "risk": {
            "type": "string",
            "nullable": true,
            "description": "Der angewendete Risikofall (`risk` oder der aus dem Szenario übernommene) oder `null`, wenn keiner vorliegt.",
            "example": "POSSIBLE_MATCH_FOUND"
          },
          "send_webhooks": {
            "type": "boolean",
            "description": "Der von der Simulation angewendete Wert `send_webhooks`.",
            "example": false
          }
        }
      },
      "CaseTeamSummary": {
        "type": "object",
        "nullable": true,
        "description": "Das Prüfungsteam, das für den Fall zuständig ist, oder null, wenn kein Team zuständig ist. Das Routing legt dies fest, wenn eine Routing-Regel den Fall einem ihrer Teams zuweist. Ändern oder löschen Sie dies mit `PATCH .../cases/{case_uuid}/` (`team`).",
        "properties": {
          "uuid": {
            "type": "string",
            "format": "uuid"
          },
          "name": {
            "type": "string"
          }
        }
      },
      "CaseChecker": {
        "type": "object",
        "nullable": true,
        "description": "Das benannte Mitglied zur Genehmigung oder Ablehnung des ausstehenden Beschlusses. Nur gesetzt, während ein Vier-Augen-Beschluss auf einen benannten Prüfer wartet. Null, wenn nichts aussteht, während der ausstehende Beschluss in der Prüfer-Warteschlange wartet und sobald der Beschluss genehmigt, abgelehnt oder aufgrund geänderter Nachweise zur erneuten Prüfung zurückgegeben wurde.",
        "properties": {
          "member_uuid": {
            "type": "string",
            "format": "uuid",
            "description": "Die Benutzer-UUID des Mitglieds: der Wert, den Sie als `checker` übergeben, wenn Sie den Fall lösen."
          },
          "name": {
            "type": "string",
            "nullable": true,
            "description": "Der vollständige Name des Mitglieds oder null, wenn er nicht bekannt ist."
          },
          "email": {
            "type": "string",
            "format": "email"
          }
        }
      },
      "ServiceStatusFeed": {
        "type": "object",
        "description": "Öffentlicher Dienststatus: der Zustand jedes Didit-Dienstes, der Gesamtzustand und die Vorfälle, die aktuell andauern oder in den letzten 7 Tagen behoben wurden.",
        "required": [
          "status",
          "updated_at",
          "services",
          "incidents"
        ],
        "properties": {
          "status": {
            "type": "string",
            "enum": [
              "operational",
              "degraded",
              "down"
            ],
            "description": "Der schlechteste Status aller Dienste zum aktuellen Zeitpunkt, ausschließlich bestimmt durch laufende Vorfälle.",
            "example": "degraded"
          },
          "updated_at": {
            "type": "string",
            "format": "date-time",
            "description": "Wann Didit diese Antwort erstellt hat (ISO 8601, UTC). Antworten werden 30 Sekunden lang zwischengespeichert, daher kann sie bis zu 30 Sekunden alt sein.",
            "example": "2026-10-13T09:41:07.512345Z"
          },
          "services": {
            "type": "array",
            "description": "Ein Eintrag pro Dienst, jeder Dienst wird immer aufgeführt.",
            "items": {
              "$ref": "#/components/schemas/ServiceStatusService"
            }
          },
          "incidents": {
            "type": "array",
            "description": "Nach dem neuesten `started_at` zuerst. Jeder laufende Vorfall sowie die in den letzten 7 Tagen behobenen Vorfälle (maximal 50 behobene Vorfälle). Leer, wenn in dieser Zeit nichts vorgefallen ist.",
            "items": {
              "$ref": "#/components/schemas/ServiceStatusIncident"
            }
          }
        }
      },
      "ServiceStatusService": {
        "type": "object",
        "required": [
          "key",
          "name",
          "status"
        ],
        "properties": {
          "key": {
            "type": "string",
            "enum": [
              "service_id_verification",
              "service_liveness_face_match",
              "service_aml_screening",
              "service_kyb_registries",
              "service_database_validation",
              "service_phone_delivery",
              "service_email_delivery",
              "service_transaction_monitoring"
            ],
            "description": "Stabiler Serviceschlüssel. Gleichen Sie diesen ab, niemals den Anzeigenamen. `service_id_verification`: Ausweisverifizierung, `service_liveness_face_match`: Liveness und Gesichtsabgleich, `service_aml_screening`: AML-Screening, `service_kyb_registries`: KYB-Register, `service_database_validation`: Datenbankvalidierung, `service_phone_delivery`: Zustellung für Telefonverifizierung, `service_email_delivery`: Zustellung für E-Mail-Verifizierung, `service_transaction_monitoring`: Transaktionsüberwachung.",
            "example": "service_database_validation"
          },
          "name": {
            "type": "string",
            "description": "Englischer Anzeigename des Dienstes.",
            "example": "Database validation"
          },
          "status": {
            "type": "string",
            "enum": [
              "operational",
              "degraded",
              "down"
            ],
            "description": "`operational`, wenn für den Dienst kein Vorfall aktiv ist, andernfalls der schwerwiegendste Zustand seiner laufenden Vorfälle.",
            "example": "degraded"
          }
        }
      },
      "ServiceStatusIncident": {
        "type": "object",
        "required": [
          "id",
          "service",
          "service_name",
          "state",
          "status",
          "title",
          "body",
          "affected",
          "country_name",
          "started_at",
          "resolved_at",
          "duration_minutes"
        ],
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "description": "Vorfall-ID.",
            "example": "3fa85f64-5717-4562-b3fc-2c963f66afa6"
          },
          "service": {
            "type": "string",
            "enum": [
              "service_id_verification",
              "service_liveness_face_match",
              "service_aml_screening",
              "service_kyb_registries",
              "service_database_validation",
              "service_phone_delivery",
              "service_email_delivery",
              "service_transaction_monitoring"
            ],
            "description": "Schlüssel des betroffenen Dienstes (siehe `services[].key`).",
            "example": "service_database_validation"
          },
          "service_name": {
            "type": "string",
            "description": "Englischer Anzeigename des betroffenen Dienstes.",
            "example": "Database validation"
          },
          "state": {
            "type": "string",
            "enum": [
              "degraded",
              "down"
            ],
            "description": "Wie der Dienst beeinträchtigt ist. Ein behobener Vorfall behält den letzten Status, den er hatte.",
            "example": "degraded"
          },
          "status": {
            "type": "string",
            "enum": [
              "ongoing",
              "resolved"
            ],
            "description": "`ongoing`, bis sich der Dienst wieder erholt, dann `resolved`.",
            "example": "ongoing"
          },
          "title": {
            "type": "string",
            "description": "Englische Überschrift. Um sie zu übersetzen, erstellen Sie Ihren eigenen Text aus `service`, `state` und `country_name`.",
            "example": "Database validation is degraded in Brazil."
          },
          "body": {
            "type": "string",
            "description": "Englische Detailzeile: seit wann Prüfungen langsam sein oder fehlschlagen können oder wann die Wiederherstellung erfolgte.",
            "example": "Checks against Brazil (CPF) may be slow or fail since 08:55 UTC."
          },
          "affected": {
            "type": "string",
            "description": "Betroffene Länder oder Register, zum Beispiel `Brazil (CPF)`. Leer, wenn der Vorfall nicht an ein Land oder Register gebunden ist.",
            "example": "Brazil (CPF)"
          },
          "country_name": {
            "type": "string",
            "description": "Betroffenes Land, auf Englisch. Leer, wenn der Vorfall nicht an ein Land gebunden ist.",
            "example": "Brazil"
          },
          "started_at": {
            "type": "string",
            "format": "date-time",
            "description": "Wann der Vorfall begann (ISO 8601, UTC).",
            "example": "2026-10-13T08:55:00Z"
          },
          "resolved_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "description": "Wann der Dienst wiederhergestellt wurde (ISO 8601, UTC). `null`, während der Vorfall andauert."
          },
          "duration_minutes": {
            "type": "integer",
            "nullable": true,
            "description": "Ganze Minuten von `started_at` bis `resolved_at`. `null`, solange der Vorfall noch andauert."
          }
        }
      },
      "TravelRuleJoinInvitation": {
        "type": "object",
        "description": "Was die Beitrittsseite anzeigt, bevor etwas eingegeben wird.",
        "properties": {
          "email": {
            "type": "string",
            "format": "email",
            "description": "Die Adresse, an die die Einladung gesendet wurde."
          },
          "vasp_name": {
            "type": "string"
          },
          "source": {
            "type": "string",
            "description": "Woher die Einladung stammt, zum Beispiel `pickup`."
          },
          "expires_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "prefill": {
            "type": "object",
            "properties": {
              "vasp_id": {
                "type": "string",
                "format": "uuid",
                "nullable": true
              },
              "legal_name": {
                "type": "string"
              },
              "lei": {
                "type": "string"
              },
              "jurisdiction": {
                "type": "string"
              },
              "domains": {
                "type": "array",
                "items": {
                  "type": "string"
                }
              }
            }
          }
        }
      },
      "TravelRuleJoinRegisterRequest": {
        "type": "object",
        "required": [
          "email",
          "password"
        ],
        "properties": {
          "email": {
            "type": "string",
            "format": "email",
            "maxLength": 254,
            "description": "Muss die Adresse sein, an die die Einladung gesendet wurde."
          },
          "password": {
            "type": "string",
            "minLength": 8,
            "maxLength": 128
          }
        }
      },
      "TravelRuleJoinVerifyRequest": {
        "type": "object",
        "required": [
          "email",
          "code"
        ],
        "properties": {
          "email": {
            "type": "string",
            "format": "email",
            "maxLength": 254
          },
          "code": {
            "type": "string",
            "minLength": 6,
            "maxLength": 6,
            "description": "Der 6 Zeichen lange Code, der nach der Registrierung per E-Mail gesendet wurde."
          }
        }
      },
      "TravelRuleJoinCredentials": {
        "type": "object",
        "description": "Die neue kostenlose Organisation und die Anmeldedaten, mit denen ihre Anwendung die API aufruft.",
        "properties": {
          "organization": {
            "type": "object",
            "properties": {
              "uuid": {
                "type": "string",
                "format": "uuid"
              }
            }
          },
          "application": {
            "type": "object",
            "properties": {
              "uuid": {
                "type": "string",
                "format": "uuid"
              }
            }
          },
          "client_id": {
            "type": "string"
          },
          "api_key": {
            "type": "string",
            "description": "Als `x-api-key`-Header an den Workspace-Endpoints senden."
          }
        }
      },
      "TravelRuleWorkspaceClaimRequest": {
        "type": "object",
        "required": [
          "vasp_id"
        ],
        "properties": {
          "vasp_id": {
            "type": "string",
            "format": "uuid",
            "description": "Der Verzeichniseintrag, der dieser Workspace ist. Rufen Sie IDs über `GET /v3/travel-rule/vasps/` ab."
          }
        }
      },
      "TravelRuleWorkspaceDomainConfirmRequest": {
        "type": "object",
        "required": [
          "code"
        ],
        "properties": {
          "code": {
            "type": "string",
            "minLength": 6,
            "maxLength": 6
          }
        }
      },
      "TravelRuleWorkspaceBillingRequest": {
        "type": "object",
        "properties": {
          "enabled": {
            "type": "boolean",
            "default": true,
            "description": "Nur `true` wird akzeptiert: Die ausgehende Abrechnung kann über die API nicht wieder deaktiviert werden."
          }
        }
      },
      "TravelRuleWorkspaceDomainCodeResponse": {
        "type": "object",
        "properties": {
          "domain": {
            "type": "string"
          },
          "status": {
            "type": "string",
            "enum": [
              "unverified",
              "code_sent",
              "verified"
            ]
          },
          "txt": {
            "$ref": "#/components/schemas/TravelRuleWorkspaceTxtRecord"
          }
        }
      },
      "TravelRuleWorkspaceTxtRecord": {
        "type": "object",
        "description": "Der für den DNS-Nachweis zu veröffentlichende TXT-Eintrag. Leer, bis ein Nachweis gestartet wurde.",
        "properties": {
          "host": {
            "type": "string",
            "example": "didit-tr-verify.example.com"
          },
          "value": {
            "type": "string"
          }
        }
      },
      "TravelRuleWorkspace": {
        "type": "object",
        "description": "Der kostenlose Travel-Rule-Arbeitsbereich einer Anwendung, die dem kostenlosen Kontingent beigetreten ist.",
        "properties": {
          "joined_free": {
            "type": "boolean"
          },
          "work_email": {
            "type": "string",
            "format": "email"
          },
          "joined_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "claim": {
            "type": "object",
            "properties": {
              "status": {
                "type": "string",
                "enum": [
                  "unclaimed",
                  "pending_review",
                  "claimed",
                  "rejected"
                ]
              },
              "proved_by_domain": {
                "type": "boolean"
              },
              "claimed_at": {
                "type": "string",
                "format": "date-time",
                "nullable": true
              },
              "reviewed_at": {
                "type": "string",
                "format": "date-time",
                "nullable": true
              },
              "review_note": {
                "type": "string"
              },
              "vasp_id": {
                "type": "string",
                "format": "uuid",
                "nullable": true
              },
              "vasp_name": {
                "type": "string"
              }
            }
          },
          "prefill": {
            "type": "object",
            "description": "Aus dem Verzeichniseintrag übernommene Profilwerte: `vasp_id`, `legal_name`, `lei`, `jurisdiction`, `compliance_email`, `domains`. Es wird nichts geschrieben, bis der Anspruch geltend gemacht wird."
          },
          "domain": {
            "type": "object",
            "properties": {
              "domain": {
                "type": "string"
              },
              "status": {
                "type": "string",
                "enum": [
                  "unverified",
                  "code_sent",
                  "verified"
                ]
              },
              "verified_at": {
                "type": "string",
                "format": "date-time",
                "nullable": true
              },
              "txt": {
                "$ref": "#/components/schemas/TravelRuleWorkspaceTxtRecord"
              }
            }
          },
          "billing_enabled": {
            "type": "boolean",
            "description": "Der Empfang von Travel Rule-Daten ist kostenlos. Das Senden wird erst nach Aktivierung der Abrechnung berechnet."
          },
          "billing_enabled_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "didit_network": {
            "type": "object",
            "description": "Gibt an, ob das Didit-Netzwerk diesen VASP führt, und wenn nicht, jede Bedingung, die er noch nicht erfüllt."
          },
          "settings": {
            "$ref": "#/components/schemas/TravelRuleSettingsDetail"
          }
        }
      },
      "InvestigatorDecision": {
        "type": "object",
        "description": "Wie das Element die Investigator-Warteschlange verlassen hat. `decided_by`, `original_outcome` und `overrides` werden von den Endpoints zum Akzeptieren und Überschreiben sowie dem Bericht zurückgegeben; der `investigator`-Block einer Sitzungsentscheidung enthält die anderen Felder.",
        "properties": {
          "outcome": {
            "type": "string",
            "enum": [
              "accepted",
              "edited",
              "overridden",
              "decided_elsewhere",
              "automated"
            ],
            "description": "`accepted` oder `edited` hat die Empfehlung übernommen (`edited` mit einem neu formulierten Text), `overridden` hat eine andere Aktion ausgeführt, `decided_elsewhere` ist eine Entscheidung, die außerhalb des Investigators getroffen wurde, während der Bericht geöffnet war, `automated` ist eine Entscheidung, die der Investigator selbstständig getroffen hat."
          },
          "action": {
            "type": "string",
            "enum": [
              "approve",
              "decline",
              "escalate",
              "request"
            ]
          },
          "actor_email": {
            "type": "string",
            "nullable": true
          },
          "actor_name": {
            "type": "string",
            "nullable": true
          },
          "override_category": {
            "type": "string",
            "enum": [
              "missing_context",
              "needs_information",
              "policy_differs",
              "evidence_misread",
              "other",
              ""
            ],
            "nullable": true
          },
          "override_reason": {
            "type": "string",
            "nullable": true
          },
          "final_status": {
            "type": "string",
            "description": "Der Status des Elements nach der Entscheidung."
          },
          "agreed": {
            "type": "boolean",
            "description": "Gibt an, ob die Entscheidung mit der Empfehlung übereinstimmte.",
            "nullable": true
          },
          "decided_at": {
            "type": "string",
            "format": "date-time"
          },
          "billed": {
            "type": "boolean",
            "description": "Die Prüfung wurde abgerechnet."
          },
          "decided_by": {
            "type": "string",
            "enum": [
              "investigator",
              "member"
            ]
          },
          "original_outcome": {
            "type": "object",
            "description": "Die Entscheidung, die der Investigator eigenständig getroffen hat, unverändert durch spätere Überschreibungen. Null bei einer vom Team getroffenen Entscheidung.",
            "properties": {
              "action": {
                "type": "string"
              },
              "final_status": {
                "type": "string"
              },
              "decided_at": {
                "type": "string",
                "format": "date-time"
              }
            },
            "nullable": true
          },
          "overrides": {
            "type": "array",
            "description": "Jede Überschreibung einer Entscheidung, die der Investigator eigenständig getroffen hat, die älteste zuerst.",
            "items": {
              "type": "object",
              "properties": {
                "action": {
                  "type": "string"
                },
                "actor_email": {
                  "type": "string",
                  "nullable": true
                },
                "actor_name": {
                  "type": "string",
                  "nullable": true
                },
                "override_category": {
                  "type": "string"
                },
                "override_reason": {
                  "type": "string"
                },
                "previous_status": {
                  "type": "string"
                },
                "final_status": {
                  "type": "string"
                },
                "agreed": {
                  "type": "boolean",
                  "nullable": true
                },
                "overridden_at": {
                  "type": "string",
                  "format": "date-time"
                }
              }
            }
          }
        }
      },
      "InvestigatorBlock": {
        "type": "object",
        "nullable": true,
        "description": "Die neueste Investigator-Prüfung des Elements, oder null, wenn es nie eine hatte. Wird von der V3-Sitzungs- und Business-Sitzungsentscheidung übermittelt (und somit von `status.updated`-Webhooks).",
        "properties": {
          "run_id": {
            "type": "string",
            "format": "uuid"
          },
          "status": {
            "type": "string",
            "enum": [
              "running",
              "completed",
              "failed"
            ]
          },
          "stage": {
            "type": "string",
            "enum": [
              "shadow",
              "live"
            ]
          },
          "queue": {
            "type": "string",
            "enum": [
              "kyc",
              "kyb",
              "aml",
              "transactions",
              "cases"
            ]
          },
          "is_open": {
            "type": "boolean"
          },
          "recommendation": {
            "type": "string",
            "enum": [
              "approve",
              "decline",
              "escalate",
              "request"
            ],
            "nullable": true
          },
          "recommendation_detail": {
            "type": "string",
            "nullable": true
          },
          "confidence": {
            "type": "string",
            "enum": [
              "high",
              "moderate",
              "low"
            ],
            "nullable": true
          },
          "summary": {
            "type": "string",
            "nullable": true
          },
          "ready_to_accept": {
            "type": "boolean"
          },
          "prepared_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "automated": {
            "type": "boolean",
            "description": "Der Investigator hat eigenständig entschieden, selbst wenn die Entscheidung später überschrieben wurde."
          },
          "decided_by": {
            "type": "string",
            "enum": [
              "investigator",
              "member"
            ],
            "nullable": true
          },
          "decision": {
            "nullable": true,
            "allOf": [
              {
                "$ref": "#/components/schemas/InvestigatorDecision"
              }
            ],
            "type": "object"
          }
        }
      },
      "InvestigatorQueueRow": {
        "type": "object",
        "properties": {
          "run_id": {
            "type": "string",
            "format": "uuid"
          },
          "kind": {
            "type": "string",
            "enum": [
              "session",
              "business_session",
              "transaction",
              "case"
            ]
          },
          "queue": {
            "type": "string",
            "enum": [
              "kyc",
              "kyb",
              "aml",
              "transactions",
              "cases"
            ]
          },
          "stage": {
            "type": "string",
            "enum": [
              "shadow",
              "live"
            ]
          },
          "subject": {
            "type": "object",
            "description": "Das zu prüfende Element: `id`, `number`, `status`, `name` und, je nach Art, `country`, `workflow`, `vendor_data`, `txn_id`, `amount`, `currency`, `direction`, `title` oder `priority`.",
            "additionalProperties": true
          },
          "recommendation": {
            "type": "string",
            "enum": [
              "approve",
              "decline",
              "escalate",
              "request"
            ]
          },
          "recommendation_detail": {
            "type": "string"
          },
          "confidence": {
            "type": "string",
            "enum": [
              "high",
              "moderate",
              "low"
            ]
          },
          "summary": {
            "type": "string"
          },
          "sources_count": {
            "type": "integer"
          },
          "ready_to_accept": {
            "type": "boolean"
          },
          "guardrails": {
            "description": "Die gesperrten Guardrails, die für dieses Element gelten, sofern vorhanden."
          },
          "waiting_since": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "due_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "prepared_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          }
        }
      },
      "InvestigatorRunDetail": {
        "allOf": [
          {
            "$ref": "#/components/schemas/InvestigatorQueueRow"
          },
          {
            "type": "object",
            "properties": {
              "status": {
                "type": "string"
              },
              "is_open": {
                "type": "boolean"
              },
              "lookups": {
                "type": "integer",
                "description": "Wie viele Abschnitte und verknüpfte Datensätze gelesen wurden."
              },
              "duration_ms": {
                "type": "integer",
                "nullable": true
              },
              "agent_version": {
                "type": "string"
              },
              "prepared_before_opened": {
                "type": "boolean",
                "nullable": true
              },
              "report": {
                "type": "object",
                "additionalProperties": true,
                "description": "Der Bericht: Begründung, Beweispunkte mit ihrem Urteil (`ok`, `risk`, `look`, `explained`, `context`) und zitierten Quellen, Screening-Treffer-Urteile (`same`, `not_same`, `unclear`) und vorgeschlagene nächste Schritte."
              },
              "trail": {
                "description": "Was geprüft wurde: die Übersicht, Abschnitte und Datensätze, die nacheinander gelesen wurden."
              },
              "decision": {
                "nullable": true,
                "allOf": [
                  {
                    "$ref": "#/components/schemas/InvestigatorDecision"
                  }
                ],
                "type": "object"
              },
              "autonomy": {
                "type": "object",
                "additionalProperties": true,
                "description": "Was die Automatisierung aus dem Bericht gemacht hat (`result`, `reason`, `tier`, `policy_version`, `rule`, `agreement`, `decisions`, `threshold`, `at`). Null, wenn die Warteschlange nicht automatisiert ist.",
                "nullable": true
              }
            }
          }
        ]
      },
      "InvestigatorAcceptRequest": {
        "type": "object",
        "properties": {
          "narrative": {
            "type": "string",
            "maxLength": 4000,
            "description": "Eine umformulierte Darstellung. Das Senden einer solchen erfasst die Entscheidung als bearbeitet und akzeptiert."
          },
          "send_email": {
            "type": "boolean",
            "default": false,
            "description": "Die Person per E-Mail über die Entscheidung informieren."
          },
          "email_address": {
            "type": "string",
            "format": "email",
            "description": "Erforderlich, wenn `send_email` true ist."
          },
          "email_language": {
            "type": "string",
            "default": "en",
            "maxLength": 16
          }
        }
      },
      "InvestigatorOverrideRequest": {
        "type": "object",
        "required": [
          "action",
          "category",
          "reason"
        ],
        "properties": {
          "action": {
            "type": "string",
            "enum": [
              "approve",
              "decline",
              "escalate",
              "request"
            ]
          },
          "category": {
            "type": "string",
            "enum": [
              "missing_context",
              "needs_information",
              "policy_differs",
              "evidence_misread",
              "other"
            ]
          },
          "reason": {
            "type": "string",
            "minLength": 10,
            "maxLength": 500
          },
          "send_email": {
            "type": "boolean",
            "default": false,
            "description": "Die Person per E-Mail über die Entscheidung informieren."
          },
          "email_address": {
            "type": "string",
            "format": "email",
            "description": "Erforderlich, wenn `send_email` true ist."
          },
          "email_language": {
            "type": "string",
            "default": "en",
            "maxLength": 16
          }
        }
      },
      "InvestigatorBatchAcceptRequest": {
        "type": "object",
        "required": [
          "run_ids"
        ],
        "properties": {
          "run_ids": {
            "type": "array",
            "minItems": 1,
            "maxItems": 50,
            "items": {
              "type": "string",
              "format": "uuid"
            }
          }
        }
      },
      "InvestigatorBatchAcceptResponse": {
        "type": "object",
        "properties": {
          "accepted": {
            "type": "integer"
          },
          "skipped": {
            "type": "integer"
          },
          "results": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "run_id": {
                  "type": "string",
                  "format": "uuid"
                },
                "result": {
                  "type": "string",
                  "enum": [
                    "accepted",
                    "skipped"
                  ]
                },
                "reason": {
                  "type": "string",
                  "enum": [
                    "not_found",
                    "forbidden",
                    "already_decided",
                    "not_ready",
                    "guardrail",
                    "invalid"
                  ]
                },
                "detail": {},
                "action": {
                  "type": "string"
                },
                "final_status": {
                  "type": "string"
                }
              }
            }
          }
        }
      },
      "InvestigatorSettings": {
        "type": "object",
        "properties": {
          "stage": {
            "type": "string",
            "enum": [
              "none",
              "shadow",
              "live"
            ]
          },
          "stage_changed_at": {
            "type": "string",
            "format": "date-time",
            "readOnly": true,
            "nullable": true
          },
          "stage_changed_by": {
            "type": "string",
            "readOnly": true
          },
          "monthly_spend_limit": {
            "type": "string",
            "format": "decimal",
            "description": "Monatliches Limit in Ihrer Abrechnungswährung, 0.01 bis 1,000,000. Null deaktiviert es.",
            "nullable": true
          },
          "spend_limit": {
            "type": "object",
            "readOnly": true,
            "properties": {
              "enabled": {
                "type": "boolean"
              },
              "limit": {
                "type": "string",
                "format": "decimal",
                "nullable": true
              },
              "spent": {
                "type": "string",
                "format": "decimal"
              },
              "reviews": {
                "type": "integer"
              },
              "reserved": {
                "type": "string",
                "format": "decimal",
                "description": "Der Preis jedes offenen Live-Berichts, der zurückgehalten wird, da seine Annahme Kosten verursacht."
              },
              "currency": {
                "type": "string"
              },
              "paused": {
                "type": "boolean",
                "description": "Am Limit: Es wird keine neue Prüfung gestartet."
              }
            }
          }
        }
      },
      "TravelRuleUtxoEntry": {
        "type": "object",
        "description": "Eine Eingabe oder Ausgabe einer UTXO-Transaktion, wie sie von der Blockchain erfasst wurde.",
        "required": [
          "address"
        ],
        "properties": {
          "address": {
            "type": "string",
            "maxLength": 128
          },
          "amount": {
            "type": "string",
            "nullable": true,
            "description": "Dezimal-Zeichenkette in der Einheit des Coins selbst (BTC, nicht Satoshis). Optional.",
            "example": "0.0125"
          },
          "txid": {
            "type": "string",
            "maxLength": 128,
            "description": "Optional. Die Transaktion, deren Output ein Input ausgibt."
          },
          "vout": {
            "type": "integer",
            "nullable": true,
            "minimum": 0,
            "description": "Optional. Der Index des Outputs, den ein Input ausgibt."
          }
        }
      },
      "TravelRuleUtxo": {
        "type": "object",
        "description": "Die Inputs und Outputs eines UTXO-Transfers (BTC, LTC, BCH, DOGE). Wird nur auf diesen Blockchains akzeptiert: Auf jeder anderen Blockchain führt dies zu einem `400`. Daraus leitet Didit die Wallet des Auftraggebers (die deklarierte, andernfalls die Input-Adresse mit dem größten Beitrag) und den Begünstigten-Output ab (den deklarierten, andernfalls den einzigen Output, der keine Input-Adresse als Wechselgeld auszahlt, andernfalls den einen Output, der den Transferbetrag zahlt). Das Ergebnis befindet sich in `chain_details` des Transfers.",
        "required": [
          "outputs"
        ],
        "properties": {
          "inputs": {
            "type": "array",
            "maxItems": 1000,
            "items": {
              "$ref": "#/components/schemas/TravelRuleUtxoEntry"
            },
            "description": "Optional. Ohne Inputs wird kein Auftraggeber abgeleitet und kein Wechselgeld-Output (Change) erkannt."
          },
          "outputs": {
            "type": "array",
            "minItems": 1,
            "maxItems": 1000,
            "items": {
              "$ref": "#/components/schemas/TravelRuleUtxoEntry"
            }
          }
        }
      },
      "TravelRuleChainSide": {
        "type": "object",
        "description": "Die Wallet einer Seite, wie von Didit aus den Chain-Daten aufgelöst.",
        "properties": {
          "address": {
            "type": "string",
            "description": "Die Wallet. Auf einem Memo-Netzwerk die klassische Adresse (eine XRP-X-Adresse wird in ihre klassische Adresse und ihr Tag aufgeteilt); auf Lightning die Knoten-ID des Zahlungsempfängers oder die Lightning-Adresse."
          },
          "memo": {
            "type": "string",
            "description": "Das Destination-Tag oder Memo, das Teil der Wallet ist; `\"\"` für keines."
          },
          "source": {
            "type": "string",
            "enum": [
              "declared",
              "x_address",
              "largest_input",
              "only_non_change_output",
              "amount_match",
              "invoice_payee",
              "updated"
            ],
            "description": "Woher die Wallet stammt: `declared` (Ihre Anfrage), `x_address` (aus einer XRP-X-Adresse aufgeteilt), `largest_input` (die UTXO-Input-Adresse mit dem größten Beitrag), `only_non_change_output` (der einzige UTXO-Output, der kein Wechselgeld ist), `amount_match` (der eine UTXO-Output, der den Überweisungsbetrag zahlt), `invoice_payee` (der Zahlungsempfänger, den eine Lightning-Zahlungsanforderung benennt), `updated` (nachträglich mit `action: update_originator_wallet` festgelegt)."
          }
        }
      },
      "TravelRuleChainDetails": {
        "type": "object",
        "description": "Wie die Blockchain des Transfers ihre beiden Wallets benennt, wenn mehr als eine Adresse eine andere bezahlt. Leer (`{}`) bei einem Account-Chain-Transfer (EVM, Solana, Tron), bei dem die beiden Adressen die Wallets sind. Abgleich, Weiterleitung und das Adressbuch lesen die Wallets zuerst von hier aus.",
        "properties": {
          "chain": {
            "type": "string",
            "description": "Kanonische Chain, z. B. `BTC`, `XRP` oder `LIGHTNING` für einen Lightning-Transfer."
          },
          "shape": {
            "type": "string",
            "enum": [
              "utxo",
              "memo",
              "lightning"
            ]
          },
          "originator": {
            "$ref": "#/components/schemas/TravelRuleChainSide"
          },
          "beneficiary": {
            "$ref": "#/components/schemas/TravelRuleChainSide"
          },
          "utxo": {
            "type": "object",
            "description": "Bei einem UTXO-Transfer: die Inputs und Outputs wie gespeichert (Beträge als Dezimal-Strings) und welche Outputs Didit als was interpretiert hat.",
            "properties": {
              "inputs": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/TravelRuleUtxoEntry"
                }
              },
              "outputs": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/TravelRuleUtxoEntry"
                }
              },
              "change_output_indexes": {
                "type": "array",
                "items": {
                  "type": "integer"
                },
                "description": "Ausgaben, die an eine Eingabeadresse zurückzahlen."
              },
              "beneficiary_output_index": {
                "type": "integer",
                "nullable": true,
                "description": "Der Output, der den Begünstigten bezahlt; null, wenn keine unterschieden werden konnten."
              }
            }
          },
          "lightning": {
            "type": "object",
            "description": "Bei einem Lightning-Transfer: Inhalt der Zahlungsanforderung. Immer `kind` (`bolt11`, `bolt12_offer`, `bolt12_invoice`, `bolt12_invoice_request`, `lnurl`, `lightning_address`, `node_id` oder `unknown`); eine BOLT11-Rechnung ergänzt `network`, `payee_node_id`, `payment_hash`, `amount_msat`, `created_at` und `expires_at`; ein BOLT12-String ergänzt `blinded_paths` und `payee_node_id`; eine LNURL oder Lightning Address ihre `domain`. Es wird nichts über das Netzwerk aufgelöst: Die Anforderung wird lediglich decodiert.",
            "additionalProperties": true
          },
          "warnings": {
            "type": "array",
            "items": {
              "type": "string",
              "enum": [
                "declared_originator_not_an_input",
                "declared_beneficiary_not_an_output",
                "beneficiary_output_ambiguous",
                "beneficiary_output_amount_differs"
              ]
            },
            "description": "UTXO-Inkonsistenzen, die eine Überprüfung wert sind: Der angegebene Auftraggeber ist kein Input, der angegebene Begünstigte ist kein Output, es konnte kein einzelner Output des Begünstigten unterschieden werden oder der Begünstigten-Output zahlt einen anderen Betrag aus, als in der Transaktion angegeben ist."
          },
          "not_applicable_reason": {
            "type": "string",
            "enum": [
              "LIGHTNING_NO_PAYEE_IDENTIFIER",
              "LIGHTNING_BOLT12_BLINDED_PAYEE",
              "LIGHTNING_LNURL_NAMES_NO_PAYEE"
            ],
            "description": "Bei einem ausgehenden Lightning-Transfer, dessen Zahlungsanforderung keinen Begünstigten nennt: der Grund, warum der Transfer `NOT_APPLICABLE` ist. `LIGHTNING_NO_PAYEE_IDENTIFIER` (die Anforderung nennt keinen Knoten des Begünstigten oder konnte nicht decodiert werden), `LIGHTNING_BOLT12_BLINDED_PAYEE` (das Angebot verbirgt seinen Begünstigten hinter blinden Pfaden), `LIGHTNING_LNURL_NAMES_NO_PAYEE` (eine LNURL nennt einen Dienst, keinen Begünstigten). Derselbe Code leitet den letzten `timeline`-Eintrag des Transfers ein."
          }
        }
      },
      "WalletAddressImportRow": {
        "type": "object",
        "description": "Eine zu importierende Wallet: anhand ihrer `address`, ihres `address_hash` oder beidem. Die camelCase-Formen dieser Felder werden ebenfalls akzeptiert, ebenso wie `walletAddress`, `walletAddressHash`, `destinationTag` und `externalUserId`.",
        "properties": {
          "address": {
            "type": "string",
            "maxLength": 128,
            "description": "Die Adresse. Alias: `walletAddress`."
          },
          "address_hash": {
            "type": "string",
            "description": "SHA-256 der in Kleinbuchstaben geschriebenen Adresse als 64 Hex-Zeichen oder 44 Base64-Zeichen. Senden Sie diesen Wert allein, um eine Wallet zu registrieren, ohne deren Adresse offenzulegen; wird er zusammen mit `address` gesendet, muss er der Hash dieser Adresse sein. Alias: `walletAddressHash`."
          },
          "chain": {
            "type": "string",
            "maxLength": 32
          },
          "memo": {
            "type": "string",
            "maxLength": 256,
            "description": "Das Ziel-Tag oder Memo. XRP: ein Ziel-Tag, eine ganze Zahl von 0 bis 4294967295 (eine JSON-Zahl wird akzeptiert). XLM: ein Text-Memo von bis zu 28 Bytes, eine 64-Bit-ID oder ein 32-Byte-Hash in Hex. EOS: bis zu 256 Bytes. ATOM: bis zu 256 Zeichen. HBAR: bis zu 100 Bytes. Wallets für Bitcoin, EVM, Solana, Tron, Litecoin, Bitcoin Cash, Dogecoin und Lightning akzeptieren kein Memo: wird dennoch eines übergeben, führt dies zu einem `400`."
          },
          "holder_name": {
            "type": "string",
            "maxLength": 255
          },
          "holder_vendor_data": {
            "type": "string",
            "maxLength": 255,
            "description": "Ihre interne Kennung für den Inhaber. Alias: `externalUserId`."
          },
          "entity_type": {
            "type": "string",
            "enum": [
              "individual",
              "company"
            ],
            "default": "individual"
          },
          "label": {
            "type": "string",
            "maxLength": 255
          },
          "owner_type": {
            "type": "string",
            "enum": [
              "customer",
              "internal",
              "vasp"
            ],
            "default": "customer"
          },
          "travel_address": {
            "type": "string",
            "maxLength": 512
          },
          "self_declared": {
            "type": "boolean",
            "default": false,
            "description": "Erstellt den Eintrag direkt als durch Eigenerklärung verifiziert, wenn Ihre Einstellungen dies erlauben."
          }
        }
      },
      "WalletAddressImportReport": {
        "type": "object",
        "description": "Was mit jeder Zeile eines Imports passiert ist, in der gesendeten Reihenfolge.",
        "properties": {
          "total": {
            "type": "integer"
          },
          "created": {
            "type": "integer"
          },
          "existing": {
            "type": "integer"
          },
          "duplicate": {
            "type": "integer"
          },
          "failed": {
            "type": "integer"
          },
          "rows": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "row": {
                  "type": "integer",
                  "description": "Die Zeilennummer, beginnend bei 1."
                },
                "status": {
                  "type": "string",
                  "enum": [
                    "created",
                    "existing",
                    "duplicate",
                    "failed"
                  ],
                  "description": "`created`: zum Adressbuch hinzugefügt. `existing`: Die Wallet befindet sich bereits im Adressbuch und blieb unverändert. `duplicate`: wiederholt eine frühere Zeile dieses Imports. `failed`: siehe `errors`."
                },
                "entry_id": {
                  "type": "string",
                  "format": "uuid",
                  "nullable": true,
                  "description": "Der Adressbucheintrag, den die Zeile erstellt oder gefunden hat."
                },
                "errors": {
                  "type": "object",
                  "description": "Feldfehler einer `failed`-Zeile; andernfalls leer."
                },
                "duplicate_of_row": {
                  "type": "integer",
                  "nullable": true,
                  "description": "Bei einer `duplicate`-Zeile die Zeile, die sie wiederholt."
                }
              }
            }
          }
        }
      },
      "TravelRuleCounterpartyContact": {
        "type": "object",
        "description": "Eine Compliance-Adresse, an die der EMAIL-Kanal für einen Verzeichniseintrag schreibt.",
        "properties": {
          "uuid": {
            "type": "string",
            "format": "uuid"
          },
          "counterparty": {
            "type": "string",
            "format": "uuid",
            "description": "Die `id` des Verzeichniseintrags, wie von GET /v3/travel-rule/vasps/ angezeigt."
          },
          "counterparty_name": {
            "type": "string"
          },
          "email": {
            "type": "string",
            "format": "email"
          },
          "name": {
            "type": "string",
            "description": "Optionales Label, zum Beispiel der Teamname."
          },
          "source": {
            "type": "string",
            "enum": [
              "staff",
              "application",
              "learned"
            ],
            "description": "staff: Von Didit kuratiert. learned: Eine Adresse unter einer der eigenen Domains des VASP, die eine Anfrage über ihren Antwort-Link beantwortet hat. application: Von Ihrer Anwendung hinzugefügt."
          },
          "scope": {
            "type": "string",
            "enum": [
              "platform",
              "application"
            ],
            "description": "platform: von Didit kuratiert oder aus einer verifizierten Antwort gelernt, für jeden Didit-Kunden verwendet, für Sie schreibgeschützt. application: privat für Ihre Anwendung."
          },
          "created_by": {
            "type": "string",
            "description": "Leer bei Plattformkontakten und Kontakten, die über einen API-Schlüssel hinzugefügt wurden."
          },
          "verified_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "description": "Wann diese Adresse zuletzt über ihren Antwortlink auf eine Anfrage geantwortet hat."
          },
          "is_invalid": {
            "type": "boolean",
            "description": "true, sobald für die Adresse ein Bounce oder eine Beschwerde verzeichnet wurde; der EMAIL-Kanal überspringt sie."
          },
          "invalid_reason": {
            "type": "string",
            "enum": [
              "",
              "hard_bounce",
              "soft_bounce",
              "spam_complaint",
              "suppressed"
            ]
          },
          "invalid_detail": {
            "type": "string",
            "description": "Der Grund des empfangenden Mailservers, sofern er einen angegeben hat."
          },
          "invalid_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "created_at": {
            "type": "string",
            "format": "date-time"
          }
        }
      },
      "TravelRuleCounterpartyContactCreate": {
        "type": "object",
        "required": [
          "counterparty",
          "email"
        ],
        "properties": {
          "counterparty": {
            "type": "string",
            "format": "uuid",
            "description": "Die `id` des Verzeichniseintrags."
          },
          "email": {
            "type": "string",
            "format": "email",
            "maxLength": 254
          },
          "name": {
            "type": "string",
            "description": "Optionales Label.",
            "maxLength": 255
          }
        }
      },
      "TravelRuleNameMatch": {
        "type": "object",
        "nullable": true,
        "description": "Der Namensabgleich, der über die Überweisung entschieden hat, oder null, bis einer ausgeführt wurde. Solange die Parteien maskiert sind und auf der Kopie des anderen Kunden eines INTERNAL-Austauschs, werden `transfer_name`, `compared_name`, `matched_names` und `mismatched_names` ausgeblendet. `score` und `matched` können voneinander abweichen: `matched` richtet sich nach der Strenge, `score` ist die Ähnlichkeit der beiden vollständigen Namen.",
        "properties": {
          "score": {
            "type": "integer",
            "minimum": 0,
            "maximum": 100,
            "description": "Ähnlichkeit der beiden vollständigen Namen, 0 bis 100. 0, wenn einer der Namen leer ist."
          },
          "matched": {
            "type": "boolean",
            "description": "Gibt an, ob die Namen die Bedingung `strictness` erfüllen. Das Ergebnis des Transfers folgt `data_match`, das jedes Feld vergleicht, sodass ein Transfer COUNTERPARTY_MISMATCHED_DATA sein kann, während dies wahr ist."
          },
          "method": {
            "type": "string",
            "enum": [
              "none",
              "exact_token",
              "token_subset",
              "token_containment",
              "sequence_ratio"
            ],
            "description": "Wie über `matched` entschieden wurde: none (`NONE`), exact_token (`STRICT`), token_subset (`DEFAULT`), token_containment (`CONTAINS`) oder sequence_ratio (`FUZZY`)."
          },
          "strictness": {
            "type": "string",
            "enum": [
              "NONE",
              "STRICT",
              "CONTAINS",
              "DEFAULT",
              "FUZZY"
            ]
          },
          "compared_with": {
            "type": "string",
            "enum": [
              "wallet_holder",
              "counterparty_vasp"
            ],
            "description": "wallet_holder: Der für die Wallet hinterlegte Inhaber. counterparty_vasp: Der Name, den die Gegenpartei auf der E-Mail-Antwortseite angegeben hat, oder die Antwort des Didit-Test-VASP in der Sandbox."
          },
          "transfer_name": {
            "type": "string",
            "description": "Der Name auf der Überweisung."
          },
          "compared_name": {
            "type": "string",
            "description": "Der Name, mit dem verglichen wurde."
          },
          "matched_names": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Wörter aus `transfer_name`, die in `compared_name` gefunden wurden."
          },
          "mismatched_names": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Wörter aus `transfer_name`, die in `compared_name` fehlen, gefolgt von Wörtern aus `compared_name`, die in `transfer_name` fehlen."
          }
        }
      },
      "TravelRuleTransferRow": {
        "type": "object",
        "description": "Ein Travel-Rule-Transfer, wie ihn die Transferliste anzeigt: nur VASP-Namen, Wallets und Memos, niemals die Personendaten des Auftraggebers oder Begünstigten.",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "description": "Die ID des Transfers."
          },
          "transaction_id": {
            "type": "string",
            "format": "uuid",
            "description": "Die Didit-Transaktion, zu der die Überweisung gehört."
          },
          "txn_id": {
            "type": "string",
            "nullable": true,
            "description": "Ihre eigene ID für die Transaktion. Überweisungen, die Didit für Sie bucht, wie z. B. ein eingehender Transfer über den Didit Test VASP, tragen eine generierte ID."
          },
          "txn_date": {
            "type": "string",
            "format": "date-time"
          },
          "kind": {
            "type": "string",
            "enum": [
              "withdrawal",
              "deposit",
              "message"
            ],
            "description": "withdrawal: ausgehend. message: ein eingehender Transfer, den ein Kanal aus der Nachricht einer Gegenpartei erstellt hat (eine TRP-Anfrage, der eingehende INTERNAL-Teil oder eine GTR-, VerifyVASP- oder Sygna-Bridge-Nachricht). deposit: jeder andere eingehende Transfer."
          },
          "direction": {
            "type": "string",
            "enum": [
              "INBOUND",
              "OUTBOUND"
            ]
          },
          "status": {
            "type": "string",
            "enum": [
              "AWAITING_COUNTERPARTY",
              "ON_HOLD",
              "COMPLETED",
              "FINISHED",
              "CANCELLED",
              "EXPIRED",
              "COUNTERPARTY_MISMATCHED_DATA",
              "COUNTERPARTY_VASP_NOT_FOUND",
              "COUNTERPARTY_VASP_NOT_REACHABLE",
              "UNCONFIRMED_OWNERSHIP",
              "COUNTERPARTY_VASP_GENERAL_DECLINE",
              "NOT_ENOUGH_COUNTERPARTY_DATA",
              "NOT_APPLICABLE"
            ]
          },
          "reason": {
            "type": "string",
            "description": "Warum ein Transfer mit `COUNTERPARTY_VASP_NOT_FOUND` oder `COUNTERPARTY_VASP_NOT_REACHABLE` feststeckt; derselbe Wert wie `reason` des Transfers selbst, sodass die Liste eine unzustellbare Compliance-E-Mail von einer Gegenpartei ohne Route unterscheidet, ohne jeden Transfer einzeln öffnen zu müssen. `\"\"` für jeden anderen Status. Siehe [Warum ein Transfer feststeckt](/de/transaction-monitoring/travel-rule#warum-ein-transfer-blockiert-ist)."
          },
          "rail": {
            "type": "string",
            "nullable": true,
            "enum": [
              "INTERNAL",
              "TRP",
              "GTR",
              "TRUST",
              "VERIFYVASP",
              "SYGNA",
              "EMAIL",
              "TEST_VASP",
              null
            ]
          },
          "asset": {
            "type": "string",
            "description": "Die Währung der Transaktion."
          },
          "amount": {
            "type": "string",
            "description": "Der Betrag als reine Dezimalzahl, zum Beispiel \"1.25\"."
          },
          "originator_vasp": {
            "type": "string",
            "description": "Ausgehend: der rechtliche Name Ihres VASP. Eingehend: der Name der Gegenpartei aus ihrem Verzeichniseintrag, dem Didit-Netzwerkmitglied, dem TRP-Absender, dem Didit Test VASP oder dem im Transfer angegebenen Namen. Leer, wenn keiner bekannt ist."
          },
          "beneficiary_vasp": {
            "type": "string",
            "description": "Ausgehend: der Name der Gegenpartei, auf dieselbe Weise ermittelt. Eingehend: der rechtliche Name Ihres VASP."
          },
          "originator_wallet": {
            "type": "string"
          },
          "beneficiary_wallet": {
            "type": "string"
          },
          "originator_memo": {
            "type": "string",
            "description": "Memo oder Destination-Tag, leer bei Blockchains ohne ein solches."
          },
          "beneficiary_memo": {
            "type": "string"
          },
          "originator_wallet_type": {
            "type": "string",
            "enum": [
              "vasp",
              "self_hosted",
              "own"
            ],
            "description": "vasp, self_hosted (als unhosted deklariert) oder own (eine Wallet, die Ihr Adressbuch als Ihre eigene ausweist). Ihre eigene Seite ist immer vasp."
          },
          "beneficiary_wallet_type": {
            "type": "string",
            "enum": [
              "vasp",
              "self_hosted",
              "own"
            ]
          },
          "matched_transaction_id": {
            "type": "string",
            "format": "uuid",
            "nullable": true,
            "description": "Die andere Seite einer Einzahlung, die Sie manuell einem angekündigten Transfer zugeordnet haben."
          },
          "deadline_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "description": "Wann der Transfer abläuft, falls er noch auf seine Gegenpartei wartet. Wird für jeden Transfer festgelegt, den Sie mit `POST /v3/transactions/` erstellen und der einen Austausch erfordert, ausgehend oder eingehend. Null unterhalb des Schwellenwerts, bei einer Lightning-Zahlung, für die die Travel Rule nicht gilt, und bei eingehenden Transfers, die Didit erstellt, wenn eine Gegenpartei Sie kontaktiert (eine eingehende TRP-Anfrage, eine Netzwerknachricht oder der eingehende INTERNAL-Abschnitt)."
          },
          "created_at": {
            "type": "string",
            "format": "date-time"
          }
        }
      },
      "BankAccountCheckHolder": {
        "description": "Der Name, gegen den das Konto geprüft wird. Senden Sie genau eines von `full_name` und `business_name`.",
        "oneOf": [
          {
            "$ref": "#/components/schemas/BankAccountCheckPersonHolder"
          },
          {
            "$ref": "#/components/schemas/BankAccountCheckBusinessHolder"
          }
        ]
      },
      "BankAccountCheckRequest": {
        "type": "object",
        "required": [
          "country",
          "account",
          "holder"
        ],
        "properties": {
          "country": {
            "type": "string",
            "minLength": 3,
            "maxLength": 3,
            "description": "Das Land des Kontos als ISO 3166-1 Alpha-3-Code, zum Beispiel `NGA`. Kleinbuchstaben werden akzeptiert.",
            "example": "NGA"
          },
          "account": {
            "type": "object",
            "description": "Das Konto in der Schreibweise seines Landes: eine `iban` oder eine `account_number` mit der vom Land benötigten Bank- oder Filialleitzahl (`sort_code`, `routing_number`, `transit_institution`, `bsb`, `ifsc`, `bank_code` oder `bic`). Mexiko verwendet eine `clabe` und Argentinien einen `cbu_cvu`, die bereits die Bank angeben. Ein Geschäftskonto fügt eine `registration_id` hinzu, sofern das Land eine solche verlangt. Leerzeichen, Bindestriche und Punkte werden ignoriert. Schlüssel, die von der Prüfung des Landes nicht verwendet werden, werden ignoriert; ein benötigter, aber fehlender Schlüssel führt zu einem `400`, der ihn benennt.",
            "properties": {
              "iban": {
                "type": "string",
                "maxLength": 64,
                "description": "Die IBAN, in einem Land, das IBANs verwendet. Sie muss zu `country` gehören."
              },
              "account_number": {
                "type": "string",
                "maxLength": 64,
                "description": "Die Kontonummer in einem Land, in dem die Kontonummer zusammen mit einer separaten Bank- oder Filialleitzahl angegeben wird."
              },
              "sort_code": {
                "type": "string",
                "maxLength": 64,
                "description": "Vereinigtes Königreich: der 6-stellige Sort Code."
              },
              "routing_number": {
                "type": "string",
                "maxLength": 64,
                "description": "Vereinigte Staaten: die 9-stellige ABA-Routing-Nummer."
              },
              "transit_institution": {
                "type": "string",
                "maxLength": 64,
                "description": "Kanada: die 8-stellige Transit- und Institutionsnummer."
              },
              "bsb": {
                "type": "string",
                "maxLength": 64,
                "description": "Australien: die 6-stellige BSB."
              },
              "ifsc": {
                "type": "string",
                "maxLength": 64,
                "description": "Indien: der 11-stellige IFSC."
              },
              "bank_code": {
                "type": "string",
                "maxLength": 64,
                "description": "Der Bankcode, sofern das Land einen benötigt, zum Beispiel in Nigeria."
              },
              "bic": {
                "type": "string",
                "maxLength": 64,
                "description": "Der BIC der Bank, sofern die Prüfung des Landes einen erfordert."
              },
              "clabe": {
                "type": "string",
                "maxLength": 64,
                "description": "Mexiko: die 18-stellige CLABE. Sie benennt die Bank bereits."
              },
              "cbu_cvu": {
                "type": "string",
                "maxLength": 64,
                "description": "Argentinien: die 22-stellige CBU oder CVU. Sie gibt die Bank bereits an."
              },
              "registration_id": {
                "type": "string",
                "maxLength": 64,
                "description": "Die Registernummer eines Unternehmenskontos, sofern das Land eine solche verlangt."
              }
            },
            "additionalProperties": {
              "type": "string",
              "maxLength": 64
            },
            "example": {
              "bank_code": "000014",
              "account_number": "0123450001"
            }
          },
          "holder": {
            "$ref": "#/components/schemas/BankAccountCheckHolder"
          },
          "vendor_data": {
            "type": "string",
            "nullable": true,
            "description": "Ihre eigene Referenz für diese Prüfung, unverändert zurückgegeben.",
            "example": "payout_20481"
          },
          "consent": {
            "type": "boolean",
            "default": false,
            "description": "Auf `true` setzen, wenn der Kontoinhaber dieser Prüfung ausdrücklich eingewilligt hat. Erforderlich in Ländern, deren Kontoprüfung diese Einwilligung verlangt: Ohne sie wird die Prüfung mit einem `400`-Fehler abgelehnt, dessen `field` `consent` und dessen `reason` `required` lautet, und es wird nichts in Rechnung gestellt. Andernorts ist dies optional, und Didit erfasst dies bei der Übermittlung zusammen mit der Gebühr für die Prüfung.",
            "example": true
          }
        }
      },
      "BankAccountCheckResponse": {
        "type": "object",
        "required": [
          "request_id",
          "result",
          "holder_name",
          "account",
          "vendor_data",
          "created_at"
        ],
        "properties": {
          "request_id": {
            "type": "string",
            "format": "uuid",
            "description": "Die ID dieser Prüfung."
          },
          "result": {
            "type": "string",
            "enum": [
              "match",
              "close_match",
              "no_match",
              "cannot_verify"
            ],
            "description": "`match`: Die Bank führt das Konto unter dem von Ihnen übermittelten Namen. `close_match`: unter einem ähnlichen Namen, zum Beispiel ein fehlender zweiter Vorname oder ein Tippfehler. `no_match`: unter einem anderen Namen, oder es existiert kein solches Konto. `cannot_verify`: Die Bank hat geantwortet, ohne den Namen abzugleichen, zum Beispiel bei einem gesperrten oder geschlossenen Konto."
          },
          "holder_name": {
            "type": "string",
            "nullable": true,
            "description": "Nur bei einem `close_match` und nur, wenn die Bank ihn zurückgegeben hat: der Name auf dem Konto, wie er bei der Bank geführt wird. Andernfalls `null`."
          },
          "account": {
            "type": "string",
            "description": "Das Konto, maskiert auf die letzten 4 Zeichen."
          },
          "vendor_data": {
            "type": "string",
            "nullable": true,
            "description": "Ihre eigene Referenz, genau wie von Ihnen gesendet."
          },
          "created_at": {
            "type": "string",
            "format": "date-time",
            "description": "Wann die Überprüfung durchgeführt wurde, in UTC."
          }
        }
      },
      "BankAccountCheckError": {
        "type": "object",
        "required": [
          "detail"
        ],
        "properties": {
          "detail": {
            "type": "string",
            "description": "Was schiefgelaufen ist, auf Englisch."
          },
          "code": {
            "type": "string",
            "description": "Ein stabiler Code für Verzweigungen. Fehlt bei `401` und `403`."
          },
          "field": {
            "type": "string",
            "description": "Nur bei `400`: das zu korrigierende Body-Feld als punktierter Pfad, beispielsweise `account.sort_code`."
          },
          "reason": {
            "type": "string",
            "enum": [
              "required",
              "length",
              "format",
              "checksum",
              "country_mismatch",
              "rejected"
            ],
            "description": "Nur bei `400`: warum das Feld abgelehnt wurde. `required`, `length`, `format`, `checksum` und `country_mismatch` (eine IBAN eines anderen Landes) sind Didits eigene Prüfungen; `rejected` bedeutet, dass die Bank das Konto in der übermittelten Form abgelehnt hat."
          }
        }
      },
      "BankVerificationResult": {
        "type": "object",
        "description": "Ergebnis eines Bankverifizierungsschritts für die Benutzer- und Unternehmensverifizierung. `method` gibt an, wie das Konto verifiziert wurde, und `none`, dass die Person ohne Bank fortgefahren ist, bevor ein Versuch bewertet wurde. `continued_without_bank` gibt an, dass die Person ohne Bank fortgefahren ist, auch nach einem bewerteten Versuch. Siehe [Bankverifizierungsmethoden](/de/core-technology/bank-verification/verification-methods) und [Wenn die Person ihre Bank nicht verifizieren kann](/de/core-technology/bank-verification/fallbacks).",
        "properties": {
          "schema_version": {
            "type": "integer",
            "description": "Version dieser Ergebnisstruktur. Derzeit `1`."
          },
          "bank_verification_id": {
            "type": "string",
            "format": "uuid",
            "description": "Die ID dieses Ergebnisses."
          },
          "node_id": {
            "type": "string",
            "description": "Der Workflow-Knoten, zu dem dieses Ergebnis gehört."
          },
          "status": {
            "type": "string",
            "enum": [
              "Not Finished",
              "Approved",
              "Declined",
              "In Review",
              "Expired"
            ],
            "description": "Das Verdikt des Schritts nach seinen Aktionen und Statusregeln."
          },
          "original_status": {
            "type": "string",
            "nullable": true,
            "description": "Das erste Urteil, das der Schritt gefällt hat, vor jeder späteren Änderung wie einer manuellen Prüfung."
          },
          "method": {
            "type": "string",
            "nullable": true,
            "enum": [
              "open_banking",
              "account_lookup",
              "microdeposits",
              "statement",
              "none"
            ],
            "description": "Wie das Konto verifiziert wurde: `open_banking` (Bank-Login: die Person hat sich bei ihrer Bank angemeldet), `account_lookup` (Kontoüberprüfung: die Person hat die Kontodaten eingegeben und die Bank hat den Namen bestätigt), `microdeposits` oder `statement` (Upload eines Kontoauszugs). `none`, wenn die Person ohne Bank fortgefahren ist, bevor ein Versuch ausgewertet wurde, sodass kein Konto verifiziert wurde. Nach einem ausgewerteten Versuch bleibt es die Methode dieses Versuchs. `null`, bis ein Konto ausgewertet wird, sowie wenn der Workflow die zurückgegebenen Daten einschränkt. Workflow-Regeln lesen denselben Wert wie `bank.method`."
          },
          "provider": {
            "type": "string",
            "nullable": true,
            "description": "Der Schlüssel der Route, die die Verbindung ausgeführt hat. Lesen Sie `method`, nicht diesen Schlüssel, um festzustellen, wie das Konto verifiziert wurde."
          },
          "credential_source": {
            "type": "string",
            "nullable": true,
            "enum": [
              "native",
              "byok"
            ],
            "description": "`native`: Didits eigene Route, abgerechnet über Ihr Didit-Guthaben. `byok`: ein Marketplace-Anbieter, den Sie mit Ihren eigenen Anmeldedaten angebunden haben."
          },
          "route": {
            "type": "object",
            "nullable": true,
            "description": "Die vor der Einwilligung gewählte Route. Sie ändert sich danach nicht mehr.",
            "properties": {
              "provider_key": {
                "type": "string",
                "nullable": true,
                "description": "Der Schlüssel der Route."
              },
              "credential_source": {
                "type": "string",
                "enum": [
                  "native",
                  "byok"
                ]
              },
              "is_fallback": {
                "type": "boolean",
                "description": "Gibt an, ob Didits eigene Route für einen Marketplace-Anbieter eingesprungen ist, der keine Verbindung herstellen konnte."
              },
              "provider_connection_id": {
                "type": "string",
                "nullable": true,
                "description": "Die verwendete Marketplace-Verbindung für `byok`."
              },
              "requested_scopes": {
                "type": "array",
                "items": {
                  "type": "string"
                },
                "description": "Die von der Verbindung angeforderten Daten, beispielsweise `ownership` oder `balances`."
              }
            }
          },
          "connection": {
            "type": "object",
            "nullable": true,
            "description": "Die Verbindung des letzten Versuchs. `null` vor dem ersten Versuch.",
            "properties": {
              "status": {
                "type": "string",
                "enum": [
                  "pending",
                  "connected",
                  "cancelled",
                  "timeout",
                  "failed",
                  "unsupported",
                  "revoked",
                  "expired"
                ]
              },
              "institution_id": {
                "type": "string",
                "nullable": true,
                "description": "Die ID der Bank. `null` bei einer Kontoprüfung, bei der keine Bank ausgewählt wird."
              },
              "institution_name": {
                "type": "string",
                "nullable": true,
                "description": "Der Name der Bank. `null` bei einer Kontoprüfung."
              },
              "institution_country": {
                "type": "string",
                "nullable": true,
                "description": "Das Land des Kontos, ISO 3166-1 Alpha-3."
              },
              "oauth": {
                "type": "boolean",
                "nullable": true,
                "description": "Gibt an, ob die Bankanmeldung über OAuth oder App-to-App erfolgte. `null` bei einer Kontoüberprüfung."
              },
              "connected_at": {
                "type": "string",
                "format": "date-time",
                "nullable": true,
                "description": "Wann die Verbindung erfolgreich war."
              },
              "consent_expires_at": {
                "type": "string",
                "format": "date-time",
                "nullable": true,
                "description": "Wann die Bank-Einwilligung endet, bei der Bank-Anmeldung."
              },
              "last_refreshed_at": {
                "type": "string",
                "format": "date-time",
                "nullable": true,
                "description": "Wann die Finanzdaten zuletzt erneut ausgelesen wurden."
              },
              "attempts": {
                "type": "integer",
                "description": "Die Versuche, die die Person für diesen Schritt aufgewendet hat, alle Methoden zusammen."
              },
              "reason_code": {
                "type": "string",
                "nullable": true,
                "description": "Warum die Verbindung nicht einfach `connected` ist, zum Beispiel `USER_CANCELLED`, `INSTITUTION_DOWN`, `ACCOUNT_NOT_FOUND`, `REFERENCE_IDENTITY_MISSING` oder `VERIFICATION_COMPLETED`."
              }
            }
          },
          "account": {
            "type": "object",
            "nullable": true,
            "description": "Das bewertete Konto. `null`, bis ein Konto bewertet wird.",
            "properties": {
              "account_id_masked": {
                "type": "string",
                "nullable": true,
                "description": "Die Kontonummer, maskiert."
              },
              "iban_masked": {
                "type": "string",
                "nullable": true,
                "description": "Die IBAN, maskiert."
              },
              "sort_code": {
                "type": "string",
                "nullable": true,
                "description": "Der Sort Code im Vereinigten Königreich."
              },
              "routing_number_masked": {
                "type": "string",
                "nullable": true,
                "description": "Die Routing-Nummer, maskiert."
              },
              "type": {
                "type": "string",
                "nullable": true,
                "enum": [
                  "checking",
                  "current",
                  "savings",
                  "business",
                  "other"
                ]
              },
              "subtype": {
                "type": "string",
                "nullable": true,
                "description": "Der bankeigene Kontosubtyp."
              },
              "currency": {
                "type": "string",
                "nullable": true,
                "description": "ISO 4217-Währung des Kontos."
              },
              "holder_type": {
                "type": "string",
                "nullable": true,
                "enum": [
                  "person",
                  "business",
                  "unknown"
                ]
              },
              "holders_count": {
                "type": "integer",
                "nullable": true
              },
              "is_joint": {
                "type": "boolean",
                "nullable": true
              },
              "is_business": {
                "type": "boolean",
                "nullable": true
              }
            }
          },
          "ownership": {
            "type": "object",
            "nullable": true,
            "description": "Wie der Kontoinhaber mit der verifizierten Identität übereinstimmt. `null`, bis ein Konto ausgewertet wird.",
            "properties": {
              "result": {
                "type": "string",
                "enum": [
                  "match",
                  "partial_match",
                  "no_match",
                  "unknown",
                  "not_verifiable"
                ],
                "description": "`partial_match` ist eine nahe Übereinstimmung. `not_verifiable`: Die Bank hat ohne abzugleichenden Inhaber geantwortet. `unknown`: Der Nachweis konnte nicht gelesen werden, oder es lag keine Identität zum Abgleich vor."
              },
              "reference_identity_source": {
                "type": "string",
                "nullable": true,
                "description": "Der Schritt, mit dessen Identität der Inhaber verglichen wurde: `kyc`, `database_validation`, `expected_details`, `questionnaire`, `document_ai` oder `kyb`."
              },
              "name_score": {
                "type": "integer",
                "minimum": 0,
                "maximum": 100,
                "nullable": true,
                "description": "Didits Kontoinhaber-Namens-Score."
              },
              "provider_name_score": {
                "type": "integer",
                "minimum": 0,
                "maximum": 100,
                "nullable": true,
                "description": "Der bankeigene Score für den Inhabernamen, sofern einer zurückgegeben wurde."
              },
              "address_score": {
                "type": "integer",
                "minimum": 0,
                "maximum": 100,
                "nullable": true,
                "description": "Der Score für die Inhaberadresse, sofern ein Adressabgleich durchgeführt wurde."
              },
              "email_score": {
                "type": "integer",
                "minimum": 0,
                "maximum": 100,
                "nullable": true,
                "description": "Der Score für die Inhaber-E-Mail, sofern ein E-Mail-Abgleich durchgeführt wurde."
              },
              "phone_score": {
                "type": "integer",
                "minimum": 0,
                "maximum": 100,
                "nullable": true,
                "description": "Der Score für die Inhabertelefonnummer, sofern ein Telefonabgleich durchgeführt wurde."
              },
              "dob_score": {
                "type": "integer",
                "minimum": 0,
                "maximum": 100,
                "nullable": true,
                "description": "Der Score für das Inhabergeburtsdatum, sofern die Bank eines übermittelt hat."
              },
              "close_match": {
                "type": "boolean",
                "nullable": true,
                "description": "Gibt an, ob der Name im Bereich für eine enge Übereinstimmung lag."
              },
              "holder_confirmation": {
                "type": "string",
                "nullable": true,
                "enum": [
                  "pending",
                  "confirmed",
                  "rejected"
                ],
                "description": "Die Antwort der Person bei der Bitte um Bestätigung eines ähnlich lautenden Namens. `null`, wenn nie danach gefragt wurde."
              },
              "method": {
                "type": "string",
                "nullable": true,
                "enum": [
                  "exact",
                  "token_set",
                  "nickname",
                  "transliteration",
                  "fuzzy",
                  "provider_only",
                  "microdeposits"
                ],
                "description": "Welcher Namensvergleich den Wert erzeugt hat. Dies ist nicht die Verifizierungsmethode: Lesen Sie hierfür das übergeordnete Feld `method` aus."
              },
              "matched_holder_index": {
                "type": "integer",
                "nullable": true
              },
              "holders": {
                "type": "array",
                "items": {
                  "type": "object"
                },
                "description": "Jeder von der Bank aufgeführte Inhaber mit seinen Scores."
              },
              "owner_identity_available": {
                "type": "boolean",
                "nullable": true
              },
              "evidence_freshness": {
                "type": "string",
                "nullable": true,
                "enum": [
                  "live",
                  "cached",
                  "refreshed"
                ]
              },
              "evaluated_at": {
                "type": "string",
                "format": "date-time",
                "nullable": true,
                "description": "Wann die Entscheidung berechnet wurde."
              }
            }
          },
          "financial_data": {
            "type": "object",
            "description": "Die Finanzdaten, die der Schritt ausgelesen hat. Nur die Bank-Anmeldung liest sie aus.",
            "properties": {
              "balances": {
                "type": "object",
                "nullable": true,
                "description": "Mit dem Scope `balances`."
              },
              "transactions": {
                "type": "object",
                "nullable": true,
                "description": "Mit dem Scope `transactions`."
              },
              "income": {
                "type": "object",
                "nullable": true,
                "description": "Mit dem Scope `income`."
              },
              "categorization": {
                "type": "object",
                "nullable": true,
                "description": "Didits Kategorisierung der gelesenen Transaktionen. `null` ohne diese."
              },
              "not_collected": {
                "type": "array",
                "items": {
                  "type": "string",
                  "enum": [
                    "balances",
                    "income",
                    "transactions"
                  ]
                },
                "description": "Die vom Schritt angeforderten Daten, die von der Methode zur Kontoverifizierung nicht erfasst werden. Guthaben, Transaktionen und Einkommen stammen ausschließlich aus dem Bank-Login; ein per Kontoprüfung verifiziertes Konto führt sie daher hier auf. Dies ist niemals ein Fehler. Andernfalls ist das Feld leer."
              }
            }
          },
          "billing": {
            "type": "object",
            "nullable": true,
            "properties": {
              "route": {
                "type": "string",
                "enum": [
                  "native",
                  "byok"
                ]
              },
              "billed": {
                "type": "boolean"
              },
              "marketplace_fee": {
                "type": "string",
                "nullable": true,
                "description": "Die berechnete Marketplace-Plattformgebühr für `byok`."
              },
              "usage_type": {
                "type": "string",
                "nullable": true,
                "description": "Die Nutzungsposition, auf die die Gebühr gebucht wurde: `bank_verification` für eine Bankanmeldung oder eine Kontoprüfung, `bank_statement_upload` für einen Kontoauszug-Upload ohne vorherigen kostenpflichtigen Bankversuch und `bank_byok_fee` für die Marktplatzgebühr bei Ihrem eigenen Provider. `null`, wenn nichts in Rechnung gestellt wurde."
              }
            }
          },
          "reference_identity": {
            "type": "object",
            "nullable": true,
            "description": "Die Identität, mit der der Inhaber verglichen wurde, zusammen mit ihrer Quelle."
          },
          "signals": {
            "type": "object",
            "nullable": true,
            "description": "Kontosignale aus dem Transaktionsverlauf, sofern der Schritt diesen ausgelesen hat."
          },
          "connection_abandoned": {
            "type": "boolean",
            "nullable": true,
            "description": "Gibt an, ob der Schritt ohne Übereinstimmung endete, nachdem die Person den Schritt bei ihrer Bank verlassen hat."
          },
          "not_covered": {
            "type": "boolean",
            "nullable": true,
            "description": "Gibt an, ob die Bank oder das Land der Person bei diesem Schritt nicht erreicht werden konnte. Auch `true`, wenn die Person ohne Bank fortgefahren ist, da keine Methode ihr Land oder ihre Bank verifizieren konnte."
          },
          "continued_without_bank": {
            "type": "boolean",
            "description": "Gibt an, ob die Person den Schritt mit **Ohne Ihre Bank fortfahren** verlassen hat. `continuation` gibt dann den Grund an. `method` ist `none`, wenn vor dem Fortfahren kein Versuch ausgewertet wurde. Nach einem ausgewerteten Versuch, wie etwa einem nicht übereinstimmenden Kontoinhaber, bleibt `method` die Methode dieses Versuchs und das Urteil sowie die Grund-Codes bleiben bestehen. Wird auch zurückgegeben, wenn der Workflow die zurückgegebenen Daten einschränkt."
          },
          "continuation": {
            "type": "object",
            "nullable": true,
            "description": "Wie die Person ohne Bank fortgefahren ist. `null`, wenn sie dies nicht getan hat. Wenn der Workflow die zurückgegebenen Daten einschränkt, wird `reason` weiterhin zurückgegeben und jeder andere Schlüssel ist `null`.",
            "properties": {
              "reason": {
                "type": "string",
                "enum": [
                  "no_route",
                  "institution_unsupported",
                  "attempts_exhausted",
                  "person_choice"
                ],
                "description": "Warum dies geschah, wie von Didit beim Fortfahren der Person ermittelt: `no_route` (kein Bank-Login und keine Kontoprüfung für ihr Land verfügbar ist), `institution_unsupported` (die ausgewählte Bank kann in diesem Schritt nicht verwendet werden), `attempts_exhausted` (alle Versuche wurden bereits aufgebraucht und keiner war im Gange) oder `person_choice` (eine Verifizierungsmöglichkeit war vorhanden und die Person entschied sich fortzufahren, auch wenn ihre Bank gerade nicht erreichbar war). `no_route` und `institution_unsupported` folgen `bank_unsupported_action`, `attempts_exhausted` folgt `bank_attempts_exhausted_action` und `person_choice` folgt `bank_skipped_action`, es sei denn, ein ausgewerteter Versuch hat den Schritt bereits entschieden."
              },
              "country": {
                "type": "string",
                "nullable": true,
                "description": "Das Land, in dem sich die Person bei der Verifizierung befand, ISO 3166-1 alpha-3. `null`, wenn sie fortgefahren ist, bevor sie eines ausgewählt hat."
              },
              "offered": {
                "type": "array",
                "items": {
                  "type": "string",
                  "enum": [
                    "statement",
                    "microdeposits"
                  ]
                },
                "nullable": true,
                "description": "Die anderen Verifizierungsmethoden, die das Land der Person beim Fortfahren angeboten hat, in der Reihenfolge ihres Angebots: `statement` (ein Kontoauszugs-Upload), dann `microdeposits`. Leer, wenn keine angeboten wurden."
              },
              "institution_id": {
                "type": "string",
                "nullable": true,
                "description": "Für `institution_unsupported`: die ID der Bank, die die Person nicht verwenden konnte: die Bank, die sie ausgewählt hat, oder die Bank, bei der ihr letzter Versuch endete. Didit entnimmt diese seiner eigenen Bankenliste, niemals dem Gerät der Person; eine Bank, die nicht in dieser Liste enthalten ist, ist daher `null`. `null` für jeden anderen Grund."
              },
              "institution_name": {
                "type": "string",
                "nullable": true,
                "description": "Für `institution_unsupported`: der Name dieser Bank aus derselben Liste wie `institution_id`. `null`, wenn diese Liste die Bank nicht enthält, sowie für jeden anderen Grund."
              },
              "continued_at": {
                "type": "string",
                "format": "date-time",
                "nullable": true,
                "description": "Wann die Person fortgefahren ist."
              }
            }
          },
          "evidence_purged_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "description": "Wann die Banknachweise gemäß `bank_evidence_retention_days` gelöscht wurden. Andernfalls `null`."
          },
          "warnings": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Informative Codes, zum Beispiel `holder_declared`. Eine Warnung ändert den Status niemals von sich aus."
          },
          "reason_codes": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Warum das Ergebnis so ausgefallen ist, zum Beispiel `OWNER_NAME_PARTIAL`. Es können mehrere zutreffen. `NOT_COVERED`: Die Person ist ohne Bank fortgefahren, da keine Methode ihr Land oder ihre Bank verifizieren konnte. `SKIPPED`: Die Person hat sich entschieden, ohne Bank fortzufahren, obwohl eine Verifizierungsmöglichkeit vorhanden war. Keines von beiden wird hinzugefügt, wenn ein ausgewerteter Versuch den Schritt bereits entschieden hat."
          },
          "created_at": {
            "type": "string",
            "format": "date-time"
          },
          "updated_at": {
            "type": "string",
            "format": "date-time"
          }
        }
      },
      "BankAccountCheckPersonHolder": {
        "type": "object",
        "description": "Die Person, die Kontoinhaber sein soll.",
        "required": [
          "full_name"
        ],
        "properties": {
          "full_name": {
            "type": "string",
            "maxLength": 255,
            "description": "Der vollständige Name der Person, die das Konto innehaben soll.",
            "example": "Maria Oliveira"
          }
        }
      },
      "BankAccountCheckBusinessHolder": {
        "type": "object",
        "description": "Das Unternehmen, das das Konto halten soll. Prüft ein Geschäftskonto.",
        "required": [
          "business_name"
        ],
        "properties": {
          "business_name": {
            "type": "string",
            "maxLength": 255,
            "description": "Der Name des Unternehmens, das das Konto führen soll. Prüft ein Geschäftskonto."
          }
        }
      },
      "BankVerificationPricing": {
        "type": "object",
        "description": "Öffentliche Listenpreise für Bank Verification: der Kontoauszug-Upload, die Gebühr für den eigenen Anbieterschlüssel und die Methoden der einzelnen Länder.",
        "required": [
          "currency",
          "statement_upload",
          "own_provider_fee_usd",
          "countries"
        ],
        "properties": {
          "currency": {
            "type": "string",
            "enum": [
              "USD"
            ],
            "description": "Währung jedes Preises in der Antwort.",
            "example": "USD"
          },
          "statement_upload": {
            "$ref": "#/components/schemas/BankStatementUploadPricing"
          },
          "own_provider_fee_usd": {
            "type": "string",
            "description": "Gebühr für jede abrechenbare Prüfung der Eigentümerstruktur auf einer Route, die Ihren eigenen Anbietervertrag anstelle des Didit-Vertrags nutzt, unabhängig vom Ergebnis berechnet. Eine stornierte, wegen einer Zeitüberschreitung beendete oder abgebrochene Verbindung wird nicht in Rechnung gestellt. Dezimalzeichenfolge mit 4 Nachkommastellen in USD.",
            "example": "0.0200"
          },
          "countries": {
            "type": "object",
            "description": "Jedes Land, nach dem ISO-3166-1-Alpha-3-Code aufgeschlüsselt.",
            "additionalProperties": {
              "$ref": "#/components/schemas/BankVerificationPricingCountry"
            }
          }
        }
      },
      "BankStatementUploadPricing": {
        "type": "object",
        "description": "Wie der Upload eines Kontoauszugs abgerechnet wird.",
        "required": [
          "price_usd",
          "included_after_charged_bank_attempt",
          "standalone_available"
        ],
        "properties": {
          "price_usd": {
            "type": "string",
            "description": "Preis für den Upload eines Kontoauszugs nach einem kostenpflichtigen Bankversuch. Dezimal-String mit 4 Dezimalstellen in USD.",
            "example": "0.0000"
          },
          "included_after_charged_bank_attempt": {
            "type": "boolean",
            "description": "`true`, wenn der Upload nach einem kostenpflichtigen Bankversuch in derselben Sitzung ohne zusätzliche Kosten enthalten ist.",
            "example": true
          },
          "standalone_available": {
            "type": "boolean",
            "description": "`true`, wenn ein Kontoauszug-Upload eigenständig ausgeführt werden kann, ohne vorherigen Bankversuch. `false` in der Produktionsumgebung; Sandbox-Sitzungen können dies ohne Abrechnung testen.",
            "example": false
          }
        }
      },
      "BankVerificationPricingCountry": {
        "type": "object",
        "description": "Die Bankverifizierungsmethoden eines Landes und deren Listenpreise.",
        "required": [
          "name",
          "methods"
        ],
        "properties": {
          "name": {
            "type": "string",
            "description": "Ländername auf Englisch.",
            "example": "United Kingdom"
          },
          "methods": {
            "$ref": "#/components/schemas/BankVerificationPricingMethods"
          }
        }
      },
      "BankVerificationPricingMethods": {
        "type": "object",
        "description": "Die beiden Bankverifizierungsmethoden in einem Land.",
        "required": [
          "open_banking",
          "account_lookup"
        ],
        "properties": {
          "open_banking": {
            "$ref": "#/components/schemas/BankSignInPricing"
          },
          "account_lookup": {
            "$ref": "#/components/schemas/BankAccountCheckPricing"
          }
        }
      },
      "BankSignInPricing": {
        "type": "object",
        "description": "Bank-Anmeldung: Die Person meldet sich bei ihrer Bank an. Bepreist nach Markt, identisch für jede Bank darin.",
        "required": [
          "available",
          "market",
          "price_usd",
          "add_ons"
        ],
        "properties": {
          "available": {
            "type": "boolean",
            "description": "`true` nur dort, wo Didit den Bank-Login in diesem Land in der Produktionsumgebung anbietet.",
            "example": true
          },
          "market": {
            "type": "string",
            "nullable": true,
            "description": "Der Markt, dessen Preis gilt. `null`, wenn nicht verfügbar.",
            "example": "UK and EEA"
          },
          "price_usd": {
            "type": "string",
            "nullable": true,
            "description": "Listenpreis für eine Bank-Anmeldung. `null`, wenn nicht verfügbar. Dezimal-String mit 4 Nachkommastellen in USD.",
            "example": "0.7900"
          },
          "add_ons": {
            "type": "object",
            "description": "In diesem Land bepreiste Add-ons, jeweils als Dezimal-String mit 4 Nachkommastellen in USD, addiert zum Preis für den Bank-Login. Es werden nur die vom Land angebotenen Add-ons aufgelistet; leer, wenn der Bank-Login nicht verfügbar ist.",
            "properties": {
              "balance": {
                "type": "string",
                "description": "Zusatzfunktion für Kontostand.",
                "example": "0.3500"
              },
              "transactions": {
                "type": "string",
                "description": "Transaktions-Add-on.",
                "example": "1.3000"
              }
            }
          }
        }
      },
      "BankAccountCheckPricing": {
        "type": "object",
        "description": "Kontoprüfung: Die Person gibt ihre Kontonummer ein und Didit prüft diese bei der Bank. Abrechnung pro Land.",
        "required": [
          "available",
          "price_usd"
        ],
        "properties": {
          "available": {
            "type": "boolean",
            "description": "`true` nur dort, wo Didit die Kontoprüfung in diesem Land in der Produktionsumgebung anbietet.",
            "example": true
          },
          "price_usd": {
            "type": "string",
            "nullable": true,
            "description": "Listenpreis für eine Kontoprüfung, die die Bank beantwortet. `null`, wenn nicht verfügbar. Dezimal-String mit 4 Nachkommastellen in USD.",
            "example": "0.4000"
          }
        }
      },
      "ImportProvider": {
        "type": "object",
        "properties": {
          "key": {
            "type": "string",
            "enum": [
              "sumsub",
              "jumio",
              "veriff",
              "onfido",
              "persona",
              "metamap",
              "socure",
              "idnow",
              "shufti",
              "idenfy",
              "ondato",
              "trulioo",
              "au10tix",
              "complycube",
              "other"
            ]
          },
          "name": {
            "type": "string"
          },
          "mode": {
            "type": "string",
            "enum": [
              "api_list",
              "api_ids",
              "export_file"
            ],
            "description": "`api_list`: Didit listet Datensätze mit dem Schlüssel auf. `api_ids`: Laden Sie die Datensatz-IDs aus einem Export hoch. `export_file`: Laden Sie einen Export im Didit-Format hoch."
          },
          "record_noun": {
            "type": "string"
          },
          "credential_fields": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "name": {
                  "type": "string"
                },
                "label": {
                  "type": "string"
                },
                "secret": {
                  "type": "boolean"
                }
              }
            }
          },
          "regions": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "required_permissions": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "docs_url": {
            "type": "string",
            "nullable": true
          },
          "status_mapping": {
            "type": "object",
            "additionalProperties": {
              "type": "string",
              "enum": [
                "Approved",
                "Declined",
                "In Review",
                "Expired",
                "Not Finished",
                "Abandoned"
              ]
            }
          }
        }
      },
      "ImportJobSummary": {
        "type": "object",
        "description": "Ein Import-Job beliebiger Art, in dem Format, das der Importjob-Bereich der Konsole liest.",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "kind": {
            "type": "string",
            "enum": [
              "sessions",
              "businesses",
              "users",
              "status_rules",
              "transactions"
            ]
          },
          "source": {
            "type": "string",
            "enum": [
              "file",
              "api",
              "provider"
            ]
          },
          "provider": {
            "type": "string",
            "nullable": true
          },
          "provider_name": {
            "type": "string",
            "nullable": true
          },
          "filename": {
            "type": "string",
            "nullable": true
          },
          "state": {
            "type": "string",
            "enum": [
              "ready",
              "queued",
              "running",
              "paused",
              "completed",
              "errors",
              "failed",
              "cancelled"
            ],
            "description": "Der Status des Jobs, wie er in der Konsole angezeigt wird; `errors` ist ein abgeschlossener Job mit abgelehnten Zeilen."
          },
          "status": {
            "type": "string"
          },
          "is_dry_run": {
            "type": "boolean"
          },
          "credential_hint": {
            "type": "string",
            "nullable": true
          },
          "resumes_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "last_error": {
            "type": "string",
            "nullable": true
          },
          "started_by": {
            "type": "object",
            "properties": {
              "name": {
                "type": "string",
                "nullable": true
              },
              "email": {
                "type": "string",
                "nullable": true
              }
            }
          },
          "progress": {
            "type": "object",
            "properties": {
              "total": {
                "type": "integer",
                "format": "int64"
              },
              "processed": {
                "type": "integer",
                "format": "int64"
              },
              "imported": {
                "type": "integer",
                "format": "int64"
              },
              "updated": {
                "type": "integer",
                "format": "int64"
              },
              "already_in_didit": {
                "type": "integer",
                "format": "int64"
              },
              "failed": {
                "type": "integer",
                "format": "int64"
              },
              "not_finished": {
                "type": "integer",
                "format": "int64"
              },
              "same_person": {
                "type": "integer",
                "format": "int64"
              }
            }
          },
          "face_templates": {
            "type": "object",
            "nullable": true,
            "properties": {
              "enabled": {
                "type": "boolean"
              },
              "built": {
                "type": "integer",
                "format": "int64"
              },
              "duplicates": {
                "type": "integer",
                "format": "int64"
              },
              "blocklisted": {
                "type": "integer",
                "format": "int64"
              }
            }
          },
          "eta_seconds": {
            "type": "integer",
            "nullable": true
          },
          "created_at": {
            "type": "string",
            "format": "date-time"
          },
          "started_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "completed_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          }
        }
      },
      "FiledRegulatoryReport": {
        "type": "object",
        "description": "Ein finalisierter regulatorischer Bericht, der die angeforderte Löschung verhindert.",
        "required": [
          "uuid",
          "report_number",
          "report_type",
          "case_uuid"
        ],
        "properties": {
          "uuid": {
            "type": "string",
            "format": "uuid",
            "description": "Berichts-UUID."
          },
          "report_number": {
            "type": "string",
            "description": "In der Console angezeigte Berichtsnummer (z. B. SAR-0001)."
          },
          "report_type": {
            "type": "string",
            "enum": [
              "SAR",
              "STR",
              "CTR",
              "TTR",
              "UTR",
              "IFT",
              "CBR",
              "TFR"
            ],
            "description": "Art des aufsichtsrechtlichen Berichts."
          },
          "case_uuid": {
            "type": "string",
            "format": "uuid",
            "description": "Fall, zu dem der Bericht gehört."
          }
        }
      },
      "FiledReportTransaction": {
        "type": "object",
        "description": "Eine Transaktion, die nicht gelöscht werden kann, da ein abgeschlossener regulatorischer Bericht sie auflistet.",
        "required": [
          "uuid",
          "transaction_id",
          "reports"
        ],
        "properties": {
          "uuid": {
            "type": "string",
            "format": "uuid",
            "description": "Didit-Transaktions-UUID."
          },
          "transaction_id": {
            "type": "string",
            "description": "Die Transaktionskennung, die bei der Erstellung der Transaktion angegeben wurde."
          },
          "reports": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/FiledRegulatoryReport"
            },
            "description": "Abgeschlossene Berichte, die diese Transaktion aufführen."
          }
        }
      },
      "InFiledReportError": {
        "type": "object",
        "description": "Die Löschung wird verweigert, da sich die ausgewählten Daten in einem abgeschlossenen regulatorischen Bericht befinden. Es wird nichts gelöscht. Löschen Sie den Bericht und wiederholen Sie die Anfrage.",
        "required": [
          "detail",
          "code"
        ],
        "properties": {
          "detail": {
            "type": "string"
          },
          "code": {
            "type": "string",
            "enum": [
              "in_filed_report"
            ],
            "description": "Stabiler Fehlercode für eine Löschung, die durch einen finalisierten regulatorischen Bericht blockiert wird."
          },
          "reports": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/FiledRegulatoryReport"
            },
            "description": "Berichte, die das Löschen einer Person, eines Unternehmens, eines Falls oder einer Sitzung blockieren."
          },
          "transactions": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/FiledReportTransaction"
            },
            "description": "Transaktionen, die das Löschen einer Transaktion blockieren, jeweils mit den Berichten, in denen sie aufgeführt sind."
          }
        }
      },
      "SubjectDeletionInProgressError": {
        "type": "object",
        "description": "Eine andere Anfrage löscht diese Person oder dieses Unternehmen noch. Diese Anfrage hat nichts gelöscht und kann wiederholt werden, sobald dieser Löschvorgang abgeschlossen ist; eine Wiederholung löscht dann alles, was noch ausgewählt ist.",
        "required": [
          "detail",
          "code"
        ],
        "properties": {
          "detail": {
            "type": "string"
          },
          "code": {
            "type": "string",
            "enum": [
              "subject_deletion_in_progress"
            ],
            "description": "Stabiler Fehlercode für eine Person oder ein Unternehmen, die bzw. das von einer anderen Anfrage noch gelöscht wird."
          }
        }
      },
      "TravelRuleNetworkParticipantSummary": {
        "type": "object",
        "nullable": true,
        "description": "Der eigene Teilnehmer dieser Anwendung im Netzwerk oder null, wenn keiner vorhanden ist.",
        "properties": {
          "mode": {
            "type": "string",
            "enum": [
              "platform",
              "own"
            ],
            "description": "platform: über die Didit-Mitgliedschaft geführt; own: unter der eigenen Mitgliedschaft der Anwendung onboarded."
          },
          "status": {
            "type": "string",
            "enum": [
              "not_requested",
              "questionnaire_pending",
              "submitted_to_network",
              "active",
              "suspended",
              "rejected"
            ],
            "description": "not_requested: nie angefordert oder das Netzwerk hat die erste Anfrage abgelehnt (siehe last_error); questionnaire_pending: Warten auf die Genehmigung des Due-Diligence-Fragebogens; submitted_to_network: an das Onboarding des Netzwerks übergeben; active: das Netzwerk hat dieser Anwendung einen eigenen Teilnehmercode zugewiesen; suspended / rejected: Didit hat sie gesperrt oder abgelehnt."
          },
          "participant_code": {
            "type": "string",
            "description": "Der Code, den das Netzwerk dieser Anwendung zugewiesen hat (bei GTR dessen VASP-Code). Ausgehende Nachrichten enthalten diesen Code, niemals den von Didit selbst."
          },
          "requested_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "activated_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "last_error": {
            "type": "string",
            "description": "Die Antwort des Netzwerks bei Ablehnung der Registrierung; andernfalls leer."
          }
        }
      },
      "TravelRuleNetworkState": {
        "type": "object",
        "description": "Wie Travel Rule-Nachrichten in einem Netzwerk für diese Anwendung gesendet würden und warum dies nicht möglich ist. Konfigurationsstatus, keine Live-Prüfung von Status oder Zustellung.",
        "properties": {
          "rail": {
            "type": "string",
            "enum": [
              "GTR",
              "TRUST",
              "VERIFYVASP",
              "SYGNA"
            ]
          },
          "mode": {
            "type": "string",
            "enum": [
              "own",
              "didit",
              "off",
              "unavailable"
            ],
            "description": "own: die verknüpfte Mitgliedschaft der Anwendung wird verwendet; didit: die Mitgliedschaft von Didit führt die Anwendung als eigenen aktiven Teilnehmer; off: Plattform-Routing in disabled_networks ohne eigene Mitgliedschaft deaktiviert; unavailable: über dieses Netzwerk kann noch nichts gesendet werden (siehe state und reason)."
          },
          "state": {
            "type": "string",
            "enum": [
              "own_membership",
              "live_through_didit",
              "off",
              "didit_onboarding",
              "questionnaire_needed",
              "questionnaire_in_review",
              "request_access",
              "request_sent",
              "unavailable",
              "error"
            ],
            "description": "own_membership: Ihre verknüpfte Mitgliedschaft sendet; live_through_didit: Ihr eigener Teilnehmer über die Didit-Mitgliedschaft sendet; off: Sie haben das Plattform-Routing deaktiviert; didit_onboarding: Didits eigene Mitgliedschaft in diesem Netzwerk ist noch nicht live und kann daher niemanden führen; questionnaire_needed / questionnaire_in_review: Der Due-Diligence-Fragebogen muss eingereicht werden oder liegt bei Didit; request_access: Der Fragebogen ist genehmigt, fragen Sie das Netzwerk an; request_sent: Ihr Teilnehmer wird onboarded; unavailable: siehe reason; error: siehe reason."
          },
          "reason": {
            "type": "string",
            "enum": [
              "own_membership_connected",
              "platform_network_switched_off",
              "own_membership_only",
              "sandbox_application",
              "didit_membership_not_live",
              "participant_suspended",
              "participant_rejected",
              "questionnaire_not_submitted",
              "questionnaire_submitted",
              "questionnaire_changes_requested",
              "questionnaire_rejected",
              "participant_not_requested",
              "participant_active",
              "participant_key_missing",
              "participant_key_unresolved",
              "provisioning_failed",
              "questionnaire_pending",
              "submitted_to_network"
            ],
            "description": "Maschinenlesbare Details zum Status. own_membership_only: Didit wickelt keine Anwendungen in diesem Netzwerk (TRUST) ab, verknüpfen Sie Ihre eigene Mitgliedschaft; sandbox_application: Sandbox-Übertragungen erreichen niemals ein Netzwerk; provisioning_failed: Das Netzwerk hat die Registrierung abgelehnt, last_error des Teilnehmers gibt den Grund an und eine erneute Netzwerkanfrage startet einen Wiederholungsversuch."
          },
          "platform_available": {
            "type": "boolean",
            "description": "Gibt an, ob Didits eigene Mitgliedschaft in diesem Netzwerk konfiguriert ist; keine Live-Statusprüfung."
          },
          "connected": {
            "type": "boolean",
            "description": "Gibt an, ob eine verbundene Kundenmitgliedschaft existiert. Zugangsdaten werden lokal validiert; die Netzwerkvalidierung erfolgt bei einem Live-Austausch."
          },
          "participant": {
            "$ref": "#/components/schemas/TravelRuleNetworkParticipantSummary"
          },
          "vasps_reachable": {
            "type": "integer",
            "description": "Verzeichnis-VASPs, die in diesem Netzwerk erreichbar sind."
          },
          "routed_30d": {
            "type": "integer",
            "description": "Die über dieses Netzwerk in den letzten 30 Tagen durchgeführten Transfers dieser Anwendung."
          }
        }
      },
      "TravelRuleNetworkQuestionnaireAnswers": {
        "type": "object",
        "description": "Didits Netzwerk-Due-Diligence-Fragebogen. Speicherungen erfolgen partiell: Bei einer Speicherung bleiben alle Antworten erhalten, die nicht genannt werden. Das Einreichen erfordert jedes Feld mit Ausnahme von lei und data_protection_contact_email sowie die drei Bestätigungen auf true.",
        "properties": {
          "legal_name": {
            "type": "string",
            "maxLength": 255
          },
          "registration_number": {
            "type": "string",
            "maxLength": 255
          },
          "incorporation_country": {
            "type": "string",
            "minLength": 2,
            "maxLength": 2,
            "description": "ISO 3166-1 Alpha-2-Ländercode."
          },
          "registered_address": {
            "type": "string",
            "maxLength": 1000
          },
          "website": {
            "type": "string",
            "format": "uri",
            "maxLength": 500
          },
          "lei": {
            "type": "string",
            "maxLength": 20,
            "description": "Optional. Eine gültige ISO-17442-LEI, sofern angegeben."
          },
          "licences": {
            "type": "array",
            "minItems": 1,
            "items": {
              "type": "object",
              "required": [
                "regulator",
                "jurisdiction",
                "licence_type",
                "licence_number"
              ],
              "properties": {
                "regulator": {
                  "type": "string",
                  "maxLength": 255
                },
                "jurisdiction": {
                  "type": "string",
                  "minLength": 2,
                  "maxLength": 2,
                  "description": "ISO 3166-1 Alpha-2-Ländercode."
                },
                "licence_type": {
                  "type": "string",
                  "maxLength": 255
                },
                "licence_number": {
                  "type": "string",
                  "maxLength": 255
                }
              }
            },
            "description": "Jede Lizenz oder Registrierung, die der VASP besitzt."
          },
          "operating_jurisdictions": {
            "type": "array",
            "minItems": 1,
            "maxItems": 250,
            "items": {
              "type": "string",
              "minLength": 2,
              "maxLength": 2,
              "description": "ISO 3166-1 Alpha-2-Ländercode."
            }
          },
          "compliance_officer_name": {
            "type": "string",
            "maxLength": 255
          },
          "compliance_officer_email": {
            "type": "string",
            "format": "email"
          },
          "aml_ctf_policy_attested": {
            "type": "boolean",
            "description": "Muss true sein, um übermittelt zu werden."
          },
          "sanctions_screening_attested": {
            "type": "boolean",
            "description": "Muss true sein, um übermittelt zu werden."
          },
          "data_protection_attested": {
            "type": "boolean",
            "description": "Muss true sein, um übermittelt zu werden."
          },
          "data_protection_contact_email": {
            "type": "string",
            "format": "email",
            "description": "Optional."
          },
          "expected_monthly_transfers": {
            "type": "integer",
            "minimum": 0
          },
          "expected_monthly_volume_usd": {
            "type": "string",
            "format": "decimal",
            "description": "Erwartetes monatliches Volumen in USD, bis zu 2 Dezimalstellen. Wird als String zurückgegeben."
          },
          "assets": {
            "type": "array",
            "minItems": 1,
            "maxItems": 200,
            "items": {
              "type": "string",
              "maxLength": 32
            },
            "description": "Asset-Ticker, in Großbuchstaben gespeichert, sortiert und dedupliziert."
          }
        }
      },
      "TravelRuleNetworkQuestionnaire": {
        "type": "object",
        "properties": {
          "status": {
            "type": "string",
            "enum": [
              "draft",
              "submitted",
              "changes_requested",
              "approved",
              "rejected"
            ],
            "description": "Antworten können gespeichert werden, solange der Status draft oder changes_requested ist; die Statusänderungen zu submitted, approved und rejected werden von Didit vorgenommen."
          },
          "answers": {
            "$ref": "#/components/schemas/TravelRuleNetworkQuestionnaireAnswers"
          },
          "submitted_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "reviewed_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "review_note": {
            "type": "string",
            "description": "Didits Notiz zu seiner letzten Entscheidung, beispielsweise was geändert werden muss."
          },
          "history": {
            "type": "array",
            "readOnly": true,
            "description": "Jede Statusänderung, die älteste zuerst.",
            "items": {
              "type": "object",
              "properties": {
                "at": {
                  "type": "string",
                  "format": "date-time"
                },
                "from": {
                  "type": "string"
                },
                "to": {
                  "type": "string"
                },
                "note": {
                  "type": "string",
                  "description": "Prüfnotiz oder die Antwort des Netzwerks, sofern vorhanden."
                }
              }
            }
          },
          "updated_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          }
        }
      },
      "TravelRuleNetworkParticipant": {
        "type": "object",
        "description": "Der eigene Teilnehmer dieser Anwendung in einem Netzwerk.",
        "properties": {
          "network": {
            "type": "string",
            "enum": [
              "gtr",
              "trust",
              "verifyvasp",
              "sygna"
            ]
          },
          "rail": {
            "type": "string",
            "enum": [
              "GTR",
              "TRUST",
              "VERIFYVASP",
              "SYGNA"
            ]
          },
          "mode": {
            "type": "string",
            "enum": [
              "platform",
              "own"
            ]
          },
          "status": {
            "type": "string",
            "enum": [
              "not_requested",
              "questionnaire_pending",
              "submitted_to_network",
              "active",
              "suspended",
              "rejected"
            ],
            "description": "not_requested: nie angefordert oder das Netzwerk hat die erste Anfrage abgelehnt (siehe last_error); questionnaire_pending: Warten auf die Genehmigung des Due-Diligence-Fragebogens; submitted_to_network: an das Onboarding des Netzwerks übergeben; active: das Netzwerk hat dieser Anwendung einen eigenen Teilnehmercode zugewiesen; suspended / rejected: Didit hat sie gesperrt oder abgelehnt."
          },
          "participant_code": {
            "type": "string"
          },
          "requested_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "submitted_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "activated_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "suspended_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "last_error": {
            "type": "string",
            "description": "Die Antwort des Netzwerks bei Ablehnung der Registrierung; andernfalls leer."
          },
          "history": {
            "type": "array",
            "readOnly": true,
            "description": "Jede Statusänderung, die älteste zuerst.",
            "items": {
              "type": "object",
              "properties": {
                "at": {
                  "type": "string",
                  "format": "date-time"
                },
                "from": {
                  "type": "string"
                },
                "to": {
                  "type": "string"
                },
                "note": {
                  "type": "string",
                  "description": "Prüfnotiz oder die Antwort des Netzwerks, sofern vorhanden."
                }
              }
            }
          }
        }
      },
      "TravelRuleNetworksOverview": {
        "type": "object",
        "properties": {
          "platform_networks_enabled": {
            "type": "boolean",
            "description": "Gibt an, ob der Netzwerkzugriff über Didits Mitgliedschaft offen ist. Solange dies false ist, antworten das Speichern von Fragebögen, Einreichungen und Netzwerkanfragen mit 403."
          },
          "questionnaire": {
            "$ref": "#/components/schemas/TravelRuleNetworkQuestionnaire"
          },
          "participants": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/TravelRuleNetworkParticipant"
            }
          },
          "networks": {
            "type": "object",
            "readOnly": true,
            "description": "Pro Netzwerk, wie diese Anwendung senden würde und warum sie es nicht kann. Kein Netzwerk, einschließlich GTR, ist standardmäßig enthalten: Ein Netzwerk ist über Ihre eigene verknüpfte Mitgliedschaft erreichbar oder über die Mitgliedschaft von Didit, sobald die Mitgliedschaft von Didit in diesem Netzwerk aktiv ist und Ihr eigener Teilnehmer darauf aktiv ist. Keine Live-Prüfung von Status oder Zustellung.",
            "properties": {
              "gtr": {
                "$ref": "#/components/schemas/TravelRuleNetworkState"
              },
              "trust": {
                "$ref": "#/components/schemas/TravelRuleNetworkState"
              },
              "verifyvasp": {
                "$ref": "#/components/schemas/TravelRuleNetworkState"
              },
              "sygna": {
                "$ref": "#/components/schemas/TravelRuleNetworkState"
              }
            }
          }
        }
      },
      "AddressValidationResult": {
        "type": "object",
        "description": "Das Ergebnis einer Adressvalidierung: ob die Adresse existiert und ihre normalisierte Form. Sie bestätigt nur die Adresse; sie verknüpft die Adresse niemals mit einer Person.",
        "required": [
          "status",
          "verification_level",
          "address",
          "formatted_address",
          "latitude",
          "longitude"
        ],
        "properties": {
          "status": {
            "type": "string",
            "enum": [
              "verified",
              "partially_verified",
              "not_verified",
              "unavailable"
            ],
            "description": "`verified`: Die Adresse wurde bis zum Gebäude (oder zur Wohnung bzw. zum Postfach) bestätigt. `partially_verified`: Sie wurde nur bis zur Straße oder bis zur genauesten Stufe bestätigt, die die Postreferenzdaten für diesen Ort enthalten. `not_verified`: Nur die Region oder die Stadt stimmte überein, oder gar nichts. `unavailable`: Die Validierung konnte nicht ausgeführt werden (z. B. hat der Referenzdienst nicht geantwortet); sie wird nicht abgerechnet und wirkt sich niemals auf eine Verifizierung aus."
          },
          "verification_level": {
            "type": "string",
            "nullable": true,
            "enum": [
              "administrative_area",
              "locality",
              "thoroughfare",
              "premise",
              "delivery_point",
              null
            ],
            "description": "Die genaueste Ebene, auf der die Adresse abgeglichen wurde. `null`, wenn keine Übereinstimmung vorliegt oder `status` auf `unavailable` steht."
          },
          "address": {
            "type": "object",
            "nullable": true,
            "description": "Die normalisierte Adresse. `null`, wenn `status` den Wert `unavailable` hat.",
            "properties": {
              "address_line_1": {
                "type": "string",
                "nullable": true,
                "description": "Erste Zustellzeile, so geschrieben, wie im jeweiligen Land üblich.",
                "example": "1600 Amphitheatre Pkwy"
              },
              "address_line_2": {
                "type": "string",
                "nullable": true,
                "description": "Zweite Adresszeile (Wohnung, Gebäude oder Stadtteil), sofern die Adresse eine enthält."
              },
              "city": {
                "type": "string",
                "nullable": true,
                "example": "Mountain View"
              },
              "region": {
                "type": "string",
                "nullable": true,
                "description": "Bundesland, Provinz oder Region.",
                "example": "CA"
              },
              "postal_code": {
                "type": "string",
                "nullable": true,
                "example": "94043-1351"
              },
              "country": {
                "type": "string",
                "nullable": true,
                "description": "ISO 3166-1 Alpha-2-Ländercode.",
                "example": "US"
              }
            }
          },
          "formatted_address": {
            "type": "string",
            "nullable": true,
            "description": "Die normalisierte Adresse in einer Zeile.",
            "example": "1600 Amphitheatre Pkwy, Mountain View CA 94043-1351"
          },
          "latitude": {
            "type": "number",
            "nullable": true,
            "example": 37.422022
          },
          "longitude": {
            "type": "number",
            "nullable": true,
            "example": -122.08429
          }
        }
      },
      "AddressValidationRequest": {
        "type": "object",
        "required": [
          "country"
        ],
        "description": "Eine Adresse: entweder einzeilig (`address`) oder als strukturierte Felder mit mindestens `address_line_1`, niemals beides.",
        "properties": {
          "address": {
            "type": "string",
            "maxLength": 500,
            "description": "Die vollständige Adresse in einer Zeile.",
            "example": "Paseo de la Castellana 259, 28046 Madrid"
          },
          "address_line_1": {
            "type": "string",
            "maxLength": 255,
            "description": "Straße und Hausnummer.",
            "example": "1600 Amphitheatre Pkwy"
          },
          "address_line_2": {
            "type": "string",
            "maxLength": 255,
            "description": "Wohnung, Suite, Etage oder Gebäude."
          },
          "city": {
            "type": "string",
            "maxLength": 128,
            "description": "Stadt oder Ortschaft.",
            "example": "Mountain View"
          },
          "region": {
            "type": "string",
            "maxLength": 128,
            "description": "Bundesland, Provinz oder Region.",
            "example": "CA"
          },
          "postal_code": {
            "type": "string",
            "maxLength": 32,
            "example": "94043"
          },
          "country": {
            "type": "string",
            "maxLength": 3,
            "description": "ISO 3166-1-Alpha-2- oder Alpha-3-Code des Landes der Adresse.",
            "example": "US"
          }
        }
      },
      "AddressValidationResponse": {
        "type": "object",
        "required": [
          "request_id",
          "address_validation",
          "created_at"
        ],
        "properties": {
          "request_id": {
            "type": "string",
            "format": "uuid",
            "description": "Kennung dieser Anfrage; geben Sie diese beim Support an. Es wird keine Sitzung erstellt."
          },
          "address_validation": {
            "$ref": "#/components/schemas/AddressValidationResult"
          },
          "created_at": {
            "type": "string",
            "format": "date-time"
          }
        }
      },
      "TravelRuleWalletProofFailureReason": {
        "type": "string",
        "enum": [
          "",
          "SIGNATURE_INVALID",
          "SIGNATURE_UNSUPPORTED_SCHEME",
          "DEPOSIT_NOT_FOUND",
          "DEPOSIT_UNCONFIRMED",
          "DEPOSIT_LOOKUP_FAILED",
          "DEPOSIT_MISMATCH",
          "DEPOSIT_STALE",
          "TXID_REUSED",
          "CHAIN_UNSUPPORTED",
          "WINDOW_EXPIRED",
          "OWNERSHIP_CHANGED",
          "METHOD_SWITCHED",
          "REVIEW_REJECTED",
          "ABANDONED"
        ],
        "description": "Warum ein Wallet-Eigentumsnachweis oder dessen letzter Versuch VERIFIED verfehlt hat. Leer, wenn kein Fehler aufgetreten ist. Ein PENDING-Nachweis kann einen Grund enthalten: Der letzte Versuch ist fehlgeschlagen und der Endbenutzer kann es erneut versuchen. DEPOSIT_MISMATCH, DEPOSIT_STALE, TXID_REUSED und REVIEW_REJECTED schließen den Nachweis als REJECTED ab. SIGNATURE_INVALID: Die Signatur stimmt nicht mit der Wallet und der Challenge überein. SIGNATURE_UNSUPPORTED_SCHEME: Die Wallet hat in einem Format signiert, das Didit nicht verifiziert. DEPOSIT_NOT_FOUND, DEPOSIT_UNCONFIRMED, DEPOSIT_LOOKUP_FAILED: Die Testeinzahlung ist noch nicht lesbar oder noch nicht bestätigt; Didit prüft dies weiter, bis das Testfenster schließt. DEPOSIT_MISMATCH: Die Transaktion sendet nicht den erwarteten Betrag von der Wallet an die Einzahlungsadresse. DEPOSIT_STALE: Die Transaktion liegt zeitlich vor der Challenge. TXID_REUSED: Die Transaktion hat bereits eine andere Wallet nachgewiesen. CHAIN_UNSUPPORTED: Die Methode ist auf dieser Chain nicht verfügbar. WINDOW_EXPIRED: Das Testfenster ist abgelaufen. OWNERSHIP_CHANGED: Der Inhaber der Wallet hat sich geändert oder die Wallet wurde nach dem Erstellen der Widget-Sitzung aus Ihrem Adressbuch gelöscht. METHOD_SWITCHED: Der Endbenutzer hat eine andere Methode gewählt, bevor diese abgeschlossen war. REVIEW_REJECTED: Ihr Prüfer hat den Screenshot abgelehnt. ABANDONED: Die Widget-Sitzung ist abgelaufen, bevor der Endbenutzer fertig war."
      },
      "TravelRuleWidgetProofError": {
        "type": "object",
        "properties": {
          "detail": {
            "type": "string",
            "description": "Lesbare Nachricht auf Englisch."
          },
          "code": {
            "allOf": [
              {
                "$ref": "#/components/schemas/TravelRuleWalletProofFailureReason"
              }
            ],
            "description": "Maschinenlesbarer Grund, damit ein Client seine eigene übersetzte Nachricht anzeigen kann."
          },
          "status": {
            "type": "string",
            "enum": [
              "PENDING",
              "VERIFIED",
              "REJECTED",
              "EXPIRED"
            ],
            "description": "Vorhanden, wenn der Nachweis abgeschlossen ist: REJECTED durch die gerade übermittelte Einzahlung (400), oder REJECTED bzw. EXPIRED, wenn Nachweise an einen bereits geschlossenen Nachweis gesendet werden (409)."
          },
          "proof_id": {
            "type": "string",
            "format": "uuid",
            "description": "Vorhanden bei Status: der geschlossene Nachweis."
          },
          "method": {
            "type": "string",
            "enum": [
              "MESSAGE_SIGNING",
              "SATOSHI_TEST",
              "SCREENSHOT",
              "SELF_DECLARATION"
            ],
            "description": "Vorhanden bei Status: Methode des geschlossenen Nachweises."
          },
          "max_attempts": {
            "type": "integer",
            "description": "Vorhanden bei Status: abgelehnte Wallet-Nachweise, die diese Sitzung zulässt."
          },
          "attempts_used": {
            "type": "integer",
            "description": "Vorhanden bei Status: bisher abgelehnte Nachweise."
          },
          "attempts_remaining": {
            "type": "integer",
            "description": "Vorhanden bei Status: Wenn der Wert 0 ist, führt das Starten eines weiteren Nachweises zu einer 409-Antwort und Sie erstellen eine neue Widget-Sitzung."
          }
        }
      },
      "TravelRuleWidgetProofCreate": {
        "type": "object",
        "required": [
          "method"
        ],
        "properties": {
          "method": {
            "type": "string",
            "enum": [
              "MESSAGE_SIGNING",
              "SATOSHI_TEST",
              "SCREENSHOT",
              "SELF_DECLARATION"
            ],
            "description": "Die vom Endbenutzer gewählte Nachweismethode. Sie muss eine der allowed_methods des Kontexts sein."
          },
          "wallet_address": {
            "type": "string",
            "maxLength": 128,
            "description": "Standardmäßig die wallet_address der Sitzung. Muss mit der Wallet des Transfers übereinstimmen, wenn die Sitzung mit einem Transfer verknüpft ist."
          },
          "chain": {
            "type": "string",
            "maxLength": 32,
            "description": "Standardmäßig die Blockchain der Sitzung."
          }
        }
      },
      "TravelRuleWidgetProofVerifyResult": {
        "type": "object",
        "properties": {
          "proof_id": {
            "type": "string",
            "format": "uuid"
          },
          "method": {
            "type": "string",
            "enum": [
              "MESSAGE_SIGNING",
              "SATOSHI_TEST",
              "SCREENSHOT",
              "SELF_DECLARATION"
            ]
          },
          "status": {
            "type": "string",
            "enum": [
              "PENDING",
              "VERIFIED",
              "REJECTED",
              "EXPIRED"
            ]
          },
          "is_ownership_verified": {
            "type": "boolean",
            "description": "Vorhanden, wenn der Nachweis VERIFIED ist: Die Eigentümerschaft des Adressbucheintrags ist nun verifiziert."
          },
          "transfer_status": {
            "type": "string",
            "nullable": true,
            "description": "Vorhanden, wenn der Nachweis VERIFIED ist: Status des verknüpften Transfers, null ohne Verknüpfung."
          },
          "detail": {
            "type": "string",
            "description": "Vorhanden, solange der Nachweis PENDING bleibt: ein übermittelter Screenshot, der auf Prüfung wartet, oder eine Testeinzahlung, die noch nicht bestätigt ist."
          },
          "code": {
            "allOf": [
              {
                "$ref": "#/components/schemas/TravelRuleWalletProofFailureReason"
              }
            ],
            "description": "Vorhanden bei einer ausstehenden Testeinzahlung: Grund, warum sie noch nicht bestätigt ist."
          }
        }
      },
      "TravelRuleWalletProofReview": {
        "type": "object",
        "properties": {
          "proof_id": {
            "type": "string",
            "format": "uuid"
          },
          "method": {
            "type": "string",
            "enum": [
              "SCREENSHOT"
            ]
          },
          "status": {
            "type": "string",
            "enum": [
              "PENDING",
              "VERIFIED",
              "REJECTED",
              "EXPIRED"
            ]
          },
          "wallet_address": {
            "type": "string"
          },
          "chain": {
            "type": "string",
            "description": "Kanonischer Chain-Identifikator, z. B. ETH, BTC, SOL, TRX."
          },
          "holder_name": {
            "type": "string"
          },
          "is_ownership_verified": {
            "type": "boolean",
            "description": "Gibt an, ob die Inhaberschaft des Adressbucheintrags verifiziert ist, durch diesen oder einen anderen Nachweis."
          },
          "transaction_id": {
            "type": "string",
            "format": "uuid",
            "nullable": true,
            "description": "Die Transaktion, für deren Travel-Rule-Transfer die Widget-Sitzung erstellt wurde. Null für eine Sitzung, die ohne transaction_id erstellt wurde."
          },
          "file_name": {
            "type": "string",
            "nullable": true
          },
          "content_type": {
            "type": "string",
            "nullable": true
          },
          "screenshot_url": {
            "type": "string",
            "nullable": true,
            "description": "Zeitlich begrenzter Link zum hochgeladenen Screenshot. Rufen Sie die Warteschlange erneut ab, um einen neuen Link zu erhalten."
          },
          "attempts": {
            "type": "integer",
            "description": "Wie viele Dateien der Endbenutzer für diesen Nachweis hochgeladen hat."
          },
          "failure_reason": {
            "allOf": [
              {
                "$ref": "#/components/schemas/TravelRuleWalletProofFailureReason"
              }
            ],
            "description": "REVIEW_REJECTED nach einer Ablehnung, OWNERSHIP_CHANGED, wenn die Wallet vor einer Entscheidung den Inhaber gewechselt hat oder gelöscht wurde. Andernfalls leer."
          },
          "method_chosen_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "description": "Wann der Endbenutzer die Screenshot-Methode ausgewählt hat."
          },
          "decided_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "decided_by": {
            "type": "string",
            "description": "Wer den Nachweis geschlossen hat: review:<user identifier> für einen Prüfer in der Konsole, review für eine Entscheidung per API-Schlüssel, widget oder sweeper, wenn Didit ihn automatisch geschlossen hat. Leer, solange PENDING."
          },
          "review_note": {
            "type": "string",
            "description": "Die mit der Entscheidung gesendete Notiz. Leer, wenn keine vorhanden ist."
          },
          "created_at": {
            "type": "string",
            "format": "date-time"
          }
        }
      },
      "TravelRuleWalletProofDecision": {
        "type": "object",
        "required": [
          "decision"
        ],
        "properties": {
          "decision": {
            "type": "string",
            "enum": [
              "approve",
              "reject"
            ]
          },
          "note": {
            "type": "string",
            "maxLength": 512,
            "description": "Optional. Wird zusammen mit dem Nachweis gespeichert und als review_note zurückgegeben."
          }
        }
      },
      "DigitalIdWalletApiWalletDigitalCredentialsRequest": {
        "type": "object",
        "properties": {
          "protocol": {
            "type": "string",
            "description": "openid4vp-v1-signed."
          },
          "request": {
            "type": "object",
            "additionalProperties": {},
            "description": "Unverändert übergeben: navigator.credentials.get({digital: request}) im Browser oder JSON.stringify(request) als requestJson von GetDigitalCredentialOption auf Android. Von Didit für Ihre Anwendung signiert."
          }
        },
        "required": [
          "protocol",
          "request"
        ]
      },
      "DigitalIdWalletApiGoogleWalletWalletVerificationStartRequest": {
        "type": "object",
        "description": "Starten Sie eine Google-Wallet-Verifizierung (USA, GBR, BRA, SGP, TWN).",
        "properties": {
          "vendor_data": {
            "type": "string",
            "nullable": true,
            "description": "Ihre eigene Referenz für diese Verifizierung (z. B. Ihre Benutzer-ID). Wird in Ergebnissen und Webhooks zurückgegeben."
          },
          "metadata": {
            "type": "object",
            "additionalProperties": {},
            "nullable": true,
            "description": "Optionales JSON-Objekt, das mit der Verifizierung gespeichert und in Ergebnissen sowie Webhooks zurückgegeben wird."
          },
          "sandbox_scenario": {
            "type": "string",
            "minLength": 1,
            "description": "Nur für Sandbox-Anwendungen: Das simulierte Ergebnis – 'wallet_cancelled', 'wallet_timeout' oder 'wallet_provider_error'; jedes andere Szenario (oder keines) verifiziert erfolgreich. Bei Live-Anwendungen abgelehnt. Der vollständige Katalog ist unter GET /v1/sandbox/scenarios/ verfügbar."
          },
          "country": {
            "allOf": [
              {
                "$ref": "#/components/schemas/DigitalIdWalletApiGoogleWalletWalletVerificationStartCountryEnum"
              }
            ],
            "description": "ISO 3166-1-Alpha-3-Land der Google Wallet-Identität.\n\n* `USA` - USA\n* `GBR` - GBR\n* `BRA` - BRA\n* `SGP` - SGP\n* `TWN` - TWN"
          },
          "origin": {
            "type": "string",
            "minLength": 1,
            "description": "Wo Ihre Seite oder App die Wallet anfragt: der https-Origin Ihrer Seite (sein Host muss in den allowed_return_hosts der Anwendung enthalten sein oder deren White-Label-Domain sein), z. B. https://app.example.com, oder android:apk-key-hash:<base64 SHA-256 des Signaturzertifikats Ihrer App, ohne Padding>. Die Wallet lehnt die Anfrage überall sonst ab.",
            "maxLength": 256
          }
        },
        "required": [
          "country",
          "origin"
        ]
      },
      "DigitalIdWalletApiGoogleWalletWalletVerificationStartCountryEnum": {
        "enum": [
          "USA",
          "GBR",
          "BRA",
          "SGP",
          "TWN"
        ],
        "type": "string",
        "description": "* `USA` - USA\n* `GBR` - GBR\n* `BRA` - BRA\n* `SGP` - SGP\n* `TWN` - TWN"
      },
      "DigitalIdWalletApiWalletDigitalCredentialResponseRequest": {
        "type": "object",
        "description": "Was die Wallet Ihrer Seite oder App für eine ``request_digital_credential``-Verifizierung geantwortet hat.",
        "properties": {
          "response": {
            "type": "object",
            "additionalProperties": {},
            "description": "Genau das, was die Wallet zurückgegeben hat: {protocol, data} des DigitalCredential aus navigator.credentials.get oder das geparste credentialJson des DigitalCredential von Android. Für Didit verschlüsselt; verändern Sie es nicht."
          }
        },
        "required": [
          "response"
        ]
      },
      "SessionFilesExport": {
        "type": "object",
        "description": "Eine ZIP-Datei mit allen Dateien einer Sitzung in Originalqualität.",
        "required": [
          "export_id",
          "session_id",
          "status",
          "file_count",
          "size_bytes",
          "download_url",
          "expires_at",
          "error",
          "created_at",
          "completed_at"
        ],
        "properties": {
          "export_id": {
            "type": "string",
            "format": "uuid",
            "description": "ID des Exports. Übergeben Sie sie an `GET /v3/session/{sessionId}/files-export/{exportId}/`."
          },
          "session_id": {
            "type": "string",
            "format": "uuid",
            "description": "Die Sitzung, aus der die Dateien stammen."
          },
          "status": {
            "type": "string",
            "enum": [
              "PENDING",
              "PROCESSING",
              "READY",
              "FAILED",
              "EXPIRED"
            ],
            "description": "`PENDING` und `PROCESSING`, während die ZIP-Datei vorbereitet wird, `READY`, sobald sie heruntergeladen werden kann, `FAILED`, wenn sie nicht vorbereitet werden konnte (fordern Sie einen neuen Export an), `EXPIRED`, sobald die ZIP-Datei gelöscht wurde."
          },
          "file_count": {
            "type": "integer",
            "nullable": true,
            "description": "Dateien in der ZIP-Datei. Nur festgelegt, solange `status` auf `READY` steht."
          },
          "size_bytes": {
            "type": "integer",
            "format": "int64",
            "nullable": true,
            "description": "Größe der ZIP-Datei in Bytes. Nur gesetzt, während `status` auf `READY` steht."
          },
          "download_url": {
            "type": "string",
            "format": "uri",
            "nullable": true,
            "description": "Signierte URL der ZIP-Datei, gültig für kurze Zeit. Nur gesetzt, während `status` auf `READY` steht; rufen Sie den Export erneut ab, um eine neue zu erhalten."
          },
          "expires_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "description": "Wann die ZIP-Datei gelöscht wird, 24 Stunden nachdem sie bereit war. Wird nur gesetzt, solange `status` den Wert `READY` hat."
          },
          "error": {
            "type": "string",
            "nullable": true,
            "description": "Warum der Export fehlgeschlagen ist, wenn `status` den Wert `FAILED` hat."
          },
          "created_at": {
            "type": "string",
            "format": "date-time",
            "description": "Wann der Export angefordert wurde."
          },
          "completed_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "description": "Wann die ZIP-Datei bereit war oder der Export fehlgeschlagen ist."
          }
        }
      },
      "TransactionRuleSuggestionsCreatedEvent": {
        "description": "Ein Durchlauf für Transaktionsregelvorschläge hat neue Regeländerungen für Ihre Anwendung vorgeschlagen. Wird gesendet, wenn in den Einstellungen für Regelvorschläge Webhook-Benachrichtigungen aktiviert sind. Es gibt keinen übergeordneten `status`.",
        "allOf": [
          {
            "$ref": "#/components/schemas/WebhookEventEnvelope"
          },
          {
            "type": "object",
            "properties": {
              "webhook_type": {
                "type": "string",
                "enum": [
                  "transaction_rule_suggestions.created"
                ],
                "description": "Immer `transaction_rule_suggestions.created`."
              },
              "run_id": {
                "type": "string",
                "format": "uuid",
                "description": "Der Vorschlagslauf, der die neuen Vorschläge generiert hat."
              },
              "open_count": {
                "type": "integer",
                "description": "Anzahl der nach diesem Durchlauf noch offenen Vorschläge, einschließlich neuer."
              },
              "suggestions": {
                "type": "array",
                "description": "Die Vorschläge, die dieser Lauf erstellt hat.",
                "items": {
                  "type": "object",
                  "required": [
                    "suggestion_id",
                    "kind",
                    "title",
                    "rule_id",
                    "expected_impact"
                  ],
                  "properties": {
                    "suggestion_id": {
                      "type": "string",
                      "format": "uuid"
                    },
                    "kind": {
                      "type": "string",
                      "enum": [
                        "ADD",
                        "TWEAK",
                        "DISABLE"
                      ],
                      "description": "`ADD` schlägt eine neue Regel vor, `TWEAK` ändert eine bestehende, `DISABLE` deaktiviert eine Regel."
                    },
                    "title": {
                      "type": "string"
                    },
                    "rule_id": {
                      "type": "string",
                      "format": "uuid",
                      "nullable": true,
                      "description": "Die Regel, für die ein `TWEAK`- oder `DISABLE`-Vorschlag gilt; `null` für `ADD`."
                    },
                    "expected_impact": {
                      "type": "object",
                      "additionalProperties": true,
                      "description": "Was die Änderung bewirken würde, wie der Vorschlag sie in der Console anzeigt."
                    }
                  }
                }
              }
            },
            "required": [
              "webhook_type",
              "run_id",
              "open_count",
              "suggestions"
            ]
          }
        ]
      },
      "GeolocationCheck": {
        "type": "object",
        "description": "Ein Standortverifizierungsergebnis, der akzeptierte Versuch eines Workflow-Knotens. Messung, Unsicherheit und Authentizität sind separate Schlüssel, sodass sich eine präzise nicht attestierte Positionsbestimmung von einer unpräzisen attestierten unterscheidet.",
        "properties": {
          "node_id": {
            "type": "string",
            "nullable": true,
            "description": "Workflow-Knoten, der dieses Ergebnis erzeugt hat, damit ein Workflow mit zwei Standortverifizierungs-Schritten nachvollziehbar bleibt."
          },
          "status": {
            "type": "string",
            "enum": [
              "Not Finished",
              "Approved",
              "Declined",
              "In Review",
              "Resub Requested"
            ],
            "description": "Status auf Funktionsebene dieses Schritts der Standortverifizierung, ermittelt anhand seiner Warnungen. Unabhängig vom `status` der Sitzung."
          },
          "outcome": {
            "type": "string",
            "nullable": true,
            "description": "Was bei diesem Versuch passiert ist.",
            "enum": [
              "verified",
              "low_accuracy",
              "accuracy_undetermined",
              "stale",
              "approximate",
              "denied",
              "restricted",
              "unavailable",
              "timeout",
              "mock_detected",
              "outside_geofence",
              "in_blocked_area",
              "anonymizer_detected",
              "skipped",
              "replay_rejected",
              "unsupported_client",
              null
            ]
          },
          "permission": {
            "type": "string",
            "nullable": true,
            "description": "Was das Betriebssystem oder der Browser erteilt hat. `not_requested` bedeutet, dass der Schritt ausschließlich den IP-Standort der Verbindung verwendet, sodass die Person niemals nach einer Berechtigung gefragt wird.",
            "enum": [
              "granted_precise",
              "granted_approximate",
              "denied",
              "restricted",
              "unavailable",
              "timeout",
              "dismissed",
              "not_requested",
              null
            ]
          },
          "latitude": {
            "type": "number",
            "nullable": true,
            "description": "WGS84-Breitengrad der Positionsbestimmung. `null`, wenn keine Positionsbestimmung vorliegt.",
            "format": "double"
          },
          "longitude": {
            "type": "number",
            "nullable": true,
            "description": "WGS84-Längengrad der Positionsbestimmung. `null`, wenn keine Positionsbestimmung vorliegt.",
            "format": "double"
          },
          "accuracy_m": {
            "type": "number",
            "nullable": true,
            "description": "Unsicherheitsradius in Metern auf dem in `accuracy_confidence` angegebenen Konfidenzniveau.",
            "format": "double"
          },
          "accuracy_confidence": {
            "type": "string",
            "nullable": true,
            "description": "Konfidenzniveau, das die Plattform `accuracy_m` zuordnet: `p95` (Browser), `p68` (Android) oder `unspecified` (iOS).",
            "enum": [
              "p95",
              "p68",
              "unspecified",
              null
            ]
          },
          "measured_at": {
            "type": "string",
            "nullable": true,
            "description": "Wann das Gerät die Positionsbestimmung vorgenommen hat, nach seiner eigenen Uhr.",
            "format": "date-time"
          },
          "age_seconds": {
            "type": "integer",
            "nullable": true,
            "description": "Sekunden zwischen der Erfassung der Position durch das Gerät und dem Empfang bei Didit."
          },
          "source": {
            "type": "string",
            "nullable": true,
            "description": "Woher die Positionsbestimmung stammt, sofern die Plattform dies angibt. `ip` bedeutet, dass die Position der IP-Standort der Verbindung ist.",
            "enum": [
              "gps",
              "fused",
              "network",
              "wifi",
              "cell",
              "browser",
              "unknown",
              "ip",
              null
            ]
          },
          "platform": {
            "type": "string",
            "nullable": true,
            "description": "Der Client, der den Fix erstellt hat.",
            "enum": [
              "web",
              "ios",
              "android",
              "react_native",
              "flutter",
              null
            ]
          },
          "sdk_version": {
            "type": "string",
            "nullable": true,
            "description": "Version des SDKs, das den Fix erstellt hat."
          },
          "is_mock": {
            "type": "boolean",
            "nullable": true,
            "description": "`true`, wenn das Gerät meldet, dass die Standortbestimmung von einem Mock-Location-Anbieter oder einer Simulationssoftware stammt. `null`, wenn die Plattform dies nicht meldet (Browser können dies nicht feststellen); `null` ist nicht `false`."
          },
          "produced_by_accessory": {
            "type": "boolean",
            "nullable": true,
            "description": "Nur iOS: `true`, wenn die Positionsbestimmung von einem externen Zubehör stammt. Andernfalls `null`."
          },
          "integrity": {
            "type": "string",
            "enum": [
              "attested",
              "not_attested",
              "failed",
              "unsupported",
              "not_determined"
            ],
            "description": "Gibt an, ob die Fehlerbehebung durch eine Geräte-Attestierung gestützt wird. `unsupported` ist das, was Browser melden, da das Web über keinen Attestierungsmechanismus verfügt; es stellt keinen Fehler dar."
          },
          "country_code": {
            "type": "string",
            "nullable": true,
            "description": "ISO 3166-1-Alpha-2-Land, in dem sich der Standort befindet."
          },
          "region_code": {
            "type": "string",
            "nullable": true,
            "description": "ISO 3166-2-Unterteilung, in der sich die Standortbestimmung befindet."
          },
          "city": {
            "type": "string",
            "nullable": true,
            "description": "Nächstgelegener bewohnter Ort, ein Label für Prüfer."
          },
          "geofence": {
            "type": "object",
            "description": "Ergebnis der Länder- und Gebietsregeln des Schritts.",
            "properties": {
              "enabled": {
                "type": "boolean",
                "description": "Gibt an, ob der Schritt eine Länder- oder Regionsregel anwendet."
              },
              "result": {
                "type": "string",
                "nullable": true,
                "description": "Wo sich die Position relativ zu den Regeln befindet. `undetermined` bedeutet, dass der Genauigkeitskreis die Grenze überschneidet oder die Position keinem Land zugeordnet werden konnte; dies ist kein Nachweis dafür, außerhalb zu sein.",
                "enum": [
                  "inside",
                  "outside",
                  "undetermined",
                  null
                ]
              }
            }
          },
          "inside_geofence": {
            "type": "boolean",
            "nullable": true,
            "description": "`true`, wenn `geofence.result` gleich `inside` ist, `false` bei `outside`, andernfalls `null`."
          },
          "geofence_basis": {
            "type": "string",
            "nullable": true,
            "description": "Anhand welcher Position das Bereichsergebnis ermittelt wurde: der `device`-Standort oder der `ip`-Standort der Verbindung.",
            "enum": [
              "device",
              "ip",
              null
            ]
          },
          "inside_areas": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "IDs der konfigurierten zulässigen Bereiche, in denen sich die Position befindet."
          },
          "blocked_areas": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "IDs der konfigurierten gesperrten Bereiche, in denen sich die Position befindet."
          },
          "position_source": {
            "type": "string",
            "nullable": true,
            "description": "Woher der Schritt die Position bezieht, wie konfiguriert: das mit dem IP-Standort abgeglichene Gerät, nur das Gerät oder nur der IP-Standort.",
            "enum": [
              "device_and_ip",
              "device_only",
              "ip_only",
              null
            ]
          },
          "anonymizers": {
            "type": "object",
            "nullable": true,
            "description": "Wie die Verbindung und das Gerät beschaffen sind, jeweils `true`, `false` oder `null`, wenn die Quelle dies nicht ermitteln kann.",
            "properties": {
              "vpn": {
                "type": "boolean",
                "nullable": true
              },
              "proxy": {
                "type": "boolean",
                "nullable": true
              },
              "tor": {
                "type": "boolean",
                "nullable": true
              },
              "spoofing": {
                "type": "boolean",
                "nullable": true
              },
              "emulator": {
                "type": "boolean",
                "nullable": true
              }
            }
          },
          "ip_distance_km": {
            "type": "number",
            "nullable": true,
            "description": "Entfernung zum IP-Standort der Sitzung nach Abzug beider Unschärferadien; `0`, wenn sie sich überschneiden.",
            "format": "double"
          },
          "ip_distance_uncertainty_km": {
            "type": "number",
            "nullable": true,
            "description": "Kombinierter Radius, der subtrahiert wurde: der Radius des IP-Standorts plus die Genauigkeit dieser Positionsbestimmung.",
            "format": "double"
          },
          "ip_consistent": {
            "type": "boolean",
            "nullable": true,
            "description": "Gibt an, ob `ip_distance_km` innerhalb der für den Schritt konfigurierten Entfernung liegt. `null`, wenn eine der beiden Seiten unbekannt ist."
          },
          "document_distance_km": {
            "type": "number",
            "nullable": true,
            "description": "Entfernung zur geokodierten Adresse auf dem Ausweisdokument oder Adressnachweis. `null`, wenn keine Adresse vorliegt.",
            "format": "double"
          },
          "travel_excused": {
            "type": "boolean",
            "nullable": true,
            "description": "Gibt an, ob die Reisetoleranz des Schritts die Entfernung von der Adresse entschuldigt hat. `null`, wenn die Toleranz deaktiviert ist."
          },
          "consecutive_mismatches": {
            "type": "integer",
            "nullable": true,
            "description": "Beim letzten Versuch: diese Prüfung zuzüglich der vorherigen aufeinanderfolgenden Nichtübereinstimmungen derselben Person."
          },
          "attempts": {
            "type": "integer",
            "description": "Nummer dieses Versuchs innerhalb des Knotens, beginnend bei 1."
          },
          "consent": {
            "type": "object",
            "nullable": true,
            "description": "Die Einwilligung, die die Person vor dem System-Prompt erteilt hat, erfasst mit der Version des Wortlauts und der Sprache, die ihr angezeigt wurde.",
            "properties": {
              "accepted_at": {
                "type": "string",
                "format": "date-time"
              },
              "version": {
                "type": "string",
                "nullable": true
              },
              "locale": {
                "type": "string",
                "nullable": true
              }
            }
          },
          "warnings": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "feature": {
                  "type": "string",
                  "enum": [
                    "ID_VERIFICATION",
                    "NFC",
                    "LIVENESS",
                    "FACEMATCH",
                    "PROOF_OF_ADDRESS",
                    "PHONE",
                    "EMAIL",
                    "AML",
                    "LOCATION",
                    "DATABASE_VALIDATION",
                    "QUESTIONNAIRE",
                    "DOCUMENT_AI",
                    "KYB_REGISTRY",
                    "KYB_DOCUMENTS",
                    "KYB_KEY_PEOPLE",
                    "GEOLOCATION",
                    "SIGNATURE"
                  ],
                  "description": "Die Funktion, die diese Warnung generiert hat. Der Wert identifiziert den Funktionsblock, zu dem die Warnung gehört. Das Warnungs-Array jedes Moduls verwendet typischerweise den zu seinem Modul passenden Wert (z. B. `PHONE` innerhalb von `phone_verifications[].warnings`), aber das obige Enum ist für alle Funktionswarnungen in der Entscheidungs-Payload maßgeblich."
                },
                "risk": {
                  "type": "string"
                },
                "additional_data": {
                  "type": "object",
                  "nullable": true
                },
                "log_type": {
                  "type": "string"
                },
                "short_description": {
                  "type": "string"
                },
                "long_description": {
                  "type": "string"
                },
                "node_id": {
                  "type": "string",
                  "description": "Die ID des Workflow-Graph-Knotens, der diese Warnung erzeugt hat"
                }
              }
            },
            "description": "Warnungen, die dieser Standortverifizierungsschritt ausgelöst hat, wobei `feature` auf `GEOLOCATION` gesetzt ist. Warnungscodes beginnen mit `LOCATION_`."
          }
        }
      },
      "GeolocationAttempt": {
        "type": "object",
        "description": "Ein Versuch eines Standort-Verifizierungsschritts: dieselben Schlüssel wie `geolocation_checks[]` außer `warnings`, plus der Zeitpunkt, an dem Didit ihn empfangen hat.",
        "properties": {
          "node_id": {
            "type": "string",
            "nullable": true,
            "description": "Workflow-Knoten, der dieses Ergebnis erzeugt hat, damit ein Workflow mit zwei Standortverifizierungs-Schritten nachvollziehbar bleibt."
          },
          "status": {
            "type": "string",
            "enum": [
              "Not Finished",
              "Approved",
              "Declined",
              "In Review",
              "Resub Requested"
            ],
            "description": "Status auf Funktionsebene dieses Schritts der Standortverifizierung, ermittelt anhand seiner Warnungen. Unabhängig vom `status` der Sitzung."
          },
          "outcome": {
            "type": "string",
            "nullable": true,
            "description": "Was bei diesem Versuch passiert ist.",
            "enum": [
              "verified",
              "low_accuracy",
              "accuracy_undetermined",
              "stale",
              "approximate",
              "denied",
              "restricted",
              "unavailable",
              "timeout",
              "mock_detected",
              "outside_geofence",
              "in_blocked_area",
              "anonymizer_detected",
              "skipped",
              "replay_rejected",
              "unsupported_client",
              null
            ]
          },
          "permission": {
            "type": "string",
            "nullable": true,
            "description": "Was das Betriebssystem oder der Browser erteilt hat. `not_requested` bedeutet, dass der Schritt ausschließlich den IP-Standort der Verbindung verwendet, sodass die Person niemals nach einer Berechtigung gefragt wird.",
            "enum": [
              "granted_precise",
              "granted_approximate",
              "denied",
              "restricted",
              "unavailable",
              "timeout",
              "dismissed",
              "not_requested",
              null
            ]
          },
          "latitude": {
            "type": "number",
            "nullable": true,
            "description": "WGS84-Breitengrad der Positionsbestimmung. `null`, wenn keine Positionsbestimmung vorliegt.",
            "format": "double"
          },
          "longitude": {
            "type": "number",
            "nullable": true,
            "description": "WGS84-Längengrad der Positionsbestimmung. `null`, wenn keine Positionsbestimmung vorliegt.",
            "format": "double"
          },
          "accuracy_m": {
            "type": "number",
            "nullable": true,
            "description": "Unsicherheitsradius in Metern auf dem in `accuracy_confidence` angegebenen Konfidenzniveau.",
            "format": "double"
          },
          "accuracy_confidence": {
            "type": "string",
            "nullable": true,
            "description": "Konfidenzniveau, das die Plattform `accuracy_m` zuordnet: `p95` (Browser), `p68` (Android) oder `unspecified` (iOS).",
            "enum": [
              "p95",
              "p68",
              "unspecified",
              null
            ]
          },
          "measured_at": {
            "type": "string",
            "nullable": true,
            "description": "Wann das Gerät die Positionsbestimmung vorgenommen hat, nach seiner eigenen Uhr.",
            "format": "date-time"
          },
          "age_seconds": {
            "type": "integer",
            "nullable": true,
            "description": "Sekunden zwischen der Erfassung der Position durch das Gerät und dem Empfang bei Didit."
          },
          "source": {
            "type": "string",
            "nullable": true,
            "description": "Woher die Positionsbestimmung stammt, sofern die Plattform dies angibt. `ip` bedeutet, dass die Position der IP-Standort der Verbindung ist.",
            "enum": [
              "gps",
              "fused",
              "network",
              "wifi",
              "cell",
              "browser",
              "unknown",
              "ip",
              null
            ]
          },
          "platform": {
            "type": "string",
            "nullable": true,
            "description": "Der Client, der den Fix erstellt hat.",
            "enum": [
              "web",
              "ios",
              "android",
              "react_native",
              "flutter",
              null
            ]
          },
          "sdk_version": {
            "type": "string",
            "nullable": true,
            "description": "Version des SDKs, das den Fix erstellt hat."
          },
          "is_mock": {
            "type": "boolean",
            "nullable": true,
            "description": "`true`, wenn das Gerät meldet, dass die Standortbestimmung von einem Mock-Location-Anbieter oder einer Simulationssoftware stammt. `null`, wenn die Plattform dies nicht meldet (Browser können dies nicht feststellen); `null` ist nicht `false`."
          },
          "produced_by_accessory": {
            "type": "boolean",
            "nullable": true,
            "description": "Nur iOS: `true`, wenn die Positionsbestimmung von einem externen Zubehör stammt. Andernfalls `null`."
          },
          "integrity": {
            "type": "string",
            "enum": [
              "attested",
              "not_attested",
              "failed",
              "unsupported",
              "not_determined"
            ],
            "description": "Gibt an, ob die Fehlerbehebung durch eine Geräte-Attestierung gestützt wird. `unsupported` ist das, was Browser melden, da das Web über keinen Attestierungsmechanismus verfügt; es stellt keinen Fehler dar."
          },
          "country_code": {
            "type": "string",
            "nullable": true,
            "description": "ISO 3166-1-Alpha-2-Land, in dem sich der Standort befindet."
          },
          "region_code": {
            "type": "string",
            "nullable": true,
            "description": "ISO 3166-2-Unterteilung, in der sich die Standortbestimmung befindet."
          },
          "city": {
            "type": "string",
            "nullable": true,
            "description": "Nächstgelegener bewohnter Ort, ein Label für Prüfer."
          },
          "geofence": {
            "type": "object",
            "description": "Ergebnis der Länder- und Gebietsregeln des Schritts.",
            "properties": {
              "enabled": {
                "type": "boolean",
                "description": "Gibt an, ob der Schritt eine Länder- oder Regionsregel anwendet."
              },
              "result": {
                "type": "string",
                "nullable": true,
                "description": "Wo sich die Position relativ zu den Regeln befindet. `undetermined` bedeutet, dass der Genauigkeitskreis die Grenze überschneidet oder die Position keinem Land zugeordnet werden konnte; dies ist kein Nachweis dafür, außerhalb zu sein.",
                "enum": [
                  "inside",
                  "outside",
                  "undetermined",
                  null
                ]
              }
            }
          },
          "inside_geofence": {
            "type": "boolean",
            "nullable": true,
            "description": "`true`, wenn `geofence.result` gleich `inside` ist, `false` bei `outside`, andernfalls `null`."
          },
          "geofence_basis": {
            "type": "string",
            "nullable": true,
            "description": "Anhand welcher Position das Bereichsergebnis ermittelt wurde: der `device`-Standort oder der `ip`-Standort der Verbindung.",
            "enum": [
              "device",
              "ip",
              null
            ]
          },
          "inside_areas": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "IDs der konfigurierten zulässigen Bereiche, in denen sich die Position befindet."
          },
          "blocked_areas": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "IDs der konfigurierten gesperrten Bereiche, in denen sich die Position befindet."
          },
          "position_source": {
            "type": "string",
            "nullable": true,
            "description": "Woher der Schritt die Position bezieht, wie konfiguriert: das mit dem IP-Standort abgeglichene Gerät, nur das Gerät oder nur der IP-Standort.",
            "enum": [
              "device_and_ip",
              "device_only",
              "ip_only",
              null
            ]
          },
          "anonymizers": {
            "type": "object",
            "nullable": true,
            "description": "Wie die Verbindung und das Gerät beschaffen sind, jeweils `true`, `false` oder `null`, wenn die Quelle dies nicht ermitteln kann.",
            "properties": {
              "vpn": {
                "type": "boolean",
                "nullable": true
              },
              "proxy": {
                "type": "boolean",
                "nullable": true
              },
              "tor": {
                "type": "boolean",
                "nullable": true
              },
              "spoofing": {
                "type": "boolean",
                "nullable": true
              },
              "emulator": {
                "type": "boolean",
                "nullable": true
              }
            }
          },
          "ip_distance_km": {
            "type": "number",
            "nullable": true,
            "description": "Entfernung zum IP-Standort der Sitzung nach Abzug beider Unschärferadien; `0`, wenn sie sich überschneiden.",
            "format": "double"
          },
          "ip_distance_uncertainty_km": {
            "type": "number",
            "nullable": true,
            "description": "Kombinierter Radius, der subtrahiert wurde: der Radius des IP-Standorts plus die Genauigkeit dieser Positionsbestimmung.",
            "format": "double"
          },
          "ip_consistent": {
            "type": "boolean",
            "nullable": true,
            "description": "Gibt an, ob `ip_distance_km` innerhalb der für den Schritt konfigurierten Entfernung liegt. `null`, wenn eine der beiden Seiten unbekannt ist."
          },
          "document_distance_km": {
            "type": "number",
            "nullable": true,
            "description": "Entfernung zur geokodierten Adresse auf dem Ausweisdokument oder Adressnachweis. `null`, wenn keine Adresse vorliegt.",
            "format": "double"
          },
          "travel_excused": {
            "type": "boolean",
            "nullable": true,
            "description": "Gibt an, ob die Reisetoleranz des Schritts die Entfernung von der Adresse entschuldigt hat. `null`, wenn die Toleranz deaktiviert ist."
          },
          "consecutive_mismatches": {
            "type": "integer",
            "nullable": true,
            "description": "Beim letzten Versuch: diese Prüfung zuzüglich der vorherigen aufeinanderfolgenden Nichtübereinstimmungen derselben Person."
          },
          "attempts": {
            "type": "integer",
            "description": "Nummer dieses Versuchs innerhalb des Knotens, beginnend bei 1."
          },
          "consent": {
            "type": "object",
            "nullable": true,
            "description": "Die Einwilligung, die die Person vor dem System-Prompt erteilt hat, erfasst mit der Version des Wortlauts und der Sprache, die ihr angezeigt wurde.",
            "properties": {
              "accepted_at": {
                "type": "string",
                "format": "date-time"
              },
              "version": {
                "type": "string",
                "nullable": true
              },
              "locale": {
                "type": "string",
                "nullable": true
              }
            }
          },
          "received_at": {
            "type": "string",
            "nullable": true,
            "description": "Wann Didit den Versuch empfangen hat.",
            "format": "date-time"
          },
          "created_at": {
            "type": "string",
            "format": "date-time"
          }
        }
      },
      "BiometricRetention": {
        "type": "object",
        "description": "Wann die Live-Biometriedaten dieser Sitzung gelöscht werden.",
        "required": [
          "jurisdictions",
          "deletes_at"
        ],
        "properties": {
          "jurisdictions": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Codes der US-Bundesstaaten, deren biometrische Regeln eine Löschfrist für diese Person festlegen (`US`, wenn der Bundesstaat unbekannt ist). Leer, wenn keine zutreffen."
          },
          "deletes_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "description": "Das Datum, an dem die Live-Biometriedaten (Gesichtsbilder und biometrische Templates) dieser Sitzung gelöscht werden, basierend auf der Aufbewahrungseinstellung Ihrer Anwendung und, sofern zutreffend, der gesetzlichen Frist der Gerichtsbarkeit der Person. `null`, wenn noch kein Datum gilt."
          }
        }
      },
      "TravelRuleManualMatchRequest": {
        "type": "object",
        "required": [
          "transaction_id"
        ],
        "properties": {
          "transaction_id": {
            "type": "string",
            "format": "uuid",
            "description": "Die `transaction_id` der empfangenen Travel-Rule-Nachricht (eine Zeile mit `kind: message`)."
          }
        }
      },
      "TravelRuleManualMatchResponse": {
        "type": "object",
        "required": [
          "deposit",
          "message"
        ],
        "properties": {
          "deposit": {
            "$ref": "#/components/schemas/TravelRuleTransferRow"
          },
          "message": {
            "$ref": "#/components/schemas/TravelRuleTransferRow"
          }
        }
      }
    },
    "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."
      },
      "TransactionTokenAuth": {
        "type": "apiKey",
        "in": "header",
        "name": "X-Transaction-Token",
        "description": "Kurzlebiger berechtigungseingeschränkter Token, der von Ihrem Backend über POST /v3/transactions/sdk-token/ generiert wird. Wird von den Didit-SDKs auf den geräteseitigen /v1/transactions/-Endpoints verwendet."
      },
      "SessionTokenAuth": {
        "type": "apiKey",
        "in": "header",
        "name": "Session-Token",
        "description": "Kurzlebiger Token, der im Feld `session_token` von POST /v3/session/ zurückgegeben wird. Wird vom gehosteten Verifizierungsablauf (und benutzerdefinierten Sandbox-UIs) verwendet, um sitzungsbezogene Endpoints im Namen des zu verifizierenden Benutzers ohne Ihren serverseitigen API-Schlüssel aufzurufen."
      },
      "BearerAuth": {
        "type": "http",
        "scheme": "bearer",
        "description": "Das Client-Credentials-Zugriffstoken der Anwendung."
      },
      "CaseRequestToken": {
        "type": "apiKey",
        "in": "header",
        "name": "X-Case-Request-Token",
        "description": "Anfragespezifischer Berechtigungsnachweis aus dem sicheren Link. Gewährt nur Zugriff auf diese Anfrage."
      }
    },
    "responses": {
      "Unauthorized": {
        "description": "Nicht autorisiert",
        "content": {
          "application/json": {
            "examples": {
              "Invalid API Key": {
                "summary": "Ungültiger API-Schlüssel",
                "value": {
                  "detail": "Invalid API Key."
                }
              }
            }
          }
        }
      },
      "Forbidden": {
        "description": "Verboten",
        "content": {
          "application/json": {
            "examples": {
              "No Permission": {
                "summary": "Keine Berechtigung",
                "value": {
                  "detail": "You do not have permission to perform this action."
                }
              },
              "Not Enough Credits": {
                "summary": "Nicht genügend Credit",
                "value": {
                  "error": "You don't have enough credits to perform this request. Please top up at https://business.didit.me"
                }
              }
            }
          }
        }
      },
      "NotFound": {
        "description": "Nicht gefunden",
        "content": {
          "application/json": {
            "examples": {
              "Not Found": {
                "summary": "Nicht gefunden",
                "value": {
                  "detail": "Resource not found."
                }
              }
            }
          }
        }
      },
      "PhoneRiskValidationError": {
        "description": "Validierung der Anfrage fehlgeschlagen.",
        "content": {
          "application/json": {
            "examples": {
              "Missing phone number": {
                "summary": "Fehlende Telefonnummer",
                "value": {
                  "phone_number": [
                    "This field is required."
                  ]
                }
              },
              "Invalid phone number": {
                "summary": "Ungültige Telefonnummer",
                "value": {
                  "phone_number": [
                    "Invalid phone number provided."
                  ]
                }
              },
              "Invalid signal IP": {
                "summary": "Ungültige Signal-IP",
                "value": {
                  "signals": {
                    "ip": [
                      "Enter a valid IPv4 or IPv6 address."
                    ]
                  }
                }
              }
            }
          }
        }
      },
      "EmailRiskValidationError": {
        "description": "Validierung der Anfrage fehlgeschlagen.",
        "content": {
          "application/json": {
            "examples": {
              "Missing email": {
                "summary": "Fehlende E-Mail-Adresse",
                "value": {
                  "email": [
                    "This field is required."
                  ]
                }
              },
              "Invalid email": {
                "summary": "Ungültige E-Mail",
                "value": {
                  "email": [
                    "Enter a valid email address."
                  ]
                }
              },
              "Invalid country hint": {
                "summary": "Ungültiger Länderhinweis",
                "value": {
                  "country_code": [
                    "Ensure this field has no more than 3 characters."
                  ]
                }
              }
            }
          }
        }
      },
      "IPRiskValidationError": {
        "description": "Validierung der Anfrage fehlgeschlagen.",
        "content": {
          "application/json": {
            "examples": {
              "Missing IP address": {
                "summary": "Fehlende IP-Adresse",
                "value": {
                  "ip_address": [
                    "This field is required."
                  ]
                }
              },
              "Invalid IP address": {
                "summary": "Ungültige IP-Adresse",
                "value": {
                  "ip_address": [
                    "Enter a valid IPv4 or IPv6 address."
                  ]
                }
              },
              "Country hint too long": {
                "summary": "Länderhinweis zu lang",
                "value": {
                  "claimed_country": [
                    "Ensure this field has no more than 3 characters."
                  ]
                }
              }
            }
          }
        }
      },
      "RiskPermissionDenied": {
        "description": "Der API-Schlüssel fehlt oder ist ungültig, oder die Organisation kann die Live-Abfrage nicht abdecken. Diese API gibt niemals `401` zurück.",
        "content": {
          "application/json": {
            "examples": {
              "Missing or invalid API key": {
                "summary": "Kein `x-api-key`-Header, oder der Schlüssel ist ungültig oder widerrufen",
                "value": {
                  "detail": "You do not have permission to perform this action."
                }
              },
              "Not enough credits": {
                "summary": "Das Guthaben der Organisation reicht für den Preis der Abfrage nicht aus",
                "value": {
                  "error": "You don't have enough credits to perform this request."
                }
              }
            }
          }
        }
      },
      "RateLimitedWrite": {
        "description": "Das geteilte Schreiblimit von 300 Anfragen pro Minute pro API-Schlüssel wurde überschritten. Beachten Sie `Retry-After`, bevor Sie es erneut versuchen.",
        "content": {
          "application/json": {
            "schema": {
              "type": "object",
              "required": [
                "detail"
              ],
              "properties": {
                "detail": {
                  "type": "string"
                }
              }
            },
            "example": {
              "detail": "Write request rate limit exceeded. You can make up to 300 requests per minute."
            }
          }
        }
      },
      "AddressValidationValidationError": {
        "description": "Der Anfrage-Body ist ungültig: ein fehlendes oder unbekanntes `country`, keine Adresse oder sowohl `address` als auch die strukturierten Felder angegeben.",
        "content": {
          "application/json": {
            "examples": {
              "Unknown country": {
                "value": {
                  "country": [
                    "Use an ISO 3166-1 alpha-2 or alpha-3 country code, e.g. 'US' or 'USA'."
                  ]
                }
              },
              "No address": {
                "value": {
                  "address": [
                    "Send the address: 'address' on one line, or the structured fields with 'address_line_1'."
                  ]
                }
              },
              "Both shapes": {
                "value": {
                  "address": [
                    "Send either 'address' or the structured fields (address_line_1, ...), not both."
                  ]
                }
              }
            }
          }
        }
      },
      "AddressValidationPermissionDenied": {
        "description": "Der API-Schlüssel fehlt oder ist ungültig, ein berechtigungsbeschränkter Schlüssel verfügt nicht über Schreibzugriff auf `sessions` oder die Organisation kann die Validierung nicht abdecken. Diese API gibt niemals `401` zurück.",
        "content": {
          "application/json": {
            "examples": {
              "Missing or invalid API key": {
                "value": {
                  "detail": "You do not have permission to perform this action."
                }
              },
              "Not enough credits": {
                "value": {
                  "detail": "You don't have enough credits to perform this request. Please top up at https://business.didit.me",
                  "code": "insufficient_credits"
                }
              }
            }
          }
        }
      },
      "DocumentProcessingBusy": {
        "description": "Zurzeit werden zu viele Dokumente verarbeitet, daher wurde dieser Upload nicht verarbeitet: Es wurde nichts gespeichert und kein Versuch verbraucht. Senden Sie dieselbe Datei nach der in `Retry-After` angegebenen Anzahl an Sekunden erneut. Verzweigen Sie anhand von `code`, nicht anhand des Nachrichtentexts.",
        "headers": {
          "Retry-After": {
            "description": "Sekunden, die gewartet werden müssen, bevor dieselbe Anfrage erneut gesendet wird.",
            "schema": {
              "type": "integer",
              "example": 10
            }
          }
        },
        "content": {
          "application/json": {
            "schema": {
              "type": "object",
              "required": [
                "detail",
                "code"
              ],
              "properties": {
                "detail": {
                  "type": "string"
                },
                "code": {
                  "type": "string",
                  "enum": [
                    "document_processing_busy"
                  ]
                }
              }
            },
            "example": {
              "detail": "We are busy processing documents. Please try again in a moment.",
              "code": "document_processing_busy"
            }
          }
        }
      }
    },
    "parameters": {
      "WebhookSignature": {
        "name": "X-Signature",
        "in": "header",
        "required": true,
        "schema": {
          "type": "string"
        },
        "description": "Hexadezimaler HMAC-SHA256 in Kleinbuchstaben, unter Verwendung des Secrets des Ziels als Schlüssel aus dem exakten rohen Anfrage-Body berechnet."
      },
      "WebhookSignatureV2": {
        "name": "X-Signature-V2",
        "in": "header",
        "required": true,
        "schema": {
          "type": "string"
        },
        "description": "Hexadezimaler HMAC-SHA256 in Kleinbuchstaben, unter Verwendung des Secrets des Ziels als Schlüssel aus dem kanonischen JSON des Bodys berechnet (Schlüssel sortiert, keine Leerzeichen, Nicht-ASCII-Zeichen nicht mit Escape-Sequenzen versehen). Empfohlen, da dies Middleware übersteht, die den Body neu kodiert."
      },
      "WebhookSignatureSimple": {
        "name": "X-Signature-Simple",
        "in": "header",
        "required": true,
        "deprecated": true,
        "schema": {
          "type": "string"
        },
        "description": "Hexadezimaler HMAC-SHA256 in Kleinbuchstaben, unter Verwendung des Secrets des Ziels als Schlüssel aus `{timestamp}:{session_id}:{status}:{webhook_type}` berechnet (fehlende Felder als leere Zeichenketten). Deckt nur den Umschlag ab, niemals die Payload."
      },
      "WebhookTimestamp": {
        "name": "X-Timestamp",
        "in": "header",
        "required": true,
        "schema": {
          "type": "string"
        },
        "description": "Unix-Zeit in Sekunden, entspricht dem `timestamp` des Bodys. Lehnen Sie Zustellungen ab, die älter als ein paar Minuten sind."
      }
    }
  },
  "x-webhooks": {
    "status.updated": {
      "post": {
        "summary": "Sitzungsstatus geändert",
        "description": "Eine Verifizierungssitzung hat ihren Status geändert. `decision` wird nur für `Approved`, `Declined`, `In Review` und `Abandoned` gesendet; es entspricht dem Format von `GET /v3/session/{sessionId}/decision/` für Ziele mit Webhook-Version 3 (Standard) und dem älteren reduzierten Format für Ziele der Version 1 oder 2. Unternehmenssitzungen erhalten immer die Unternehmensentscheidung der Version 3.",
        "tags": [
          "Webhook"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/WebhookSignature"
          },
          {
            "$ref": "#/components/parameters/WebhookSignatureV2"
          },
          {
            "$ref": "#/components/parameters/WebhookSignatureSimple"
          },
          {
            "$ref": "#/components/parameters/WebhookTimestamp"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SessionStatusUpdatedEvent"
              }
            }
          }
        },
        "responses": {
          "2XX": {
            "description": "Jede 2xx-Antwort bestätigt die Zustellung. Bei anderen Antworten und Timeouts erfolgen Wiederholungsversuche; siehe https://docs.didit.me/integration/webhooks."
          }
        }
      }
    },
    "data.updated": {
      "post": {
        "summary": "Sitzungsdaten geändert",
        "description": "Daten einer Verifizierungssitzung wurden ohne Statusänderung geändert, beispielsweise nach einer Bearbeitung bei der manuellen Prüfung, dem Überschreiben eines Schritts oder einem erneuten Screening im Rahmen der laufenden Überwachung. `decision` wird nur für `Approved`, `Declined`, `In Review` und `Abandoned` gesendet; es hat die Struktur von `GET /v3/session/{sessionId}/decision/` für Ziele mit Webhook-Version 3 (Standard) und die ältere reduzierte Struktur für Ziele mit Version 1 oder 2. Unternehmenssitzungen erhalten immer die Unternehmensentscheidung der Version 3.",
        "tags": [
          "Webhook"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/WebhookSignature"
          },
          {
            "$ref": "#/components/parameters/WebhookSignatureV2"
          },
          {
            "$ref": "#/components/parameters/WebhookSignatureSimple"
          },
          {
            "$ref": "#/components/parameters/WebhookTimestamp"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SessionDataUpdatedEvent"
              }
            }
          }
        },
        "responses": {
          "2XX": {
            "description": "Jede 2xx-Antwort bestätigt die Zustellung. Bei anderen Antworten und Timeouts erfolgen Wiederholungsversuche; siehe https://docs.didit.me/integration/webhooks."
          }
        }
      }
    },
    "user.status.updated": {
      "post": {
        "summary": "Benutzerstatus geändert",
        "description": "Ein Benutzer hat seinen Status geändert. Wird nicht gesendet, wenn der Benutzer erstellt wird.",
        "tags": [
          "Webhook"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/WebhookSignature"
          },
          {
            "$ref": "#/components/parameters/WebhookSignatureV2"
          },
          {
            "$ref": "#/components/parameters/WebhookSignatureSimple"
          },
          {
            "$ref": "#/components/parameters/WebhookTimestamp"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UserStatusUpdatedEvent"
              }
            }
          }
        },
        "responses": {
          "2XX": {
            "description": "Jede 2xx-Antwort bestätigt die Zustellung. Bei anderen Antworten und Timeouts erfolgen Wiederholungsversuche; siehe https://docs.didit.me/integration/webhooks."
          }
        }
      }
    },
    "user.data.updated": {
      "post": {
        "summary": "Benutzerdaten geändert",
        "description": "Felder eines Benutzers wurden geändert. Wird bei der Erstellung des Benutzers nicht gesendet. Ein einziger Speichervorgang kann sowohl ein Status- als auch ein Datenereignis erzeugen.",
        "tags": [
          "Webhook"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/WebhookSignature"
          },
          {
            "$ref": "#/components/parameters/WebhookSignatureV2"
          },
          {
            "$ref": "#/components/parameters/WebhookSignatureSimple"
          },
          {
            "$ref": "#/components/parameters/WebhookTimestamp"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UserDataUpdatedEvent"
              }
            }
          }
        },
        "responses": {
          "2XX": {
            "description": "Jede 2xx-Antwort bestätigt die Zustellung. Bei anderen Antworten und Timeouts erfolgen Wiederholungsversuche; siehe https://docs.didit.me/integration/webhooks."
          }
        }
      }
    },
    "business.status.updated": {
      "post": {
        "summary": "Unternehmensstatus geändert",
        "description": "Ein Unternehmen hat den Status geändert. Wird nicht gesendet, wenn das Unternehmen erstellt wird.",
        "tags": [
          "Webhook"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/WebhookSignature"
          },
          {
            "$ref": "#/components/parameters/WebhookSignatureV2"
          },
          {
            "$ref": "#/components/parameters/WebhookSignatureSimple"
          },
          {
            "$ref": "#/components/parameters/WebhookTimestamp"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/BusinessStatusUpdatedEvent"
              }
            }
          }
        },
        "responses": {
          "2XX": {
            "description": "Jede 2xx-Antwort bestätigt die Zustellung. Bei anderen Antworten und Timeouts erfolgen Wiederholungsversuche; siehe https://docs.didit.me/integration/webhooks."
          }
        }
      }
    },
    "business.data.updated": {
      "post": {
        "summary": "Unternehmensdaten geändert",
        "description": "Felder eines Unternehmens wurden geändert. Wird bei der Erstellung des Unternehmens nicht gesendet. Ein einziger Speichervorgang kann sowohl ein Status- als auch ein Datenereignis erzeugen.",
        "tags": [
          "Webhook"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/WebhookSignature"
          },
          {
            "$ref": "#/components/parameters/WebhookSignatureV2"
          },
          {
            "$ref": "#/components/parameters/WebhookSignatureSimple"
          },
          {
            "$ref": "#/components/parameters/WebhookTimestamp"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/BusinessDataUpdatedEvent"
              }
            }
          }
        },
        "responses": {
          "2XX": {
            "description": "Jede 2xx-Antwort bestätigt die Zustellung. Bei anderen Antworten und Timeouts erfolgen Wiederholungsversuche; siehe https://docs.didit.me/integration/webhooks."
          }
        }
      }
    },
    "transaction.created": {
      "post": {
        "summary": "Transaktion erstellt",
        "description": "Eine Transaktion wurde erstellt und gescreent. Wird nur für Live-Anwendungen gesendet.",
        "tags": [
          "Webhook"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/WebhookSignature"
          },
          {
            "$ref": "#/components/parameters/WebhookSignatureV2"
          },
          {
            "$ref": "#/components/parameters/WebhookSignatureSimple"
          },
          {
            "$ref": "#/components/parameters/WebhookTimestamp"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TransactionCreatedEvent"
              }
            }
          }
        },
        "responses": {
          "2XX": {
            "description": "Jede 2xx-Antwort bestätigt die Zustellung. Bei anderen Antworten und Timeouts erfolgen Wiederholungsversuche; siehe https://docs.didit.me/integration/webhooks."
          }
        }
      }
    },
    "transaction.status.updated": {
      "post": {
        "summary": "Transaktionsstatus geändert",
        "description": "Eine Transaktion hat ihren Status geändert, durch eine Regel, eine Prüfung oder eine Aktion des Endbenutzers. Wird nur für Live-Anwendungen gesendet.",
        "tags": [
          "Webhook"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/WebhookSignature"
          },
          {
            "$ref": "#/components/parameters/WebhookSignatureV2"
          },
          {
            "$ref": "#/components/parameters/WebhookSignatureSimple"
          },
          {
            "$ref": "#/components/parameters/WebhookTimestamp"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TransactionStatusUpdatedEvent"
              }
            }
          }
        },
        "responses": {
          "2XX": {
            "description": "Jede 2xx-Antwort bestätigt die Zustellung. Bei anderen Antworten und Timeouts erfolgen Wiederholungsversuche; siehe https://docs.didit.me/integration/webhooks."
          }
        }
      }
    },
    "travel_rule.status.updated": {
      "post": {
        "summary": "Travel Rule-Status geändert",
        "description": "Ein Travel-Rule-Austausch hat den Status geändert. Wird bei jedem Übergang bis einschließlich `FINISHED`, `CANCELLED` oder `EXPIRED` gesendet, danach nie wieder. Wird für Live-Anwendungen gesendet und bei Travel-Rule-Austauschen auch für Sandbox-Anwendungen (`environment: sandbox`). Es gibt keinen übergeordneten `status`.",
        "tags": [
          "Webhook"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/WebhookSignature"
          },
          {
            "$ref": "#/components/parameters/WebhookSignatureV2"
          },
          {
            "$ref": "#/components/parameters/WebhookSignatureSimple"
          },
          {
            "$ref": "#/components/parameters/WebhookTimestamp"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TravelRuleStatusUpdatedEvent"
              }
            }
          }
        },
        "responses": {
          "2XX": {
            "description": "Jede 2xx-Antwort bestätigt die Zustellung. Bei anderen Antworten und Timeouts erfolgen Wiederholungsversuche; siehe https://docs.didit.me/integration/webhooks."
          }
        }
      }
    },
    "workflow.compliance_changed": {
      "post": {
        "summary": "Workflow-Compliance geändert",
        "description": "Der Compliance-Status eines veröffentlichten Workflows hat sich nach einer Neubewertung geändert. Ein Ereignis pro Workflow. Es gibt keinen übergeordneten `status`.",
        "tags": [
          "Webhook"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/WebhookSignature"
          },
          {
            "$ref": "#/components/parameters/WebhookSignatureV2"
          },
          {
            "$ref": "#/components/parameters/WebhookSignatureSimple"
          },
          {
            "$ref": "#/components/parameters/WebhookTimestamp"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/WorkflowComplianceChangedEvent"
              }
            }
          }
        },
        "responses": {
          "2XX": {
            "description": "Jede 2xx-Antwort bestätigt die Zustellung. Bei anderen Antworten und Timeouts erfolgen Wiederholungsversuche; siehe https://docs.didit.me/integration/webhooks."
          }
        }
      }
    },
    "kyb.registry_search.resolved": {
      "post": {
        "summary": "Unternehmenssuche erfolgreich abgeschlossen (unsignierter Callback)",
        "description": "Body des Callbacks, der an die `webhook_url` von `POST /v3/kyb/search/` gesendet wird, sobald die Registersuche abgeschlossen ist. Er ist nicht signiert: Die Anfrage enthält `X-Didit-Unsigned-Callback: true` und keine der Signatur-Header. Bestätigen Sie ihn daher, indem Sie `request_id` mit einer von Ihnen gestarteten Suche abgleichen. Verwendet `event_type`, nicht `webhook_type`.",
        "tags": [
          "Webhook"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/KYBRegistrySearchResolvedCallback"
              }
            }
          }
        },
        "responses": {
          "2XX": {
            "description": "Jede 2xx-Antwort bestätigt die Zustellung. Bei anderen Antworten und Timeouts erfolgen Wiederholungsversuche; siehe https://docs.didit.me/integration/webhooks."
          }
        }
      }
    },
    "transaction_rule_suggestions.created": {
      "post": {
        "summary": "Vorschläge für Transaktionsregeln erstellt",
        "description": "Ein Durchlauf für Transaktionsregelvorschläge hat neue Regeländerungen für Ihre Anwendung vorgeschlagen. Wird gesendet, wenn in den Einstellungen für Regelvorschläge Webhook-Benachrichtigungen aktiviert sind. Es gibt keinen übergeordneten `status`.",
        "tags": [
          "Webhook"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/WebhookSignature"
          },
          {
            "$ref": "#/components/parameters/WebhookSignatureV2"
          },
          {
            "$ref": "#/components/parameters/WebhookSignatureSimple"
          },
          {
            "$ref": "#/components/parameters/WebhookTimestamp"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TransactionRuleSuggestionsCreatedEvent"
              }
            }
          }
        },
        "responses": {
          "2XX": {
            "description": "Jede 2xx-Antwort bestätigt die Zustellung. Bei anderen Antworten und Timeouts erfolgen Wiederholungsversuche; siehe https://docs.didit.me/integration/webhooks."
          }
        }
      }
    }
  }
}
