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

# मैन्युअल समीक्षा API: सत्र समीक्षा बनाएं (KYC)

> Didit सत्यापन सत्र में मैन्युअल समीक्षा नोट या स्थिति बदलाव भेजें। प्रोग्रामैटिक अनुपालन समीक्षा और ऑडिट ट्रेल, प्रति कॉल भुगतान।



सत्र समीक्षा प्रॉम्प्ट बनाएँ
        प्रॉम्प्ट को क्लिपबोर्ड पर कॉपी करें



      
      

\<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>



      
      

यहाँ पेस्ट करें



## OpenAPI

````yaml hi/openapi-25.json POST /v3/sessions/{session_id}/reviews/
openapi: 3.0.0
info:
  version: 3.0.0
  title: Didit Verification API
  description: पहचान सत्यापन API। x-api-key हेडर के साथ प्रमाणीकृत करें।
servers:
  - url: https://verification.didit.me
security: []
tags: []
paths:
  /v3/sessions/{session_id}/reviews/:
    post:
      tags:
        - Sessions
      summary: सत्र के ऑडिट ट्रेल में एक समीक्षा नोट जोड़ें
      description: >-
        उपयोगकर्ता सत्यापन (KYC) सत्र के समीक्षा / गतिविधि फ़ीड में एक नोट
        जोड़ें। **यह endpoint केवल एक प्रविष्टि रिकॉर्ड करता है — यह कभी भी सत्र
        को नहीं बदलता है।** सत्र का `status` अपरिवर्तित रहता है, कोई
        स्थिति-परिवर्तन सत्यापन नहीं चलता है, और कोई webhook ट्रिगर नहीं होता
        है। किसी सत्र को वास्तव में स्वीकृत, अस्वीकृत या पुनः खोलने के लिए (जो
        इस फ़ीड में पूर्ण-एट्रिब्यूशन वाली `STATUS_UPDATED` प्रविष्टि भी लिखता
        है), इसके बजाय `PATCH /v3/session/{session_id}/update-status/` का उपयोग
        करें।


        दोनों बॉडी फ़ील्ड वैकल्पिक हैं और एक खाली JSON ऑब्जेक्ट स्वीकार किया
        जाता है। `new_status` को प्रविष्टि पर केवल एक लेबल के रूप में संग्रहीत
        किया जाता है और यह सत्र की दस स्थिति मानों में से किसी को भी स्वीकार
        करता है (केस-संवेदनशील)। `comment` के अंदर `@email` मेंशन केवल सादे पाठ
        के रूप में संग्रहीत होते हैं — वे इस endpoint पर कोई सूचना ट्रिगर नहीं
        करते हैं, और प्रविष्टि का `mentioned_emails` खाली रहता है।


        एट्रिब्यूशन पर नोट: यहाँ बनाई गई प्रविष्टियों में कोई कर्ता (actor)
        जानकारी नहीं होती है। फ़ीड में वे `actor_display: "Unknown"`,
        `actor_type: "CONSOLE_USER"`, और `activity_type: "STATUS_UPDATED"`
        (स्टोरेज डिफ़ॉल्ट) दिखाते हैं, और `201` बॉडी का `user` फ़ील्ड
        `"Unknown"` होता है।
      operationId: create_session_review
      parameters:
        - name: Content-Type
          in: header
          required: false
          description: JSON बॉडी भेजते समय `application/json` पर सेट करें।
          schema:
            type: string
            example: application/json
        - name: session_id
          in: path
          required: true
          description: >-
            उपयोगकर्ता सत्यापन (KYC) सत्र का UUID। यह API कुंजी के समान
            एप्लिकेशन से संबंधित होना चाहिए — क्रॉस-एप्लिकेशन UUID, हटाए गए सत्र
            और व्यवसाय सत्यापन (KYB) सत्र ID सभी `404` लौटाते हैं।
          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: >-
                    प्रविष्टि पर रिकॉर्ड करने के लिए वैकल्पिक स्थिति लेबल। सत्र
                    स्थिति का कोई भी मान स्वीकार करता है, केस-संवेदी
                    (`"approved"` को `400` के साथ अस्वीकार कर दिया जाता है)।
                    यहाँ स्थिति रिकॉर्ड करने से सत्र की वास्तविक स्थिति **नहीं**
                    बदलती है — इसके लिए update-status endpoint का उपयोग करें।
                  example: In Review
                comment:
                  type: string
                  nullable: true
                  description: >-
                    वैकल्पिक फ़्री-टेक्स्ट नोट (कोई बाध्यकारी लंबाई सीमा नहीं)।
                    जैसा है वैसा ही संग्रहीत; इस endpoint पर `@email` मेंशन
                    संसाधित नहीं होते हैं।
                  example: Flagging for manual document re-check.
            examples:
              NoteWithStatusLabel:
                summary: स्थिति लेबल वाला नोट (सत्र स्थिति अपरिवर्तित)
                value:
                  new_status: In Review
                  comment: Flagging for manual document re-check.
              CommentOnly:
                summary: बिना स्थिति लेबल वाला सादा नोट
                value:
                  comment: Customer emailed an updated utility bill; awaiting upload.
      responses:
        '201':
          description: >-
            सत्र के ऑडिट लॉग पर दर्ज की गई प्रविष्टि। सत्र स्वयं अपरिवर्तित रहता
            है — इसकी `status` अपना पिछला मान बनाए रखती है और कोई webhook नहीं
            भेजा जाता है। नई प्रविष्टि `GET …/reviews/` के शीर्ष पर भी दिखाई
            देती है (`actor_display: "Unknown"` के साथ)।
          content:
            application/json:
              schema:
                type: object
                properties:
                  user:
                    type: string
                    description: >-
                      एंट्री के लेखक का डिस्प्ले नाम। इस endpoint के माध्यम से
                      बनाई गई प्रविष्टियों के लिए हमेशा `"Unknown"`, क्योंकि यह
                      कोई कर्ता एट्रिब्यूशन रिकॉर्ड नहीं करता है।
                    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: >-
                      प्रविष्टि पर दर्ज स्थिति लेबल, या कोई नहीं भेजे जाने पर
                      `null`। सत्र की वास्तविक स्थिति प्रभावित नहीं होती है।
                    example: In Review
                  comment:
                    type: string
                    nullable: true
                    description: >-
                      एंट्री पर रिकॉर्ड किया गया नोट, या यदि कोई नहीं भेजा गया
                      था तो `null`।
                    example: Flagging for manual document re-check.
                  created_at:
                    type: string
                    format: date-time
                    description: जब प्रविष्टि लिखी गई थी, ISO 8601 UTC।
                    example: '2026-06-12T00:18:44.466537Z'
              examples:
                NoteWithStatusLabel:
                  summary: स्थिति लेबल वाला नोट
                  value:
                    user: Unknown
                    new_status: In Review
                    comment: Flagging for manual document re-check.
                    created_at: '2026-06-12T00:18:44.466537Z'
                CommentOnly:
                  summary: सादा नोट
                  value:
                    user: Unknown
                    new_status: null
                    comment: Note without status.
                    created_at: '2026-06-12T00:18:44.504157Z'
        '400':
          description: >-
            सत्यापन त्रुटि, संदेशों के प्रति-फ़ील्ड मैप के रूप में लौटाई जाती
            है। सामान्य कारण एक `new_status` मान है जो दस अनुमत स्थितियों में से
            एक नहीं है — यह जांच केस-संवेदनशील (case-sensitive) है।
          content:
            application/json:
              schema:
                type: object
                properties:
                  new_status:
                    type: array
                    items:
                      type: string
                    example:
                      - '"approved" is not a valid choice.'
              examples:
                InvalidStatusChoice:
                  summary: लोअरकेस / अज्ञात स्थिति मान
                  value:
                    new_status:
                      - '"approved" is not a valid choice.'
        '403':
          description: >-
            `x-api-key` अनुपलब्ध, विकृत, समय-सीमा समाप्त या निरस्त है। सत्र
            लुकअप से पहले प्रमाणीकरण की जाँच की जाती है, इसलिए सत्र UUID मौजूद न
            होने पर भी अनुपलब्ध कुंजी `403` लौटाती है।
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
                    example: You do not have permission to perform this action.
              examples:
                InvalidKey:
                  summary: अनुपलब्ध या अमान्य x-api-key हेडर
                  value:
                    detail: You do not have permission to perform this action.
        '404':
          description: >-
            इस UUID वाला कोई उपयोगकर्ता सत्यापन (KYC) सत्र आपके एप्लिकेशन को
            दिखाई नहीं दे रहा है: UUID मौजूद नहीं है, सत्र हटा दिया गया था, या
            यह किसी भिन्न एप्लिकेशन से संबंधित है। व्यवसाय सत्यापन (KYB) सत्र ID
            भी यहाँ `404` लौटाती हैं — समीक्षा फ़ीड केवल KYC सत्रों के लिए ही
            पता योग्य है।
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
                    example: Session not found.
              examples:
                NotFound:
                  summary: अज्ञात, हटाया गया, या क्रॉस-एप्लिकेशन सत्र UUID
                  value:
                    detail: Session not found.
        '429':
          description: >-
            रेट लिमिट पार हो गई। `Retry-After` और `X-RateLimit-*` रिस्पॉन्स हेडर
            का निरीक्षण करें। [रेट लिमिटिंग](/hi/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: >-
        आपकी एप्लिकेशन की API कुंजी, Business Console में Developers -> API keys
        से। प्राथमिक कुंजी के पास पूर्ण एक्सेस होता है। एक नामित कुंजी को स्कोप
        किया जा सकता है: प्रति संसाधन none, read या write, कुछ वर्कफ़्लो या
        स्वीकृत सत्रों तक सीमित, IP पतों की सूची तक सीमित, और समाप्ति तिथि तक
        सीमित। 401 का अर्थ है कि कुंजी गलत है, निरस्त कर दी गई है या उसकी
        समय-सीमा समाप्त हो गई है; 403 का अर्थ है कि कोई कुंजी नहीं भेजी गई थी,
        कुंजी के पास इस संसाधन या कार्रवाई का एक्सेस नहीं है, या अनुरोध उसकी IP
        सूची से बाहर के पते से आया था; सत्र रूट पर 404 का अर्थ है कि सत्र कुंजी
        के वर्कफ़्लो या स्थितियों से बाहर है। मीडिया एक्सेस के बिना एक कुंजी को
        छवि, वीडियो और PDF URL null के रूप में प्राप्त होते हैं, और सत्र write
        के बिना एक कुंजी को सत्र लिंक और token null के रूप में प्राप्त होते हैं।
        देखें https://docs.didit.me/console/api-keys।

````

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