> ## 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 ko/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`는 항목의 레이블로만 저장되며 10개의
        세션 상태 값 중 어느 것이든 허용됩니다(대소문자 구분). `comment` 내부의 `@email` 멘션은 일반 텍스트로만
        저장되며, 이 endpoint에서 알림을 트리거하지 않고 항목의 `mentioned_emails`는 비어 있는 상태로 유지됩니다.


        귀속 관련 참고 사항: 여기서 생성된 항목에는 행위자 정보가 포함되지 않습니다. 피드에는 `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`으로 거부됨). 여기에 상태를 기록해도 세션의 실제 상태는
                    변경되지 **않습니다**. 실제 상태를 변경하려면 상태 업데이트 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` 값이 허용된 10개의 상태
            중 하나가 아닌 경우입니다(대소문자 구분).
          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-*` 응답 헤더를 확인하세요. [속도
            제한](/ko/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: >-
        Business Console의 Developers -> API keys에서 발급받은 귀하 애플리케이션의 API 키입니다. 기본
        키는 전체 접근 권한을 갖습니다. 이름이 지정된 키는 리소스별 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.