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

# Gesichtssuche-API: 1:N-Dubletten & Betrugsringe

> Didit: 1:N-Gesichtssuche über verifizierte Benutzer für Dubletten- und Betrugsringerkennung. Inferenz unter 2s, pro Aufruf, ohne Verträge.



## OpenAPI

````yaml de/openapi-25.json POST /v3/face-search/
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/face-search/:
    post:
      tags:
        - Standalone APIs
      summary: Gesichtssuche
      description: >-
        Durchsuchen Sie den Gesichtssuchindex Ihrer Anwendung (1:N) anhand eines
        Gesichtsbilds – Gesichter, die aus Verifizierungssitzungen registriert
        wurden, gespeicherte eigenständige API-Aufrufe, direkte Uploads von
        Gesichtern aus Benutzerprofilen sowie Ihre Sperr-/Freigabelisten – und
        erhalten Sie nach Ähnlichkeit geordnete Treffer sowie Sperrlisten- und
        Duplikatwarnungen zurück.


        **Funktionsweise.** Das größte erkannte Gesicht in `user_image` wird
        eingebettet und im für Ihre Anwendung isolierten Index gesucht. Bis zu
        **5 Treffer** oberhalb des Ähnlichkeits-Schwellenwerts werden in
        `matches` zurückgegeben, jeweils mit `similarity_percentage`, der
        Ursprungssitzung (`session_id`, `session_number`, `status`,
        `vendor_data`), während der Dokumentenverifizierung dieser Sitzung
        extrahierten `user_details`, den Flags `is_blocklisted` /
        `is_allowlisted` sowie einem Unterscheidungsmerkmal `source` (`session`,
        `imported` oder `list_entry`).


        - `search_type=most_similar` (Standard) ordnet jedes registrierte
        Gesicht nach Ähnlichkeit – nutzen Sie dies zur Deduplizierung und
        Untersuchung von Betrugsringen.

        - `search_type=blocklisted_or_approved` beschränkt die Kandidaten auf
        Gesichter auf der Sperrliste, Gesichter auf der Freigabeliste, Gesichter
        aus genehmigten Sitzungen und importierte Gesichter aus
        Benutzerprofilen, wobei Einträge auf der Sperrliste zuerst sortiert
        werden – nutzen Sie dies, wenn das Hauptziel das Sperrlisten-Screening
        ist.


        `status` ist nur dann `Declined`, wenn eine Warnung `FACE_IN_BLOCKLIST`
        oder `POSSIBLE_FACE_IN_BLOCKLIST` ausgelöst wird; `DUPLICATED_FACE` /
        `POSSIBLE_DUPLICATED_FACE` (`information`) und `MULTIPLE_FACES_DETECTED`
        (`warning`) führen nie zu einer Ablehnung. Im Gegensatz zur passiven
        Liveness-Erkennung schließt dieser Endpoint vorherige Sitzungen mit
        denselben `vendor_data` **nicht** vom Abgleich aus. Eine passive
        Liveness-Erkennungsanalyse läuft intern ebenfalls ab und wird mit der
        persistenten Sitzung gespeichert, ihr Ergebnis ist jedoch nicht Teil
        dieser Antwort.


        **Abrechnung.** Jede `200`-Antwort verbraucht einen Credit der
        Gesichtssuche-API (bezahlt aus Ihrem Tarif-Guthaben oder
        Aufladeguthaben). Bei unzureichendem Guthaben wird vor jeglicher
        Bildverarbeitung ein `403` zurückgegeben.


        **Sitzungspersistenz und Gesichtsregistrierung (`save_api_request`,
        standardmäßig `true`).** Wenn `true`, wird der Aufruf als Sitzung vom
        Typ API persistent gespeichert (Business Console, `GET
        /v3/session/{sessionId}/decision/` über die zurückgegebene `request_id`,
        Webhook `status.updated`) und das gesuchte Gesicht wird in Ihren
        Gesichtssuchindex aufgenommen. Gesichter, die durch Aufrufe der
        Gesichtssuche registriert wurden, werden von zukünftigen Ergebnissen der
        Gesichtssuche ausgeschlossen, sodass wiederholte Suchen nie miteinander
        übereinstimmen. Wenn `false`, ist der Aufruf einmalig: Es wird nichts
        gespeichert, das Gesicht wird nicht registriert und
        `match_image_url`-Werte sind interne Speicherpfade statt
        herunterladbarer URLs.


        **Sandbox.** Sandbox-API-Schlüssel überspringen jegliche Verarbeitung
        und Abrechnung: Nach der Validierung der Anfrage (fehlerhafte Eingaben
        geben weiterhin `400` zurück) gibt der Endpoint eine statische
        `Approved`-Mock-Payload zurück, es wird keine Sitzung gespeichert und es
        werden keine Credits verbraucht.


        **Authentifizierung.** Senden Sie den API-Schlüssel Ihrer Anwendung im
        Header `x-api-key`. Bei fehlenden oder ungültigen Anmeldedaten wird
        `403` zurückgegeben (`{"detail": "You do not have permission to perform
        this action."}`) – diese API gibt niemals `401` zurück.


        **Rate-Limit.** Geteiltes Schreibkontingent von 300 Anfragen/Min. pro
        API-Schlüssel über alle POST/PATCH/DELETE-Endpoints hinweg; bei
        Überschreitung wird `429` zurückgegeben.
      operationId: post_v3face-search
      parameters: []
      requestBody:
        required: true
        content:
          multipart/form-data:
            schema:
              type: object
              required:
                - user_image
              properties:
                user_image:
                  type: string
                  format: binary
                  description: >-
                    Frontales Gesichtsbild für die Suche. Zulässige
                    Dateiendungen: `tiff`, `jpg`, `jpeg`, `png`, `webp`.
                    Maximale Upload-Größe: **5 MB** (größere Dateien werden mit
                    `400` abgelehnt). Bilder werden vor der Verarbeitung
                    automatisch auf ca. 0,5 MB komprimiert, sodass sehr hohe
                    Auflösungen die Genauigkeit nicht verbessern. Das Bild muss
                    mindestens ein erkennbares Gesicht enthalten – andernfalls
                    gibt der Endpoint `400` zurück. Sind mehrere Gesichter
                    vorhanden, wird nach dem größten gesucht und eine Warnung
                    `MULTIPLE_FACES_DETECTED` hinzugefügt.
                search_type:
                  type: string
                  default: most_similar
                  enum:
                    - most_similar
                    - blocklisted_or_approved
                  description: >-
                    Suchrichtlinie. `most_similar` (Standard) sortiert jedes in
                    Ihrer Anwendung registrierte Gesicht nach Ähnlichkeit.
                    `blocklisted_or_approved` beschränkt die Kandidaten auf
                    Gesichter auf der Sperrliste, Gesichter auf der
                    Zulassungsliste, Gesichter aus genehmigten Sitzungen und
                    importierte Benutzerprofil-Gesichter — wobei Einträge auf
                    der Sperrliste an erster Stelle stehen.
                  example: most_similar
                rotate_image:
                  type: boolean
                  default: false
                  description: >-
                    Wenn `true`, versucht der Dienst 90-Grad-Drehungen der
                    Eingabe und verwendet die Ausrichtung, die die beste
                    Gesichtserkennung liefert. Nützlich, wenn die
                    EXIF-Ausrichtung fehlt. Erhöht die Latenz.
                  example: false
                save_api_request:
                  type: boolean
                  default: true
                  description: >-
                    Wenn `true` (Standard), wird der Aufruf als Sitzung vom Typ
                    API persistent gespeichert, ein Webhook `status.updated`
                    ausgegeben, `match_image_url`-Werte vorsigniert und das
                    gesuchte Gesicht in Ihrem Gesichtssuchindex registriert
                    (Gesichtssuch-Registrierungen sind von zukünftigen Suchen
                    ausgeschlossen). Wenn `false`, erfolgt die Suche einmalig –
                    es wird keine Sitzung gespeichert und das Gesicht wird nicht
                    registriert.
                  example: true
                vendor_data:
                  type: string
                  description: >-
                    Optionaler opaker Bezeichner (Ihre Benutzer-ID, E-Mail,
                    UUID…), der in der gespeicherten Sitzung hinterlegt und
                    zurückgegeben wird. Schließt Gesichter desselben Benutzers
                    nicht aus den Suchergebnissen aus.
                  example: user-123
                metadata:
                  type: object
                  additionalProperties: true
                  description: >-
                    Optionales JSON-Objekt, das mit der Sitzung gespeichert
                    (wenn `save_api_request=true`) und zurückgegeben wird.
                    Senden Sie es bei Multipart-Anfragen als JSON-codiertes
                    String-Feld – es wird in ein Objekt geparst.
                  example:
                    flow: dedup_check
            example:
              user_image: (binary JPEG/PNG selfie)
              search_type: most_similar
              rotate_image: false
              save_api_request: true
              vendor_data: user-123
              metadata:
                flow: dedup_check
      responses:
        '200':
          description: >-
            Gesichtssuche abgeschlossen. `face_search.matches` enthält bis zu 5
            ähnliche Gesichter, sortiert nach Ähnlichkeit; ein leeres Array
            bedeutet, dass kein registriertes Gesicht den
            Mindestähnlichkeitswert überschritten hat. `status` ist nur bei
            Treffern auf der Sperrliste `Declined` – reine Duplikattreffer geben
            `Approved` zurück, prüfen Sie daher `matches` und `warnings`, nicht
            nur `status`. Wenn `save_api_request=true`, ist `request_id` die
            persistierte Sitzungs-ID. Jeder Treffer enthält `source` (`session`,
            `imported`, `list_entry` oder `retained_template`), `vendor_user_id`
            und `biometric_template_id`; ein Treffer mit `retained_template`
            stammt von einem bildfreien biometrischen Template, das nach dem
            Löschen der Quellsitzung aufbewahrt wurde, und weist `null` für
            Sitzungsfelder, `match_image_url` und `user_details` auf.
          content:
            application/json:
              examples:
                Blocklist hit (Declined):
                  summary: >-
                    Das Gesicht stimmt mit einem Gesicht auf der Sperrliste
                    überein
                  value:
                    request_id: a1b2c3d4-e5f6-7890-1234-567890abcdef
                    face_search:
                      status: Declined
                      total_matches: 1
                      matches:
                        - session_id: 882c42d5-8a4d-4d20-8080-a22f57822c86
                          session_number: 323442
                          similarity_percentage: 99.99
                          source: session
                          vendor_data: user-1
                          verification_date: '2025-01-01T00:00:00Z'
                          user_details:
                            full_name: Jane Marie Doe
                            document_type: ID
                            document_number: X1234567
                          match_image_url: https://<media-host>/face/3f6a1c2e/reference.jpg
                          status: Approved
                          is_blocklisted: true
                          is_allowlisted: false
                          api_service: null
                          vendor_user_id: 2f7c1a9e-8b4d-4c6a-9e1f-3d5b7a9c1e2f
                          biometric_template_id: null
                      user_image:
                        entities:
                          - bbox:
                              - 40
                              - 40
                              - 120
                              - 120
                            confidence: 0.732973
                        best_angle: 0
                      warnings:
                        - risk: FACE_IN_BLOCKLIST
                          feature: LIVENESS
                          additional_data:
                            blocklisted_session_id: 882c42d5-8a4d-4d20-8080-a22f57822c86
                            blocklisted_session_number: 323442
                            api_service: null
                          log_type: error
                          short_description: Face in blocklist
                          long_description: >-
                            The system identified a face in the blocklist, which
                            means the face is not allowed to be verified.
                    vendor_data: user-123
                    metadata: null
                    created_at: '2026-06-12T01:04:42.763237+00:00'
                Duplicate found (Approved):
                  summary: >-
                    Das Gesicht ist bereits in einer anderen genehmigten Sitzung
                    aufgetaucht – rein informativ, keine Ablehnung
                  value:
                    request_id: 5e0c3a1f-7b2d-4c8e-9f10-2a3b4c5d6e7f
                    face_search:
                      status: Approved
                      total_matches: 1
                      matches:
                        - session_id: 1f2e3d4c-5b6a-7980-1122-334455667788
                          session_number: 1024
                          similarity_percentage: 87.42
                          source: session
                          vendor_data: user-9
                          verification_date: '2025-11-20T09:15:00Z'
                          user_details: null
                          match_image_url: https://<media-host>/face/9c8b7a6d/reference.jpg
                          status: Approved
                          is_blocklisted: false
                          is_allowlisted: false
                          api_service: PASSIVE_LIVENESS
                          vendor_user_id: 2f7c1a9e-8b4d-4c6a-9e1f-3d5b7a9c1e2f
                          biometric_template_id: null
                      user_image:
                        entities:
                          - bbox:
                              - 40
                              - 40
                              - 120
                              - 120
                            confidence: 0.732973
                        best_angle: 0
                      warnings:
                        - risk: DUPLICATED_FACE
                          feature: LIVENESS
                          additional_data:
                            duplicated_session_id: 1f2e3d4c-5b6a-7980-1122-334455667788
                            duplicated_session_number: 1024
                            api_service: PASSIVE_LIVENESS
                          log_type: information
                          short_description: Duplicated face from other approved session
                          long_description: >-
                            The system identified a duplicated face from another
                            approved session, requiring further investigation.
                    vendor_data: user-123
                    metadata: null
                    created_at: '2026-06-12T01:04:42.763237+00:00'
                No matches (Approved):
                  summary: >-
                    Kein registriertes Gesicht überschritt die
                    Ähnlichkeitsuntergrenze
                  value:
                    request_id: 9d8c7b6a-5f4e-3d2c-1b0a-998877665544
                    face_search:
                      status: Approved
                      total_matches: 0
                      matches: []
                      user_image:
                        entities:
                          - bbox:
                              - 40
                              - 40
                              - 120
                              - 120
                            confidence: 0.732973
                        best_angle: 0
                      warnings: []
                    vendor_data: user-123
                    metadata: null
                    created_at: '2026-06-12T01:04:42.763237+00:00'
              schema:
                type: object
                properties:
                  request_id:
                    type: string
                    format: uuid
                    description: >-
                      Beibehaltene Sitzungs-ID, wenn `save_api_request=true`
                      (verwendbar mit `GET /v3/session/{sessionId}/decision/`);
                      andernfalls eine vorübergehende Korrelations-UUID.
                  face_search:
                    type: object
                    properties:
                      status:
                        type: string
                        enum:
                          - Approved
                          - Declined
                        description: >-
                          `Declined` nur dann, wenn eine `FACE_IN_BLOCKLIST`-
                          oder `POSSIBLE_FACE_IN_BLOCKLIST`-Warnung ausgelöst
                          wurde. Duplikatübereinstimmungen und Warnungen zu
                          mehreren Gesichtern führen nie zu einer Ablehnung.
                      total_matches:
                        type: integer
                        description: Anzahl der Einträge in `matches` (0–5).
                        example: 1
                      matches:
                        type: array
                        maxItems: 5
                        description: >-
                          Bis zu 5 Gesichter aus Ihrem Gesichtssuchindex, die
                          den Ähnlichkeitsschwellenwert überschreiten, sortiert
                          nach Ähnlichkeit (wobei gesperrte Einträge an erster
                          Stelle stehen, wenn
                          `search_type=blocklisted_or_approved`). Leer, wenn
                          kein registriertes Gesicht ausreichend ähnlich ist.
                        items:
                          type: object
                          properties:
                            session_id:
                              type: string
                              format: uuid
                              nullable: true
                              description: >-
                                ID der Verifizierungssitzung, zu der das
                                übereinstimmende Gesicht gehört. `null`, wenn
                                `source` den Wert `imported`, `list_entry` oder
                                `retained_template` hat.
                              example: 882c42d5-8a4d-4d20-8080-a22f57822c86
                            session_number:
                              type: integer
                              nullable: true
                              description: >-
                                Benutzerfreundliche Sitzungsnummer, die in der
                                Business Console angezeigt wird. `null` für
                                Übereinstimmungen ohne Sitzung.
                              example: 323442
                            similarity_percentage:
                              type: number
                              format: float
                              minimum: 0
                              maximum: 100
                              description: >-
                                Ähnlichkeit zwischen dem übermittelten Gesicht
                                und dem abgeglichenen Gesicht (0–100).
                              example: 99.99
                            source:
                              type: string
                              enum:
                                - session
                                - imported
                                - list_entry
                                - retained_template
                              description: >-
                                Woher das übereinstimmende Gesicht registriert
                                wurde: `session` – eine Verifizierungssitzung
                                oder ein gespeicherter eigenständiger
                                API-Aufruf; `imported` – ein direkt in ein
                                Benutzerprofil hochgeladenes Gesicht;
                                `list_entry` – ein Gesicht, das einer Ihrer
                                Listen angehängt ist; `retained_template` – ein
                                bildfreies biometrisches Template, das bei einem
                                Benutzer gespeichert ist und unter
                                `/v3/biometric-templates/` aufgeführt wird.
                            vendor_data:
                              type: string
                              nullable: true
                              description: >-
                                `vendor_data` der übereinstimmenden Sitzung oder
                                des verknüpften Benutzers für importierte
                                Gesichter und Gesichter aus aufbewahrten
                                Vorlagen.
                              example: user-1
                            vendor_user_id:
                              type: string
                              format: uuid
                              nullable: true
                              description: >-
                                Verknüpfte Benutzer-ID. `null` für
                                Listeneinträge und Sitzungstreffer ohne
                                Benutzer.
                              example: 2f7c1a9e-4b28-4a6d-97f1-83576f80e1b4
                            biometric_template_id:
                              type: string
                              format: uuid
                              nullable: true
                              description: >-
                                ID des aufbewahrten biometrischen Templates.
                                Wird nur gesetzt, wenn `source` den Wert
                                `retained_template` hat; andernfalls `null`.
                              example: null
                            verification_date:
                              type: string
                              format: date-time
                              nullable: true
                              description: >-
                                Wann das abgeglichene Gesicht ursprünglich
                                erfasst wurde oder wann eine aufbewahrte Vorlage
                                erstellt wurde (`YYYY-MM-DDThh:mm:ssZ`). `null`
                                für Treffer mit `list_entry`.
                              example: '2025-01-01T00:00:00Z'
                            user_details:
                              type: object
                              nullable: true
                              description: >-
                                Identitätsdaten, die während der
                                Dokumentenprüfung der übereinstimmenden Sitzung
                                extrahiert wurden. `null`, wenn die
                                übereinstimmende Sitzung keine Dokumentendaten
                                enthält (z. B. reine Liveness-Sitzungen), und
                                immer `null` bei Übereinstimmungen mit
                                `retained_template`. Bei Übereinstimmungen mit
                                `source: imported` werden sie stattdessen aus
                                dem Benutzerprofil befüllt: `full_name` gesetzt,
                                `document_type`/`document_number` null.
                              properties:
                                full_name:
                                  type: string
                                  nullable: true
                                  example: Jane Marie Doe
                                document_type:
                                  type: string
                                  nullable: true
                                  example: ID
                                document_number:
                                  type: string
                                  nullable: true
                                  example: X1234567
                            match_image_url:
                              type: string
                              nullable: true
                              description: >-
                                Zeitlich begrenzte URL
                                (`https://<media-host>/...`) des Referenzbildes
                                des übereinstimmenden Gesichts, wenn
                                `save_api_request=true`. Bei
                                `save_api_request=false` ist dies ein interner
                                Speicherpfad, der nicht direkt heruntergeladen
                                werden kann. Immer `null` bei
                                `retained_template`-Übereinstimmungen, da
                                gespeicherte Vorlagen kein Bild enthalten.
                              example: https://<media-host>/face/3f6a1c2e/reference.jpg
                            status:
                              type: string
                              nullable: true
                              description: >-
                                Status der übereinstimmenden Sitzung
                                (`Approved`, `Declined`, `In Review`, …). `null`
                                für Treffer aus `imported`/`list_entry`.
                              example: Approved
                            is_blocklisted:
                              type: boolean
                              description: >-
                                `true`, wenn sich das übereinstimmende Gesicht
                                auf Ihrer Gesichts-Sperrliste befindet. Jeder
                                hinreichend ähnliche Treffer auf der Sperrliste
                                führt zur Ablehnung der Suche.
                            is_allowlisted:
                              type: boolean
                              description: >-
                                `true`, wenn sich das übereinstimmende Gesicht
                                auf einer Ihrer Positivlisten befindet. Treffer
                                auf der Positivliste unterdrücken
                                Duplikatswarnungen.
                            api_service:
                              type: string
                              nullable: true
                              description: >-
                                Wird gesetzt, wenn das abgeglichene Gesicht über
                                einen Standalone-API-Aufruf registriert wurde
                                (z. B. `PASSIVE_LIVENESS`); `null` für reguläre
                                Verifizierungssitzungen und importierte
                                Gesichter.
                              example: null
                      user_image:
                        type: object
                        description: >-
                          Gesichtserkennungsergebnisse für das übermittelte
                          Bild. Einträge hier enthalten nur `bbox` und
                          `confidence`.
                        properties:
                          entities:
                            type: array
                            description: >-
                              Ein Eintrag pro erkanntem Gesicht. Das größte
                              Gesicht ist dasjenige, nach dem gesucht wird.
                            items:
                              type: object
                              properties:
                                bbox:
                                  type: array
                                  items:
                                    type: integer
                                  minItems: 4
                                  maxItems: 4
                                  description: >-
                                    Bounding-Box `[x_min, y_min, x_max, y_max]`
                                    in Pixeln.
                                  example:
                                    - 40
                                    - 40
                                    - 120
                                    - 120
                                confidence:
                                  type: number
                                  format: float
                                  minimum: 0
                                  maximum: 1
                                  description: Konfidenz der Gesichtserkennung (0–1).
                                  example: 0.732973
                          best_angle:
                            type: integer
                            description: >-
                              Drehung (Grad), die die beste Gesichtserkennung
                              lieferte; nur ungleich null, wenn
                              `rotate_image=true` die Ausrichtung korrigiert
                              hat. An diesem Endpoint niemals null
                              (standardmäßig 0, wenn das Modell den Wert
                              weglässt).
                            example: 0
                      warnings:
                        type: array
                        description: >-
                          Risikosignale. `FACE_IN_BLOCKLIST` /
                          `POSSIBLE_FACE_IN_BLOCKLIST` (`error`) lehnen die
                          Suche ab; `MULTIPLE_FACES_DETECTED` (`warning`) und
                          `DUPLICATED_FACE` / `POSSIBLE_DUPLICATED_FACE`
                          (`information`) dienen als Hinweis.
                        items:
                          type: object
                          properties:
                            risk:
                              type: string
                              enum:
                                - MULTIPLE_FACES_DETECTED
                                - FACE_IN_BLOCKLIST
                                - POSSIBLE_FACE_IN_BLOCKLIST
                                - DUPLICATED_FACE
                                - POSSIBLE_DUPLICATED_FACE
                              description: Maschinenlesbarer Risiko-Code.
                            feature:
                              type: string
                              enum:
                                - LIVENESS
                              description: >-
                                Funktion, die die Warnung ausgelöst hat. An
                                diesem Endpoint immer `LIVENESS`.
                            additional_data:
                              type: object
                              nullable: true
                              additionalProperties: true
                              description: >-
                                `null` für `MULTIPLE_FACES_DETECTED`. Treffer
                                auf der Sperrliste enthalten
                                `{blocklisted_session_id,
                                blocklisted_session_number, api_service}`;
                                Duplikat-Treffer enthalten
                                `{duplicated_session_id,
                                duplicated_session_number, api_service}`, die
                                auf die erste übereinstimmende Sitzung
                                verweisen.
                            log_type:
                              type: string
                              enum:
                                - error
                                - warning
                                - information
                              description: >-
                                Schweregrad. `error`-Warnungen setzen `status`
                                auf `Declined`; `warning`- und
                                `information`-Einträge sind hinweisend und
                                führen für sich allein nie zu einer Ablehnung.
                            short_description:
                              type: string
                              description: >-
                                Für Menschen lesbare einzeilige Zusammenfassung
                                des Risikos.
                            long_description:
                              type: string
                              description: Lesbare Erklärung des Risikos.
                  vendor_data:
                    type: string
                    nullable: true
                    description: >-
                      Rückgabe der von Ihnen gesendeten `vendor_data` oder
                      `null`.
                  metadata:
                    type: object
                    nullable: true
                    additionalProperties: true
                    description: >-
                      Rückgabe des von Ihnen gesendeten `metadata`-Objekts oder
                      `null`.
                  created_at:
                    type: string
                    format: date-time
                    description: >-
                      ISO 8601-Zeitstempel (UTC), wann die Antwort generiert
                      wurde, z. B. `2026-06-12T01:04:42.763237+00:00`.
        '400':
          description: >-
            Validierungsfehler. Wird zurückgegeben, wenn `user_image` fehlt, 5
            MB überschreitet, eine nicht unterstützte Dateiendung hat oder im
            übermittelten Bild **kein Gesicht erkannt wird**. Feldfehler
            verwenden die DRF-Envelope `{field: [messages]}`; Fehler bei der
            Gesichtserkennung verwenden `{"error": ...}`.
          content:
            application/json:
              examples:
                No face detected:
                  summary: >-
                    Das Bild lässt sich fehlerfrei decodieren, enthält jedoch
                    kein erkennbares Gesicht
                  value:
                    error: No face detected in the image
                Missing image:
                  summary: '`user_image` ist nicht in den Formulardaten enthalten'
                  value:
                    user_image:
                      - No file was submitted.
                Unsupported file extension:
                  summary: Dateiendung außerhalb von tiff/jpg/jpeg/png/webp
                  value:
                    user_image:
                      - >-
                        File extension “txt” is not allowed. Allowed extensions
                        are: tiff, jpg, jpeg, png, webp.
                File too large:
                  summary: Der Upload überschreitet das Limit von 5 MB
                  value:
                    user_image:
                      - File size should not exceed 5 MB
        '403':
          description: >-
            Zugriff verweigert. Wird zurückgegeben, wenn der Header `x-api-key`
            fehlt sowie wenn das Guthaben der aufrufenden Organisation den
            Aufruf nicht decken kann; ein falscher, widerrufener oder
            abgelaufener Schlüssel gibt `401` zurück. Ein fehlender Schlüssel
            gibt `403` mit `{"detail": ...}` zurück; ein falscher, widerrufener
            oder abgelaufener Schlüssel gibt `401` zurück. Unzureichende Credits
            geben `403` mit `{"error": ...}` zurück, bevor eine Bildverarbeitung
            stattfindet.
          content:
            application/json:
              examples:
                Missing or invalid API key:
                  summary: >-
                    Kein `x-api-key`-Header, oder der Schlüssel ist
                    ungültig/widerrufen
                  value:
                    detail: You do not have permission to perform this action.
                Not enough credits:
                  summary: >-
                    Das Guthaben der Organisation reicht für den Aufruf nicht
                    aus
                  value:
                    error: >-
                      You don't have enough credits to perform this request.
                      Please top up at https://business.didit.me
        '429':
          description: >-
            Rate-Limit überschritten. POST/PATCH/DELETE-Endpoints teilen sich
            ein Budget von 300 Schreibanfragen pro Minute pro API-Schlüssel
            (Transaktionserstellungen und Ereignis-Ingestion haben ein separates
            Budget von 600). Die Antwort enthält die Header `X-RateLimit-Limit`,
            `X-RateLimit-Remaining`, `X-RateLimit-Reset` und `Retry-After`.
          content:
            application/json:
              examples:
                Write rate limit exceeded:
                  summary: Mehr als 300 Schreibanfragen in der aktuellen Minute
                  value:
                    detail: >-
                      Write request rate limit exceeded. You can make up to 300
                      requests per minute.
              schema:
                type: object
                properties:
                  detail:
                    type: string
      security:
        - ApiKeyAuth: []
      x-codeSamples:
        - lang: curl
          label: cURL
          source: |-
            curl -X POST 'https://verification.didit.me/v3/face-search/' \
              -H 'x-api-key: YOUR_API_KEY' \
              -F 'user_image=@./selfie.jpg' \
              -F 'search_type=most_similar' \
              -F 'save_api_request=true' \
              -F 'vendor_data=user-123'
        - lang: python
          label: Python
          source: |-
            from didit import Didit

            # Reads DIDIT_API_KEY.
            client = Didit()

            result = client.face_search.search(
                user_image=open("user_image.jpg", "rb"),
                search_type="most_similar",
                rotate_image=False,
                save_api_request=True,
                vendor_data="user-123",
                metadata={"flow": "dedup_check"},
            )
            print(result)
        - lang: javascript
          label: Node.js
          source: |-
            import Didit, { fileFromPath } from "@didit-protocol/sdk-node";

            // Reads DIDIT_API_KEY.
            const didit = new Didit();

            const result = await didit.faceSearch.search({
              user_image: await fileFromPath("user_image.jpg"),
              search_type: "most_similar",
              rotate_image: false,
              save_api_request: true,
              vendor_data: "user-123",
              metadata: { flow: "dedup_check" },
            });
            console.log(result);
        - lang: go
          label: Go
          source: "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.FaceSearch.Search(ctx, didit.FaceSearchSearchParams{\n\tUserImage:      didit.FileFromPath(\"user_image.jpg\"),\n\tSearchType:     didit.Some(didit.FaceSearchSearchParamsSearchType(\"most_similar\")),\n\tRotateImage:    didit.Bool(false),\n\tSaveAPIRequest: didit.Bool(true),\n\tVendorData:     didit.String(\"user-123\"),\n\tMetadata:       didit.Some(map[string]any{\"flow\": \"dedup_check\"}),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
        - lang: java
          label: Java
          source: >-
            import java.nio.file.Path;

            import java.util.Map;

            import me.didit.Didit;

            import me.didit.types.FaceSearchSearchParams;


            // Reads DIDIT_API_KEY.

            Didit client = new Didit();


            var result =
            client.faceSearch().search(FaceSearchSearchParams.builder()
                    .userImage(Path.of("user_image.jpg"))
                    .searchType(FaceSearchSearchParams.SearchType.of("most_similar"))
                    .rotateImage(false)
                    .saveApiRequest(true)
                    .vendorData("user-123")
                    .metadata(Map.of("flow", "dedup_check"))
                    .build());
            System.out.println(result);
        - lang: php
          label: PHP
          source: |-
            <?php

            require 'vendor/autoload.php';

            use Didit\DiditClient;
            use Didit\File;

            // Reads DIDIT_API_KEY.
            $didit = new DiditClient();

            $result = $didit->faceSearch->search([
                'user_image' => File::fromPath('user_image.jpg'),
                'search_type' => 'most_similar',
                'rotate_image' => false,
                'save_api_request' => true,
                'vendor_data' => 'user-123',
                'metadata' => ['flow' => 'dedup_check'],
            ]);
            print_r($result->toArray());
        - lang: ruby
          label: Ruby
          source: |-
            require "didit"

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

            result = didit.face_search.search(
              user_image: Pathname("user_image.jpg"),
              search_type: "most_similar",
              rotate_image: false,
              save_api_request: true,
              vendor_data: "user-123",
              metadata: { flow: "dedup_check" }
            )
            puts result.to_h
        - lang: csharp
          label: .NET
          source: >-
            using System;

            using System.Collections.Generic;

            using System.Text.Json;

            using Didit;


            // Reads DIDIT_API_KEY.

            using var client = new DiditClient();


            var result = await client.FaceSearch.SearchAsync(new
            FaceSearchSearchParams

            {
                UserImage = FileUpload.FromPath("user_image.jpg"),
                SearchType = new FaceSearchSearchParamsSearchType("most_similar"),
                RotateImage = false,
                SaveApiRequest = true,
                VendorData = "user-123",
                Metadata = new Dictionary<string, object> { ["flow"] = "dedup_check" },
            });

            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.