> ## 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: 단일 단계 승인/거부

> Didit API로 OCR, 라이브니스 감지, 얼굴 대조, AML, 주소 증명, 전화번호 인증 등 단일 인증 단계를 승인, 거부 또는 검토 중으로 변경하세요. 지금 바로 또는 사용자가 절차를 마친 후에 적용할 수 있습니다.



기능 상태 업데이트 프롬프트
        프롬프트를 클립보드에 복사



      
      

\<pre>

\`Approve, decline, or move a SINGLE verification step (feature) of a Didit session to review, now or once the person finishes the flow.

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

Authentication:
x-api-key (client API key) or a user-auth token. Privilege: write:sessions.

Path parameters:
\- session_id (UUID) — KYC or KYB; Didit resolves it against both session types.
\- node_id — the workflow graph node ID of the step (e.g. feature_ocr_1, feature_liveness_1, feature_aml_1). Use the literal "default" for non-graph (single-step) workflows where the step has no node ID.

Request body:
\- new_status (string, required): one of "Approved", "Declined", "In Review". Must differ from the step's current status.
\- comment (string, optional): your reason, saved in the session's activity and returned as the override's reason.
\- feature_type (string, optional): which kind of step to target, for example "LIVENESS", "AML", "FACE_MATCH", "ID_VERIFICATION". Needed when node_id is "default" (non-graph workflows, where steps have no node ID). An unknown value returns 400 { "feature_type": ["Unknown feature_type '...'."] }.
\- defer_until_flow_finishes (boolean, optional, default false): while the person is still in the flow, wait and apply the override when the flow finishes instead of at once.

When the override applies:
\- Omitted or false: it applies at once. If the person is still in the flow it is recorded as forced=true.
\- true while the person is still in the flow (session Not Started, In Progress or Resubmitted, and not finished): it is stored as "pending_until_flow_finishes" and applies when the flow finishes, after the flow reaches its own decision.
\- true after the flow ended: it applies at once.
\- A waiting override is cancelled instead when the person redoes the step before finishing, a newer override on the same step replaces it, the session leaves the flow unfinished (abandoned, expired, decided mid-flow), or you cancel it with POST /v3/session/{session_id}/features/overrides/{override_id}/cancel/.

Which steps this works on:
Every per-step feature record: OCR/ID, Liveness, Face Match, NFC, AML, Proof of Address (POA), Phone, Email, Database Validation, Questionnaire, and the KYB registry / documents / key-people checks.

Difference vs update-status:
\- update-status changes the OVERALL session decision (Approved/Declined/Resubmitted).
\- THIS endpoint changes ONE step's status. A session that already has a decision keeps it. If the session has no decision yet and its workflow is waiting on exactly this step, applying the override completes the step: the workflow moves on and a status node can set the session decision (and fire status.updated).

Not allowed:
\- Standalone API sessions (session_type = API) return 400.

curl example — approve the ID/OCR step:
curl -X PATCH https://verification.didit.me/v3/session/<SESSION_ID>/features/feature_ocr_1/update-status/ \
-H "x-api-key: <API_KEY>" \
-H "Content-Type: application/json" \
-d '{ "new_status": "Approved", "comment": "Document manually verified" }'

Response: { session_id, node_id, feature_type, new_status, override }.
\- node_id is the step's workflow node, or null for a step without a node ("default" in a non-graph workflow).
\- new_status is the step's stored status: the requested one once the override applied, the unchanged one while it waits.
\- override: { id, node_id, feature_type, feature_model, previous_status, new_status, state ("applied" | "pending_until_flow_finishes" | "cancelled"), forced, reason, requested_by { email, name, type }, requested_at, applied_at, cancelled_at, cancel_reason }.

Side effects:
\- Fires a data.updated webhook when the override applies (at once, or when the flow finishes). Nothing is sent while it waits or when it is cancelled.
\- Records the override in the session's activity as FEATURE_OVERRIDE_PENDING, FEATURE_OVERRIDE_APPLIED or FEATURE_OVERRIDE_CANCELLED, with who made it; the request's entry carries your comment. In the decision's reviews array these entries appear with new_status null, and the request's entry has your reason in comment.

Failure modes:
\- 400: new_status invalid or unchanged, unknown feature_type, or the session is a standalone API session.
\- 401: the scoped API key has expired.
\- 403: missing credentials (a wrong, revoked or expired key gets 401), or the caller lacks write:sessions (a scoped key needs decisions write).
\- 404: session not found, or no feature has the given node_id.

Related: list overrides with GET /v3/session/{session_id}/features/overrides/ (see /sessions-api/list-feature-overrides); cancel a waiting one with POST /v3/session/{session_id}/features/overrides/{override_id}/cancel/ (see /sessions-api/cancel-feature-override).

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

\</pre>



      
      

붙여넣을 곳

## 이 기능의 역할인증 세션은 신분증 인증/OCR, 라이브니스 감지, 얼굴 대조, AML, 주소 증명, 전화번호 인증 등 개별 **기능(단계)**으로 구성됩니다.
이 엔드포인트를 사용하면 그중 **하나의** 단계 상태를 `Approved`, `Declined` 또는 `In Review`로 설정할 수 있습니다.세션 전체를 승인, 거부 또는 다시 열어야 할 때는 [세션 상태 업데이트](https://docs.didit.me/ko/sessions-api/update-status.md)를 사용합니다.
단일 단계에 대한 결정만 기록하려는 경우에는 **이** 엔드포인트를 사용합니다. 예를 들어 자체 검토 워크플로에서 얼굴 대조 단계를 `Declined`로 표시하는 경우가 있습니다.이미 결정이 내려진 세션은 그 결정을 유지하며, 변경되는 것은 해당 단계뿐입니다.
세션에 아직 결정이 없고 워크플로가 바로 이 단계를 기다리고 있다면, 재정의를 적용하면 해당 단계를 정상적으로 완료했을 때와 같이 단계가 완료됩니다.
워크플로는 다음 단계로 넘어가고, 이후 단계가 실행되며, 상태 노드가 세션 결정을 설정하고 `status.updated` webhook을 발생시킬 수 있습니다.## `node_id`로 단계 지정하기그래프 기반 워크플로에서 각 단계에는 `node_id`가 있습니다(예: `feature_ocr_1`, `feature_liveness_1`, `feature_aml_1`). 이 값은 [세션 결정](https://docs.didit.me/ko/sessions-api/retrieve-session.md)에서 확인할 수 있으며, V3 결정의 각 기능에는 해당 기능의 `node_id`가 포함되어 있습니다.**그래프가 아닌(단일 단계) 워크플로**에서는 기반 기능에 노드 ID가 없습니다. 이 경우 `nodeId`에 리터럴 값 `default`를 전달하여 해당 기능을 지정합니다.
이러한 워크플로의 어떤 단계에도 노드 ID가 없으므로 `feature_type`(예: `LIVENESS`, `AML` 또는 `FACE_MATCH`)도 함께 전달하여 대상 단계를 지정해야 합니다.
알 수 없는 `feature_type`을 전달하면 `400`이 반환됩니다.## 사용자가 흐름을 마칠 때까지 기다리기기본적으로 재정의는 즉시 적용됩니다.
사용자가 아직 흐름을 진행 중이라면 실행 중인 흐름의 단계가 변경되며, 이 경우 재정의는 `forced: true`와 함께 기록됩니다.대신 기다리려면 `defer_until_flow_finishes: true`를 설정합니다.
세션이 `Not Started`, `In Progress` 또는 `Resubmitted` 상태이고 사용자가 흐름을 아직 마치지 않은 동안에는 재정의가 `pending_until_flow_finishes`로 저장됩니다.
재정의는 사용자가 흐름을 마칠 때, 즉 흐름이 자체 결정에 도달한 뒤에 적용됩니다.
이미 종료된 흐름의 세션에서는 어느 경우든 즉시 적용됩니다.대기 중인 재정의는 다음의 경우 적용되지 않고 취소됩니다.- 사용자가 흐름을 마치기 전에 단계를 다시 수행하는 경우(`check_changed`)
- 같은 단계에 대해 더 새로운 재정의가 이를 대체하는 경우(`replaced`)
- 세션이 흐름을 끝내지 못하고 중단됨, 만료됨 또는 흐름 도중 결정됨 상태로 종료되는 경우(`session_closed`)
- [기능 재정의 취소](https://docs.didit.me/ko/sessions-api/cancel-feature-override.md)로 직접 취소하는 경우(`cancelled_by_reviewer`)응답의 `override`에서 결과를 확인할 수 있습니다. `state`는 `applied` 또는 `pending_until_flow_finishes`이며, 재정의가 적용되면 `applied_at`이 설정됩니다.
최상위 `new_status`는 해당 단계에 저장된 상태이므로, 재정의가 대기하는 동안에도 변경되지 않습니다.
세션의 모든 재정의와 사용자가 아직 흐름 안에 있는지 여부를 보려면 [기능 재정의 목록](https://docs.didit.me/ko/sessions-api/list-feature-overrides.md)을 사용합니다.## KYC 및 KYB 지원**사용자 인증(KYC)** 및 **기업 확인(KYB)** 세션 모두에서 동일하게 작동하며, Didit은 두 유형 모두에서 `sessionId`를 조회합니다. 지원되는 단계 유형은 신분증 인증/OCR, 라이브니스 감지, 얼굴 대조, NFC, AML, 주소 증명, 전화번호 인증, 이메일 인증, 데이터베이스 검증, 설문지 및 KYB 법인 등기부, 문서, 주요 인물 확인입니다.> [!NOTE]
>
> 독립형 API 세션(독립형 인증 API로 생성된 세션, `session_type = API`)은 개별 기능 상태를 변경할 수 없으며, 이 경우 엔드포인트는 `400`을 반환합니다.## 예시> [tab] 단계 승인
>
> ```bash theme={null}
> curl -X PATCH https://verification.didit.me/v3/session/4c5c7f3a-.../features/feature_ocr_1/update-status/ \
>   -H "x-api-key: YOUR_API_KEY" \
>   -H "Content-Type: application/json" \
>   -d '{
>     "new_status": "Approved",
>     "comment": "Document manually verified by compliance"
>   }'
> ```> [tab] 얼굴 대조 단계 거부
>
> ```bash theme={null}
> curl -X PATCH https://verification.didit.me/v3/session/4c5c7f3a-.../features/feature_face_match/update-status/ \
>   -H "x-api-key: YOUR_API_KEY" \
>   -H "Content-Type: application/json" \
>   -d '{
>     "new_status": "Declined"
>   }'
> ```> [tab] 단일 단계 워크플로(기본 노드)
>
> ```bash theme={null}
> curl -X PATCH https://verification.didit.me/v3/session/4c5c7f3a-.../features/default/update-status/ \
>   -H "x-api-key: YOUR_API_KEY" \
>   -H "Content-Type: application/json" \
>   -d '{
>     "new_status": "In Review",
>     "feature_type": "LIVENESS"
>   }'
> ```> [tab] 사용자가 흐름을 마칠 때까지 대기
>
> ```bash theme={null}
> curl -X PATCH https://verification.didit.me/v3/session/4c5c7f3a-.../features/feature_liveness_1/update-status/ \
>   -H "x-api-key: YOUR_API_KEY" \
>   -H "Content-Type: application/json" \
>   -d '{
>     "new_status": "Approved",
>     "comment": "Liveness retried with a reviewer present",
>     "defer_until_flow_finishes": true
>   }'
> ```## 업데이트 후 일어나는 일- **Webhook**: 재정의가 즉시 적용되거나 흐름이 끝나 적용될 때 `data.updated` 이벤트가 발생합니다. 대기 중이거나 취소된 경우에는 아무것도 전송되지 않습니다.
- **활동**: 모든 재정의는 세션의 활동에 `FEATURE_OVERRIDE_PENDING`, `FEATURE_OVERRIDE_APPLIED` 또는 `FEATURE_OVERRIDE_CANCELLED`로 기록되며, 행위자(API 키, 사용자, 또는 대기 중인 재정의가 적용될 때는 시스템)가 함께 기록됩니다. 요청에 대한 항목에는 `comment`로 입력한 내용이 사유로 포함됩니다. [세션 결정](https://docs.didit.me/ko/sessions-api/retrieve-session.md)의 `reviews` 배열에서 이 항목들은 `new_status: null`로 표시되며, 요청 항목의 사유는 `comment`에 들어 있습니다.
- **세션 결정**: 이미 결정이 내려진 세션은 그 결정을 유지합니다. 최종 결정을 변경하려면 [세션 상태 업데이트](https://docs.didit.me/ko/sessions-api/update-status.md)를 별도로 호출합니다.## 권한`write:sessions` 권한이 필요하며, 클라이언트 API 키(`x-api-key`) 또는 사용자 인증 헤더 중 하나를 사용할 수 있습니다.
범위가 지정된 API 키에는 결정에 대한 쓰기 권한이 있어야 합니다.## 관련 문서- [세션 상태 업데이트](https://docs.didit.me/ko/sessions-api/update-status.md): 세션 전체의 결정을 변경합니다.
- [AML 일치 상태 업데이트](https://docs.didit.me/ko/sessions-api/update-aml-hit-status.md): 개별 AML 일치 항목을 검토합니다.
- [세션 조회](https://docs.didit.me/ko/sessions-api/retrieve-session.md): 결정(및 각 기능의 `node_id`)을 조회합니다.
- [Webhook](https://docs.didit.me/ko/integration/webhooks.md): `data.updated`를 구독합니다.
- [기능 재정의 목록](https://docs.didit.me/ko/sessions-api/list-feature-overrides.md): 세션의 모든 재정의와 그 상태입니다.
- [기능 재정의 취소](https://docs.didit.me/ko/sessions-api/cancel-feature-override.md): 대기 중인 재정의가 적용되지 않도록 중지합니다.


## OpenAPI

````yaml ko/openapi-25.json PATCH /v3/session/{sessionId}/features/{nodeId}/update-status/
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/session/{sessionId}/features/{nodeId}/update-status/:
    patch:
      tags:
        - Sessions
      summary: 개별 기능(단계) 상태 업데이트
      description: >-
        세션 내 단일 인증 기능(단계)의 상태를 설정합니다. 워크플로 그래프 `nodeId`로 대상 기능을 지정합니다. 단계에 노드가
        없는 비그래프 워크플로의 경우 `default`를 사용하고 어떤 단계를 의미하는지 지정하기 위해 `feature_type`도 함께
        전달합니다.


        사용자 인증(KYC) 및 기업 확인(KYB) 세션 모두와 모든 단계 유형(신분증/OCR, 라이브니스, 얼굴 대조, NFC,
        AML, 주소 증명, 전화번호, 이메일, 데이터베이스 검증, 설문지 및 KYB 법인 등기부/문서/주요 인물 검사)에서 작동합니다.
        이 endpoint는 독립 실행형 API 세션(`session_type = API`)에서는 사용할 수 **없습니다**.


        `new_status`는 `Approved`, `Declined` 또는 `In Review` 중 하나여야 하며, 해당 기능의 현재
        상태와 달라야 합니다.


        **재정의 적용 시점.** `defer_until_flow_finishes`가 없거나 `false`인 경우 재정의는 기존과
        동일하게 즉시 적용됩니다. 사용자가 아직 플로우 진행 중인 경우 `forced`로 기록됩니다. 사용자가 아직 플로우 진행 중일
        때(세션이 `Not Started`, `In Progress` 또는 `Resubmitted` 상태이며 완료되지 않음)
        `defer_until_flow_finishes: true`로 설정하면, 재정의는
        `pending_until_flow_finishes`로 저장되며 플로우가 자체 결정에 도달한 후 완료될 때 적용됩니다. 플로우가
        이미 종료된 세션에서는 어느 쪽이든 즉시 적용됩니다. 대기 중인 재정의는 사용자가 완료하기 전에 해당 단계를 다시 수행하거나,
        동일한 검사에 대한 최신 재정의로 대체되거나, 세션이 플로우를 완료하지 않고 종료되거나(중단됨, 만료됨 또는 플로우 도중
        결정됨), `POST
        /v3/session/{sessionId}/features/overrides/{overrideId}/cancel/`을 통해 취소할
        경우 취소 처리됩니다. 세션의 재정의 목록은 `GET
        /v3/session/{sessionId}/features/overrides/`로 조회할 수 있습니다.


        **세션에 미치는 영향.** 이미 결정이 내려진 세션은 기존 결정을 유지하며, 해당 검사만 변경됩니다. 세션에 아직 결정이
        내려지지 않았고 워크플로가 정확히 이 단계를 대기 중인 경우, 재정의를 적용하면 해당 단계가 완료됩니다. 워크플로가 계속 진행되어
        후속 단계가 실행되고, 상태 노드가 세션 결정을 설정하고 `status.updated`를 발생시킬 수 있습니다.


        **Webhook 및 활동.** `data.updated` webhook은 재정의가 적용될 때(즉시 또는 플로우 완료 시)
        발생하며, 대기 중이거나 취소될 때는 발생하지 않습니다. 모든 재정의는 누가 수행했는지에 대한 정보와 함께 세션 활동에
        `FEATURE_OVERRIDE_PENDING`, `FEATURE_OVERRIDE_APPLIED` 또는
        `FEATURE_OVERRIDE_CANCELLED`로 기록됩니다. 요청 항목에는 작성한 `comment`가 포함됩니다.


        API 키(`x-api-key`) 또는 `write:sessions` 권한이 포함된 사용자 인증 헤더로 인증합니다. 스코프가
        지정된 API 키에는 결정에 대한 쓰기 권한이 필요합니다.
      operationId: patch_v3_session_update_feature_status
      parameters:
        - in: path
          name: sessionId
          required: true
          description: >-
            인증 세션의 UUID입니다. 사용자(KYC) 및 기업(KYB) 세션 ID를 모두 지원하며, 서비스는 두 세션 유형 전체에서
            ID를 확인합니다.
          schema:
            type: string
            format: uuid
            example: 11111111-2222-3333-4444-555555555555
        - in: path
          name: nodeId
          required: true
          description: >-
            업데이트할 기능의 워크플로 그래프 노드 ID입니다(예: `feature_ocr_1`). 기능에 노드 ID가 없는
            비그래프(단일 단계) 워크플로의 경우 리터럴 값 `default`를 사용하십시오.
          schema:
            type: string
            example: feature_ocr_1
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - new_status
              properties:
                new_status:
                  type: string
                  description: 이 기능의 대상 상태입니다. 현재 값과 달라야 합니다.
                  enum:
                    - Approved
                    - Declined
                    - In Review
                  example: Approved
                comment:
                  type: string
                  description: 이 기능 변경에 대해 세션의 검토 기록에 기록되는 선택적 자유 텍스트 메모입니다.
                  example: Document manually verified by compliance.
                feature_type:
                  type: string
                  enum:
                    - ID_VERIFICATION
                    - OCR
                    - OCR_BACK
                    - NFC
                    - LIVENESS
                    - FACE
                    - AGE_ESTIMATION
                    - AGE_VERIFICATION
                    - FACE_SEARCH
                    - FACE_MATCH
                    - IP_ANALYSIS
                    - AML
                    - PHONE
                    - PHONE_VERIFICATION
                    - EMAIL
                    - EMAIL_VERIFICATION
                    - POA
                    - PROOF_OF_ADDRESS
                    - DATABASE_VALIDATION
                    - DATA_VALIDATION
                    - QUESTIONNAIRE
                    - DOCUMENT_AI
                    - KYB_REGISTRY
                    - KYB_DOCUMENTS
                    - KYB_KEY_PEOPLE
                    - BANK_VERIFICATION
                    - GEOLOCATION
                  description: >-
                    대상으로 지정할 단계의 종류입니다. 모든 단계가 노드를 공유하지 않는 비그래프 워크플로(`nodeId` =
                    `default`)에서 필요하며, 그렇지 않은 경우 선택 사항입니다. 알 수 없는 값은 `400`을
                    반환합니다.
                  example: LIVENESS
                defer_until_flow_finishes:
                  type: boolean
                  default: false
                  description: >-
                    사용자가 아직 플로우에 있는 동안 재정의를 즉시 적용하는 대신
                    `pending_until_flow_finishes`로 저장하고 플로우가 끝날 때 적용합니다. 생략하거나
                    `false`로 설정하면 재정의가 즉시 적용됩니다. 플로우가 이미 종료된 세션의 경우 어느 쪽이든 즉시
                    적용됩니다.
                  example: false
            examples:
              Apply Now:
                summary: 신분증 단계를 즉시 승인
                value:
                  new_status: Approved
                  comment: Document manually verified by compliance.
              Wait For The Flow:
                summary: 사용자가 플로우를 완료하면 라이브니스 단계 승인
                value:
                  new_status: Approved
                  comment: Liveness retried with a reviewer present.
                  defer_until_flow_finishes: true
              Non-graph Workflow:
                summary: 노드가 없는 워크플로의 라이브니스 단계 타겟팅(nodeId = default)
                value:
                  new_status: In Review
                  feature_type: LIVENESS
      responses:
        '200':
          description: >-
            오버라이드가 기록되었습니다. `new_status`는 저장된 검사 상태입니다. 오버라이드가 적용되면 요청된 상태가 되고,
            흐름이 완료되기를 기다리는 동안에는 변경되지 않은 상태가 됩니다. `override`는 어떤 경우가 발생했는지를
            나타냅니다.
          content:
            application/json:
              schema:
                type: object
                properties:
                  session_id:
                    type: string
                    format: uuid
                  node_id:
                    type: string
                    nullable: true
                    description: >-
                      업데이트된 단계의 워크플로 노드이거나, 노드가 없는 단계(비그래프 워크플로의 `default` 경로)의
                      경우 `null`입니다.
                    example: feature_ocr_1
                  feature_type:
                    type: string
                    description: >-
                      업데이트된 기능의 모델 이름입니다(예: `KYC`, `Face`, `FaceMatch`, `AML`,
                      `POA`).
                    example: KYC
                  new_status:
                    type: string
                    description: >-
                      검사의 저장된 상태입니다. 재정의가 적용되면 요청된 상태가 되고, 재정의가 흐름 완료를 기다리는 동안에는
                      변경되지 않은 상태가 됩니다.
                    example: Approved
                  override:
                    $ref: '#/components/schemas/FeatureStatusOverride'
                required:
                  - session_id
                  - node_id
                  - feature_type
                  - new_status
                  - override
              examples:
                Applied:
                  summary: 오버라이드가 즉시 적용되었습니다.
                  value:
                    session_id: 3fa85f64-5717-4562-b3fc-2c963f66afa6
                    node_id: feature_ocr_1
                    feature_type: KYC
                    new_status: Approved
                    override:
                      id: 7c9e6679-7425-40de-944b-e07fc1f90ae7
                      node_id: feature_ocr_1
                      feature_type: ''
                      feature_model: KYC
                      previous_status: In Review
                      new_status: Approved
                      state: applied
                      forced: false
                      reason: Document manually verified by compliance.
                      requested_by:
                        email: reviewer@example.com
                        name: Alex Reviewer
                        type: CONSOLE_USER
                      requested_at: '2026-10-13T09:15:00Z'
                      applied_at: '2026-10-13T09:15:00Z'
                      cancelled_at: null
                      cancel_reason: null
                Waiting For The Flow:
                  summary: 사용자가 아직 플로우에 있는 동안 defer_until_flow_finishes
                  value:
                    session_id: 3fa85f64-5717-4562-b3fc-2c963f66afa6
                    node_id: feature_liveness_1
                    feature_type: Face
                    new_status: Declined
                    override:
                      id: 9b2f4c1e-8d3a-4e5f-a6b7-c8d9e0f1a2b3
                      node_id: feature_liveness_1
                      feature_type: ''
                      feature_model: Face
                      previous_status: Declined
                      new_status: Approved
                      state: pending_until_flow_finishes
                      forced: false
                      reason: Liveness retried with a reviewer present.
                      requested_by:
                        email: reviewer@example.com
                        name: Alex Reviewer
                        type: CONSOLE_USER
                      requested_at: '2026-10-13T09:15:00Z'
                      applied_at: null
                      cancelled_at: null
                      cancel_reason: null
        '400':
          description: >-
            유효성 검사 오류입니다. `new_status`가 유효하지 않거나 변경되지 않은 경우, `feature_type`을 알 수
            없는 경우, 또는 세션이 독립형 API 세션인 경우 반환됩니다.
          content:
            application/json:
              examples:
                Same Status:
                  summary: new_status가 현재 상태와 동일함
                  value:
                    new_status:
                      - The new status is the same as the current status.
                API Session:
                  summary: 독립형 API 세션에서는 기능 상태를 변경할 수 없습니다.
                  value:
                    - Cannot change feature status for API sessions.
                Unknown feature_type:
                  summary: feature_type이 알려진 단계 유형이 아닙니다
                  value:
                    feature_type:
                      - Unknown feature_type 'SELFIE'.
        '401':
          description: 스코프가 지정된 API 키가 만료되었습니다.
          content:
            application/json:
              examples:
                Expired API Key:
                  summary: 만료일이 지난 스코프 지정 API 키
                  value:
                    detail: This API key has expired.
        '403':
          description: 자격 증명이 누락되었거나 권한이 부족합니다.
          content:
            application/json:
              examples:
                Invalid Credentials:
                  summary: x-api-key가 누락되었거나 유효하지 않음
                  value:
                    detail: >-
                      Authentication credentials were not provided or are
                      invalid.
                Missing Privilege:
                  summary: API 키에 write:sessions 권한이 없습니다
                  value:
                    detail: You do not have permission to perform this action.
                Scoped Key Without Access:
                  summary: 결정에 대한 쓰기 권한이 없는 스코프 지정 API 키
                  value:
                    detail: This API key has no write access to decisions.
        '404':
          description: 세션을 찾을 수 없거나 해당 `nodeId`를 가진 기능이 없습니다.
          content:
            application/json:
              examples:
                Session Not Found:
                  summary: 알 수 없는 session_id
                  value:
                    detail: Session not found.
                Feature Not Found:
                  summary: 이 node_id에 대한 기능이 없습니다
                  value:
                    detail: >-
                      No feature found with node_id 'feature_ocr_1' in this
                      session.
      security:
        - ApiKeyAuth: []
      x-codeSamples:
        - lang: curl
          label: curl
          source: |-
            curl -X PATCH \
              https://verification.didit.me/v3/session/11111111-2222-3333-4444-555555555555/features/feature_ocr_1/update-status/ \
              -H 'x-api-key: YOUR_API_KEY' \
              -H 'Content-Type: application/json' \
              -d '{
                "new_status": "Approved",
                "comment": "Document manually verified by compliance."
              }'
        - lang: python
          label: Python
          source: |-
            from didit import Didit

            # Reads DIDIT_API_KEY.
            client = Didit()

            result = client.sessions.update_feature_status(
                "11111111-2222-3333-4444-555555555555",
                "feature_ocr_1",
                new_status="Approved",
                comment="Document manually verified by compliance.",
            )
            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.updateFeatureStatus(
              "11111111-2222-3333-4444-555555555555",
              "feature_ocr_1",
              {
                new_status: "Approved",
                comment: "Document manually verified by compliance.",
              },
            );
            console.log(result);
        - lang: go
          label: Go
          source: "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Sessions.UpdateFeatureStatus(ctx, \"11111111-2222-3333-4444-555555555555\", \"feature_ocr_1\", didit.SessionsUpdateFeatureStatusParams{\n\tNewStatus: \"Approved\",\n\tComment:   didit.String(\"Document manually verified by compliance.\"),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
        - lang: java
          label: Java
          source: >-
            import me.didit.Didit;

            import me.didit.types.SessionsUpdateFeatureStatusParams;


            // Reads DIDIT_API_KEY.

            Didit client = new Didit();


            var result =
            client.sessions().updateFeatureStatus("11111111-2222-3333-4444-555555555555",
            "feature_ocr_1", SessionsUpdateFeatureStatusParams.builder()
                    .newStatus(SessionsUpdateFeatureStatusParams.NewStatus.of("Approved"))
                    .comment("Document manually verified by compliance.")
                    .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->updateFeatureStatus('11111111-2222-3333-4444-555555555555',
            'feature_ocr_1', [
                'new_status' => 'Approved',
                'comment' => 'Document manually verified by compliance.',
            ]);

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

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

            result = didit.sessions.update_feature_status(
              "11111111-2222-3333-4444-555555555555",
              "feature_ocr_1",
              new_status: "Approved",
              comment: "Document manually verified by compliance."
            )
            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.UpdateFeatureStatusAsync("11111111-2222-3333-4444-555555555555",
            "feature_ocr_1", new SessionsUpdateFeatureStatusParams

            {
                NewStatus = "Approved",
                Comment = "Document manually verified by compliance.",
            });

            Console.WriteLine(JsonSerializer.Serialize(result));
components:
  schemas:
    FeatureStatusOverride:
      type: object
      description: >-
        `PATCH /v3/session/{sessionId}/features/{nodeId}/update-status/`로 수행된
        검사(기능) 상태의 재정의 항목 하나입니다. 변경 내용, 적용 여부 또는 사용자가 플로우를 완료할 때까지 대기 중인지 여부,
        요청한 주체 및 사유를 포함합니다.
      required:
        - id
        - node_id
        - feature_type
        - feature_model
        - previous_status
        - new_status
        - state
        - forced
        - reason
        - requested_by
        - requested_at
        - applied_at
        - cancelled_at
        - cancel_reason
      properties:
        id:
          type: string
          format: uuid
          description: 재정의 식별자입니다. 취소 endpoint에 전달하십시오.
          example: 7c9e6679-7425-40de-944b-e07fc1f90ae7
        node_id:
          type: string
          description: 요청에 지정된 워크플로 노드(노드가 없는 단계의 경우 `default`).
          example: feature_ocr_1
        feature_type:
          type: string
          description: 요청이 전달한 `feature_type`이며, 전달하지 않은 경우 빈 문자열입니다.
          example: ''
        feature_model:
          type: string
          description: '재정의된 검사 종류입니다(예: `KYC`, `Face`, `AML` 또는 `GeolocationCheck`).'
          example: KYC
        previous_status:
          type: string
          enum:
            - Not Finished
            - Approved
            - Declined
            - In Review
            - Resub Requested
          description: 재정의가 요청되었을 때의 검사 상태입니다.
          example: In Review
        new_status:
          type: string
          enum:
            - Approved
            - Declined
            - In Review
          description: 재정의를 통해 설정된 상태입니다.
          example: Approved
        state:
          type: string
          enum:
            - applied
            - pending_until_flow_finishes
            - cancelled
          description: >-
            `applied`: 검사에 새 상태가 적용되었습니다. `pending_until_flow_finishes`: 재지정 사항이
            대기 상태를 유지하다가 사용자가 흐름을 완료하면 적용됩니다. `cancelled`: 대기 상태였으나 적용되지
            않았습니다(`cancel_reason` 참조).
          example: applied
        forced:
          type: boolean
          description: 사용자가 플로우에 머무르는 동안 오버라이드가 즉시 적용된 경우 `true`입니다.
          example: false
        reason:
          type: string
          nullable: true
          description: 요청과 함께 전송된 `comment` 또는 `null`입니다.
          example: Document manually verified by compliance.
        requested_by:
          type: object
          nullable: true
          description: 누가 재정의를 요청했는지 나타내며, 알 수 없는 경우 `null`입니다.
          properties:
            email:
              type: string
              format: email
              nullable: true
              description: 콘솔 사용자의 이메일이며, API 키 및 시스템의 경우 `null`입니다.
              example: reviewer@example.com
            name:
              type: string
              nullable: true
              description: 요청자의 표시 이름 또는 `null`입니다.
              example: Alex Reviewer
            type:
              type: string
              enum:
                - CONSOLE_USER
                - API_KEY
                - SYSTEM
              description: '요청을 보낸 주체: 콘솔 사용자, API 키 또는 Didit 자체입니다.'
              example: CONSOLE_USER
        requested_at:
          type: string
          format: date-time
          description: 재정의가 요청된 시점입니다.
          example: '2026-10-13T09:15:00Z'
        applied_at:
          type: string
          format: date-time
          nullable: true
          description: 검사가 새 상태로 변경된 시점이며, 대기 중이거나 취소된 후에는 `null`입니다.
          example: '2026-10-13T09:15:00Z'
        cancelled_at:
          type: string
          format: date-time
          nullable: true
          description: 대기 중인 오버라이드가 취소된 시점 또는 `null`입니다.
          example: null
        cancel_reason:
          type: string
          nullable: true
          enum:
            - cancelled_by_reviewer
            - replaced
            - check_changed
            - session_closed
            - null
          description: >-
            대기 중인 오버라이드가 적용되지 않은 이유 또는 `null`입니다. `cancelled_by_reviewer`: 취소
            endpoint로 취소됨. `replaced`: 동일한 검사에 대한 최신 오버라이드로 대체됨.
            `check_changed`: 사용자가 흐름을 완료하기 전에 검사를 다시 수행함. `session_closed`: 사용자가
            흐름을 완료하기 전에 세션을 벗어남(중단됨, 만료됨 또는 흐름 도중 결정됨).
          example: null
  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.