> ## 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 para eliminar sesiones en lote: limpieza de KYC

> Elimina sesiones KYC en lote con Didit, por número de sesión o todas. Hasta 20 dan resultado por sesión; si son más, un trabajo que consultas.



Prompt para eliminar sesiones en lote
        Copiar el prompt al portapapeles



      
      

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



      
      

Pegar en

## ComportamientoCada sesión seleccionada se elimina exactamente igual que con [Eliminar sesión](https://docs.didit.me/es/sessions-api/delete-session.md): se eliminan la sesión, todos los intentos de verificación que contiene, su decisión y los datos extraídos, sus registros de funciones y todos sus archivos almacenados; además, desaparece de todos los endpoints de lectura y las URL de contenido multimedia emitidas previamente dejan de resolverse. Las entregas de webhook que sigan en cola para una sesión eliminada, junto con sus reintentos, se descartan; los webhooks ya entregados no se ven afectados. La eliminación es permanente e irreversible.Si alguna de las sesiones seleccionadas forma parte de un informe regulatorio finalizado, toda la solicitud devuelve `409` y no se elimina nada. La respuesta usa `code: in_filed_report` e indica cada informe. Elimina cada informe con [Eliminar informe](https://docs.didit.me/es/management-api/regulatory-reports/delete.md) y luego repite la solicitud. Eliminar el informe no elimina la sesión; la sesión se mantiene hasta que repitas esta solicitud.El número de sesiones coincidentes determina cómo se responde la solicitud, tanto si las seleccionas con `session_numbers` como con `delete_all`:| Sesiones coincidentes | Respuesta |
| - | - |
| Hasta 20 | `200 OK` una vez eliminadas, con un resultado por cada sesión coincidente en `results`. |
| Más de 20 | `202 Accepted` con un trabajo de eliminación. Las sesiones se eliminan en segundo plano; consulta [Obtener trabajo de eliminación de sesiones](https://docs.didit.me/es/management-api/sessions/get-deletion-job.md) hasta que termine. |Un resultado confirma que la sesión se eliminó, salvo cuando su `face_retention_outcome` es `failed_retryable`: esa sesión **no** se eliminó y sigue existiendo, así que trata ese resultado como un fallo que debes reintentar, nunca como confirmación de eliminación.
Los números que no corresponden a una sesión KYC activa de tu aplicación se omiten y no aparecen en `results`.## Acotar `delete_all` con filtrosCon `delete_all: true` puedes acotar la selección con los filtros de [Listar sesiones](https://docs.didit.me/es/sessions-api/list-sessions.md), cada uno con el prefijo `filter_`.
Aceptan los mismos valores que los parámetros de consulta.
Un filtro que admite varios valores (`status`, `workflow_id`, `country`, `region`, `document_type`, `document_name`, `session_type`, `warning`, `organization_name`) acepta una cadena separada por comas o un array:```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"
}
```- Los filtros solo se aplican junto con `delete_all`; con `session_numbers` se validan, pero no cambian la selección.
- Todos los demás filtros admiten un único valor.
  Un array se une en un único valor separado por comas, por lo que varias fechas, UUID o valores de `api_service` devuelven `400`, y varios textos de `vendor_data`, `search` o `screened_full_name` no se tratan como alternativas.
- Un filtro con un valor vacío se ignora, por lo que no acota la selección.
- Una clave `filter_*` desconocida devuelve `400` `{"filter_reviewer": "Unknown filter."}`, y un valor que no se puede interpretar devuelve `400` con esa clave `filter_*`, como `{"filter_date_from": ["Enter a valid date."]}`.
  En ninguno de los dos casos se elimina nada, de modo que un filtro mal escrito nunca amplía la eliminación a todas las sesiones.
- Un trabajo de eliminación aplica los mismos filtros y, como todo `delete_all`, solo abarca las sesiones creadas antes de la solicitud.## Campos de retención e instrucciónEl endpoint acepta los mismos campos opcionales que el endpoint de sesión individual y los aplica a cada sesión coincidente:| Campo | Tipo | Descripción |
| - | - | - |
| `retain_face_embeddings` | booleano o null | Anula la `face_retention_policy` de la aplicación para esta solicitud. |
| `face_retention_days` | entero (1-3650) | Duración finita de retención para las plantillas retenidas. Obligatorio al retener, salvo que la aplicación defina `face_retention_days`. |
| `face_retention_deadline` | fecha y hora (ISO 8601) | Caducidad estricta opcional; debe ser una fecha futura. |
| `deletion_instruction` | `operational_session_delete` (predeterminado) o `privacy_erasure` | `privacy_erasure` purga todas las plantillas retenidas del usuario de cada sesión antes de eliminar la sesión y no se puede combinar con `retain_face_embeddings: true`. |
| `instruction_id` | cadena (máx. 255) | Tu referencia persistente para esta instrucción. Se registra en el registro de auditoría y en cada plantilla retenida. |Consulta [Eliminar sesión](https://docs.didit.me/es/sessions-api/delete-session.md#datos-biométricos-faciales-eliminar-o-conservar) para saber qué contiene y qué no contiene una plantilla retenida, cómo se calcula `expires_at` y qué hace una instrucción de eliminación por privacidad.## Resultados por sesiónCon hasta 20 sesiones coincidentes, `200 OK` devuelve un resultado por sesión:```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 }
  ]
}
```Cada resultado incluye los mismos campos que la respuesta de [Eliminar sesión](https://docs.didit.me/es/sessions-api/delete-session.md#respuesta). `biometric_template_expires_at` indica cuándo se elimina una plantilla retenida, y `deleted_child_verifications` siempre es `0` aquí, porque este endpoint solo elimina sesiones KYC.| `face_retention_outcome` | Significado |
| - | - |
| `deleted` | La sesión y su embedding facial se eliminan. Comportamiento predeterminado. |
| `retained_with_user` | La sesión se elimina. Una plantilla biométrica sin imágenes permanece vinculada al usuario; su id es `biometric_template_uuid`. |
| `none` | La sesión no tenía ningún embedding facial que eliminar o retener. |
| `ineligible_no_vendor_user` | Se solicitó la retención, pero la sesión no está vinculada a un usuario, por lo que no hay nada a lo que vincular una plantilla. La sesión y su embedding se eliminan. |
| `failed_retryable` | El grupo con el que se iba a eliminar esta sesión no se pudo eliminar porque un servicio de almacenamiento, un almacén biométrico o un proveedor de monitorización no estaba disponible. Esta sesión **no** se eliminó y sigue existiendo. Vuelve a ejecutar la solicitud para ella; los reintentos convergen en una única plantilla. |Las sesiones se eliminan en grupos. Cuando un grupo no se puede eliminar, todas sus sesiones se indican como `failed_retryable`; los demás grupos no se ven afectados y siguen eliminados.## Las selecciones grandes se ejecutan como un trabajoCuando coinciden más de 20 sesiones, la respuesta es `202 Accepted` con un trabajo de eliminación en lugar de `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
}
```Consulta [Get Session Deletion Job](https://docs.didit.me/es/management-api/sessions/get-deletion-job.md) cada pocos segundos hasta que `status` sea `COMPLETED` o `FAILED`.- El trabajo informa cuántas sesiones finalizaron con cada resultado, pero nunca indica qué sesiones eliminó.
- Un trabajo `delete_all` elimina solo las sesiones creadas antes de tu solicitud. Las sesiones iniciadas mientras se ejecuta no se eliminan.
- Los campos de retención e instrucciones de tu solicitud se aplican a todas las sesiones que elimina el trabajo.
- Si un grupo todavía no se puede eliminar, el trabajo lo reintenta por sí solo.
- Un trabajo `FAILED` explica el motivo en `error`. Las sesiones a las que no había llegado siguen existiendo: repite la solicitud para eliminarlas.## Ejemplos> [tab] Eliminar por número
>
> ```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] Eliminar y conservar plantillas
>
> ```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] Borrado por motivos de privacidad
>
> ```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] Eliminar todo y consultar periódicamente el trabajo
>
> ```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"
> ```## Migración desde respuestas 204Hasta esta versión, el endpoint devolvía `204 No Content`. Ahora devuelve `200 OK` con `results[]`, o `202 Accepted` con un trabajo de eliminación cuando coinciden más de 20 sesiones. Actualiza los clientes que comprueban `204`. El comportamiento de eliminación predeterminado no cambia: las aplicaciones existentes siguen con `delete_with_session` hasta que cambies la política de forma explícita.## Relacionado- [Eliminar sesión](https://docs.didit.me/es/sessions-api/delete-session.md)
- [Obtener trabajo de eliminación de sesión](https://docs.didit.me/es/management-api/sessions/get-deletion-job.md)
- [Plantillas biométricas](https://docs.didit.me/es/management-api/biometric-templates/overview.md)
- [Retención de datos](https://docs.didit.me/es/console/data-retention.md)


## OpenAPI

````yaml es/openapi-25.json POST /v3/sessions/delete/
openapi: 3.0.0
info:
  version: 3.0.0
  title: Didit Verification API
  description: API de verificación de identidad. Autentícate con el encabezado x-api-key.
servers:
  - url: https://verification.didit.me
security: []
tags: []
paths:
  /v3/sessions/delete/:
    post:
      tags:
        - Sessions
      summary: Eliminar en bloque sesiones de KYC por session_number
      description: >-
        Elimina en bloque sesiones de Verificación de usuarios (KYC) por su
        `session_number` numérico, o todas las sesiones KYC de tu aplicación con
        `delete_all: true`.


        `session_number` es el contador incremental y fácil de leer que se
        muestra en la lista de sesiones de la consola y que los endpoints de
        creación de sesión y de decisión devuelven como `session_number`; **no**
        es el UUID `session_id`. Para eliminar una sesión por su UUID, o para
        eliminar una sesión de Verificación de empresas (KYB), que este endpoint
        nunca toca, usa `DELETE /v3/session/{sessionId}/delete/` en su lugar.


        **Hasta 20 sesiones se eliminan dentro de la solicitud; si son más, se
        procesan como un trabajo.** Lo que decide es el número de sesiones que
        coinciden, tanto si se seleccionan con `session_numbers` como con
        `delete_all`:

        - Hasta 20 sesiones coincidentes: se eliminan antes de la respuesta, que
        es `200` con una entrada por sesión en `results[]`.

        - Más de 20: la respuesta es `202` con un trabajo de eliminación, y las
        sesiones se eliminan en segundo plano. Consulta `GET
        /v3/sessions/delete/{job_id}/` hasta que `status` sea `COMPLETED` o
        `FAILED`. Un trabajo informa de recuentos por resultado, nunca de qué
        sesiones eliminó. Un trabajo con `delete_all` elimina solo las sesiones
        creadas antes de la solicitud; las sesiones iniciadas mientras se
        ejecuta no se eliminan.


        Cada sesión eliminada recibe exactamente el mismo tratamiento que con el
        endpoint de eliminación de una sola sesión: se eliminan la sesión, todos
        los intentos de verificación que contiene, su decisión y los datos
        extraídos, sus registros de funciones relacionados (verificación de
        identidad, rostro, prueba de vida, coincidencia facial, etc.) y todos
        sus archivos almacenados; desaparece de todos los endpoints de lectura y
        las URL de medios emitidas anteriormente dejan de resolverse. Las
        entregas de webhook que sigan en cola para una sesión eliminada, y sus
        reintentos, se descartan; los webhooks ya entregados no se ven
        afectados. Las entradas de la lista de bloqueo **no** se eliminan, los
        créditos ya consumidos **no** se reembolsan y las entidades User
        principales **no** se eliminan (usa `POST /v3/users/delete/` para ello);
        no se emite ningún webhook por la eliminación. La eliminación es
        permanente e irreversible.


        **Semántica de la selección:**

        - Con `delete_all: true` puedes acotar la selección con los filtros de
        `GET /v3/sessions/`, cada uno con el prefijo `filter_` (por ejemplo,
        `filter_status`, `filter_workflow_id`, `filter_date_from`). Los filtros
        que admiten varios valores en List Sessions (`status`, `workflow_id`,
        `country`, `region`, `document_type`, `document_name`, `session_type`,
        `warning`, `organization_name`) aceptan una cadena separada por comas o
        un array; los demás admiten un solo valor. Un valor vacío se ignora. Los
        filtros solo se aplican junto con `delete_all`, y un trabajo de
        eliminación aplica los mismos filtros.

        - Una clave `filter_*` desconocida, o un valor de filtro que no se puede
        interpretar, rechaza toda la solicitud con `400` antes de eliminar nada,
        de modo que un filtro mal escrito nunca amplía la eliminación a todas
        las sesiones.

        - Las entradas de `session_numbers` que no coinciden con una sesión KYC
        activa de tu aplicación (números desconocidos, sesiones ya eliminadas o
        sesiones de otra aplicación) se **omiten sin avisar**: no aparecen en
        `results` y no se cuentan en el `total` de un trabajo.

        - Los errores de validación (una entrada no numérica, una lista vacía,
        no indicar ni `session_numbers` ni `delete_all`, o una retención de
        plantilla que la aplicación no puede cumplir) rechazan **toda la
        solicitud** con `400` y no eliminan nada.

        - Las sesiones se eliminan por grupos. Si un grupo no se puede eliminar
        (por ejemplo, porque un servicio de almacenamiento no está disponible),
        todas las sesiones de ese grupo se notifican como
        `face_retention_outcome: failed_retryable` y se conservan; los demás
        grupos no se ven afectados. Repite la solicitud para esas sesiones. Un
        trabajo reintenta ese grupo por sí mismo.

        - No hay un límite documentado para la longitud de la lista; el límite
        práctico es el límite de solicitudes de escritura compartido (ver más
        abajo).


        **Datos biométricos faciales:** los campos opcionales
        `retain_face_embeddings`, `face_retention_days`,
        `face_retention_deadline`, `deletion_instruction` e `instruction_id`
        tienen el mismo significado que en `DELETE
        /v3/session/{sessionId}/delete/` y se aplican a todas las sesiones
        coincidentes. Cada resultado indica su propio `face_retention_outcome`.


        **Respuesta:** `200 OK` con `results[]` para hasta 20 sesiones
        coincidentes, o `202 Accepted` con un trabajo de eliminación si son más.
        Todos los resultados confirman la eliminación excepto
        `face_retention_outcome: failed_retryable`, que indica una sesión que NO
        se eliminó y que debe reintentarse. Las versiones anteriores de este
        endpoint devolvían `204 No Content`; actualiza los clientes que
        comprueban `204`.


        **Idempotencia:** repetir la misma solicitud no elimina nada más: los
        números que ya no coinciden con una sesión se omiten.


        **`delete_all: true` (destructivo):** elimina **todas** las sesiones KYC
        restantes de la aplicación; `session_numbers` se ignora si se indica. No
        hay paso de confirmación ni forma de deshacerlo.


        **Autenticación:** clave de API en el encabezado `x-api-key`. Si las
        credenciales faltan o no son válidas, se devuelve `403` (`{"detail":
        "You do not have permission to perform this action."}`); esta API nunca
        devuelve `401`.


        **Límite de solicitudes:** presupuesto de escritura compartido de 300
        solicitudes/min por clave de API entre todos los endpoints
        POST/PATCH/DELETE; si se supera, se devuelve `429`.


        Este endpoint solo acepta claves de API. Los tokens Bearer de usuarios
        de Business Console se rechazan con `403` (a diferencia de la
        eliminación de una sola sesión, que acepta ambos).


        **Informes regulatorios presentados:** si los datos seleccionados están
        en un informe regulatorio finalizado, toda la solicitud se rechaza con
        `409` y no se elimina nada. El cuerpo usa `code: in_filed_report` e
        identifica cada informe con `uuid`, `report_number`, `report_type` y
        `case_uuid`. Elimina los informes y repite la solicitud.
      operationId: batch_delete_sessions
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                session_numbers:
                  type: array
                  description: >-
                    Valores numéricos de `session_number` de las sesiones de KYC
                    que se van a eliminar, como cadenas que solo contienen
                    dígitos (también se aceptan números JSON, que se
                    convierten). Es obligatorio salvo que `delete_all` sea
                    `true`; una lista vacía devuelve `400`. Cualquier entrada
                    que no sea solo dígitos rechaza toda la solicitud con `400`
                    (salvo que `delete_all` sea `true`, en cuyo caso se omite la
                    validación y las entradas se ignoran). Los números que no
                    correspondan a una sesión activa de tu aplicación se omiten
                    sin aviso.
                  items:
                    type: string
                    pattern: ^[0-9]+$
                    example: '1001'
                  minItems: 1
                  example:
                    - '1001'
                    - '1002'
                    - '1003'
                delete_all:
                  type: boolean
                  description: >-
                    Si es `true`, se eliminan todas las sesiones de KYC
                    restantes de la aplicación que hace la llamada y se ignora
                    `session_numbers`, salvo que acotes la selección con claves
                    `filter_*`. Si coinciden más de 20 sesiones, se ejecuta un
                    trabajo de eliminación (`202`) que solo abarca las sesiones
                    creadas antes de la solicitud. El valor predeterminado es
                    `false`. Es irreversible; no hay paso de confirmación.
                  default: false
                  example: false
                retain_face_embeddings:
                  type: boolean
                  nullable: true
                  description: >-
                    Anula la `face_retention_policy` de la aplicación para esta
                    eliminación. `true` conserva una plantilla biométrica facial
                    sin imágenes vinculada al usuario de la sesión después de
                    eliminar la sesión; `false` elimina el embedding facial
                    junto con la sesión; omítelo o usa `null` para seguir la
                    política de la aplicación. Se ignora en las sesiones KYB y
                    en las sesiones sin embedding facial.
                  example: true
                face_retention_days:
                  type: integer
                  minimum: 1
                  maximum: 3650
                  description: >-
                    Duración de retención finita, en días, de una plantilla
                    conservada. Es obligatoria cuando se conserva una plantilla,
                    salvo que la aplicación ya defina `face_retention_days`. El
                    `expires_at` de la plantilla es el más temprano entre esta
                    duración, el periodo general de retención de datos de la
                    aplicación y `face_retention_deadline`.
                  example: 365
                face_retention_deadline:
                  type: string
                  format: date-time
                  description: >-
                    Caducidad estricta opcional para una plantilla retenida.
                    Debe ser una fecha futura.
                  example: '2027-08-28T00:00:00Z'
                deletion_instruction:
                  type: string
                  enum:
                    - operational_session_delete
                    - privacy_erasure
                  default: operational_session_delete
                  description: >-
                    El tipo de instrucción que das. `operational_session_delete`
                    elimina la sesión y conserva una plantilla solo cuando la
                    política o `retain_face_embeddings` lo indican.
                    `privacy_erasure` purga todas las plantillas biométricas
                    conservadas vinculadas al usuario de la sesión antes de
                    eliminar la sesión, la política de la aplicación no puede
                    anularla y no se puede combinar con `retain_face_embeddings:
                    true` (`400`).
                  example: operational_session_delete
                instruction_id:
                  type: string
                  maxLength: 255
                  description: >-
                    Tu referencia permanente para esta instrucción de
                    eliminación (por ejemplo, el ID de un ticket de supresión).
                    Se registra en el registro de auditoría y en cualquier
                    plantilla conservada. Didit la genera si se omite.
                  example: dsar-2026-0142
                filter_status:
                  description: >-
                    Restringe un `delete_all` a las sesiones que coinciden con
                    el filtro `status` de [Listar
                    sesiones](/es/sessions-api/list-sessions), con los mismos
                    valores. Una cadena separada por comas o un array. Se ignora
                    sin `delete_all`. Un valor vacío se ignora y no restringe la
                    selección.
                  oneOf:
                    - type: string
                    - type: array
                      items:
                        type: string
                filter_vendor_data:
                  description: >-
                    Restringe un `delete_all` a las sesiones que coinciden con
                    el filtro `vendor_data` de [Listar
                    sesiones](/es/sessions-api/list-sessions), con el mismo
                    valor. Un solo valor, no una lista: un array se une en un
                    único texto separado por comas, por lo que varios valores no
                    se tratan como alternativas. Se ignora sin `delete_all`. Un
                    valor vacío se ignora y no restringe la selección.
                  type: string
                filter_search:
                  description: >-
                    Restringe un `delete_all` a las sesiones que coinciden con
                    el filtro `search` de [Listar
                    sesiones](/es/sessions-api/list-sessions), con el mismo
                    valor. Un solo valor, no una lista: un array se une en un
                    único texto separado por comas, por lo que varios valores no
                    se tratan como alternativas. Se ignora sin `delete_all`. Un
                    valor vacío se ignora y no restringe la selección.
                  type: string
                filter_workflow_id:
                  description: >-
                    Restringe un `delete_all` a las sesiones que coinciden con
                    el filtro `workflow_id` de [Listar
                    sesiones](/es/sessions-api/list-sessions), con los mismos
                    valores. Una cadena separada por comas o un array. Se ignora
                    sin `delete_all`. Un valor vacío se ignora y no restringe la
                    selección.
                  oneOf:
                    - type: string
                    - type: array
                      items:
                        type: string
                filter_date_from:
                  description: >-
                    Limita un `delete_all` a las sesiones que coinciden con el
                    filtro `date_from` de [List
                    Sessions](/es/sessions-api/list-sessions), con el mismo
                    valor. Un solo valor, no una lista: un array se une en un
                    único valor separado por comas, por lo que varios valores se
                    rechazan con `400`. Se ignora sin `delete_all`. Un valor
                    vacío se ignora y no limita la selección.
                  type: string
                  format: date
                filter_date_to:
                  description: >-
                    Limita un `delete_all` a las sesiones que coinciden con el
                    filtro `date_to` de [List
                    Sessions](/es/sessions-api/list-sessions), con el mismo
                    valor. Un solo valor, no una lista: un array se une en un
                    único valor separado por comas, por lo que varios valores se
                    rechazan con `400`. Se ignora sin `delete_all`. Un valor
                    vacío se ignora y no limita la selección.
                  type: string
                  format: date
                filter_country:
                  description: >-
                    Limita un `delete_all` a las sesiones que coinciden con el
                    filtro `country` de [List
                    Sessions](/es/sessions-api/list-sessions), con los mismos
                    valores. Una cadena separada por comas o un array. Se ignora
                    sin `delete_all`. Un valor vacío se ignora y no limita la
                    selección.
                  oneOf:
                    - type: string
                    - type: array
                      items:
                        type: string
                filter_document_type:
                  description: >-
                    Limita un `delete_all` a las sesiones que coinciden con el
                    filtro `document_type` de [List
                    Sessions](/es/sessions-api/list-sessions), con los mismos
                    valores. Una cadena separada por comas o un array. Se ignora
                    sin `delete_all`. Un valor vacío se ignora y no limita la
                    selección.
                  oneOf:
                    - type: string
                    - type: array
                      items:
                        type: string
                filter_document_name:
                  description: >-
                    Limita un `delete_all` a las sesiones que coinciden con el
                    filtro `document_name` de [List
                    Sessions](/es/sessions-api/list-sessions), con los mismos
                    valores. Una cadena separada por comas o un array. Se ignora
                    sin `delete_all`. Un valor vacío se ignora y no limita la
                    selección.
                  oneOf:
                    - type: string
                    - type: array
                      items:
                        type: string
                filter_region:
                  description: >-
                    Restringe un `delete_all` a las sesiones que coinciden con
                    el filtro `region` de [Listar
                    sesiones](/es/sessions-api/list-sessions), con los mismos
                    valores. Una cadena separada por comas o un array. Se ignora
                    sin `delete_all`. Un valor vacío se ignora y no restringe la
                    selección.
                  oneOf:
                    - type: string
                    - type: array
                      items:
                        type: string
                filter_didit_internal_id:
                  description: >-
                    Limita un `delete_all` a las sesiones que coinciden con el
                    filtro `didit_internal_id` de [List
                    Sessions](/es/sessions-api/list-sessions), con el mismo
                    valor. Un solo valor, no una lista: un array se une en un
                    único valor separado por comas, por lo que varios valores se
                    rechazan con `400`. Se ignora sin `delete_all`. Un valor
                    vacío se ignora y no limita la selección.
                  type: string
                  format: uuid
                filter_session_type:
                  description: >-
                    Restringe un `delete_all` a las sesiones que coinciden con
                    el filtro `session_type` de [Listar
                    sesiones](/es/sessions-api/list-sessions), con los mismos
                    valores. Una cadena separada por comas o un array. Se ignora
                    sin `delete_all`. Un valor vacío se ignora y no restringe la
                    selección.
                  oneOf:
                    - type: string
                    - type: array
                      items:
                        type: string
                filter_api_service:
                  description: >-
                    Limita un `delete_all` a las sesiones que coinciden con el
                    filtro `api_service` de [List
                    Sessions](/es/sessions-api/list-sessions), con el mismo
                    valor. Un solo valor, no una lista: un array se une en un
                    único valor separado por comas, por lo que varios valores se
                    rechazan con `400`. Se ignora sin `delete_all`. Un valor
                    vacío se ignora y no limita la selección.
                  type: string
                filter_screened_full_name:
                  description: >-
                    Restringe un `delete_all` a las sesiones que coinciden con
                    el filtro `screened_full_name` de [Listar
                    sesiones](/es/sessions-api/list-sessions), con el mismo
                    valor. Un solo valor, no una lista: un array se une en un
                    único texto separado por comas, por lo que varios valores no
                    se tratan como alternativas. Se ignora sin `delete_all`. Un
                    valor vacío se ignora y no restringe la selección.
                  type: string
                filter_warning:
                  description: >-
                    Restringe un `delete_all` a las sesiones que coinciden con
                    el filtro `warning` de [Listar
                    sesiones](/es/sessions-api/list-sessions), con los mismos
                    valores. Una cadena separada por comas o un array. Se ignora
                    sin `delete_all`. Un valor vacío se ignora y no restringe la
                    selección.
                  oneOf:
                    - type: string
                    - type: array
                      items:
                        type: string
                filter_status_initialized_as_in_review:
                  description: >-
                    Restringe un `delete_all` a las sesiones que coinciden con
                    el filtro `status_initialized_as_in_review` de [Listar
                    sesiones](/es/sessions-api/list-sessions), con los mismos
                    valores. Se ignora sin `delete_all`. Un valor vacío se
                    ignora y no restringe la selección.
                  type: boolean
                filter_is_kyc_to_be_reviewed:
                  description: >-
                    Limita un `delete_all` a las sesiones que coinciden con el
                    filtro `is_kyc_to_be_reviewed` de [List
                    Sessions](/es/sessions-api/list-sessions), con los mismos
                    valores. Se ignora sin `delete_all`. Un valor vacío se
                    ignora y no limita la selección.
                  type: boolean
                filter_euuid:
                  description: >-
                    Limita un `delete_all` a las sesiones que coinciden con el
                    filtro `euuid` de [List
                    Sessions](/es/sessions-api/list-sessions), con el mismo
                    valor. Un solo valor, no una lista: un array se une en un
                    único valor separado por comas, por lo que varios valores se
                    rechazan con `400`. Se ignora sin `delete_all`. Un valor
                    vacío se ignora y no limita la selección.
                  type: string
                  format: uuid
                filter_organization_name:
                  description: >-
                    Restringe un `delete_all` a las sesiones que coinciden con
                    el filtro `organization_name` de [Listar
                    sesiones](/es/sessions-api/list-sessions), con los mismos
                    valores. Una cadena separada por comas o un array. Con una
                    clave de API solo puede coincidir con el nombre de tu propia
                    organización, así que selecciona todas tus sesiones o
                    ninguna. Se ignora sin `delete_all`. Un valor vacío se
                    ignora y no restringe la selección.
                  oneOf:
                    - type: string
                    - type: array
                      items:
                        type: string
            examples:
              Specific sessions:
                summary: Eliminar sesiones concretas por número
                value:
                  session_numbers:
                    - '1001'
                    - '1002'
                    - '1003'
              All sessions:
                summary: Eliminar todas las sesiones KYC de la aplicación
                value:
                  delete_all: true
              Delete and retain templates:
                summary: >-
                  Eliminar sesiones pero conservar las plantillas biométricas
                  sin imágenes durante 365 días
                value:
                  session_numbers:
                    - '1001'
                    - '1002'
                  retain_face_embeddings: true
                  face_retention_days: 365
                  instruction_id: post-approval-cleanup-2026-08
              Privacy erasure:
                summary: >-
                  Eliminar sesiones y purgar todas las plantillas conservadas de
                  sus usuarios
                value:
                  session_numbers:
                    - '1001'
                  deletion_instruction: privacy_erasure
                  instruction_id: dsar-2026-0142
              Filtered delete_all:
                summary: >-
                  Eliminar todas las sesiones rechazadas de un flujo creadas en
                  septiembre de 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: >-
            Hasta 20 sesiones coincidieron y se procesaron en la solicitud. Hay
            un resultado por cada sesión coincidente; los números que no
            coincidieron con nada (desconocidos o ya eliminados) se omiten y no
            aparecen. Un resultado confirma la eliminación, excepto cuando
            `face_retention_outcome` es `failed_retryable`: esa sesión NO se
            eliminó y debe reintentarse.
          content:
            application/json:
              schema:
                type: object
                properties:
                  results:
                    type: array
                    items:
                      type: object
                      properties:
                        session_id:
                          type: string
                          format: uuid
                          description: La sesión eliminada.
                        session_number:
                          type: integer
                          nullable: true
                          description: El número de la sesión eliminada.
                        face_retention_outcome:
                          type: string
                          enum:
                            - retained_with_user
                            - deleted
                            - none
                            - ineligible_no_vendor_user
                            - failed_retryable
                          description: >-
                            Qué ocurrió con los datos biométricos faciales de la
                            sesión. `deleted`: el embedding facial se eliminó
                            junto con la sesión (valor predeterminado).
                            `retained_with_user`: la sesión se elimina y se
                            conserva una plantilla biométrica sin imágenes
                            vinculada al User; consulta
                            `biometric_template_uuid`. `none`: la sesión no
                            tenía embedding facial (por ejemplo, una sesión KYC
                            solo de documento sin selfie de prueba de vida; este
                            endpoint nunca selecciona sesiones KYB).
                            `ineligible_no_vendor_user`: se solicitó la
                            retención, pero la sesión no tiene ningún User
                            vinculado, por lo que el embedding se eliminó junto
                            con la sesión. `failed_retryable` (solo en el
                            endpoint por lotes): no se pudo eliminar el grupo
                            con el que se iba a eliminar esta sesión (un
                            servicio de almacenamiento, un almacén biométrico o
                            un proveedor de monitorización no estaba
                            disponible); esta sesión sigue existiendo, repite la
                            solicitud para ella.
                        biometric_template_uuid:
                          type: string
                          format: uuid
                          nullable: true
                          description: >-
                            ID de la plantilla biométrica conservada cuando
                            `face_retention_outcome` es `retained_with_user`;
                            `null` en caso contrario. Gestiónala a través de
                            `/v3/biometric-templates/{template_uuid}/`.
                        biometric_template_expires_at:
                          type: string
                          format: date-time
                          nullable: true
                          description: >-
                            Fecha y hora en que se elimina la plantilla
                            biométrica conservada, cuando
                            `face_retention_outcome` es `retained_with_user`;
                            `null` cuando no se conserva ninguna plantilla.
                        deleted_child_verifications:
                          type: integer
                          description: >-
                            Siempre `0` en este endpoint, que solo elimina
                            sesiones KYC. Al eliminar una sesión de Verificación
                            de empresas (KYB) con `DELETE
                            /v3/session/{sessionId}/delete/`, se informan las
                            verificaciones que creó y que se eliminaron con
                            ella.
              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: >-
            Coincidieron más de 20 sesiones. Se eliminan en segundo plano;
            consulta `GET /v3/sessions/delete/{job_id}/` hasta que `status` sea
            `COMPLETED` o `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: >-
            Error de validación: no se eliminó nada. Los valores de error son
            arrays de cadenas de mensaje indexados por nombre de campo.
          content:
            application/json:
              schema:
                type: object
                properties:
                  session_numbers:
                    type: array
                    items:
                      type: string
                additionalProperties:
                  description: >-
                    Otras claves: una clave `filter_*` que no es un filtro de
                    List Sessions (`"Unknown filter."`), o una clave `filter_*`
                    cuyo valor no se puede leer (indexada por esa clave
                    `filter_*`, con un array de mensajes).
              examples:
                Missing selector:
                  summary: No se proporcionó ni session_numbers ni delete_all
                  value:
                    session_numbers:
                      - This field is required unless delete_all is true.
                Empty list:
                  summary: session_numbers es un array vacío
                  value:
                    session_numbers:
                      - This list may not be empty.
                Non-numeric entry:
                  summary: session_numbers contiene una cadena que no es numérica
                  value:
                    session_numbers:
                      - All session_numbers must be numeric.
                Privacy erasure cannot retain:
                  summary: >-
                    deletion_instruction privacy_erasure combinado con
                    retain_face_embeddings true
                  value:
                    retain_face_embeddings:
                      - Privacy erasure cannot retain biometric templates.
                No finite retention duration:
                  summary: >-
                    Se solicitó retención sin face_retention_days en la
                    solicitud ni en la aplicación
                  value:
                    detail: >-
                      A finite biometric-template retention duration is
                      required.
                Unknown filter:
                  summary: Una clave filter_* que no existe en List Sessions
                  value:
                    filter_reviewer: Unknown filter.
                Unreadable filter value:
                  summary: Un valor de filtro que no se puede leer
                  value:
                    filter_date_from:
                      - Enter a valid date.
        '403':
          description: >-
            Falta la clave de API. Si falta la clave, se devuelve `403`; si la
            clave es incorrecta, está revocada o ha expirado, se devuelve `401`.
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
              examples:
                Missing or invalid API key:
                  summary: Falta el encabezado x-api-key, o la clave no es válida
                  value:
                    detail: You do not have permission to perform this action.
        '409':
          description: >-
            Una sesión seleccionada forma parte de un informe regulatorio
            finalizado. No se elimina nada.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/InFiledReportError'
        '429':
          description: >-
            Se superó el límite de solicitudes de escritura compartido (300
            solicitudes POST/PATCH/DELETE por minuto por clave de API). Revisa
            `Retry-After` y los encabezados de respuesta `X-RateLimit-*` antes
            de reintentar.
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
              examples:
                Rate limited:
                  summary: Presupuesto de escritura agotado
                  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: >-
        Una eliminación masiva de sesiones que se ejecuta en segundo plano:
        progreso y recuentos por resultado, nunca qué sesiones eliminó.
      properties:
        job_id:
          type: string
          format: uuid
          description: >-
            Consulta periódicamente `GET /v3/sessions/delete/{job_id}/` con este
            id.
        status:
          type: string
          enum:
            - PENDING
            - PROCESSING
            - COMPLETED
            - FAILED
          description: >-
            `PENDING`: aceptado, aún no ha comenzado. `PROCESSING`: eliminando;
            `processed` y `outcomes` se están actualizando. `COMPLETED`: se han
            contabilizado todas las sesiones seleccionadas. `FAILED`: el trabajo
            se detuvo antes de tiempo; consulta `error`.
        total:
          type: integer
          description: Sesiones seleccionadas cuando se solicitó la eliminación.
        processed:
          type: integer
          description: Sesiones que el trabajo ha terminado de procesar hasta el momento.
        outcomes:
          type: object
          description: >-
            Cuántas sesiones terminaron con cada resultado. Todas las claves
            están siempre presentes.
          properties:
            deleted:
              type: integer
              description: Sesiones eliminadas junto con su embedding facial.
            none:
              type: integer
              description: Sesiones eliminadas que no tenían embedding facial.
            retained_with_user:
              type: integer
              description: >-
                Sesiones eliminadas mientras se conservaba una plantilla
                biométrica sin imágenes para su Usuario, según lo indicado en la
                solicitud o en la política de la aplicación.
            ineligible_no_vendor_user:
              type: integer
              description: >-
                Sesiones eliminadas, junto con su embedding facial, porque se
                solicitó la retención pero no tenían un Usuario vinculado.
            failed_retryable:
              type: integer
              description: >-
                Sesiones notificadas como no eliminadas. Un trabajo reintenta
                por sí mismo un grupo que no pudo eliminar en lugar de
                contabilizarlo aquí.
            already_deleted:
              type: integer
              description: >-
                Sesiones seleccionadas que ya estaban eliminadas, por ejemplo
                por otra solicitud, cuando el proceso llegó a ellas.
        deleted_child_verifications:
          type: integer
          description: >-
            Verificaciones creadas por las verificaciones de empresas
            eliminadas, que se eliminaron junto con ellas. Siempre es `0` en un
            trabajo iniciado con `POST /v3/sessions/delete/`, que solo elimina
            sesiones KYC.
        error:
          type: string
          nullable: true
          description: >-
            `null` salvo que `status` sea `FAILED`; en ese caso, el motivo por
            el que se detuvo la eliminación. Las sesiones a las que el trabajo
            no había llegado siguen existiendo: repite la solicitud para
            eliminarlas.
        created_at:
          type: string
          format: date-time
          description: Cuándo se solicitó la eliminación.
        completed_at:
          type: string
          format: date-time
          nullable: true
          description: Fecha y hora en que terminó el trabajo; `null` mientras se ejecuta.
    InFiledReportError:
      type: object
      description: >-
        La eliminación se rechaza porque los datos seleccionados están en un
        informe regulatorio finalizado. No se elimina nada. Elimina el informe y
        luego repite la solicitud.
      required:
        - detail
        - code
      properties:
        detail:
          type: string
        code:
          type: string
          enum:
            - in_filed_report
          description: >-
            Código de error estable para una eliminación bloqueada por un
            informe regulatorio finalizado.
        reports:
          type: array
          items:
            $ref: '#/components/schemas/FiledRegulatoryReport'
          description: Informes que impiden eliminar una persona, empresa, caso o sesión.
        transactions:
          type: array
          items:
            $ref: '#/components/schemas/FiledReportTransaction'
          description: >-
            Transacciones que bloquean la eliminación de una transacción, cada
            una con los informes que la incluyen.
    FiledRegulatoryReport:
      type: object
      description: Un informe regulatorio finalizado que impide la eliminación solicitada.
      required:
        - uuid
        - report_number
        - report_type
        - case_uuid
      properties:
        uuid:
          type: string
          format: uuid
          description: UUID del informe.
        report_number:
          type: string
          description: >-
            Número de informe que se muestra en la consola (por ejemplo,
            SAR-0001).
        report_type:
          type: string
          enum:
            - SAR
            - STR
            - CTR
            - TTR
            - UTR
            - IFT
            - CBR
            - TFR
          description: Tipo de informe regulatorio.
        case_uuid:
          type: string
          format: uuid
          description: Caso al que pertenece el informe.
    FiledReportTransaction:
      type: object
      description: >-
        Una transacción que no se puede eliminar porque figura en un informe
        regulatorio finalizado.
      required:
        - uuid
        - transaction_id
        - reports
      properties:
        uuid:
          type: string
          format: uuid
          description: UUID de transacción de Didit.
        transaction_id:
          type: string
          description: >-
            El identificador de la transacción proporcionado al crear la
            transacción.
        reports:
          type: array
          items:
            $ref: '#/components/schemas/FiledRegulatoryReport'
          description: Informes finalizados que incluyen esta transacción.
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: x-api-key
      description: >-
        La clave de API de tu aplicación, que encontrarás en Developers -> API
        keys en la Business Console. La clave principal tiene acceso completo.
        Una clave con nombre puede tener un alcance limitado: ninguno, lectura o
        escritura por recurso, limitada a algunos flujos o a sesiones aprobadas,
        a una lista de direcciones IP y a una fecha de caducidad. 401 significa
        que la clave es incorrecta, se revocó o expiró; 403 significa que no se
        envió ninguna clave, que la clave no tiene acceso a este recurso o
        acción, o que la solicitud provino de una dirección fuera de su lista de
        IP; 404 en una ruta de sesión significa que la sesión está fuera de los
        flujos o estados de la clave. Una clave sin acceso a contenido
        multimedia recibe las URL de imágenes, videos y PDF como null, y una
        clave sin permiso de escritura en sesiones recibe los enlaces y tokens
        de sesión como null. Consulta https://docs.didit.me/console/api-keys.

````

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