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

# Biometrische Templates in Massen löschen – Bulk-Purge-API

> POST /v3/biometric-templates/delete/ löscht gespeicherte Gesichts-Templates per ID-Liste oder nach Filter. Idempotent pro Template. Didit Management API.

Massen-Löschung von Biometrie-Templates in einem Aufruf. Geben Sie entweder eine explizite ID-Liste oder `delete_all: true` an, optional eingeschränkt durch dieselben Filter wie bei [Biometrische Templates auflisten](https://docs.didit.me/de/management-api/biometric-templates/list.md).

## Anfrage-Body

| Feld | Typ | Beschreibung |
| - | - | - |
| `template_uuids` | UUID\[] | Zu löschende biometrische Templates. Erforderlich, sofern `delete_all` nicht `true` ist. IDs, die bereits gelöscht wurden, werden als `already_purged` gemeldet. |
| `delete_all` | boolean | Bei `true` werden alle biometrischen Templates gelöscht, die den unten genannten Filtern entsprechen (wenn kein Filter angegeben ist, alle Templates der Anwendung). `template_uuids` wird ignoriert. |
| `vendor_data` | string | Nur mit `delete_all`: Teilstring-Abgleich ohne Berücksichtigung der Groß- und Kleinschreibung mit dem Feld `vendor_data` des zugehörigen Benutzers |
| `vendor_user_uuid` | UUID | Nur mit `delete_all`: exakte Übereinstimmung mit der UUID des zugehörigen Benutzers |
| `status` | enum | Nur mit `delete_all`: `pending`, `active`, `expired`, `held_out_of_use`, `purge_pending`, `purge_failed` |
| `source_type` | enum | Nur mit `delete_all`: `session_delete`, `automatic_retention`, `backfill` |
| `retained_from`, `retained_to` | datetime | Nur mit `delete_all`: Bereich des Aufbewahrungsdatums |

> [!WARNING]
>
> `delete_all: true` ohne Filter löscht jedes biometrische Template der Anwendung und kann nicht rückgängig gemacht werden. Führen Sie zuvor [Biometrische Templates zählen](https://docs.didit.me/de/management-api/biometric-templates/count.md) mit denselben Filtern aus, um zu prüfen, was gelöscht wird.

## Beispiele

> [tab] Nach ID
>
> ```bash theme={null}
> curl -X POST https://verification.didit.me/v3/biometric-templates/delete/ \
>   -H "x-api-key: YOUR_API_KEY" \
>   -H "Content-Type: application/json" \
>   -d '{"template_uuids": ["9d2f4b6e-1c3a-4e8f-b7d5-0a1c2e3f4a5b", "1a2b3c4d-5e6f-4a7b-8c9d-0e1f2a3b4c5d"]}'
> ```

> [tab] Alle Templates eines Benutzers
>
> ```bash theme={null}
> curl -X POST https://verification.didit.me/v3/biometric-templates/delete/ \
>   -H "x-api-key: YOUR_API_KEY" \
>   -H "Content-Type: application/json" \
>   -d '{"delete_all": true, "vendor_user_uuid": "2f7c1a9e-8b4d-4c6a-9e1f-3d5b7a9c1e2f"}'
> ```

> [tab] Alle Templates in der Anwendung
>
> ```bash theme={null}
> curl -X POST https://verification.didit.me/v3/biometric-templates/delete/ \
>   -H "x-api-key: YOUR_API_KEY" \
>   -H "Content-Type: application/json" \
>   -d '{"delete_all": true}'
> ```

```json theme={null}
{
  "results": [
    { "uuid": "9d2f4b6e-1c3a-4e8f-b7d5-0a1c2e3f4a5b", "outcome": "purged" },
    { "uuid": "1a2b3c4d-5e6f-4a7b-8c9d-0e1f2a3b4c5d", "outcome": "already_purged" }
  ]
}
```

Templates werden einzeln gelöscht. Jedes Ergebnis meldet `purged` oder `already_purged`. Wenn ein biometrischer Speicher nicht verfügbar ist, gibt der Aufruf beim ersten fehlgeschlagenen Template `503` zurück. Templates, die zuvor in derselben Anfrage gelöscht wurden, bleiben gelöscht. Das fehlgeschlagene Template wechselt in `purge_failed` (vom Abgleich bereits ausgeschlossen). Wenn Sie die Anfrage wiederholen, wird der Vorgang abgeschlossen.

## Fehler

| Status | Wann | Body |
| - | - | - |
| `400` | Weder `template_uuids` noch `delete_all: true` angegeben | `{"template_uuids": ["This field is required unless delete_all is true."]}` |
| `400` | Ungültiger Filterwert oder `retained_to` liegt vor `retained_from` | Feldbezogene Validierungsfehler |
| `403` | Console-Benutzer-Token oder der API-Schlüssel ist nicht berechtigt | `{"detail": "You do not have permission to perform this action."}` |
| `503` | Ein biometrischer Speicher war nicht verfügbar; Anfrage wiederholen | `{"detail": "The biometric-template operation could not finish because an external store is unavailable. The operation is retryable."}` |


## OpenAPI

````yaml de/openapi-25.json POST /v3/biometric-templates/delete/
openapi: 3.0.0
info:
  version: 3.0.0
  title: Didit Verification API
  description: API für Ausweisverifizierung. Authentifizierung über den x-api-key-Header.
servers:
  - url: https://verification.didit.me
security: []
tags: []
paths:
  /v3/biometric-templates/delete/:
    post:
      tags:
        - Biometric Templates
      summary: Gespeicherte biometrische Templates per Massenaktion löschen
      description: >-
        Eine Anwendung, für die eine Einwilligung vorliegt, behält ein separat
        verwaltetes, bildfreies biometrisches Gesichtstemplate, das am Benutzer
        verankert ist, wenn eine Sitzung gelöscht wird (siehe `DELETE
        /v3/session/{sessionId}/delete/`). Templates sind biometrische Daten mit
        einem endlichen `expires_at`; sie enthalten niemals Bilder,
        Sitzungsdaten oder Identitätsfelder und werden bei Benutzerlöschung,
        datenschutzrechtlicher Löschung, Ablauf oder einer expliziten
        Bereinigung bereinigt. Diese Endpoints akzeptieren ausschließlich
        Anwendungs-API-Schlüssel (`x-api-key`); Benutzer-Tokens der Business
        Console werden mit `403` abgelehnt.


        Bereinigt viele Templates in einem Aufruf, entweder anhand einer
        expliziten ID-Liste oder mit `delete_all: true`, optional eingegrenzt
        durch dieselben Filter wie beim List-Endpoint. Templates werden
        nacheinander bereinigt, und jedes Ergebnis meldet `purged` oder
        `already_purged`. Wenn ein biometrischer Speicher nicht verfügbar ist,
        gibt der Aufruf beim ersten Template, bei dem ein Fehler auftritt, `503`
        zurück: Früher in der Anfrage bereinigte Templates bleiben bereinigt,
        das fehlschlagende wechselt zu `purge_failed` (bereits vom Abgleich
        ausgeschlossen), und eine Wiederholung der Anfrage schließt den Vorgang
        ab.


        **`delete_all: true` ohne Filter bereinigt jedes biometrische Template
        in der Anwendung und kann nicht rückgängig gemacht werden.** Führen Sie
        zuerst den Count-Endpoint mit denselben Filtern aus.
      operationId: bulk_purge_biometric_templates
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                template_uuids:
                  type: array
                  items:
                    type: string
                    format: uuid
                  minItems: 1
                  description: >-
                    Zu bereinigende Vorlagen. Erforderlich, es sei denn,
                    `delete_all` ist `true`. Bereits bereinigte IDs werden als
                    `already_purged` gemeldet.
                delete_all:
                  type: boolean
                  default: false
                  description: >-
                    Wenn `true`, werden alle Vorlagen gelöscht, die den
                    folgenden Filtern entsprechen (alle Vorlagen der Anwendung,
                    wenn kein Filter angegeben ist). `template_uuids` wird
                    ignoriert. Unumkehrbar.
                vendor_data:
                  type: string
                  description: >-
                    Nur mit `delete_all`: Teilstring-Abgleich ohne
                    Berücksichtigung der Groß-/Kleinschreibung mit dem
                    `vendor_data` des besitzenden Benutzers.
                vendor_user_uuid:
                  type: string
                  format: uuid
                  description: >-
                    Nur mit `delete_all`: exakte Übereinstimmung mit dem
                    besitzenden Benutzer.
                status:
                  type: string
                  enum:
                    - pending
                    - active
                    - expired
                    - held_out_of_use
                    - purge_pending
                    - purge_failed
                  description: Nur mit `delete_all`.
                source_type:
                  type: string
                  enum:
                    - session_delete
                    - automatic_retention
                    - backfill
                  description: Nur mit `delete_all`.
                retained_from:
                  type: string
                  format: date-time
                  description: Nur mit `delete_all`.
                retained_to:
                  type: string
                  format: date-time
                  description: Nur mit `delete_all`. Darf nicht vor `retained_from` liegen.
            examples:
              By id:
                value:
                  template_uuids:
                    - 9d2f4b6e-1c3a-4e8f-b7d5-0a1c2e3f4a5b
                    - 1a2b3c4d-5e6f-4a7b-8c9d-0e1f2a3b4c5d
              Every template of one User:
                value:
                  delete_all: true
                  vendor_user_uuid: 2f7c1a9e-8b4d-4c6a-9e1f-3d5b7a9c1e2f
              Every template in the application:
                value:
                  delete_all: true
      responses:
        '200':
          description: Bereinigungsergebnisse pro Vorlage.
          content:
            application/json:
              schema:
                type: object
                properties:
                  results:
                    type: array
                    items:
                      type: object
                      properties:
                        uuid:
                          type: string
                          format: uuid
                        outcome:
                          type: string
                          enum:
                            - purged
                            - already_purged
              examples:
                Mixed:
                  value:
                    results:
                      - uuid: 9d2f4b6e-1c3a-4e8f-b7d5-0a1c2e3f4a5b
                        outcome: purged
                      - uuid: 1a2b3c4d-5e6f-4a7b-8c9d-0e1f2a3b4c5d
                        outcome: already_purged
        '400':
          description: Validierungsfehler – es wird nichts bereinigt.
          content:
            application/json:
              examples:
                Missing selector:
                  value:
                    template_uuids:
                      - This field is required unless delete_all is true.
                Bad range:
                  value:
                    retained_to:
                      - Must be on or after retained_from.
        '403':
          description: >-
            Console-Benutzertoken, oder der API-Schlüssel ist nicht zulässig.
            Diese Endpoints akzeptieren ausschließlich Anwendungs-API-Schlüssel.
          content:
            application/json:
              examples:
                Forbidden:
                  value:
                    detail: You do not have permission to perform this action.
        '503':
          description: >-
            Ein Biometriespeicher war während des Aufbewahrens oder Löschens
            eines biometrischen Templates nicht verfügbar. Es wurde nichts
            gelöscht; wiederholen Sie dieselbe Anfrage. Wiederholungsversuche
            sind idempotent und führen zu einem einzigen Template.
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
              examples:
                Retryable:
                  value:
                    detail: >-
                      The biometric-template operation could not finish because
                      an external store is unavailable. The operation is
                      retryable.
      security:
        - ApiKeyAuth: []
      x-codeSamples:
        - lang: curl
          label: curl
          source: >-
            curl -X POST
            https://verification.didit.me/v3/biometric-templates/delete/ \
              -H 'x-api-key: YOUR_API_KEY' \
              -H 'Content-Type: application/json' \
              -d '{"delete_all": true, "vendor_user_uuid": "2f7c1a9e-8b4d-4c6a-9e1f-3d5b7a9c1e2f"}'
        - lang: python
          label: Python
          source: |-
            from didit import Didit

            # Reads DIDIT_API_KEY.
            client = Didit()

            result = client.biometric_templates.batch_delete(
                template_uuids=["9d2f4b6e-1c3a-4e8f-b7d5-0a1c2e3f4a5b", "1a2b3c4d-5e6f-4a7b-8c9d-0e1f2a3b4c5d"],
            )
            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.biometricTemplates.batchDelete({
              template_uuids: ["9d2f4b6e-1c3a-4e8f-b7d5-0a1c2e3f4a5b", "1a2b3c4d-5e6f-4a7b-8c9d-0e1f2a3b4c5d"],
            });
            console.log(result);
        - lang: go
          label: Go
          source: "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.BiometricTemplates.BatchDelete(ctx, didit.BiometricTemplatesBatchDeleteParams{\n\tTemplateUUIDs: didit.Some([]string{\"9d2f4b6e-1c3a-4e8f-b7d5-0a1c2e3f4a5b\", \"1a2b3c4d-5e6f-4a7b-8c9d-0e1f2a3b4c5d\"}),\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.BiometricTemplatesBatchDeleteParams;


            // Reads DIDIT_API_KEY.

            Didit client = new Didit();


            var result =
            client.biometricTemplates().batchDelete(BiometricTemplatesBatchDeleteParams.builder()
                    .templateUuids(List.of("9d2f4b6e-1c3a-4e8f-b7d5-0a1c2e3f4a5b", "1a2b3c4d-5e6f-4a7b-8c9d-0e1f2a3b4c5d"))
                    .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->biometricTemplates->batchDelete([
                'template_uuids' => ['9d2f4b6e-1c3a-4e8f-b7d5-0a1c2e3f4a5b', '1a2b3c4d-5e6f-4a7b-8c9d-0e1f2a3b4c5d'],
            ]);
            print_r($result->toArray());
        - lang: ruby
          label: Ruby
          source: >-
            require "didit"


            # Reads DIDIT_API_KEY.

            didit = Didit::Client.new


            result = didit.biometric_templates.batch_delete(template_uuids:
            ["9d2f4b6e-1c3a-4e8f-b7d5-0a1c2e3f4a5b",
            "1a2b3c4d-5e6f-4a7b-8c9d-0e1f2a3b4c5d"])

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

            {
                TemplateUuids = new string[] { "9d2f4b6e-1c3a-4e8f-b7d5-0a1c2e3f4a5b", "1a2b3c4d-5e6f-4a7b-8c9d-0e1f2a3b4c5d" },
            });

            Console.WriteLine(JsonSerializer.Serialize(result));
components:
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: x-api-key
      description: >-
        Der API-Schlüssel Ihrer Anwendung, aus Entwickler -> API-Schlüssel in
        der Business Console. Der Primärschlüssel hat Vollzugriff. Ein benannter
        Schlüssel kann im Geltungsbereich eingeschränkt werden: keine, Lese-
        oder Schreibberechtigung pro Ressource, beschränkt auf bestimmte
        Workflows oder genehmigte Sitzungen, auf eine Liste von IP-Adressen und
        auf ein Ablaufdatum. 401 bedeutet, dass der Schlüssel falsch, widerrufen
        oder abgelaufen ist; 403 bedeutet, dass kein Schlüssel gesendet wurde,
        der Schlüssel keinen Zugriff auf diese Ressource oder Aktion hat oder
        die Anfrage von einer Adresse außerhalb seiner IP-Liste stammte; 404 bei
        einer Sitzungsroute bedeutet, dass die Sitzung außerhalb der Workflows
        oder Status des Schlüssels liegt. Ein Schlüssel ohne Medienzugriff
        erhält Bild-, Video- und PDF-URLs als null, und ein Schlüssel ohne
        Schreibberechtigung für Sitzungen erhält Sitzungslinks und Token als
        null. Siehe https://docs.didit.me/console/api-keys.

````

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