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

> احذف جلسات KYC في Didit بالرقم أو دفعة واحدة. حتى 20 جلسة تُعاد نتيجة كل منها، والتحديدات الأكبر تعمل كمهمة حذف تستعلم عن حالتها.



موجّه حذف الجلسات دفعةً واحدة
        نسخ الموجّه إلى الحافظة



      
      

\<pre>

\`Goal: Delete a list of User Verification (KYC) sessions, or every session, for the calling application, and control what happens to each session's face biometric data. KYC only — KYB sessions are not covered here; use DELETE /v3/session/{sessionId}/delete/ for a single KYB or KYC session.

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

Request body — provide EXACTLY ONE selector:
\- session_numbers: string[] — UI-visible decimal session numbers ("#1234" style), NOT UUIDs. Each entry must be digits only (regex ^[0-9]+$). minItems: 1.
\- delete_all: true — delete every remaining KYC session for the application. When delete_all is true, session_numbers is ignored.

Narrowing delete_all (optional, only together with delete_all: true):
\- filter_<name> - any filter of GET /v3/sessions/ (see /sessions-api/list-sessions) prefixed with filter_, with the same values: filter_status, filter_workflow_id, filter_date_from, filter_date_to, filter_vendor_data, filter_country, filter_document_type, filter_warning, filter_search and the others. Filters that take several values in GET /v3/sessions/ (status, workflow_id, country, region, document_type, document_name, session_type, warning, organization_name) accept a comma-separated string or an array. The others take one value: an array is joined into one comma-separated value, so several dates, UUIDs or api_service values are refused with 400, and several texts are not matched as alternatives. An empty value is ignored and does not narrow the selection.
\- An unknown filter_* key returns 400 { "filter_<name>": "Unknown filter." } and a value that cannot be read returns 400 keyed by that filter_* key (for example { "filter_date_from": ["Enter a valid date."] }). Nothing is deleted in either case.
\- A deletion job applies the same filters.

Optional retention and instruction fields (same semantics as the single-session endpoint, applied to every matched session):
\- retain_face_embeddings (boolean | null) — true keeps an image-free biometric template anchored to each session's User; false deletes the embedding with the session; omit/null follows the application's face_retention_policy.
\- face_retention_days (integer 1-3650) — required when retaining unless the application sets face_retention_days.
\- face_retention_deadline (ISO 8601 datetime, future) — optional hard expiry.
\- deletion_instruction ("operational_session_delete" default | "privacy_erasure") — privacy_erasure purges every retained template for each session's User and never retains a new one. Cannot be combined with retain_face_embeddings: true (400).
\- instruction_id (string, max 255) — your durable reference for this instruction; recorded on the audit trail and on every retained template.

curl:
curl -X POST 'https://verification.didit.me/v3/sessions/delete/' \
-H "x-api-key: YOUR_API_KEY" \
-H 'Content-Type: application/json' \
-d '{"session_numbers": ["1001", "1002", "1003"]}'

Response: the number of matching sessions decides, whether they are selected by session_numbers or with delete_all.

Up to 20 matching sessions: they are deleted in the request. Response 200 (this endpoint no longer returns 204):
\{
"results": [
\{"session_id": "<uuid>", "session_number": 1001, "face_retention_outcome": "deleted", "biometric_template_uuid": null, "biometric_template_expires_at": null, "deleted_child_verifications": 0},
\{"session_id": "<uuid>", "session_number": 1002, "face_retention_outcome": "retained_with_user", "biometric_template_uuid": "<uuid>", "biometric_template_expires_at": "<ISO 8601 datetime>", "deleted_child_verifications": 0},
\{"session_id": "<uuid>", "session_number": 1003, "face_retention_outcome": "failed_retryable", "biometric_template_uuid": null, "biometric_template_expires_at": null, "deleted_child_verifications": 0}
]
}
face_retention_outcome per session:
\- deleted: session and face embedding deleted (default).
\- retained_with_user: session deleted; an image-free biometric template stays anchored to the User until biometric_template_expires_at (manage it via /v3/biometric-templates/).
\- none: the session had no face embedding.
\- ineligible_no_vendor_user: retention requested but the session has no linked User; session and embedding deleted.
\- failed_retryable: the group this session was deleted with could not be deleted (a storage service, a biometric store or a monitoring provider was unavailable). That session is NOT deleted and is still in place; re-run the request for it. Other groups in the same request are unaffected.
deleted_child_verifications is always 0 here: this endpoint deletes KYC sessions only.

More than 20 matching sessions: they are deleted in the background. Response 202 with a deletion job:
\{"job_id": "<uuid>", "status": "PENDING", "total": 250, "processed": 0, "outcomes": {"deleted": 0, "none": 0, "retained_with_user": 0, "ineligible_no_vendor_user": 0, "failed_retryable": 0, "already_deleted": 0}, "deleted_child_verifications": 0, "error": null, "created_at": "<datetime>", "completed_at": null}
Poll GET /v3/sessions/delete/{job_id}/ every few seconds until status is COMPLETED or FAILED. The job reports counts per outcome, never which sessions it deleted. A delete_all job deletes only the sessions created before the request. A FAILED job explains why in error; the sessions it had not reached are still in place, so repeat the request to delete them.

Side effects:
\- Each matched session is deleted along with everything it produced, including every verification attempt: its decision, its extracted data, its KYC / Face / AML / Location / POA / Phone / Email records, its reviews and activity log, and all of its stored files.
\- The sessions stop appearing in GET /v3/sessions/ and GET /v3/session/{sessionId}/decision/, and media URLs issued before the call stop resolving.
\- Webhook deliveries still queued for the deleted sessions, and their retries, are dropped. Webhooks already delivered are not affected.
\- Share tokens issued for the sessions are NOT revoked, but there is nothing left for them to import: an import with one returns 400 {"share_token": ["Original session does not exist."]}.
\- Blocklist entries created from the sessions are NOT removed.
\- Credits already consumed by the verifications are NOT refunded.
\- The parent User entities are NOT deleted; use POST /v3/users/delete/ for those (that also purges their retained templates).
\- NO deletion webhook is emitted.
\- Sessions are deleted in groups; a failure in one group does not roll back the others. Numbers that no longer match a live session are skipped and do not appear in results.

Idempotency: re-running with the same session_numbers deletes nothing more (numbers that no longer match a session are skipped). Deletion is permanent and cannot be undone.

Failure modes:
\- 400: validation, nothing deleted:
\{ "session_numbers": ["This field is required unless delete_all is true."] }
\{ "session_numbers": ["All session_numbers must be numeric."] }
\{ "retain_face_embeddings": ["Privacy erasure cannot retain biometric templates."] }
\{ "detail": "A finite biometric-template retention duration is required." }
\{ "filter_reviewer": "Unknown filter." }
\{ "filter_date_from": ["Enter a valid date."] }
\- 409: at least one selected session is part of a finalized regulatory report. Nothing is deleted. The body has code: in_filed_report and reports[] with uuid, report_number, report_type and case_uuid. Delete the reports, then repeat the request.
\- 403: API key invalid or application not allowed. { "detail": "You do not have permission to perform this action." }

Migration note: until this release the endpoint returned 204 with an empty body; it now returns 200 with results[], or 202 with a deletion job when more than 20 sessions match. Existing applications stay on delete_with_session until you explicitly change the policy.

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

\</pre>



      
      

الصق في

## السلوكيُحذف كل جلسة مطابقة تماماً مثلما يحدث عند [حذف الجلسة](https://docs.didit.me/ar/sessions-api/delete-session.md): تُحذف الجلسة، وكل محاولة تحقق تتضمنها، وقرارها والبيانات المستخرجة منها، وسجلات ميزاتها، وكل ملفاتها المخزنة. وتختفي من جميع endpoints القراءة، وتتوقف روابط الوسائط التي صدرت سابقاً عن العمل. تُسقط تسليمات webhook التي ما زالت في قائمة الانتظار لجلسة محذوفة، وكذلك إعادات محاولاتها؛ أما تسليمات webhook التي تمّت بالفعل فلا تتأثر. الحذف دائم ولا يمكن التراجع عنه.إذا كانت أيٌّ من الجلسات المحددة جزءاً من تقرير تنظيمي نهائي، يُعيد الطلب كاملاً الاستجابة `409` ولا يُحذف شيء. تستخدم الاستجابة `code: in_filed_report` وتسمّي كل تقرير. احذف كل تقرير باستخدام [حذف التقرير](https://docs.didit.me/ar/management-api/regulatory-reports/delete.md)، ثم أعد الطلب. حذف التقرير لا يحذف الجلسة؛ تبقى الجلسة إلى أن تعيد هذا الطلب.يحدد عدد الجلسات المطابقة كيفية الرد على الطلب، سواء حددتها باستخدام `session_numbers` أو باستخدام `delete_all`:| الجلسات المطابقة | الاستجابة |
| - | - |
| حتى 20 | `200 OK` بعد حذفها، مع نتيجة واحدة لكل جلسة مطابقة في `results`. |
| أكثر من 20 | `202 Accepted` مع مهمة حذف. تُحذف الجلسات في الخلفية؛ استعلم بشكل متكرر عن [الحصول على مهمة حذف الجلسات](https://docs.didit.me/ar/management-api/sessions/get-deletion-job.md) حتى تكتمل. |تؤكد النتيجة حذف الجلسة، إلا عندما تكون قيمة `face_retention_outcome` هي `failed_retryable`: فهذه الجلسة **لم تُحذف** وما زالت في مكانها، لذا عامل تلك النتيجة كفشل يجب إعادة محاولته، لا كتأكيد للحذف أبداً.
تُتخطى الأرقام التي لا تطابق جلسة KYC نشطة في تطبيقك، ولا تظهر في `results`.## تضييق نطاق `delete_all` بخيارات التصفيةمع `delete_all: true` يمكنك تضييق التحديد باستخدام خيارات التصفية في [عرض الجلسات](https://docs.didit.me/ar/sessions-api/list-sessions.md)، مع بادئة `filter_` لكل منها.
تقبل القيم نفسها التي تقبلها معاملات الاستعلام.
يقبل خيار التصفية الذي يأخذ عدة قيم (`status`، `workflow_id`، `country`، `region`، `document_type`، `document_name`، `session_type`، `warning`، `organization_name`) سلسلة نصية مفصولة بفواصل أو مصفوفة:```json theme={null}
{
  "delete_all": true,
  "filter_status": ["Declined"],
  "filter_workflow_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
  "filter_date_from": "2026-09-01",
  "filter_date_to": "2026-09-30"
}
```- تُطبَّق خيارات التصفية مع `delete_all` فقط؛ ومع `session_numbers` تُتحقق منها لكنها لا تغيّر التحديد.
- يأخذ كل خيار تصفية آخر قيمة واحدة.
  تُدمج المصفوفة في قيمة واحدة مفصولة بفواصل، لذا فإن عدة تواريخ أو معرّفات UUID أو قيم `api_service` تُرجع `400`، وعدة نصوص من `vendor_data` أو `search` أو `screened_full_name` لا تُطابَق كبدائل.
- يُتجاهل خيار التصفية ذو القيمة الفارغة، فلا يضيّق التحديد.
- يُرجع مفتاح `filter_*` غير معروف الاستجابة `400` مع `{"filter_reviewer": "Unknown filter."}`، وتُرجع القيمة التي لا يمكن قراءتها الاستجابة `400` بمفتاح `filter_*` نفسه، مثل `{"filter_date_from": ["Enter a valid date."]}`.
  لا يُحذف شيء في الحالتين، لذا فخيار التصفية المكتوب بشكل خاطئ لا يوسّع الحذف ليشمل كل الجلسات أبداً.
- تطبّق مهمة الحذف خيارات التصفية نفسها، وكأي `delete_all` تشمل فقط الجلسات التي أُنشئت قبل الطلب.## حقول الاحتفاظ والتعليماتيقبل هذا الـ endpoint الحقول الاختيارية نفسها التي يقبلها endpoint الجلسة الواحدة، ويطبّقها على كل جلسة مطابقة:| الحقل | النوع | الوصف |
| - | - | - |
| `retain_face_embeddings` | boolean أو null | تجاوز `face_retention_policy` الخاصة بالتطبيق لهذا الطلب. |
| `face_retention_days` | integer (1-3650) | مدة احتفاظ محددة للقوالب المحتفَظ بها. مطلوبة عند الاحتفاظ ما لم يحدد التطبيق `face_retention_days`. |
| `face_retention_deadline` | datetime (ISO 8601) | تاريخ انتهاء صارم اختياري، ويجب أن يكون في المستقبل. |
| `deletion_instruction` | `operational_session_delete` (الافتراضي) أو `privacy_erasure` | يمحو `privacy_erasure` كل قالب محتفَظ به للمستخدم الخاص بكل جلسة قبل حذف الجلسة، ولا يمكن دمجه مع `retain_face_embeddings: true`. |
| `instruction_id` | string (بحد أقصى 255) | مرجعك الدائم لهذه التعليمات. يُسجَّل في سجل التدقيق وفي كل قالب محتفَظ به. |راجع [حذف الجلسة](https://docs.didit.me/ar/sessions-api/delete-session.md#البيانات-البيومترية-للوجه-الحذف-أو-الاحتفاظ) لمعرفة ما يحويه القالب المحتفَظ به وما لا يحويه، وكيف يُحسب `expires_at`، وما الذي تفعله تعليمات محو الخصوصية.## نتائج كل جلسةللجلسات المطابقة حتى 20، تُرجع الاستجابة `200 OK` نتيجة واحدة لكل جلسة:```json theme={null}
{
  "results": [
    { "session_id": "4c5c7f3a-3b1d-4b7e-9c39-2b4f7e6a1d02", "session_number": 1001, "face_retention_outcome": "deleted", "biometric_template_uuid": null, "biometric_template_expires_at": null, "deleted_child_verifications": 0 },
    { "session_id": "b8e1d2c3-4f5a-4b6c-8d7e-9f0a1b2c3d4e", "session_number": 1002, "face_retention_outcome": "retained_with_user", "biometric_template_uuid": "9d2f4b6e-1c3a-4e8f-b7d5-0a1c2e3f4a5b", "biometric_template_expires_at": "2027-10-09T10:15:00Z", "deleted_child_verifications": 0 },
    { "session_id": "7a1e9c2d-5f4b-4c3a-8e2d-1b0a9f8e7d6c", "session_number": 1003, "face_retention_outcome": "ineligible_no_vendor_user", "biometric_template_uuid": null, "biometric_template_expires_at": null, "deleted_child_verifications": 0 },
    { "session_id": "c1d2e3f4-a5b6-4c7d-8e9f-0a1b2c3d4e5f", "session_number": 1004, "face_retention_outcome": "failed_retryable", "biometric_template_uuid": null, "biometric_template_expires_at": null, "deleted_child_verifications": 0 }
  ]
}
```تحتوي كل نتيجة على الحقول نفسها الموجودة في استجابة [حذف الجلسة](https://docs.didit.me/ar/sessions-api/delete-session.md#الاستجابة). `biometric_template_expires_at` هو الوقت الذي يُحذف فيه القالب المحتفَظ به، و`deleted_child_verifications` تكون دائماً `0` هنا لأن هذا الـ endpoint يحذف جلسات KYC فقط.| `face_retention_outcome` | المعنى |
| - | - |
| `deleted` | تُحذف الجلسة وتضمين الوجه. السلوك الافتراضي. |
| `retained_with_user` | تُحذف الجلسة. يبقى قالب بيومتري واحد خالٍ من الصور مرتبطاً بالمستخدم؛ ومعرّفه هو `biometric_template_uuid`. |
| `none` | لم يكن لدى الجلسة تضمين الوجه لحذفه أو الاحتفاظ به. |
| `ineligible_no_vendor_user` | طُلب الاحتفاظ، لكن الجلسة غير مرتبطة بمستخدم، لذا لا يوجد ما يثبّت القالب. تُحذف الجلسة وتضمين الوجه. |
| `failed_retryable` | تعذّر حذف المجموعة التي حُذفت هذه الجلسة ضمنها، لأن خدمة تخزين أو مخزناً بيومترياً أو مزود مراقبة كان غير متاح. هذه الجلسة **لم تُحذف** وما زالت في مكانها. أعد تشغيل الطلب من أجلها؛ وتنتهي المحاولات المتكررة إلى قالب واحد. |تُحذف الجلسات على شكل مجموعات. عندما يتعذّر حذف المجموعة، يُبلَّغ عن كل جلسة فيها بأنها `failed_retryable`؛ أما المجموعات الأخرى فلا تتأثر وتبقى محذوفة.## التحديدات الكبيرة تُنفَّذ كمهمةعند تطابق أكثر من 20 جلسة، تكون الاستجابة `202 Accepted` مع مهمة حذف بدلًا من `results`:```json theme={null}
{
  "job_id": "5b8f2c1e-7d3a-4f6b-9e2c-1a0d8f7e6c5b",
  "status": "PENDING",
  "total": 250,
  "processed": 0,
  "outcomes": { "deleted": 0, "none": 0, "retained_with_user": 0, "ineligible_no_vendor_user": 0, "failed_retryable": 0, "already_deleted": 0 },
  "deleted_child_verifications": 0,
  "error": null,
  "created_at": "2026-10-09T10:15:00Z",
  "completed_at": null
}
```استعلم عن [Get Session Deletion Job](https://docs.didit.me/ar/management-api/sessions/get-deletion-job.md) كل بضع ثوانٍ حتى تصبح قيمة `status` هي `COMPLETED` أو `FAILED`.- تُبلغ المهمة عن عدد الجلسات التي انتهت إلى كل نتيجة، ولا تُبلغ أبدًا عن الجلسات التي حذفتها.
- لا تحذف مهمة `delete_all` إلا الجلسات التي أُنشئت قبل طلبك. لا تُحذف الجلسات التي تبدأ أثناء تشغيلها.
- تنطبق حقول الاحتفاظ والتعليمات في طلبك على كل جلسة تحذفها المهمة.
- إذا تعذّر حذف مجموعة بعد، تعيد المهمة المحاولة تلقائيًا.
- تشرح المهمة الفاشلة (`FAILED`) السبب في الحقل `error`. الجلسات التي لم تصل إليها المهمة ما تزال موجودة: كرّر الطلب لحذفها.## أمثلة> [tab] الحذف حسب العدد
>
> ```bash theme={null}
> curl -X POST https://verification.didit.me/v3/sessions/delete/ \
>   -H "x-api-key: YOUR_API_KEY" \
>   -H "Content-Type: application/json" \
>   -d '{"session_numbers": ["1001", "1002", "1003"]}'
> ```> [tab] الحذف مع الاحتفاظ بالقوالب
>
> ```bash theme={null}
> curl -X POST https://verification.didit.me/v3/sessions/delete/ \
>   -H "x-api-key: YOUR_API_KEY" \
>   -H "Content-Type: application/json" \
>   -d '{
>     "session_numbers": ["1001", "1002"],
>     "retain_face_embeddings": true,
>     "face_retention_days": 365,
>     "instruction_id": "post-approval-cleanup-2026-08"
>   }'
> ```> [tab] محو لأغراض الخصوصية
>
> ```bash theme={null}
> curl -X POST https://verification.didit.me/v3/sessions/delete/ \
>   -H "x-api-key: YOUR_API_KEY" \
>   -H "Content-Type: application/json" \
>   -d '{
>     "session_numbers": ["1001"],
>     "deletion_instruction": "privacy_erasure",
>     "instruction_id": "dsar-2026-0142"
>   }'
> ```> [tab] الحذف الكامل ومتابعة المهمة
>
> ```bash theme={null}
> curl -X POST https://verification.didit.me/v3/sessions/delete/ \
>   -H "x-api-key: YOUR_API_KEY" \
>   -H "Content-Type: application/json" \
>   -d '{"delete_all": true}'
>
> # More than 20 sessions matched: the response is 202 with a job_id.
> curl https://verification.didit.me/v3/sessions/delete/JOB_ID/ \
>   -H "x-api-key: YOUR_API_KEY"
> ```## الانتقال من استجابات 204حتى هذا الإصدار كان endpoint يُرجع `204 No Content`. وهو الآن يُرجع `200 OK` مع `results[]`، أو `202 Accepted` مع مهمة حذف عند وجود أكثر من 20 جلسة مطابقة. حدّث العملاء الذين يتحققون من `204`. سلوك الحذف الافتراضي لم يتغير: تبقى التطبيقات الحالية على `delete_with_session` حتى تغيّر السياسة صراحةً.## ذات صلة- [حذف الجلسة](https://docs.didit.me/ar/sessions-api/delete-session.md)
- [Get Session Deletion Job](https://docs.didit.me/ar/management-api/sessions/get-deletion-job.md)
- [القوالب البيومترية](https://docs.didit.me/ar/management-api/biometric-templates/overview.md)
- [الاحتفاظ بالبيانات](https://docs.didit.me/ar/console/data-retention.md)


## OpenAPI

````yaml ar/openapi-25.json POST /v3/sessions/delete/
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/delete/:
    post:
      tags:
        - Sessions
      summary: حذف جلسات KYC بشكل جماعي حسب session_number
      description: >-
        حذف جماعي لجلسات التحقق من المستخدمين (KYC) باستخدام `session_number`
        الرقمي الخاص بها، أو حذف كل جلسات KYC في تطبيقك باستخدام `delete_all:
        true`.


        إن `session_number` هو العداد التصاعدي السهل على المستخدم قراءته المعروض
        في قائمة جلسات Console والمُعاد كـ `session_number` بواسطة endpoint
        لإنشاء الجلسة واتخاذ القرار؛ وهو **ليس** معرف UUID الخاص بـ
        `session_id`. لحذف جلسة بواسطة UUID، أو لحذف جلسة التحقق من الشركات
        (KYB)، والتي لا يتعامل معها هذا الـ endpoint مطلقاً، استخدم `DELETE
        /v3/session/{sessionId}/delete/` بدلاً من ذلك.


        **يتم حذف ما يصل إلى 20 جلسة ضمن الطلب، وما زاد عن ذلك يُنفذ كمهمة.**
        يحدد عدد الجلسات المطابقة ذلك، سواء حُددت بواسطة `session_numbers` أو
        عبر `delete_all`:

        - ما يصل إلى 20 جلسة مطابقة: يتم حذفها قبل إرجاع الاستجابة، والتي تكون
        `200` مع إدخال واحد لكل جلسة في `results[]`.

        - أكثر من 20: تكون الاستجابة `202` مع مهمة حذف، ويتم حذف الجلسات في
        الخلفية. استطلع `GET /v3/sessions/delete/{job_id}/` بانتظام حتى تصبح
        `status` هي `COMPLETED` أو `FAILED`. تبلغ المهمة عن الأعداد لكل نتيجة،
        ولا توضح مطلقاً أي الجلسات تم حذفها. تحذف مهمة `delete_all` فقط الجلسات
        التي تم إنشاؤها قبل الطلب؛ ولا يتم حذف الجلسات التي بدأت أثناء تشغيلها.


        تحصل كل جلسة محذوفة على نفس المعاملة تماماً مثل endpoint حذف الجلسة
        الفردية: يتم حذف الجلسة، وكل محاولة تحقق تحتويها، وقرارها وبياناتها
        المستخرجة، وسجلات الميزات المرتبطة بها (التحقق من الهوية، الوجه، كشف
        الحيوية، مطابقة الوجه، وما إلى ذلك) وجميع ملفاتها المخزنة، وتختفي من كل
        endpoint للقراءة، وتتوقف عناوين URL للوسائط الصادرة سابقاً عن العمل. يتم
        إسقاط عمليات تسليم webhook التي لا تزال في قائمة الانتظار لجلسة محذوفة،
        وكذلك عمليات إعادة المحاولة الخاصة بها؛ ولا تتأثر أحداث webhook التي تم
        تسليمها بالفعل. **لا** تتم إزالة إدخالات قائمة الحظر، و**لا** يتم
        استرداد الرصيد المستهلك بالفعل، و**لا** يتم حذف كيانات User الأصلية
        (استخدم `POST /v3/users/delete/` لتلك الكيانات)؛ ولا يتم إرسال أي
        webhook لعملية الحذف. الحذف نهائي ولا يمكن التراجع عنه.


        **دلالات التحديد:**

        - مع `delete_all: true` يمكنك تضييق نطاق التحديد باستخدام تصفيات `GET
        /v3/sessions/`، مسبوقة بـ `filter_` (على سبيل المثال `filter_status`،
        `filter_workflow_id`، `filter_date_from`). التصفيات التي تقبل قيماً
        متعددة في List Sessions (`status`، `workflow_id`، `country`، `region`،
        `document_type`، `document_name`، `session_type`، `warning`،
        `organization_name`) تقبل سلسلة مفصولة بفواصل أو مصفوفة؛ بينما تقبل
        الأخرى قيمة واحدة. يتم تجاهل القيمة الفارغة. تنطبق التصفيات فقط جنباً
        إلى جنب مع `delete_all`، وتطبق مهمة الحذف نفس التصفيات.

        - أي مفتاح `filter_*` غير معروف، أو قيمة تصفية لا يمكن قراءتها، يؤدي إلى
        رفض الطلب بأكمله بالرمز `400` قبل حذف أي شيء، بحيث لا تؤدي التصفية
        المكتوبة بشكل خاطئ إلى توسيع نطاق الحذف ليشمل جميع الجلسات.

        - الإدخالات في `session_numbers` التي لا تطابق جلسة KYC نشطة في تطبيقك
        (أرقام غير معروفة، أو جلسات محذوفة بالفعل، أو جلسات مملوكة لتطبيق آخر)
        يتم **تخطيها بصمت**: لا تظهر في `results` ولا تُحتسب ضمن `total` الخاص
        بالمهمة.

        - إخفاقات التحقق من الصحة (إدخال غير رقمي، أو قائمة فارغة، أو عدم توفير
        أي من `session_numbers` أو `delete_all`، أو الاحتفاظ بالقالب الذي لا
        يستطيع التطبيق الوفاء به) ترفض **الطلب بأكمله** بالرمز `400` ولا تحذف أي
        شيء.

        - يتم حذف الجلسات في مجموعات. إذا تعذر حذف مجموعة (على سبيل المثال بسبب
        عدم توفر خدمة التخزين)، يتم الإبلاغ عن كل جلسة في تلك المجموعة كـ
        `face_retention_outcome: failed_retryable` وتبقى في مكانها؛ ولا تتأثر
        المجموعات الأخرى. كرر الطلب لتلك الجلسات. تعيد المهمة محاولة هذه
        المجموعة من تلقاء نفسها.

        - لا يوجد حد أقصى موثق لطول القائمة؛ ويعد حد المعدل المشترك للكتابة
        (أدناه) هو الحد العملي.


        **البيانات البيومترية للوجه:** الحقول الاختيارية
        `retain_face_embeddings`، `face_retention_days`،
        `face_retention_deadline`، `deletion_instruction`، و`instruction_id` لها
        نفس المعنى كما في `DELETE /v3/session/{sessionId}/delete/` وتنطبق على كل
        جلسة مطابقة. تبلغ كل نتيجة عن `face_retention_outcome` الخاصة بها.


        **الاستجابة:** `200 OK` مع `results[]` لما يصل إلى 20 جلسة مطابقة، أو
        `202 Accepted` مع مهمة حذف لما زاد عن ذلك. تؤكد كل نتيجة الحذف باستثناء
        `face_retention_outcome: failed_retryable`، والتي تبلغ عن جلسة لم يتم
        حذفها ويجب إعادة المحاولة لها. كانت الإصدارات السابقة من هذا الـ
        endpoint ترجع `204 No Content`؛ يرجى تحديث البرمجيات العميلة التي تعتمد
        على `204`.


        **الـ idempotency:** إعادة نفس الطلب لا تحذف أي شيء إضافي: الأرقام التي
        لم تعد تطابق جلسة يتم تخطيها.


        **`delete_all: true` (إجراء تدميري):** تحذف **كل** جلسات KYC المتبقية في
        التطبيق؛ ويتم تجاهل `session_numbers` عند تعيينها. لا توجد خطوة تأكيد
        ولا يمكن التراجع.


        **المصادقة:** مفتاح API في الرأس `x-api-key`. بيانات الاعتماد المفقودة
        أو غير الصالحة ترجع `403` (`{"detail": "You do not have permission to
        perform this action."}`)؛ لا ترجع واجهة برمجة التطبيقات هذه `401`
        مطلقاً.


        **حد المعدل:** ميزانية كتابة مشتركة تبلغ 300 طلب/دقيقة لكل مفتاح API عبر
        جميع endpoint الخاصة بـ POST/PATCH/DELETE؛ وتجاوزها يرجع `429`.


        يقبل هذا الـ endpoint مفاتيح API فقط. يتم رفض رموز Bearer الخاصة بمستخدم
        Business Console بالرمز `403` (على عكس حذف الجلسة الفردية، الذي يقبل
        كليهما).


        **التقارير التنظيمية المودعة:** إذا كانت البيانات المحددة موجودة في
        تقرير تنظيمي نهائي، يتم رفض الطلب بأكمله بالرمز `409` ولا يتم حذف أي
        شيء. يستخدم نص الاستجابة `code: in_filed_report` ويسمي كل تقرير بـ
        `uuid`، `report_number`، `report_type` و`case_uuid`. احذف التقارير، ثم
        كرر الطلب.
      operationId: batch_delete_sessions
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                session_numbers:
                  type: array
                  description: >-
                    قيم `session_number` الرقمية لجلسات KYC المراد حذفها، كسلاسل
                    نصية تحتوي على أرقام فقط (يتم أيضاً قبول أرقام JSON وتحويلها
                    تلقائياً). مطلوب ما لم يكن `delete_all` بقيمة `true`؛ تُرجع
                    القائمة الفارغة الرمز `400`. يؤدي أي إدخال غير رقمي إلى رفض
                    الطلب بالكامل بالرمز `400` (ما لم يكن `delete_all` بقيمة
                    `true`، وفي هذه الحالة يتم تخطي التحقق وتجاهل المدخلات).
                    الأرقام التي لا تطابق جلسة فعلية في تطبيقك يتم تخطيها دون
                    إشعار.
                  items:
                    type: string
                    pattern: ^[0-9]+$
                    example: '1001'
                  minItems: 1
                  example:
                    - '1001'
                    - '1002'
                    - '1003'
                delete_all:
                  type: boolean
                  description: >-
                    عندما تكون `true`، تُحذف كل جلسة KYC متبقية في التطبيق
                    الطالب ويتم تجاهل `session_numbers`، ما لم تقم بتضييق نطاق
                    التحديد باستخدام مفاتيح `filter_*`. تُنفَّذ عملية الحذف
                    لأكثر من 20 جلسة متطابقة كمهمة حذف (`202`) تغطي فقط الجلسات
                    التي تم إنشاؤها قبل الطلب. القيمة الافتراضية هي `false`. لا
                    يمكن التراجع عن هذا الإجراء؛ لا توجد خطوة تأكيد.
                  default: false
                  example: false
                retain_face_embeddings:
                  type: boolean
                  nullable: true
                  description: >-
                    تجاوز `face_retention_policy` الخاصة بالتطبيق لعملية الحذف
                    هذه. القيمة `true` تحتفظ بقالب بيومتري واحد للوجه خالٍ من
                    الصور ومرتبط بمستخدم الجلسة بعد حذف الجلسة؛ والقيمة `false`
                    تحذف تضمين الوجه مع الجلسة؛ احذف المعامل أو عيّنه كـ `null`
                    لاتباع سياسة التطبيق. يتم تجاهله لجلسات KYB وللجلسات التي لا
                    تحتوي على تضمين للوجه.
                  example: true
                face_retention_days:
                  type: integer
                  minimum: 1
                  maximum: 3650
                  description: >-
                    مدة الاحتفاظ المحدودة، بالأيام، للقالب المحتفظ به. مطلوبة
                    عند الاحتفاظ بالقالب ما لم يكن التطبيق قد عيّن بالفعل
                    `face_retention_days`. يتم تعيين `expires_at` للقالب وفقاً
                    للتاريخ الأقرب بين هذه المدة، وفترة الاحتفاظ بالبيانات
                    العامة للتطبيق، و`face_retention_deadline`.
                  example: 365
                face_retention_deadline:
                  type: string
                  format: date-time
                  description: >-
                    انتهاء صلاحية نهائي اختياري لقالب تم الاحتفاظ به. يجب أن
                    يكون في المستقبل.
                  example: '2027-08-28T00:00:00Z'
                deletion_instruction:
                  type: string
                  enum:
                    - operational_session_delete
                    - privacy_erasure
                  default: operational_session_delete
                  description: >-
                    فئة التعليمات التي تقدمها. يقوم `operational_session_delete`
                    بحذف الجلسة والاحتفاظ بالقالب فقط عندما تنص السياسة أو
                    `retain_face_embeddings` على ذلك. بينما يقوم
                    `privacy_erasure` بمسح كل قالب بيومتري تم الاحتفاظ به ومرتبط
                    بمستخدم الجلسة قبل حذف الجلسة، ولا يمكن تجاوزه بواسطة سياسة
                    التطبيق، ولا يمكن دمجه مع `retain_face_embeddings: true`
                    (`400`).
                  example: operational_session_delete
                instruction_id:
                  type: string
                  maxLength: 255
                  description: >-
                    مرجعك الدائم لتعليمات الحذف هذه (على سبيل المثال معرّف تذكرة
                    المسح). يُسجل في سجل التدقيق وعلى أي قالب يتم الاحتفاظ به.
                    تنشئه Didit عند إغفاله.
                  example: dsar-2026-0142
                filter_status:
                  description: >-
                    يُضيّق نطاق `delete_all` ليشمل الجلسات التي تطابق تصفية
                    `status` في [List Sessions](/ar/sessions-api/list-sessions)،
                    بالقيم نفسها. سلسلة نصية مفصولة بفواصل أو مصفوفة. يتم تجاهله
                    بدون `delete_all`. يتم تجاهل القيمة الفارغة ولا تؤدي إلى
                    تضييق نطاق التحديد.
                  oneOf:
                    - type: string
                    - type: array
                      items:
                        type: string
                filter_vendor_data:
                  description: >-
                    يُضيّق نطاق `delete_all` ليشمل الجلسات التي تطابق تصفية
                    `vendor_data` في [List
                    Sessions](/ar/sessions-api/list-sessions)، بالقيمة نفسها.
                    قيمة واحدة، وليس قائمة: يتم دمج المصفوفة في نص واحد مفصول
                    بفواصل، لذا لا تتم مطابقة عدة قيم كبدائل. يتم تجاهله بدون
                    `delete_all`. يتم تجاهل القيمة الفارغة ولا تؤدي إلى تضييق
                    نطاق التحديد.
                  type: string
                filter_search:
                  description: >-
                    يُضيّق نطاق `delete_all` ليشمل الجلسات التي تطابق تصفية
                    `search` في [List Sessions](/ar/sessions-api/list-sessions)،
                    بالقيمة نفسها. قيمة واحدة، وليس قائمة: يتم دمج المصفوفة في
                    نص واحد مفصول بفواصل، لذا لا تتم مطابقة عدة قيم كبدائل. يتم
                    تجاهله بدون `delete_all`. يتم تجاهل القيمة الفارغة ولا تؤدي
                    إلى تضييق نطاق التحديد.
                  type: string
                filter_workflow_id:
                  description: >-
                    يُضيّق نطاق `delete_all` ليشمل الجلسات التي تطابق تصفية
                    `workflow_id` في [List
                    Sessions](/ar/sessions-api/list-sessions)، بالقيم نفسها.
                    سلسلة نصية مفصولة بفواصل أو مصفوفة. يتم تجاهله بدون
                    `delete_all`. يتم تجاهل القيمة الفارغة ولا تؤدي إلى تضييق
                    نطاق التحديد.
                  oneOf:
                    - type: string
                    - type: array
                      items:
                        type: string
                filter_date_from:
                  description: >-
                    يضيّق نطاق `delete_all` على الجلسات التي تطابق فلتر
                    `date_from` الخاص بـ [سرد
                    الجلسات](/ar/sessions-api/list-sessions)، بالقيمة نفسها.
                    قيمة واحدة وليست قائمة: يتم دمج المصفوفة في قيمة واحدة
                    مفصولة بفواصل، وبالتالي تُرفض القيم المتعددة بالرمز `400`.
                    يتم تجاهله بدون `delete_all`. يتم تجاهل القيمة الفارغة ولا
                    تؤدي إلى تضييق نطاق التحديد.
                  type: string
                  format: date
                filter_date_to:
                  description: >-
                    يضيّق نطاق `delete_all` على الجلسات التي تطابق فلتر
                    `date_to` الخاص بـ [سرد
                    الجلسات](/ar/sessions-api/list-sessions)، بالقيمة نفسها.
                    قيمة واحدة وليست قائمة: يتم دمج المصفوفة في قيمة واحدة
                    مفصولة بفواصل، وبالتالي تُرفض القيم المتعددة بالرمز `400`.
                    يتم تجاهله بدون `delete_all`. يتم تجاهل القيمة الفارغة ولا
                    تؤدي إلى تضييق نطاق التحديد.
                  type: string
                  format: date
                filter_country:
                  description: >-
                    يضيّق نطاق `delete_all` على الجلسات التي تطابق فلتر
                    `country` الخاص بـ [سرد
                    الجلسات](/ar/sessions-api/list-sessions)، بالقيم نفسها.
                    سلسلة نصية مفصولة بفواصل أو مصفوفة. يتم تجاهله بدون
                    `delete_all`. يتم تجاهل القيمة الفارغة ولا تؤدي إلى تضييق
                    نطاق التحديد.
                  oneOf:
                    - type: string
                    - type: array
                      items:
                        type: string
                filter_document_type:
                  description: >-
                    يضيّق نطاق `delete_all` على الجلسات التي تطابق فلتر
                    `document_type` الخاص بـ [سرد
                    الجلسات](/ar/sessions-api/list-sessions)، بالقيم نفسها.
                    سلسلة نصية مفصولة بفواصل أو مصفوفة. يتم تجاهله بدون
                    `delete_all`. يتم تجاهل القيمة الفارغة ولا تؤدي إلى تضييق
                    نطاق التحديد.
                  oneOf:
                    - type: string
                    - type: array
                      items:
                        type: string
                filter_document_name:
                  description: >-
                    يضيّق نطاق `delete_all` على الجلسات التي تطابق فلتر
                    `document_name` الخاص بـ [سرد
                    الجلسات](/ar/sessions-api/list-sessions)، بالقيم نفسها.
                    سلسلة نصية مفصولة بفواصل أو مصفوفة. يتم تجاهله بدون
                    `delete_all`. يتم تجاهل القيمة الفارغة ولا تؤدي إلى تضييق
                    نطاق التحديد.
                  oneOf:
                    - type: string
                    - type: array
                      items:
                        type: string
                filter_region:
                  description: >-
                    يُضيّق نطاق `delete_all` ليشمل الجلسات التي تطابق تصفية
                    `region` في [List Sessions](/ar/sessions-api/list-sessions)،
                    بالقيم نفسها. سلسلة نصية مفصولة بفواصل أو مصفوفة. يتم تجاهله
                    بدون `delete_all`. يتم تجاهل القيمة الفارغة ولا تؤدي إلى
                    تضييق نطاق التحديد.
                  oneOf:
                    - type: string
                    - type: array
                      items:
                        type: string
                filter_didit_internal_id:
                  description: >-
                    يضيّق نطاق `delete_all` على الجلسات التي تطابق فلتر
                    `didit_internal_id` الخاص بـ [سرد
                    الجلسات](/ar/sessions-api/list-sessions)، بالقيمة نفسها.
                    قيمة واحدة وليست قائمة: يتم دمج المصفوفة في قيمة واحدة
                    مفصولة بفواصل، وبالتالي تُرفض القيم المتعددة بالرمز `400`.
                    يتم تجاهله بدون `delete_all`. يتم تجاهل القيمة الفارغة ولا
                    تؤدي إلى تضييق نطاق التحديد.
                  type: string
                  format: uuid
                filter_session_type:
                  description: >-
                    يُضيّق نطاق `delete_all` ليشمل الجلسات التي تطابق تصفية
                    `session_type` في [List
                    Sessions](/ar/sessions-api/list-sessions)، بالقيم نفسها.
                    سلسلة نصية مفصولة بفواصل أو مصفوفة. يتم تجاهله بدون
                    `delete_all`. يتم تجاهل القيمة الفارغة ولا تؤدي إلى تضييق
                    نطاق التحديد.
                  oneOf:
                    - type: string
                    - type: array
                      items:
                        type: string
                filter_api_service:
                  description: >-
                    يضيّق نطاق `delete_all` على الجلسات التي تطابق فلتر
                    `api_service` الخاص بـ [سرد
                    الجلسات](/ar/sessions-api/list-sessions)، بالقيمة نفسها.
                    قيمة واحدة وليست قائمة: يتم دمج المصفوفة في قيمة واحدة
                    مفصولة بفواصل، وبالتالي تُرفض القيم المتعددة بالرمز `400`.
                    يتم تجاهله بدون `delete_all`. يتم تجاهل القيمة الفارغة ولا
                    تؤدي إلى تضييق نطاق التحديد.
                  type: string
                filter_screened_full_name:
                  description: >-
                    يُضيّق نطاق `delete_all` ليشمل الجلسات التي تطابق تصفية
                    `screened_full_name` في [List
                    Sessions](/ar/sessions-api/list-sessions)، بالقيمة نفسها.
                    قيمة واحدة، وليس قائمة: يتم دمج المصفوفة في نص واحد مفصول
                    بفواصل، لذا لا تتم مطابقة عدة قيم كبدائل. يتم تجاهله بدون
                    `delete_all`. يتم تجاهل القيمة الفارغة ولا تؤدي إلى تضييق
                    نطاق التحديد.
                  type: string
                filter_warning:
                  description: >-
                    يُضيّق نطاق `delete_all` ليشمل الجلسات التي تطابق تصفية
                    `warning` في [List
                    Sessions](/ar/sessions-api/list-sessions)، بالقيم نفسها.
                    سلسلة نصية مفصولة بفواصل أو مصفوفة. يتم تجاهله بدون
                    `delete_all`. يتم تجاهل القيمة الفارغة ولا تؤدي إلى تضييق
                    نطاق التحديد.
                  oneOf:
                    - type: string
                    - type: array
                      items:
                        type: string
                filter_status_initialized_as_in_review:
                  description: >-
                    يُضيّق نطاق `delete_all` ليشمل الجلسات التي تطابق تصفية
                    `status_initialized_as_in_review` في [List
                    Sessions](/ar/sessions-api/list-sessions)، بالقيم نفسها. يتم
                    تجاهله بدون `delete_all`. يتم تجاهل القيمة الفارغة ولا تؤدي
                    إلى تضييق نطاق التحديد.
                  type: boolean
                filter_is_kyc_to_be_reviewed:
                  description: >-
                    يضيّق نطاق `delete_all` على الجلسات التي تطابق فلتر
                    `is_kyc_to_be_reviewed` الخاص بـ [سرد
                    الجلسات](/ar/sessions-api/list-sessions)، بالقيم نفسها. يتم
                    تجاهله بدون `delete_all`. يتم تجاهل القيمة الفارغة ولا تؤدي
                    إلى تضييق نطاق التحديد.
                  type: boolean
                filter_euuid:
                  description: >-
                    يضيّق نطاق `delete_all` على الجلسات التي تطابق فلتر `euuid`
                    الخاص بـ [سرد الجلسات](/ar/sessions-api/list-sessions)،
                    بالقيمة نفسها. قيمة واحدة وليست قائمة: يتم دمج المصفوفة في
                    قيمة واحدة مفصولة بفواصل، وبالتالي تُرفض القيم المتعددة
                    بالرمز `400`. يتم تجاهله بدون `delete_all`. يتم تجاهل القيمة
                    الفارغة ولا تؤدي إلى تضييق نطاق التحديد.
                  type: string
                  format: uuid
                filter_organization_name:
                  description: >-
                    يُضيّق نطاق `delete_all` ليشمل الجلسات التي تطابق تصفية
                    `organization_name` في [List
                    Sessions](/ar/sessions-api/list-sessions)، بالقيم نفسها.
                    سلسلة نصية مفصولة بفواصل أو مصفوفة. عند استخدام مفتاح API،
                    لا يمكن أن يطابق سوى اسم مؤسستك الخاصة، لذا فإنه يحدد جميع
                    جلساتك أو لا يحدد أيًا منها. يتم تجاهله بدون `delete_all`.
                    يتم تجاهل القيمة الفارغة ولا تؤدي إلى تضييق نطاق التحديد.
                  oneOf:
                    - type: string
                    - type: array
                      items:
                        type: string
            examples:
              Specific sessions:
                summary: حذف جلسات محددة بالرقم
                value:
                  session_numbers:
                    - '1001'
                    - '1002'
                    - '1003'
              All sessions:
                summary: حذف كل جلسات KYC في التطبيق
                value:
                  delete_all: true
              Delete and retain templates:
                summary: >-
                  حذف الجلسات مع الاحتفاظ بالقوالب البيومترية الخالية من الصور
                  لمدة 365 يوماً
                value:
                  session_numbers:
                    - '1001'
                    - '1002'
                  retain_face_embeddings: true
                  face_retention_days: 365
                  instruction_id: post-approval-cleanup-2026-08
              Privacy erasure:
                summary: حذف الجلسات ومسح كل قالب محتفظ به للمستخدمين التابعين لها
                value:
                  session_numbers:
                    - '1001'
                  deletion_instruction: privacy_erasure
                  instruction_id: dsar-2026-0142
              Filtered delete_all:
                summary: >-
                  حذف جميع الجلسات المرفوضة لسير عمل واحد تم إنشاؤها في سبتمبر
                  2026
                value:
                  delete_all: true
                  filter_status:
                    - Declined
                  filter_workflow_id: 3fa85f64-5717-4562-b3fc-2c963f66afa6
                  filter_date_from: '2026-09-01'
                  filter_date_to: '2026-09-30'
      responses:
        '200':
          description: >-
            تمت مطابقة ومعالجة ما يصل إلى 20 جلسة في الطلب. نتيجة واحدة لكل جلسة
            متطابقة؛ ويتم تخطي الأرقام التي لم تطابق أي شيء (غير معروفة أو
            محذوفة بالفعل) ولا تظهر. تؤكد النتيجة الحذف إلا عندما تكون قيمة
            `face_retention_outcome` هي `failed_retryable`: لم تُحذف تلك الجلسة
            ويجب إعادة المحاولة.
          content:
            application/json:
              schema:
                type: object
                properties:
                  results:
                    type: array
                    items:
                      type: object
                      properties:
                        session_id:
                          type: string
                          format: uuid
                          description: الجلسة المحذوفة.
                        session_number:
                          type: integer
                          nullable: true
                          description: رقم الجلسة المحذوفة.
                        face_retention_outcome:
                          type: string
                          enum:
                            - retained_with_user
                            - deleted
                            - none
                            - ineligible_no_vendor_user
                            - failed_retryable
                          description: >-
                            ما حدث للبيانات البيومترية للوجه الخاصة بالجلسة.
                            `deleted`: تم حذف تضمين الوجه مع الجلسة (افتراضي).
                            `retained_with_user`: يتم حذف الجلسة ويظل قالب
                            بيومتري واحد خالٍ من الصور مرتبطاً بالمستخدم (User)؛
                            راجع `biometric_template_uuid`. `none`: لم تتضمن
                            الجلسة أي تضمين للوجه (على سبيل المثال جلسة KYC
                            تقتصر على المستندات فقط بدون صورة سيلفي لكشف
                            الحيوية؛ ولا يحدد هذا الـ endpoint جلسات KYB أبداً).
                            `ineligible_no_vendor_user`: تم طلب الاحتفاظ ولكن لا
                            يوجد مستخدم (User) مرتبط بالجلسة، لذا تم حذف التضمين
                            مع الجلسة. `failed_retryable` (في endpoint الخاص
                            بالدفعة فقط): تعذر حذف المجموعة التي تم حذف هذه
                            الجلسة معها (خدمة تخزين، أو مخزن بيانات بيومترية، أو
                            مزود مراقبة لم تكن متاحة)؛ لا تزال هذه الجلسة قائمة،
                            كرر الطلب من أجلها.
                        biometric_template_uuid:
                          type: string
                          format: uuid
                          nullable: true
                          description: >-
                            معرّف القالب البيومتري المحتفظ به عندما تكون قيمة
                            `face_retention_outcome` هي `retained_with_user`؛
                            و`null` بخلاف ذلك. يمكنك إدارته عبر
                            `/v3/biometric-templates/{template_uuid}/`.
                        biometric_template_expires_at:
                          type: string
                          format: date-time
                          nullable: true
                          description: >-
                            متى يُحذف القالب البيومتري المحتفظ به، عندما تكون
                            قيمة `face_retention_outcome` هي
                            `retained_with_user`؛ وتكون `null` عند عدم الاحتفاظ
                            بأي قالب.
                        deleted_child_verifications:
                          type: integer
                          description: >-
                            دائماً `0` في هذا الـ endpoint، الذي يحذف جلسات KYC
                            فقط. حذف جلسة التحقق من الشركات (KYB) باستخدام
                            `DELETE /v3/session/{sessionId}/delete/` يُبلغ عن
                            عمليات التحقق التي أنشأتها وحُذفت معها.
              examples:
                Mixed outcomes:
                  value:
                    results:
                      - session_id: 4c5c7f3a-3b1d-4b7e-9c39-2b4f7e6a1d02
                        session_number: 1001
                        face_retention_outcome: deleted
                        biometric_template_uuid: null
                        biometric_template_expires_at: null
                        deleted_child_verifications: 0
                      - session_id: b8e1d2c3-4f5a-4b6c-8d7e-9f0a1b2c3d4e
                        session_number: 1002
                        face_retention_outcome: retained_with_user
                        biometric_template_uuid: 9d2f4b6e-1c3a-4e8f-b7d5-0a1c2e3f4a5b
                        biometric_template_expires_at: '2027-10-09T10:15:00Z'
                        deleted_child_verifications: 0
                      - session_id: 7a1e9c2d-5f4b-4c3a-8e2d-1b0a9f8e7d6c
                        session_number: 1003
                        face_retention_outcome: ineligible_no_vendor_user
                        biometric_template_uuid: null
                        biometric_template_expires_at: null
                        deleted_child_verifications: 0
                      - session_id: c1d2e3f4-a5b6-4c7d-8e9f-0a1b2c3d4e5f
                        session_number: 1004
                        face_retention_outcome: failed_retryable
                        biometric_template_uuid: null
                        biometric_template_expires_at: null
                        deleted_child_verifications: 0
        '202':
          description: >-
            تطابقت أكثر من 20 جلسة. يتم حذفها في الخلفية؛ قم بالاستقصاء الدوري
            عبر `GET /v3/sessions/delete/{job_id}/` حتى تصبح `status` هي
            `COMPLETED` أو `FAILED`.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SessionDeletionJob'
              examples:
                Job accepted:
                  value:
                    job_id: 5b8f2c1e-7d3a-4f6b-9e2c-1a0d8f7e6c5b
                    status: PENDING
                    total: 250
                    processed: 0
                    outcomes:
                      deleted: 0
                      none: 0
                      retained_with_user: 0
                      ineligible_no_vendor_user: 0
                      failed_retryable: 0
                      already_deleted: 0
                    deleted_child_verifications: 0
                    error: null
                    created_at: '2026-10-09T10:15:00Z'
                    completed_at: null
        '400':
          description: >-
            خطأ في التحقق من الصحة — لم يُحذف أي شيء. قيم الأخطاء هي مصفوفات من
            سلاسل الرسائل النصية المفهرسة باسم الحقل.
          content:
            application/json:
              schema:
                type: object
                properties:
                  session_numbers:
                    type: array
                    items:
                      type: string
                additionalProperties:
                  description: >-
                    مفاتيح أخرى: مفتاح `filter_*` ليس عامل تصفية لـ List
                    Sessions (`"Unknown filter."`‎)، أو مفتاح `filter_*` لا يمكن
                    قراءة قيمته (مفهرس بمفتاح `filter_*` هذا، مع مصفوفة من
                    الرسائل).
              examples:
                Missing selector:
                  summary: لم يتم تقديم session_numbers ولا delete_all
                  value:
                    session_numbers:
                      - This field is required unless delete_all is true.
                Empty list:
                  summary: session_numbers مصفوفة فارغة
                  value:
                    session_numbers:
                      - This list may not be empty.
                Non-numeric entry:
                  summary: session_numbers يحتوي على سلسلة نصية غير رقمية
                  value:
                    session_numbers:
                      - All session_numbers must be numeric.
                Privacy erasure cannot retain:
                  summary: >-
                    جمع بين deletion_instruction من نوع privacy_erasure مع ضبط
                    retain_face_embeddings على true
                  value:
                    retain_face_embeddings:
                      - Privacy erasure cannot retain biometric templates.
                No finite retention duration:
                  summary: طُلب الاحتفاظ بدون face_retention_days في الطلب أو التطبيق
                  value:
                    detail: >-
                      A finite biometric-template retention duration is
                      required.
                Unknown filter:
                  summary: مفتاح filter_* لا يتوفر لدى List Sessions
                  value:
                    filter_reviewer: Unknown filter.
                Unreadable filter value:
                  summary: قيمة تصفية يتعذر قراءتها
                  value:
                    filter_date_from:
                      - Enter a valid date.
        '403':
          description: >-
            مفتاح API مفقود. يؤدي المفتاح المفقود إلى إرجاع `403`؛ بينما يؤدي
            المفتاح الخاطئ أو الملغى أو منتهي الصلاحية إلى إرجاع `401`.
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
              examples:
                Missing or invalid API key:
                  summary: لا يوجد رأس x-api-key، أو أن المفتاح غير صالح
                  value:
                    detail: You do not have permission to perform this action.
        '409':
          description: جلسة محددة هي جزء من تقرير تنظيمي نهائي. لم يُحذف أي شيء.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/InFiledReportError'
        '429':
          description: >-
            تم تجاوز حد معدل الكتابة المشترك (300 طلب POST/PATCH/DELETE في
            الدقيقة لكل مفتاح API). افحص `Retry-After` ورؤوس الاستجابة
            `X-RateLimit-*` قبل إعادة المحاولة.
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
              examples:
                Rate limited:
                  summary: تم استنفاد ميزانية الكتابة
                  value:
                    detail: >-
                      Write request rate limit exceeded. You can make up to 300
                      requests per minute.
      security:
        - ApiKeyAuth: []
      x-codeSamples:
        - lang: curl
          label: curl
          source: |-
            curl -X POST \
              https://verification.didit.me/v3/sessions/delete/ \
              -H 'x-api-key: YOUR_API_KEY' \
              -H 'Content-Type: application/json' \
              -d '{
                "session_numbers": ["1001", "1002", "1003"]
              }'
        - lang: python
          label: Python
          source: |-
            from didit import Didit

            # Reads DIDIT_API_KEY.
            client = Didit()

            result = client.sessions.batch_delete(
                session_numbers=["1001", "1002", "1003"],
            )
            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.batchDelete({
              session_numbers: ["1001", "1002", "1003"],
            });
            console.log(result);
        - lang: go
          label: Go
          source: "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Sessions.BatchDelete(ctx, didit.SessionsBatchDeleteParams{\n\tSessionNumbers: didit.Some([]string{\"1001\", \"1002\", \"1003\"}),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
        - lang: java
          label: Java
          source: >-
            import java.util.List;

            import me.didit.Didit;

            import me.didit.types.SessionsBatchDeleteParams;


            // Reads DIDIT_API_KEY.

            Didit client = new Didit();


            var result =
            client.sessions().batchDelete(SessionsBatchDeleteParams.builder()
                    .sessionNumbers(List.of("1001", "1002", "1003"))
                    .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->batchDelete([
                'session_numbers' => ['1001', '1002', '1003'],
            ]);
            print_r($result->toArray());
        - lang: ruby
          label: Ruby
          source: >-
            require "didit"


            # Reads DIDIT_API_KEY.

            didit = Didit::Client.new


            result = didit.sessions.batch_delete(session_numbers: ["1001",
            "1002", "1003"])

            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.BatchDeleteAsync(new
            SessionsBatchDeleteParams

            {
                SessionNumbers = new string[] { "1001", "1002", "1003" },
            });

            Console.WriteLine(JsonSerializer.Serialize(result));
components:
  schemas:
    SessionDeletionJob:
      type: object
      description: >-
        عملية حذف مجمع للجلسات قيد التشغيل في الخلفية: التقدم والأعداد لكل
        نتيجة، دون تحديد الجلسات التي حُذفت على الإطلاق.
      properties:
        job_id:
          type: string
          format: uuid
          description: >-
            استعلم دورياً عن `GET /v3/sessions/delete/{job_id}/` باستخدام هذا
            المعرّف.
        status:
          type: string
          enum:
            - PENDING
            - PROCESSING
            - COMPLETED
            - FAILED
          description: >-
            `PENDING`: مقبولة، لم تبدأ بعد. `PROCESSING`: جارٍ الحذف؛ يجري تحديث
            `processed` و`outcomes`. `COMPLETED`: تمت معالجة جميع الجلسات
            المحددة. `FAILED`: توقفت المهمة مبكراً؛ راجع `error`.
        total:
          type: integer
          description: الجلسات المحددة عند طلب الحذف.
        processed:
          type: integer
          description: الجلسات التي انتهت المهمة من معالجتها حتى الآن.
        outcomes:
          type: object
          description: عدد الجلسات التي انتهت بكل نتيجة. كل مفتاح موجود دائماً.
          properties:
            deleted:
              type: integer
              description: الجلسات المحذوفة مع تضمين الوجه الخاص بها.
            none:
              type: integer
              description: الجلسات المحذوفة التي لم تكن تحتوي على تضمين الوجه.
            retained_with_user:
              type: integer
              description: >-
                الجلسات المحذوفة مع الاحتفاظ بقالب بيومتري واحد خالٍ من الصور
                لمستخدمها، وفقًا لما طلبه الطلب أو أوجبته سياسة التطبيق.
            ineligible_no_vendor_user:
              type: integer
              description: >-
                الجلسات المحذوفة، مع تضمين الوجه الخاص بها، لأنه طُلب الاحتفاظ
                بها ولكن لم يكن لديها مستخدم مرتبط.
            failed_retryable:
              type: integer
              description: >-
                الجلسات التي تم الإبلاغ عن عدم حذفها. تعيد المهمة محاولة معالجة
                مجموعة لم تتمكن من حذفها بنفسها بدلاً من احتسابها هنا.
            already_deleted:
              type: integer
              description: >-
                الجلسات المحددة التي كانت محذوفة بالفعل، على سبيل المثال بواسطة
                طلب آخر، عندما وصلت المهمة إليها.
        deleted_child_verifications:
          type: integer
          description: >-
            عمليات التحقق التي أنشأتها عمليات التحقق من الشركات المحذوفة، والتي
            حُذفت معها. دائماً `0` للمهمة التي بدأت بواسطة `POST
            /v3/sessions/delete/`، والتي تحذف جلسات KYC فقط.
        error:
          type: string
          nullable: true
          description: >-
            `null` ما لم تكن `status` هي `FAILED`؛ وحينها يبيّن سبب توقف الحذف.
            الجلسات التي لم تصل إليها المهمة تظل في مكانها: كرر الطلب لحذفها.
        created_at:
          type: string
          format: date-time
          description: وقت طلب الحذف.
        completed_at:
          type: string
          format: date-time
          nullable: true
          description: متى انتهت المهمة؛ `null` أثناء تشغيلها.
    InFiledReportError:
      type: object
      description: >-
        رُفض الحذف لأن البيانات المحددة مدرجة في تقرير تنظيمي نهائي. لم يُحذف أي
        شيء. احذف التقرير، ثم كرر الطلب.
      required:
        - detail
        - code
      properties:
        detail:
          type: string
        code:
          type: string
          enum:
            - in_filed_report
          description: رمز خطأ ثابت لعملية حذف محظورة بسبب تقرير تنظيمي نهائي.
        reports:
          type: array
          items:
            $ref: '#/components/schemas/FiledRegulatoryReport'
          description: التقارير التي تمنع حذف شخص أو شركة أو حالة أو جلسة.
        transactions:
          type: array
          items:
            $ref: '#/components/schemas/FiledReportTransaction'
          description: المعاملات التي تمنع حذف المعاملة، مع التقارير التي تدرج كل منها.
    FiledRegulatoryReport:
      type: object
      description: تقرير تنظيمي مكتمل يمنع الحذف المطلوب.
      required:
        - uuid
        - report_number
        - report_type
        - case_uuid
      properties:
        uuid:
          type: string
          format: uuid
          description: معرّف UUID للتقرير.
        report_number:
          type: string
          description: رقم التقرير المعروض في Console (على سبيل المثال، SAR-0001).
        report_type:
          type: string
          enum:
            - SAR
            - STR
            - CTR
            - TTR
            - UTR
            - IFT
            - CBR
            - TFR
          description: نوع التقرير التنظيمي.
        case_uuid:
          type: string
          format: uuid
          description: الحالة التي ينتمي إليها التقرير.
    FiledReportTransaction:
      type: object
      description: معاملة لا يمكن حذفها لأن تقريراً تنظيمياً نهائياً يدرجها.
      required:
        - uuid
        - transaction_id
        - reports
      properties:
        uuid:
          type: string
          format: uuid
          description: معرّف UUID لمعاملة Didit.
        transaction_id:
          type: string
          description: معرّف المعاملة المقدَّم عند إنشاء المعاملة.
        reports:
          type: array
          items:
            $ref: '#/components/schemas/FiledRegulatoryReport'
          description: التقارير المكتملة التي تتضمن هذه المعاملة.
  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.