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

# Sitzungsstatus aktualisieren: Genehmigen & Ablehnen

> Didit: Session per PATCH /v3/session/{id}/update-status/ genehmigen, ablehnen oder in Prüfung setzen. KYC und KYB. Keine monatlichen Mindestbeträge.



Prompt zum Aktualisieren des Sitzungsstatus
        Prompt in die Zwischenablage kopieren



      
      

\<pre>

\`Manually approve, decline, or re-open a Didit verification session.

Endpoint:
PATCH https://verification.didit.me/v3/session/{session_id}/update-status/

Authentication:
Use the x-api-key header with your Didit API key (or a user-auth token). Privilege: write:sessions.

Path parameter:
\- session_id (UUID) — KYC or KYB; Didit resolves it against both session types.

Request body:
\- new_status (string, required) — One of "Approved", "Declined", "Resubmitted". Any other value is rejected.
\- comment (string, optional) — Free-text note saved on the audit trail (visible in the Console review log).
\- nodes_to_resubmit (array, required when new_status="Resubmitted") — Which feature steps the user must redo. Each entry: { "node_id": "feature_poa_1", "feature": "POA" }. KYB-only nodes "KYB_REGISTRY" and "KYB_KEY_PEOPLE" cannot be resubmitted directly (the parent recomputes from child KYCs).
\- send_email (boolean, optional, default false): if true, email the person. "Approved" and "Declined" send their decision email; "Resubmitted" sends a fresh hosted link with the reasons.
\- email_address (string, required when send_email=true).
\- email_language (string, optional, default "en") — ISO 639-1.
\- email_preview_token (string, optional): the preview_token from Preview Decision Email ("Approved", "Declined") or Preview Resubmission Email ("Resubmitted"). Only valid with send_email=true; without it the request returns 400 { "email_preview_token": ["A preview receipt is only valid when the email is sent."] }. The update then sends exactly the previewed email, or returns 409 before changing anything if the email or the session changed since the preview.

Optional preview step (all three statuses):
1\. Preview the email. Neither call changes the session or sends anything.
\- Approved or Declined: POST https://verification.didit.me/v3/session/{session_id}/decision-email-preview/ with { "new_status": "Approved", "email_language": "en" } (see /sessions-api/preview-decision-email).
\- Resubmitted: POST https://verification.didit.me/v3/session/{session_id}/resubmission-preview/ with { "nodes_to_resubmit": [...], "email_language": "en" } (see /sessions-api/preview-resubmission). email_address is optional there; without it the email goes to the person's own address.
2\. Check subject, html, recipient, will_be_sent and not_sent_reason in the response.
3\. Confirm here with the same new_status (and the same nodes_to_resubmit for Resubmitted), send_email=true, email_address=<recipient>, email_language=<the language you previewed>, email_preview_token=<preview_token>.
The receipt expires after 15 minutes.

Allowed transitions:
Current status must be one of: Approved, Declined, In Review, Kyc Expired, Abandoned, Resubmitted. Otherwise the API returns 400 { "detail": "Only sessions with status Approved, Declined, In Review, Kyc Expired, Abandoned, Resubmitted can be updated. Current status: ..." }.
Setting "Approved" or "Declined" on a session that already has that status is a no-op: 200, nothing changes, and no webhook or email goes out. Setting "Resubmitted" on a session that is already Resubmitted returns 400 ["The new status is the same as the current status."].

curl example — approve after manual review:
curl -X PATCH https://verification.didit.me/v3/session/<SESSION_ID>/update-status/ \
-H "x-api-key: <API_KEY>" \
-H "Content-Type: application/json" \
-d '{
"new_status": "Approved",
"comment": "Cleared after compliance review."
}'

curl example: approve and send the email you previewed:
curl -X PATCH https://verification.didit.me/v3/session/<SESSION_ID>/update-status/ \
-H "x-api-key: <API_KEY>" \
-H "Content-Type: application/json" \
-d '{
"new_status": "Approved",
"send_email": true,
"email_address": "<recipient from the preview>",
"email_language": "en",
"email_preview_token": "<preview_token from the preview>"
}'

curl example — request resubmission of the proof-of-address step:
curl -X PATCH https://verification.didit.me/v3/session/<SESSION_ID>/update-status/ \
-H "x-api-key: <API_KEY>" \
-H "Content-Type: application/json" \
-d '{
"new_status": "Resubmitted",
"nodes_to_resubmit": [{ "node_id": "feature_poa_1", "feature": "POA" }],
"comment": "Please upload a clearer proof of address",
"send_email": true,
"email_address": "user@example.com"
}'

Response: { "session_id": "<uuid>" } only. Fetch the refreshed session with GET /v3/session/{session_id}/decision/.

Side effects:
\- Fires a status.updated webhook (plus user.status.updated or business.status.updated alias).
\- Writes an entry to the Console review trail with the actor and your comment.
\- "Approved" or "Declined" with send_email=true emails the decision to email_address. Preview Decision Email tells you beforehand whether it will be sent (for example, not to the contact_details address of a session created without contact_details.send_notification_emails=true).
\- "Resubmitted" sends the user back to the steps in nodes_to_resubmit, resets the session expiration window, and (if send_email=true) emails the user a fresh link. What those steps returned before stays readable: the decision endpoint returns it with include=resubmissions (see Retrieve Session).

Failure modes:
\- 400: invalid new_status (only "Approved", "Declined" and "Resubmitted" are accepted), current status not allowed, nothing to resubmit, send_email=true without email_address, or email_preview_token without send_email=true. Field errors look like { "<field>": ["..."] }.
\- 401: the scoped API key has expired.
\- 403: { "detail": "..." } when credentials are missing or invalid, the caller lacks write:sessions (a scoped API key needs decisions write), or the session belongs to another application.
\- 404: { "detail": "Not found." } when no session with this session_id exists.
\- 409: { "detail": "This email preview changed or expired. Preview the message again before confirming." } when email_preview_token no longer matches the email or the session, or is older than 15 minutes. Nothing changed and no email was sent: preview again.
\- 429 - { "detail": "..." } when a resubmit that only targets backend-only features (AML, DATABASE_VALIDATION, IP_ANALYSIS) repeats within 30 seconds of the previous resubmit. Those features re-run automatically with no user interaction, so an immediate repeat cannot change the outcome; honor the Retry-After header instead of retrying in a loop (e.g. from a webhook handler).

Idempotency:
Repeating "Approved" or "Declined" returns 200 and changes nothing. Repeating "Resubmitted" returns 400.

Next step:
After updating, call GET /v3/session/{session_id}/decision/ to fetch the refreshed payload — see /sessions-api/retrieve-session.

For end-to-end Didit integration, paste in the full prompt at /integration/integration-prompt.`

\</pre>



      
      

Einfügen in

## KYC- und KYB-UnterstützungDieser Endpoint funktioniert für Sitzungen der **Benutzerverifizierung (KYC)** und der **Unternehmensverifizierung (KYB)** identisch. Didit gleicht die `session_id` mit beiden Sitzungsarten ab. Die Validierung der Statusübergänge ist für beide gleich, da dieselbe Statusaufzählung für beide gilt.Die Antwort enthält nur die `session_id`.
Lesen Sie `session_kind` aus [Session abrufen](https://docs.didit.me/de/sessions-api/retrieve-session.md) aus, wenn Ihre nachgelagerte Logik je nach Art der Sitzung unterscheiden muss.## Erlaubte ÜbergängeSie können eine Sitzung auf `Approved`, `Declined` oder `Resubmitted` setzen.
Jeder andere `new_status`, einschließlich `In Review`, gibt `400` zurück.
Der aktuelle Status der Sitzung muss einer der folgenden sein: `Approved`, `Declined`, `In Review`, `Kyc Expired`, `Abandoned` oder `Resubmitted`. Andernfalls gibt die API `400` zurück.Das Setzen von `Approved` oder `Declined` auf eine Sitzung, die bereits diesen Status hat, bleibt ohne Wirkung: Die API gibt `200` zurück, ändert nichts, löst keinen Webhook aus und sendet keine E-Mail.
Das Setzen von `Resubmitted` auf eine Sitzung, die bereits `Resubmitted` ist, gibt `400` zurück (`The new status is the same as the current status.`).Eine erneute Einreichung, deren `nodes_to_resubmit` nur reine Backend-Features enthalten (`AML`, `DATABASE_VALIDATION`, `IP_ANALYSIS`), wird automatisch ausgeführt und setzt die Sitzung ohne Benutzerinteraktion in einen entschiedenen Status zurück.
Wiederholen Sie eine solche erneute Einreichung innerhalb von 30 Sekunden, gibt sie `429 Too Many Requests` mit einem `Retry-After`-Header zurück, da eine sofortige Wiederholung kein anderes Ergebnis liefern kann.
Lösen Sie keine automatische erneute Einreichung aus einem Webhook-Handler aus, wenn Sie einen `In Review`-Status erhalten. Prüfen Sie zuerst den Befund oder ändern Sie die zugrunde liegenden Daten.## Die E-Mail vorab prüfenMit `send_email: true` senden `Approved` und `Declined` der Person ihre Entscheidungs-E-Mail, und `Resubmitted` schickt ihr einen neuen Link mit den Gründen.
Sie können diese E-Mail sehen, bevor Sie etwas ändern:1) Rufen Sie [Entscheidungs-E-Mail-Vorschau](https://docs.didit.me/de/sessions-api/preview-decision-email.md) für `Approved` oder `Declined` auf oder [Vorschau der E-Mail zur erneuten Einreichung](https://docs.didit.me/de/sessions-api/preview-resubmission.md) für `Resubmitted`.
2) Prüfen Sie den gerenderten `subject` und `html`, den `recipient` sowie `will_be_sent` / `not_sent_reason`.
3) Rufen Sie diesen Endpoint mit demselben `new_status` auf (und bei einer erneuten Einreichung mit denselben `nodes_to_resubmit`), mit `send_email: true`, `email_address` auf den Wert von `recipient` gesetzt, der in der Vorschau verwendeten `email_language` und `email_preview_token` auf den Wert von `preview_token` gesetzt.Keine der beiden Vorschauen verändert die Sitzung oder versendet etwas.
Das Update sendet danach genau die E-Mail, die Sie vorab gesehen haben.
Der Beleg läuft nach 15 Minuten ab.
Haben sich Empfänger, Sprache, Sitzungsstatus, Absender oder E-Mail seit der Vorschau geändert, gibt das Update `409` zurück, bevor etwas verändert wird. Erstellen Sie dann die Vorschau erneut und bestätigen Sie mit dem neuen Beleg.
Das Senden von `email_preview_token` ohne `send_email: true` gibt `400` zurück.
Der Vorschau-Schritt ist optional: Bestehende Integrationen können diesen Endpoint weiterhin ohne ihn aufrufen.## Beispiele> [tab] Sitzung für Benutzerverifizierung (KYC) genehmigen
>
> ```bash theme={null}
> curl -X PATCH https://verification.didit.me/v3/session/4c5c7f3a-.../update-status/ \
>   -H "x-api-key: YOUR_API_KEY" \
>   -H "Content-Type: application/json" \
>   -d '{
>     "new_status": "Approved",
>     "comment": "Cleared after manual review by compliance team"
>   }'
> ```> [tab] Sitzung für Unternehmensverifizierung (KYB) ablehnen
>
> ```bash theme={null}
> curl -X PATCH https://verification.didit.me/v3/session/bs-01HJX1.../update-status/ \
>   -H "x-api-key: YOUR_API_KEY" \
>   -H "Content-Type: application/json" \
>   -d '{
>     "new_status": "Declined",
>     "comment": "Sanctioned subsidiary detected in ownership chain"
>   }'
> ```> [tab] Erneute Einreichung anfordern
>
> ```bash theme={null}
> curl -X PATCH https://verification.didit.me/v3/session/.../update-status/ \
>   -H "x-api-key: YOUR_API_KEY" \
>   -H "Content-Type: application/json" \
>   -d '{
>     "new_status": "Resubmitted",
>     "nodes_to_resubmit": [
>       { "node_id": "feature_poa_1", "feature": "POA" }
>     ],
>     "comment": "Please upload a clearer proof of address",
>     "send_email": true,
>     "email_address": "user@example.com"
>   }'
> ```> [tab] Genehmigen und die Vorschau-E-Mail senden
>
> ```bash theme={null}
> curl -X PATCH https://verification.didit.me/v3/session/.../update-status/ \
>   -H "x-api-key: YOUR_API_KEY" \
>   -H "Content-Type: application/json" \
>   -d '{
>     "new_status": "Approved",
>     "send_email": true,
>     "email_address": "user@example.com",
>     "email_language": "en",
>     "email_preview_token": "PREVIEW_TOKEN_FROM_THE_PREVIEW"
>   }'
> ```## BerechtigungErfordert die Berechtigung `write:sessions`. Dieselbe Berechtigung gilt für beide Arten.## Verwandte Themen- [Verifizierungsstatus](https://docs.didit.me/de/integration/verification-statuses.md): Referenz des Statusmodells.
- [Session abrufen](https://docs.didit.me/de/sessions-api/retrieve-session.md): die Entscheidung nach dem Update abrufen.
- [Sitzungsübersicht](https://docs.didit.me/de/sessions-api/overview.md): Unterscheidung nach Art.
- [Entscheidungs-E-Mail-Vorschau](https://docs.didit.me/de/sessions-api/preview-decision-email.md): die Genehmigungs- oder Ablehnungs-E-Mail ansehen, bevor Sie sie senden.
- [Vorschau der E-Mail zur erneuten Einreichung](https://docs.didit.me/de/sessions-api/preview-resubmission.md): die E-Mail zur erneuten Einreichung ansehen, bevor Sie sie senden.


## OpenAPI

````yaml de/openapi-25.json PATCH /v3/session/{sessionId}/update-status/
openapi: 3.0.0
info:
  version: 3.0.0
  title: Didit Verification API
  description: API für Ausweisverifizierung. Authentifizierung über den x-api-key-Header.
servers:
  - url: https://verification.didit.me
security: []
tags: []
paths:
  /v3/session/{sessionId}/update-status/:
    patch:
      tags:
        - Sessions
      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).


        Rufen 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.


        Ü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.


        Jeder 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.


        Das 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
      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.
        '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.
        '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.
      security:
        - ApiKeyAuth: []
      x-codeSamples:
        - lang: curl
          label: curl
          source: |-
            curl -X PATCH \
              https://verification.didit.me/v3/session/11111111-2222-3333-4444-555555555555/update-status/ \
              -H 'x-api-key: YOUR_API_KEY' \
              -H 'Content-Type: application/json' \
              -d '{
                "new_status": "Approved",
                "comment": "All checks passed manual review"
              }'
        - lang: python
          label: Python
          source: |-
            from didit import Didit

            # Reads DIDIT_API_KEY.
            client = Didit()

            result = client.sessions.update_status(
                "11111111-2222-3333-4444-555555555555",
                new_status="Approved",
                comment="All checks passed manual review",
            )
            print(result)
        - lang: javascript
          label: Node.js
          source: >-
            import Didit from "@didit-protocol/sdk-node";


            // Reads DIDIT_API_KEY.

            const didit = new Didit();


            const result = await
            didit.sessions.updateStatus("11111111-2222-3333-4444-555555555555",
            {
              new_status: "Approved",
              comment: "All checks passed manual review",
            });

            console.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;

            import me.didit.types.SessionsUpdateStatusParams;


            // Reads DIDIT_API_KEY.

            Didit client = new Didit();


            var result =
            client.sessions().updateStatus("11111111-2222-3333-4444-555555555555",
            SessionsUpdateStatusParams.builder()
                    .newStatus(SessionsUpdateStatusParams.NewStatus.of("Approved"))
                    .comment("All checks passed manual review")
                    .build());
            System.out.println(result);
        - lang: php
          label: PHP
          source: >-
            <?php


            require 'vendor/autoload.php';


            use Didit\DiditClient;


            // Reads DIDIT_API_KEY.

            $didit = new DiditClient();


            $result =
            $didit->sessions->updateStatus('11111111-2222-3333-4444-555555555555',
            [
                'new_status' => 'Approved',
                'comment' => 'All checks passed manual review',
            ]);

            print_r($result->toArray());
        - lang: ruby
          label: Ruby
          source: |-
            require "didit"

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

            result = didit.sessions.update_status(
              "11111111-2222-3333-4444-555555555555",
              new_status: "Approved",
              comment: "All checks passed manual review"
            )
            puts result.to_h
        - lang: csharp
          label: .NET
          source: >-
            using System;

            using System.Text.Json;

            using Didit;


            // Reads DIDIT_API_KEY.

            using var client = new DiditClient();


            var result = await
            client.Sessions.UpdateStatusAsync("11111111-2222-3333-4444-555555555555",
            new SessionsUpdateStatusParams

            {
                NewStatus = "Approved",
                Comment = "All checks passed manual review",
            });

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

````

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