> ## 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 de recherche faciale 1:N : déduplication et fraude

> API de recherche faciale 1:N de Didit : doublons, réseaux de fraude et réauthentification. POST /v3/face-search/, inférence sous 2s, sans contrat.



## OpenAPI

````yaml fr/openapi-25.json POST /v3/face-search/
openapi: 3.0.0
info:
  version: 3.0.0
  title: Didit Verification API
  description: API de vérification d'identité. Authentifiez-vous avec l'en-tête x-api-key.
servers:
  - url: https://verification.didit.me
security: []
tags: []
paths:
  /v3/face-search/:
    post:
      tags:
        - Standalone APIs
      summary: Recherche faciale
      description: >-
        Recherchez une image de visage (1:N) dans l'index de recherche faciale
        de votre application — visages enregistrés à partir de sessions de
        vérification, d'appels d'API autonomes enregistrés, de téléversements
        directs de visages de profils utilisateurs et de vos listes de
        blocage/d'autorisation — et obtenez des correspondances de similarité
        classées ainsi que des avertissements de liste de blocage et de
        doublons.


        **Fonctionnement.** Le plus grand visage détecté dans `user_image` est
        converti en embedding et recherché dans l'index, circonscrit à votre
        application. Jusqu'à **5 correspondances** au-dessus du seuil minimal de
        similarité sont renvoyées dans `matches`, chacune avec
        `similarity_percentage`, la session d'origine (`session_id`,
        `session_number`, `status`, `vendor_data`), les `user_details` extraits
        lors de la vérification de document de cette session, les indicateurs
        `is_blocklisted` / `is_allowlisted`, et un discriminateur `source`
        (`session`, `imported` ou `list_entry`).


        - `search_type=most_similar` (par défaut) classe chaque visage
        enregistré par similarité — utilisez-le pour la déduplication et
        l'enquête sur les réseaux de fraude.

        - `search_type=blocklisted_or_approved` restreint les candidats aux
        visages sur liste de blocage, sur liste d'autorisation, aux visages
        issus de sessions approuvées et aux visages de profils utilisateurs
        importés, en classant les entrées sur liste de blocage en premier —
        utilisez-le lorsque l'objectif principal est le filtrage sur liste de
        blocage.


        `status` est `Declined` uniquement lorsqu'un avertissement
        `FACE_IN_BLOCKLIST` ou `POSSIBLE_FACE_IN_BLOCKLIST` se déclenche ;
        `DUPLICATED_FACE` / `POSSIBLE_DUPLICATED_FACE` (`information`) et
        `MULTIPLE_FACES_DETECTED` (`warning`) ne refusent jamais. Contrairement
        à la détection passive du vivant, cet endpoint n'exclut **pas** des
        correspondances les sessions antérieures avec le même `vendor_data`. Une
        analyse de détection passive du vivant s'exécute également en interne et
        est stockée avec la session persistée, mais son résultat ne fait pas
        partie de cette réponse.


        **Facturation.** Chaque réponse `200` consomme un crédit d'API de
        recherche faciale (déduit du crédit de votre forfait ou de votre solde
        de recharge). Un solde insuffisant renvoie `403` avant tout traitement
        d'image.


        **Persistance de session et enregistrement de visage
        (`save_api_request`, par défaut `true`).** Lorsque défini sur `true`,
        l'appel est persisté en tant que session de type API (Business Console,
        `GET /v3/session/{sessionId}/decision/` via le `request_id` renvoyé,
        webhook `status.updated`) et le visage recherché est enregistré dans
        votre index de recherche faciale. Les visages enregistrés par des appels
        de recherche faciale sont exclus des futurs résultats de recherche
        faciale, afin que des recherches répétées ne correspondent jamais entre
        elles. Lorsque défini sur `false`, l'appel est ponctuel : rien n'est
        stocké, le visage n'est pas enregistré, et les valeurs `match_image_url`
        sont des chemins de stockage internes plutôt que des URL
        téléchargeables.


        **Sandbox.** Les clés API de sandbox ignorent tout traitement et toute
        facturation : après la validation de la requête (une entrée malformée
        renvoie toujours `400`), l'endpoint renvoie un payload fictif statique
        `Approved`, aucune session n'est persistée et aucun crédit n'est
        consommé.


        **Authentification.** Envoyez la clé API de votre application dans
        l'en-tête `x-api-key`. Des identifiants manquants ou non valides
        renvoient `403` (`{"detail": "You do not have permission to perform this
        action."}`) — cette API ne renvoie jamais `401`.


        **Limite de débit.** Budget d'écriture partagé de 300 requêtes/min par
        clé API sur l'ensemble des endpoints POST/PATCH/DELETE ; tout
        dépassement renvoie `429`.
      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: >-
                    Image du visage de face avec laquelle effectuer la
                    recherche. Extensions autorisées : `tiff`, `jpg`, `jpeg`,
                    `png`, `webp`. Taille maximale de téléversement : **5 MB**
                    (les fichiers plus volumineux sont rejetés avec une erreur
                    `400`). Les images sont automatiquement compressées à ~0.5
                    MB avant traitement, de sorte que les très hautes
                    résolutions n'améliorent pas la précision. L'image doit
                    contenir au moins un visage détectable — sinon l'endpoint
                    renvoie `400`. Lorsque plusieurs visages sont présents, la
                    recherche porte sur le plus grand et un avertissement
                    `MULTIPLE_FACES_DETECTED` est ajouté.
                search_type:
                  type: string
                  default: most_similar
                  enum:
                    - most_similar
                    - blocklisted_or_approved
                  description: >-
                    Règle de recherche. `most_similar` (par défaut) classe
                    chaque visage inscrit dans votre application par similarité.
                    `blocklisted_or_approved` restreint les candidats aux
                    visages sur liste de blocage, sur liste blanche, aux visages
                    issus de sessions approuvées et aux visages de profils
                    d'utilisateurs importés — les entrées sur liste de blocage
                    étant classées en premier.
                  example: most_similar
                rotate_image:
                  type: boolean
                  default: false
                  description: >-
                    Lorsque la valeur est `true`, le service applique des
                    rotations de 90 degrés à l'image fournie et utilise
                    l'orientation qui produit la meilleure détection faciale.
                    Utile lorsque l'orientation EXIF est manquante. Ajoute de la
                    latence.
                  example: false
                save_api_request:
                  type: boolean
                  default: true
                  description: >-
                    Lorsque la valeur est `true` (par défaut), conserve l'appel
                    sous forme de session de type API, émet un webhook
                    `status.updated`, pré-signe les valeurs `match_image_url` et
                    inscrit le visage recherché dans votre index de Recherche
                    faciale (les inscriptions à la Recherche faciale sont
                    exclues des recherches futures). Lorsque la valeur est
                    `false`, la recherche est ponctuelle — aucune session n'est
                    stockée et le visage n'est pas inscrit.
                  example: true
                vendor_data:
                  type: string
                  description: >-
                    Identifiant opaque optionnel (votre identifiant
                    d'utilisateur, e-mail, UUID…) stocké sur la session
                    persistée et renvoyé. Il n'exclut pas les visages du même
                    utilisateur des résultats de recherche.
                  example: user-123
                metadata:
                  type: object
                  additionalProperties: true
                  description: >-
                    Objet JSON optionnel stocké avec la session (lorsque
                    `save_api_request=true`) et renvoyé. Dans les requêtes
                    multipart, envoyez-le sous forme de champ textuel encodé en
                    JSON — il est analysé sous forme d'objet.
                  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: >-
            Recherche faciale terminée. `face_search.matches` contient jusqu'à 5
            visages similaires classés par similarité ; un tableau vide signifie
            qu'aucun visage enregistré n'a dépassé le seuil minimal de
            similarité. `status` est `Declined` uniquement en cas de
            correspondance avec une liste de blocage — les correspondances en
            doublon seules renvoient `Approved`, inspectez donc `matches` et
            `warnings`, pas seulement `status`. Lorsque `save_api_request=true`,
            `request_id` est l'identifiant de la session conservée. Chaque
            correspondance contient `source` (`session`, `imported`,
            `list_entry` ou `retained_template`), `vendor_user_id` et
            `biometric_template_id` ; une correspondance `retained_template`
            provient d'un gabarit biométrique sans image conservé après la
            suppression de la session source et présente des champs de session,
            `match_image_url` et `user_details` à `null`.
          content:
            application/json:
              examples:
                Blocklist hit (Declined):
                  summary: >-
                    Le visage correspond à un visage figurant sur une liste de
                    blocage
                  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: >-
                    Le visage est déjà apparu dans une autre session approuvée —
                    informatif, aucun refus
                  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: >-
                    Aucun visage enregistré n'a dépassé le seuil minimal de
                    similarité
                  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: "Identifiant de session persistante lorsque `save_api_request=true` (utilisable avec `GET /v3/session/{sessionId}/decision/`)\_; sinon un UUID de corrélation temporaire."
                  face_search:
                    type: object
                    properties:
                      status:
                        type: string
                        enum:
                          - Approved
                          - Declined
                        description: >-
                          `Declined` uniquement lorsqu'un avertissement
                          `FACE_IN_BLOCKLIST` ou `POSSIBLE_FACE_IN_BLOCKLIST`
                          s'est déclenché. Les correspondances en double et les
                          avertissements de visages multiples n'entraînent
                          jamais de refus.
                      total_matches:
                        type: integer
                        description: Nombre d'entrées dans `matches` (0–5).
                        example: 1
                      matches:
                        type: array
                        maxItems: 5
                        description: >-
                          Jusqu'à 5 visages de votre index de recherche faciale
                          dépassant le seuil de similarité, classés par
                          similarité (avec les entrées sur liste de blocage
                          classées en premier lorsque
                          `search_type=blocklisted_or_approved`). Vide
                          lorsqu'aucun visage enregistré n'est suffisamment
                          similaire.
                        items:
                          type: object
                          properties:
                            session_id:
                              type: string
                              format: uuid
                              nullable: true
                              description: >-
                                Identifiant de la session de vérification à
                                laquelle appartient le visage correspondant.
                                `null` lorsque `source` vaut `imported`,
                                `list_entry` ou `retained_template`.
                              example: 882c42d5-8a4d-4d20-8080-a22f57822c86
                            session_number:
                              type: integer
                              nullable: true
                              description: >-
                                Numéro de session lisible par l'humain affiché
                                dans la Business Console. `null` pour les
                                correspondances hors session.
                              example: 323442
                            similarity_percentage:
                              type: number
                              format: float
                              minimum: 0
                              maximum: 100
                              description: >-
                                Similarité entre le visage soumis et le visage
                                correspondant (0–100).
                              example: 99.99
                            source:
                              type: string
                              enum:
                                - session
                                - imported
                                - list_entry
                                - retained_template
                              description: >-
                                Provenance de l'enrôlement du visage
                                correspondant : `session` — une session de
                                vérification ou un appel API autonome enregistré
                                ; `imported` — un visage téléversé directement
                                sur un profil utilisateur ; `list_entry` — un
                                visage associé à l'une de vos listes ;
                                `retained_template` — un gabarit biométrique
                                sans image associé à un utilisateur, répertorié
                                sous `/v3/biometric-templates/`.
                            vendor_data:
                              type: string
                              nullable: true
                              description: >-
                                `vendor_data` de la session correspondante ou de
                                l'utilisateur lié pour les visages importés et
                                les gabarits conservés.
                              example: user-1
                            vendor_user_id:
                              type: string
                              format: uuid
                              nullable: true
                              description: >-
                                Identifiant de l'utilisateur associé. `null`
                                pour les entrées de liste et les correspondances
                                de session sans utilisateur.
                              example: 2f7c1a9e-4b28-4a6d-97f1-83576f80e1b4
                            biometric_template_id:
                              type: string
                              format: uuid
                              nullable: true
                              description: >-
                                Identifiant du gabarit biométrique conservé.
                                Renseigné uniquement lorsque `source` vaut
                                `retained_template` ; `null` sinon.
                              example: null
                            verification_date:
                              type: string
                              format: date-time
                              nullable: true
                              description: >-
                                Moment où le visage correspondant a été
                                initialement capturé, ou lorsqu'un gabarit
                                conservé a été créé (`YYYY-MM-DDThh:mm:ssZ`).
                                `null` pour les correspondances `list_entry`.
                              example: '2025-01-01T00:00:00Z'
                            user_details:
                              type: object
                              nullable: true
                              description: >-
                                Données d'identité extraites lors de la
                                vérification de document de la session
                                correspondante. `null` lorsque la session
                                correspondante n'a pas de données de document
                                (par exemple, sessions avec détection du vivant
                                uniquement) et toujours `null` pour les
                                correspondances `retained_template`. Pour les
                                correspondances avec `source: imported`, elles
                                sont renseignées à partir du profil utilisateur
                                : `full_name` est défini,
                                `document_type`/`document_number` sont nuls.
                              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: >-
                                URL temporaire (`https://<media-host>/...`) de
                                l'image de référence du visage correspondant
                                lorsque `save_api_request=true`. Avec
                                `save_api_request=false`, il s'agit d'un chemin
                                de stockage interne qui n'est pas directement
                                téléchargeable. Vaut toujours `null` pour les
                                correspondances de `retained_template`, car les
                                gabarits conservés ne contiennent aucune image.
                              example: https://<media-host>/face/3f6a1c2e/reference.jpg
                            status:
                              type: string
                              nullable: true
                              description: >-
                                Statut de la session correspondante (`Approved`,
                                `Declined`, `In Review`, …). `null` pour les
                                correspondances `imported`/`list_entry`.
                              example: Approved
                            is_blocklisted:
                              type: boolean
                              description: >-
                                `true` lorsque le visage correspondant figure
                                sur votre liste de blocage de visages. Toute
                                correspondance suffisamment similaire présente
                                sur la liste de blocage entraîne le refus de la
                                recherche.
                            is_allowlisted:
                              type: boolean
                              description: >-
                                `true` lorsque le visage correspondant figure
                                sur l'une de vos listes d'autorisation. Les
                                correspondances figurant sur liste
                                d'autorisation suppriment les avertissements de
                                doublon.
                            api_service:
                              type: string
                              nullable: true
                              description: >-
                                Défini lorsque le visage correspondant a été
                                enrôlé par un appel d'API autonome (par ex.
                                `PASSIVE_LIVENESS`) ; `null` pour les sessions
                                de vérification standard et les visages
                                importés.
                              example: null
                      user_image:
                        type: object
                        description: >-
                          Résultats de la détection faciale pour l'image
                          soumise. Les entrées ici ne comportent que `bbox` et
                          `confidence`.
                        properties:
                          entities:
                            type: array
                            description: >-
                              Une entrée par visage détecté. Le visage le plus
                              grand est celui qui est recherché.
                            items:
                              type: object
                              properties:
                                bbox:
                                  type: array
                                  items:
                                    type: integer
                                  minItems: 4
                                  maxItems: 4
                                  description: >-
                                    Boîte englobante `[x_min, y_min, x_max,
                                    y_max]` en pixels.
                                  example:
                                    - 40
                                    - 40
                                    - 120
                                    - 120
                                confidence:
                                  type: number
                                  format: float
                                  minimum: 0
                                  maximum: 1
                                  description: >-
                                    Indice de confiance de la détection faciale
                                    (0–1).
                                  example: 0.732973
                          best_angle:
                            type: integer
                            description: >-
                              Rotation (en degrés) ayant produit la meilleure
                              détection de visage ; non nulle uniquement lorsque
                              `rotate_image=true` a corrigé l'orientation. N'est
                              jamais null sur cet endpoint (prend la valeur 0
                              par défaut lorsque le modèle l'omet).
                            example: 0
                      warnings:
                        type: array
                        description: >-
                          Signaux de risque. `FACE_IN_BLOCKLIST` /
                          `POSSIBLE_FACE_IN_BLOCKLIST` (`error`) refusent la
                          recherche ; `MULTIPLE_FACES_DETECTED` (`warning`) et
                          `DUPLICATED_FACE` / `POSSIBLE_DUPLICATED_FACE`
                          (`information`) sont informatifs.
                        items:
                          type: object
                          properties:
                            risk:
                              type: string
                              enum:
                                - MULTIPLE_FACES_DETECTED
                                - FACE_IN_BLOCKLIST
                                - POSSIBLE_FACE_IN_BLOCKLIST
                                - DUPLICATED_FACE
                                - POSSIBLE_DUPLICATED_FACE
                              description: Code de risque lisible par machine.
                            feature:
                              type: string
                              enum:
                                - LIVENESS
                              description: >-
                                Fonctionnalité ayant émis l'avertissement.
                                Toujours `LIVENESS` sur cet endpoint.
                            additional_data:
                              type: object
                              nullable: true
                              additionalProperties: true
                              description: >-
                                `null` pour `MULTIPLE_FACES_DETECTED`. Les
                                correspondances avec la liste de blocage
                                comportent `{blocklisted_session_id,
                                blocklisted_session_number, api_service}` ; les
                                correspondances de doublons comportent
                                `{duplicated_session_id,
                                duplicated_session_number, api_service}`
                                pointant vers la première session
                                correspondante.
                            log_type:
                              type: string
                              enum:
                                - error
                                - warning
                                - information
                              description: >-
                                Gravité. Les avertissements `error` font passer
                                `status` à `Declined` ; les entrées `warning` et
                                `information` sont indicatives et ne refusent
                                jamais d'elles-mêmes.
                            short_description:
                              type: string
                              description: >-
                                Résumé du risque en une ligne, lisible par
                                l'utilisateur.
                            long_description:
                              type: string
                              description: Explication lisible par l'humain du risque.
                  vendor_data:
                    type: string
                    nullable: true
                    description: Écho des `vendor_data` que vous avez envoyées, ou `null`.
                  metadata:
                    type: object
                    nullable: true
                    additionalProperties: true
                    description: >-
                      Écho de l'objet `metadata` que vous avez envoyé, ou
                      `null`.
                  created_at:
                    type: string
                    format: date-time
                    description: >-
                      Horodatage ISO 8601 (UTC) du moment où la réponse a été
                      générée, ex. `2026-06-12T01:04:42.763237+00:00`.
        '400':
          description: >-
            Erreur de validation. Renvoyée lorsque `user_image` est manquant,
            dépasse 5 Mo, possède une extension non prise en charge, ou lorsque
            **aucun visage n'est détecté** dans l'image soumise. Les erreurs de
            champ utilisent l'enveloppe `{field: [messages]}` de DRF ; les
            échecs de détection de visage utilisent `{"error": ...}`.
          content:
            application/json:
              examples:
                No face detected:
                  summary: >-
                    L'image se décode correctement mais ne contient aucun visage
                    détectable
                  value:
                    error: No face detected in the image
                Missing image:
                  summary: '`user_image` non inclus dans les données de formulaire'
                  value:
                    user_image:
                      - No file was submitted.
                Unsupported file extension:
                  summary: Extension de fichier autre que 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: Le téléversement dépasse la limite de 5 MB
                  value:
                    user_image:
                      - File size should not exceed 5 MB
        '403':
          description: "Permission refusée. Renvoyé lorsque l'en-tête `x-api-key` est manquant, ainsi que lorsque le solde de l'organisation appelante ne permet pas de couvrir l'appel\_; une clé incorrecte, révoquée ou expirée renvoie `401`. Une clé manquante renvoie `403` avec `{\"detail\": ...}`\_; une clé incorrecte, révoquée ou expirée renvoie `401`. Les crédits insuffisants renvoient `403` avec `{\"error\": ...}` avant tout traitement d'image."
          content:
            application/json:
              examples:
                Missing or invalid API key:
                  summary: Aucun en-tête `x-api-key`, ou la clé est non valide/révoquée
                  value:
                    detail: You do not have permission to perform this action.
                Not enough credits:
                  summary: Le solde de l'organisation ne peut pas couvrir l'appel
                  value:
                    error: >-
                      You don't have enough credits to perform this request.
                      Please top up at https://business.didit.me
        '429':
          description: >-
            Limite de débit dépassée. Les endpoints POST/PATCH/DELETE partagent
            un budget de 300 requêtes d'écriture par minute par clé API (la
            création de transactions et l'ingestion d'événements ont un budget
            distinct de 600). La réponse comporte les en-têtes
            `X-RateLimit-Limit`, `X-RateLimit-Remaining`, `X-RateLimit-Reset` et
            `Retry-After`.
          content:
            application/json:
              examples:
                Write rate limit exceeded:
                  summary: >-
                    Plus de 300 requêtes d'écriture au cours de la minute
                    actuelle
                  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: >-
        La clé API de votre application, issue de Développeurs -> Clés API dans
        la Business Console. La clé principale dispose d'un accès complet. Une
        clé nommée peut être restreinte : aucun, lecture ou écriture par
        ressource, limitée à certains workflows ou aux sessions approuvées, à
        une liste d'adresses IP et à une date d'expiration. 401 signifie que la
        clé est incorrecte, révoquée ou expirée ; 403 signifie qu'aucune clé n'a
        été envoyée, que la clé n'a pas accès à cette ressource ou action, ou
        que la requête provient d'une adresse hors de sa liste d'IP ; 404 sur
        une route de session signifie que la session est hors des workflows ou
        des statuts de la clé. Une clé sans accès aux médias reçoit les URL
        d'images, de vidéos et de PDF à null, et une clé sans accès en écriture
        aux sessions reçoit les liens et tokens de session à null. Voir
        https://docs.didit.me/console/api-keys.

````

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