> ## 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، فوراً أو بعد انتهاء المستخدم من العملية.



موجه تحديث حالة الميزة
        نسخ الموجّه إلى الحافظة



      
      

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



      
      

الصق في

## ماذا يفعل هذاتتكون جلسة التحقق من **ميزات** فردية (خطوات)، مثل ID/OCR والكشف عن الحيوية ومطابقة الوجه وAML وإثبات العنوان والهاتف وغيرها.
يتيح لك هذا endpoint تعيين حالة **خطوة واحدة** من هذه الخطوات إلى `Approved` أو `Declined` أو `In Review`.استخدم [update-status](https://docs.didit.me/ar/sessions-api/update-status.md) عندما تريد الموافقة على الجلسة بأكملها أو رفضها أو إعادة فتحها.
استخدم **هذا** endpoint عندما تريد تسجيل قرار على خطوة واحدة فقط، مثل وضع خطوة مطابقة الوجه كـ `Declined` ضمن سير المراجعة الخاص بك.تحتفظ الجلسة التي لها قرار بالفعل بقرارها، ولا يتغير سوى الخطوة.
إذا لم يكن للجلسة قرار بعد، وكان سير العمل ينتظر هذه الخطوة بالتحديد، فإن تطبيق التجاوز يُكمل الخطوة كما تفعل عند إنهائها بشكل طبيعي.
يتقدم سير العمل بعد ذلك، وتُنفَّذ الخطوات اللاحقة، ويمكن لعقدة الحالة أن تحدد قرار الجلسة وأن تُطلق webhook بحدث `status.updated`.## الاستهداف لخطوة باستخدام `node_id`في سير العمل القائم على المخططات، لكل خطوة `node_id` خاص بها (مثل `feature_ocr_1` و`feature_liveness_1` و`feature_aml_1`). يمكنك العثور عليها في [قرار الجلسة](https://docs.didit.me/ar/sessions-api/retrieve-session.md)، إذ تحمل كل ميزة في قرار V3 الخاص بها `node_id`.أما في **سير العمل غير القائم على المخططات (الخطوة الواحدة)**، فليس للميزة الأساسية أي معرّف عقدة. مرّر القيمة الحرفية `default` باعتبارها `nodeId` لاستهدافها.
ولأن أياً من خطوات هذا النوع من سير العمل لا يملك معرّف عقدة، مرّر أيضاً `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/ar/sessions-api/cancel-feature-override.md) (`cancelled_by_reviewer`).يخبرك `override` في الاستجابة بما حدث: `state` هو `applied` أو `pending_until_flow_finishes`، ويُعيَّن `applied_at` بمجرد تطبيق التجاوز.
يبقى `new_status` على المستوى الأعلى هو الحالة المخزنة للخطوة، لذا لا يتغير أثناء انتظار التجاوز.
استخدم [سرد تجاوزات الميزات](https://docs.didit.me/ar/sessions-api/list-feature-overrides.md) لعرض كل تجاوز في الجلسة ومعرفة ما إذا كان الشخص ما زال في الإجراء.## دعم KYC وKYBيعمل بالطريقة نفسها مع جلسات **التحقق من المستخدمين (KYC)** و**التحقق من الشركات (KYB)**، إذ يحدد Didit الـ `sessionId` عبر النوعين. تشمل أنواع الخطوات المدعومة ID/OCR والكشف عن الحيوية ومطابقة الوجه وNFC وAML وإثبات العنوان والهاتف والبريد الإلكتروني والتحقق من قواعد البيانات والاستبيانات، بالإضافة إلى فحوصات سجل الشركات والمستندات والأشخاص الرئيسيين في KYB.> [!NOTE]
>
> لا يمكن تغيير حالات الميزات الفردية في الجلسات المستقلة للواجهة البرمجية (تلك التي أُنشئت عبر واجهات التحقق المستقلة، أي `session_type = API`)، ويُعيد endpoint الاستجابة `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` الخاص بك بوصفه السبب. تظهر هذه السجلات في المصفوفة `reviews` ضمن [قرار الجلسة](https://docs.didit.me/ar/sessions-api/retrieve-session.md) بقيمة `new_status: null`، ويحمل سجل الطلب سببك في `comment`.
- **قرار الجلسة**: تحتفظ الجلسة التي لها قرار بالفعل بقرارها. لتغيير القرار النهائي، استدعِ [update-status](https://docs.didit.me/ar/sessions-api/update-status.md) بشكل منفصل.## الإذنيتطلب الصلاحية `write:sessions`، مع مفتاح API للعميل (`x-api-key`) أو ترويسة تفويض للمستخدم.
يحتاج مفتاح API المقيّد إلى صلاحية الكتابة على القرارات.## ذو صلة- [تحديث حالة الجلسة](https://docs.didit.me/ar/sessions-api/update-status.md): تغيير قرار الجلسة الإجمالي.
- [تحديث حالة نتيجة AML](https://docs.didit.me/ar/sessions-api/update-aml-hit-status.md): مراجعة مطابقات AML الفردية.
- [استرداد الجلسة](https://docs.didit.me/ar/sessions-api/retrieve-session.md): جلب القرار (وقيمة `node_id` لكل ميزة).
- [webhook](https://docs.didit.me/ar/integration/webhooks.md): الاشتراك في `data.updated`.
- [سرد تجاوزات الميزات](https://docs.didit.me/ar/sessions-api/list-feature-overrides.md): كل تجاوز في الجلسة وحالته.
- [إلغاء تجاوز الميزة](https://docs.didit.me/ar/sessions-api/cancel-feature-override.md): إيقاف تجاوز منتظر من التطبيق.


## OpenAPI

````yaml ar/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) على حد
        سواء ومع كل نوع خطوة: ID/OCR، وكشف الحيوية، ومطابقة الوجه، وNFC، وفحص
        AML، وإثبات العنوان، ورقم الهاتف، والبريد الإلكتروني، والتحقق من قواعد
        البيانات، والاستبيانات، وفحوصات سجل KYB / المستندات / الأشخاص الرئيسيين.
        هذا الـ endpoint **غير** متاح لجلسات API المستقلة (`session_type =
        API`).


        يجب أن تكون `new_status` إحدى القيم `Approved`، أو `Declined`، أو `In
        Review`، ويجب أن تختلف عن الحالة الحالية للميزة.


        **متى يُطبّق التجاوز.** بدون `defer_until_flow_finishes` (أو عند ضبطه
        على `false`)، يُطبّق التجاوز فوراً كما كان دائماً؛ وعندما يكون الشخص لا
        يزال في مسار التحقق، يتم تسجيله كـ `forced`. مع
        `defer_until_flow_finishes: true` بينما لا يزال الشخص في مسار التحقق
        (تكون الجلسة `Not Started`، أو `In Progress`، أو `Resubmitted` ولم تنتهِ
        بعد)، يُخزّن التجاوز كـ `pending_until_flow_finishes` ويُطبّق عند انتهاء
        المسار، بعد أن يصل المسار إلى قراره الخاص. أما في الجلسة التي انتهى
        مسارها بالفعل، فيُطبّق فوراً في كلتا الحالتين. ويتم إلغاء التجاوز
        المنتظر بدلاً من ذلك عندما يعيد الشخص تنفيذ خطوته قبل الإنهاء، أو عندما
        يحل محله تجاوز أحدث لنفس الفحص، أو عندما تغادر الجلسة مسار التحقق دون
        اكتماله (متروكة، أو منتهية الصلاحية، أو تم اتخاذ قرار في منتصف المسار)،
        أو عندما تقوم بإلغائه عبر `POST
        /v3/session/{sessionId}/features/overrides/{overrideId}/cancel/`. يمكنك
        إدراج تجاوزات الجلسة باستخدام `GET
        /v3/session/{sessionId}/features/overrides/`.


        **التأثير على الجلسة.** الجلسة التي لديها قرار بالفعل تحتفظ به: يتغير
        الفحص فقط. عندما لا يكون لدى الجلسة قرار بعد ويكون سير العمل الخاص بها
        في انتظار هذه الخطوة تحديداً، فإن تطبيق التجاوز يكمل الخطوة: ينتقل سير
        العمل قدماً، وتعمل الخطوات اللاحقة، ويمكن لعقدة الحالة تعيين قرار الجلسة
        وإطلاق `status.updated`.


        **أحداث Webhook والنشاط.** يتم إطلاق webhook للحدث `data.updated` عند
        تطبيق التجاوز (فوراً، أو عند انتهاء المسار)، ولا يتم إطلاقه أبداً أثناء
        الانتظار أو عند الإلغاء. يُسجّل كل تجاوز في نشاط الجلسة كـ
        `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) — يطابق الخادم المعرّف عبر كلا نوعي الجلسات.
          schema:
            type: string
            format: uuid
            example: 11111111-2222-3333-4444-555555555555
        - in: path
          name: nodeId
          required: true
          description: >-
            معرّف عقدة مخطط سير العمل للميزة المراد تحديثها (على سبيل المثال
            `feature_ocr_1`). استخدم القيمة الحرفية `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: >-
                      عقدة سير العمل للخطوة المحدثة، أو `null` لخطوة بدون عقدة
                      (مسار `default` في سير عمل لا يعتمد على المخطط).
                    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: >-
                البريد الإلكتروني لمستخدم وحدة التحكم، أو `null` لمفاتيح API
                والنظام.
              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: >-
        مفتاح API الخاص بتطبيقك، من Developers -> API keys في Business Console.
        يمتلك المفتاح الأساسي وصولاً كاملاً. يمكن تحديد نطاق المفتاح المسمى: لا
        شيء، أو قراءة، أو كتابة لكل مورد، ومحدوداً ببعض مسارات العمل أو بالجلسات
        المقبولة، وبقائمة من عناوين IP، وبتاريخ انتهاء الصلاحية. يشير 401 إلى أن
        المفتاح غير صحيح أو ملغى أو منتهي الصلاحية؛ ويشير 403 إلى أنه لم يتم
        إرسال أي مفتاح، أو أن المفتاح ليس لديه حق الوصول إلى هذا المورد أو
        الإجراء، أو أن الطلب جاء من عنوان خارج قائمة عناوين IP الخاصة به؛ ويشير
        404 في مسار جلسة إلى أن الجلسة خارج مسارات العمل أو الحالات الخاصة
        بالمفتاح. يتلقى المفتاح الذي لا يمتلك حق الوصول إلى الوسائط عناوين URL
        للصور ومقاطع الفيديو وملفات PDF كـ null، ويتلقى المفتاح الذي لا يمتلك
        إذن كتابة للجلسات روابط الجلسة وtoken كـ null. راجع
        https://docs.didit.me/console/api-keys.

````

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