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

# Sitzungsprüfung per API erstellen: Manuelle KYC-Prüfung

> Didit-Verifizierungssitzung per API manuell prüfen: Notiz oder Statusänderung senden. Compliance-Prüfung mit Audit-Trail, pay-per-call.



Prompt zur Überprüfung einer Sitzung erstellen
        Prompt in die Zwischenablage kopieren



      
      

\<pre>

\``Goal: Push a manual decision (Approve / Decline / mark In Review) onto a Didit verification session and write an immutable audit-trail row. Programmatic equivalent of the Console manual-review buttons.

Endpoint: POST https://verification.didit.me/v3/sessions/{session_id}/reviews/
Auth header: x-api-key: YOUR_API_KEY
Content-Type: application/json

Path param:
\- session_id (UUID, REQUIRED) — verification session UUID. Must belong to the same application as the API key (cross-application writes return 404).

Request body:
\- new_status (string, REQUIRED) — one of "Approved" | "Declined" | "In Review". Workflow-internal statuses ("In Progress", "Awaiting User", "Resubmitted", "Expired", "Kyc Expired", "Abandoned", "Not Started") are NOT accepted (400).
\- comment (string, optional, max 10,000 chars) — reviewer rationale. Supports @email mentions which trigger Console notifications.

curl:
curl -s -X POST 'https://verification.didit.me/v3/sessions/8c2f3a14-7e9b-4d23-9e83-3f7d5e8a1c6d/reviews/' \
-H "x-api-key: $DIDIT_API_KEY" \
-H "Content-Type: application/json" \
-d '{"new_status": "Approved", "comment": "POA cross-checked against utility bill; matches address on file."}'

Response 201 (compact ReviewSerializer shape — different from the GET response):
\{
"user": "API Client",                       // actor display label
"new_status": "Approved",
"comment": "POA cross-checked...",
"created_at": "2026-04-21T16:42:50.445Z"
}
To fetch the full activity row (uuid, activity_type, previous_status, ...) call GET /v3/sessions/{session_id}/reviews/ afterwards. See /reference/data-models for the full ReviewItem shape.

Side effects:
1\. Inserts a Review row with activity_type=STATUS_UPDATED, actor_type=API_KEY.
2\. Updates Session.status to new_status if it differs from the current status.
3\. Fires the status.updated webhook on configured destinations (see /integration/webhooks).
4\. Notifies previous reviewers and @email-mentioned Console users.
NOT idempotent — every call writes a new audit row. Re-posting the same new_status when it equals the current status is a no-op for Session.status but still writes an audit entry.

Failure modes (envelope {"detail": "..."} unless noted):
\- 400 — { "new_status": ["\\"Expired\\" is not a valid choice."] } (or missing new_status)
\- 401 — missing/invalid `x-api-key` header.
\- 403 — API key valid but wrong app or revoked.
\- 404 — session UUID not found / deleted / wrong app.
\- 429 — rate-limited.

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

\</pre>



      
      

Einfügen in



## OpenAPI

````yaml de/openapi-25.json POST /v3/sessions/{session_id}/reviews/
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/sessions/{session_id}/reviews/:
    post:
      tags:
        - Sessions
      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/`.


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


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

            curl -s -X POST
            https://verification.didit.me/v3/sessions/8c2f3a14-7e9b-4d23-9e83-3f7d5e8a1c6d/reviews/
            \
              -H 'x-api-key: YOUR_API_KEY' \
              -H 'Content-Type: application/json' \
              -d '{
                "new_status": "In Review",
                "comment": "Flagging for manual document re-check."
              }'
        - lang: python
          label: Python
          source: |-
            from didit import Didit

            # Reads DIDIT_API_KEY.
            client = Didit()

            result = client.sessions.reviews.create(
                "8c2f3a14-7e9b-4d23-9e83-3f7d5e8a1c6d",
                new_status="In Review",
                comment="Flagging for manual document re-check.",
            )
            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.reviews.create("8c2f3a14-7e9b-4d23-9e83-3f7d5e8a1c6d",
            {
              new_status: "In Review",
              comment: "Flagging for manual document re-check.",
            });

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

            import me.didit.types.SessionsReviewsCreateParams;


            // Reads DIDIT_API_KEY.

            Didit client = new Didit();


            var result =
            client.sessions().reviews().create("8c2f3a14-7e9b-4d23-9e83-3f7d5e8a1c6d",
            SessionsReviewsCreateParams.builder()
                    .newStatus(SessionsReviewsCreateParams.NewStatus.of("In Review"))
                    .comment("Flagging for manual document re-check.")
                    .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->reviews->create('8c2f3a14-7e9b-4d23-9e83-3f7d5e8a1c6d',
            [
                'new_status' => 'In Review',
                'comment' => 'Flagging for manual document re-check.',
            ]);

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

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

            result = didit.sessions.reviews.create(
              "8c2f3a14-7e9b-4d23-9e83-3f7d5e8a1c6d",
              new_status: "In Review",
              comment: "Flagging for manual document re-check."
            )
            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.Reviews.CreateAsync("8c2f3a14-7e9b-4d23-9e83-3f7d5e8a1c6d",
            new SessionsReviewsCreateParams

            {
                NewStatus = new SessionsReviewsCreateParamsNewStatus("In Review"),
                Comment = "Flagging for manual document re-check.",
            });

            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.