> ## 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 búsqueda facial: duplicados 1:N y redes de fraude

> Didit Face Search API: POST /v3/face-search/ busca rostros 1:N entre usuarios verificados. Detecta duplicados y redes de fraude en menos de 2 s.



## OpenAPI

````yaml es/openapi-25.json POST /v3/face-search/
openapi: 3.0.0
info:
  version: 3.0.0
  title: Didit Verification API
  description: API de verificación de identidad. Autentícate con el encabezado x-api-key.
servers:
  - url: https://verification.didit.me
security: []
tags: []
paths:
  /v3/face-search/:
    post:
      tags:
        - Standalone APIs
      summary: Búsqueda facial
      description: >-
        Busca una imagen de rostro (1:N) en el índice de búsqueda facial de tu
        aplicación (rostros registrados a partir de sesiones de verificación,
        llamadas independientes a la API guardadas, rostros subidos directamente
        a perfiles de usuario y tus listas de bloqueo y de permitidos) y obtén
        coincidencias ordenadas por similitud, junto con advertencias de lista
        de bloqueo y de duplicados.


        **Cómo funciona.** Se genera el embedding del rostro más grande
        detectado en `user_image` y se busca en el índice, limitado a tu
        aplicación. En `matches` se devuelven hasta **5 coincidencias** por
        encima del umbral mínimo de similitud. Cada una incluye
        `similarity_percentage`, la sesión de origen (`session_id`,
        `session_number`, `status`, `vendor_data`), los `user_details` extraídos
        durante la verificación de documentos de esa sesión, los indicadores
        `is_blocklisted` / `is_allowlisted` y un discriminador `source`
        (`session`, `imported` o `list_entry`).


        - `search_type=most_similar` (valor por defecto) ordena todos los
        rostros registrados por similitud. Úsalo para la deduplicación y la
        investigación de redes de fraude.

        - `search_type=blocklisted_or_approved` limita los candidatos a rostros
        de la lista de bloqueo, rostros de la lista de permitidos, rostros de
        sesiones aprobadas y rostros importados de perfiles de usuario, y coloca
        primero las entradas de la lista de bloqueo. Úsalo cuando el objetivo
        principal sea el control contra la lista de bloqueo.


        `status` es `Declined` solo cuando se dispara una advertencia
        `FACE_IN_BLOCKLIST` o `POSSIBLE_FACE_IN_BLOCKLIST`; `DUPLICATED_FACE` /
        `POSSIBLE_DUPLICATED_FACE` (`information`) y `MULTIPLE_FACES_DETECTED`
        (`warning`) nunca provocan un rechazo. A diferencia de la prueba de vida
        pasiva, este endpoint **no** excluye de las coincidencias las sesiones
        anteriores con el mismo `vendor_data`. También se ejecuta internamente
        un análisis de prueba de vida pasiva, que se almacena con la sesión
        persistida, pero su resultado no forma parte de esta respuesta.


        **Facturación.** Cada respuesta `200` consume un crédito de la API de
        Búsqueda facial (se paga con el crédito de tu plan o con tu saldo de
        recargas). Si el saldo es insuficiente, se devuelve `403` antes de
        procesar ninguna imagen.


        **Persistencia de la sesión y registro del rostro (`save_api_request`,
        `true` por defecto).** Cuando es `true`, la llamada se guarda como una
        sesión de tipo API (Business Console, `GET
        /v3/session/{sessionId}/decision/` mediante el `request_id` devuelto,
        webhook `status.updated`) y el rostro buscado se registra en tu índice
        de búsqueda facial. Los rostros registrados mediante llamadas de
        Búsqueda facial se excluyen de los resultados futuros de Búsqueda
        facial, por lo que las búsquedas repetidas nunca coinciden entre sí.
        Cuando es `false`, la llamada es puntual: no se almacena nada, el rostro
        no se registra y los valores de `match_image_url` son rutas de
        almacenamiento interno en lugar de URL descargables.


        **Sandbox.** Las claves de API de sandbox omiten todo el procesamiento y
        la facturación: tras validar la solicitud (una entrada mal formada sigue
        devolviendo `400`), el endpoint devuelve un payload simulado estático
        `Approved`, no se persiste ninguna sesión y no se consumen créditos.


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


        **Límite de solicitudes.** Presupuesto de escritura compartido de 300
        solicitudes/min por clave de API entre todos los endpoints
        POST/PATCH/DELETE; si se supera, se devuelve `429`.
      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: >-
                    Imagen frontal del rostro con la que buscar. Extensiones
                    permitidas: `tiff`, `jpg`, `jpeg`, `png`, `webp`. Tamaño
                    máximo de carga: **5 MB** (los archivos más grandes se
                    rechazan con `400`). Las imágenes se comprimen
                    automáticamente a ~0.5 MB antes del procesamiento, por lo
                    que las resoluciones muy altas no mejoran la precisión. La
                    imagen debe contener al menos un rostro detectable; de lo
                    contrario, el endpoint devuelve `400`. Cuando hay varios
                    rostros, se busca el más grande y se añade una advertencia
                    `MULTIPLE_FACES_DETECTED`.
                search_type:
                  type: string
                  default: most_similar
                  enum:
                    - most_similar
                    - blocklisted_or_approved
                  description: >-
                    Política de búsqueda. `most_similar` (predeterminado) ordena
                    por similitud todos los rostros registrados en tu
                    aplicación. `blocklisted_or_approved` limita los candidatos
                    a rostros en la lista de bloqueo, rostros en la lista de
                    permitidos, rostros de sesiones aprobadas y rostros de
                    perfiles de usuario importados, con las entradas de la lista
                    de bloqueo en primer lugar.
                  example: most_similar
                rotate_image:
                  type: boolean
                  default: false
                  description: >-
                    Si es `true`, el servicio prueba rotaciones de 90 grados de
                    la entrada y usa la orientación que ofrece la mejor
                    detección facial. Útil cuando falta la orientación EXIF.
                    Añade latencia.
                  example: false
                save_api_request:
                  type: boolean
                  default: true
                  description: >-
                    Si es `true` (valor predeterminado), guarda la llamada como
                    una sesión de tipo API, emite un webhook `status.updated`,
                    genera URL prefirmadas para los valores de `match_image_url`
                    y registra el rostro buscado en tu índice de búsqueda facial
                    (los registros de Búsqueda facial se excluyen de búsquedas
                    futuras). Si es `false`, la búsqueda es puntual: no se
                    almacena ninguna sesión y el rostro no se registra.
                  example: true
                vendor_data:
                  type: string
                  description: >-
                    Identificador opaco opcional (tu ID de usuario, correo
                    electrónico, UUID…) que se guarda en la sesión persistida y
                    se devuelve. No excluye de los resultados de la búsqueda los
                    rostros del mismo usuario.
                  example: user-123
                metadata:
                  type: object
                  additionalProperties: true
                  description: >-
                    Objeto JSON opcional que se almacena con la sesión (cuando
                    `save_api_request=true`) y se devuelve. En solicitudes
                    multipart, envíalo como un campo de cadena codificado en
                    JSON: se convierte en un objeto.
                  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: >-
            Búsqueda facial completada. `face_search.matches` contiene hasta 5
            rostros similares ordenados por similitud; un array vacío significa
            que ningún rostro registrado superó el umbral mínimo de similitud.
            `status` es `Declined` solo cuando hay coincidencias en la lista de
            bloqueo: las coincidencias duplicadas por sí solas devuelven
            `Approved`, así que revisa `matches` y `warnings`, no solo `status`.
            Cuando `save_api_request=true`, `request_id` es el ID de la sesión
            guardada. Cada coincidencia incluye `source` (`session`, `imported`,
            `list_entry` o `retained_template`), `vendor_user_id` y
            `biometric_template_id`; una coincidencia `retained_template`
            procede de una plantilla biométrica sin imagen que se conservó
            después de que se eliminara la sesión de origen, y tiene `null` en
            los campos de sesión, `match_image_url` y `user_details`.
          content:
            application/json:
              examples:
                Blocklist hit (Declined):
                  summary: El rostro coincide con un rostro de la lista de bloqueo
                  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: >-
                    El rostro ya apareció en otra sesión aprobada; es
                    informativo y no provoca un rechazo
                  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: >-
                    Ningún rostro registrado superó el umbral mínimo de
                    similitud
                  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: >-
                      ID de la sesión guardada cuando `save_api_request=true`
                      (se puede usar con `GET
                      /v3/session/{sessionId}/decision/`); en caso contrario, un
                      UUID de correlación temporal.
                  face_search:
                    type: object
                    properties:
                      status:
                        type: string
                        enum:
                          - Approved
                          - Declined
                        description: >-
                          `Declined` solo cuando se activó una advertencia
                          `FACE_IN_BLOCKLIST` o `POSSIBLE_FACE_IN_BLOCKLIST`.
                          Las coincidencias duplicadas y las advertencias de
                          varios rostros nunca provocan un rechazo.
                      total_matches:
                        type: integer
                        description: Número de entradas en `matches` (0–5).
                        example: 1
                      matches:
                        type: array
                        maxItems: 5
                        description: >-
                          Hasta 5 rostros de tu índice de búsqueda facial que
                          superan el umbral mínimo de similitud, ordenados por
                          similitud (con las entradas de la lista de bloqueo en
                          primer lugar cuando
                          `search_type=blocklisted_or_approved`). Vacío cuando
                          ningún rostro registrado es lo bastante similar.
                        items:
                          type: object
                          properties:
                            session_id:
                              type: string
                              format: uuid
                              nullable: true
                              description: >-
                                Id de la sesión de verificación a la que
                                pertenece el rostro coincidente. `null` cuando
                                `source` es `imported`, `list_entry` o
                                `retained_template`.
                              example: 882c42d5-8a4d-4d20-8080-a22f57822c86
                            session_number:
                              type: integer
                              nullable: true
                              description: >-
                                Número de sesión legible que se muestra en la
                                Business Console. `null` en las coincidencias
                                que no son sesiones.
                              example: 323442
                            similarity_percentage:
                              type: number
                              format: float
                              minimum: 0
                              maximum: 100
                              description: >-
                                Similitud entre el rostro enviado y el rostro
                                coincidente (0–100).
                              example: 99.99
                            source:
                              type: string
                              enum:
                                - session
                                - imported
                                - list_entry
                                - retained_template
                              description: >-
                                Origen del registro del rostro coincidente:
                                `session`: una sesión de verificación o una
                                llamada independiente a la API guardada;
                                `imported`: un rostro subido directamente a un
                                perfil de usuario; `list_entry`: un rostro
                                asociado a una de tus listas;
                                `retained_template`: una plantilla biométrica
                                sin imagen almacenada en un usuario, que aparece
                                en `/v3/biometric-templates/`.
                            vendor_data:
                              type: string
                              nullable: true
                              description: >-
                                `vendor_data` de la sesión coincidente o del
                                User vinculado, para rostros importados y
                                rostros con plantilla retenida.
                              example: user-1
                            vendor_user_id:
                              type: string
                              format: uuid
                              nullable: true
                              description: >-
                                ID del usuario vinculado. `null` para las
                                entradas de lista y las coincidencias de sesión
                                sin usuario.
                              example: 2f7c1a9e-4b28-4a6d-97f1-83576f80e1b4
                            biometric_template_id:
                              type: string
                              format: uuid
                              nullable: true
                              description: >-
                                ID de la plantilla biométrica conservada. Solo
                                se establece cuando `source` es
                                `retained_template`; `null` en caso contrario.
                              example: null
                            verification_date:
                              type: string
                              format: date-time
                              nullable: true
                              description: >-
                                Fecha y hora en que se capturó originalmente el
                                rostro coincidente, o en que se creó una
                                plantilla conservada (`YYYY-MM-DDThh:mm:ssZ`).
                                `null` para coincidencias `list_entry`.
                              example: '2025-01-01T00:00:00Z'
                            user_details:
                              type: object
                              nullable: true
                              description: >-
                                Datos de identidad extraídos durante la
                                verificación del documento de la sesión
                                coincidente. `null` cuando la sesión coincidente
                                no tiene datos de documento (p. ej., sesiones
                                solo de prueba de vida) y siempre `null` en las
                                coincidencias `retained_template`. En las
                                coincidencias con `source: imported`, se rellena
                                en cambio a partir del perfil de usuario:
                                `full_name` informado y
                                `document_type`/`document_number` en 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: >-
                                URL de validez limitada
                                (`https://<media-host>/...`) de la imagen de
                                referencia del rostro coincidente cuando
                                `save_api_request=true`. Con
                                `save_api_request=false`, es una ruta de
                                almacenamiento interna que no se puede descargar
                                directamente. Siempre es `null` en las
                                coincidencias `retained_template`, porque las
                                plantillas retenidas no contienen ninguna
                                imagen.
                              example: https://<media-host>/face/3f6a1c2e/reference.jpg
                            status:
                              type: string
                              nullable: true
                              description: >-
                                Estado de la sesión coincidente (`Approved`,
                                `Declined`, `In Review`, …). `null` para
                                coincidencias `imported`/`list_entry`.
                              example: Approved
                            is_blocklisted:
                              type: boolean
                              description: >-
                                `true` cuando el rostro coincidente está en tu
                                lista de bloqueo facial. Cualquier coincidencia
                                suficientemente similar en la lista de bloqueo
                                rechaza la búsqueda.
                            is_allowlisted:
                              type: boolean
                              description: >-
                                `true` cuando el rostro coincidente está en una
                                de tus listas de permitidos. Las coincidencias
                                en listas de permitidos suprimen las
                                advertencias de duplicado.
                            api_service:
                              type: string
                              nullable: true
                              description: >-
                                Se establece cuando el rostro coincidente se
                                registró mediante una llamada a la API
                                independiente (p. ej., `PASSIVE_LIVENESS`);
                                `null` para las sesiones de verificación
                                normales y los rostros importados.
                              example: null
                      user_image:
                        type: object
                        description: >-
                          Resultados de la detección facial de la imagen
                          enviada. Estas entradas solo incluyen `bbox` y
                          `confidence`.
                        properties:
                          entities:
                            type: array
                            description: >-
                              Una entrada por rostro detectado. El rostro más
                              grande es el que se busca.
                            items:
                              type: object
                              properties:
                                bbox:
                                  type: array
                                  items:
                                    type: integer
                                  minItems: 4
                                  maxItems: 4
                                  description: >-
                                    Cuadro delimitador `[x_min, y_min, x_max,
                                    y_max]` en píxeles.
                                  example:
                                    - 40
                                    - 40
                                    - 120
                                    - 120
                                confidence:
                                  type: number
                                  format: float
                                  minimum: 0
                                  maximum: 1
                                  description: Confianza de la detección facial (0–1).
                                  example: 0.732973
                          best_angle:
                            type: integer
                            description: >-
                              Rotación (en grados) que produjo la mejor
                              detección facial; solo es distinta de cero cuando
                              `rotate_image=true` corrigió la orientación. Nunca
                              es null en este endpoint (toma el valor 0 por
                              defecto cuando el modelo la omite).
                            example: 0
                      warnings:
                        type: array
                        description: >-
                          Señales de riesgo. `FACE_IN_BLOCKLIST` /
                          `POSSIBLE_FACE_IN_BLOCKLIST` (`error`) rechazan la
                          búsqueda; `MULTIPLE_FACES_DETECTED` (`warning`) y
                          `DUPLICATED_FACE` / `POSSIBLE_DUPLICATED_FACE`
                          (`information`) son solo informativas.
                        items:
                          type: object
                          properties:
                            risk:
                              type: string
                              enum:
                                - MULTIPLE_FACES_DETECTED
                                - FACE_IN_BLOCKLIST
                                - POSSIBLE_FACE_IN_BLOCKLIST
                                - DUPLICATED_FACE
                                - POSSIBLE_DUPLICATED_FACE
                              description: Código de riesgo legible por máquina.
                            feature:
                              type: string
                              enum:
                                - LIVENESS
                              description: >-
                                Función que emitió la advertencia. En este
                                endpoint siempre es `LIVENESS`.
                            additional_data:
                              type: object
                              nullable: true
                              additionalProperties: true
                              description: >-
                                `null` para `MULTIPLE_FACES_DETECTED`. Las
                                coincidencias en la lista de bloqueo incluyen
                                `{blocklisted_session_id,
                                blocklisted_session_number, api_service}`; las
                                coincidencias de duplicados incluyen
                                `{duplicated_session_id,
                                duplicated_session_number, api_service}`, que
                                apunta a la primera sesión coincidente.
                            log_type:
                              type: string
                              enum:
                                - error
                                - warning
                                - information
                              description: >-
                                Gravedad. Las advertencias `error` llevan
                                `status` a `Declined`; las entradas `warning` e
                                `information` son informativas y nunca rechazan
                                por sí solas.
                            short_description:
                              type: string
                              description: Resumen legible del riesgo en una línea.
                            long_description:
                              type: string
                              description: Explicación legible del riesgo.
                  vendor_data:
                    type: string
                    nullable: true
                    description: Devuelve el `vendor_data` que enviaste, o `null`.
                  metadata:
                    type: object
                    nullable: true
                    additionalProperties: true
                    description: Devuelve el objeto `metadata` que enviaste, o `null`.
                  created_at:
                    type: string
                    format: date-time
                    description: >-
                      Marca de tiempo ISO 8601 (UTC) del momento en que se
                      generó la respuesta, p. ej.,
                      `2026-06-12T01:04:42.763237+00:00`.
        '400':
          description: >-
            Error de validación. Se devuelve cuando falta `user_image`, supera
            los 5 MB o tiene una extensión no admitida, o cuando **no se detecta
            ningún rostro** en la imagen enviada. Los errores de campo usan el
            formato `{field: [messages]}` de DRF; los fallos de detección facial
            usan `{"error": ...}`.
          content:
            application/json:
              examples:
                No face detected:
                  summary: >-
                    La imagen se decodifica correctamente, pero no contiene
                    ningún rostro detectable
                  value:
                    error: No face detected in the image
                Missing image:
                  summary: '`user_image` no incluido en los datos del formulario'
                  value:
                    user_image:
                      - No file was submitted.
                Unsupported file extension:
                  summary: Extensión de archivo distinta de 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: El archivo supera el límite de 5 MB
                  value:
                    user_image:
                      - File size should not exceed 5 MB
        '403':
          description: >-
            Permiso denegado. Se devuelve cuando falta el encabezado `x-api-key`
            y también cuando el saldo de la organización que realiza la llamada
            no la cubre; una clave incorrecta, revocada o expirada devuelve
            `401`. Si falta la clave, se devuelve `403` con `{"detail": ...}`;
            una clave incorrecta, revocada o expirada devuelve `401`. La falta
            de créditos devuelve `403` con `{"error": ...}` antes de que se
            procese ninguna imagen.
          content:
            application/json:
              examples:
                Missing or invalid API key:
                  summary: >-
                    Falta el encabezado `x-api-key`, o la clave no es válida o
                    está revocada
                  value:
                    detail: You do not have permission to perform this action.
                Not enough credits:
                  summary: El saldo de la organización no cubre la llamada
                  value:
                    error: >-
                      You don't have enough credits to perform this request.
                      Please top up at https://business.didit.me
        '429':
          description: >-
            Límite de solicitudes superado. Todos los endpoints
            POST/PATCH/DELETE comparten un presupuesto de 300 solicitudes de
            escritura por minuto por clave de API. La respuesta incluye los
            encabezados `X-RateLimit-Limit`, `X-RateLimit-Remaining`,
            `X-RateLimit-Reset` y `Retry-After`.
          content:
            application/json:
              examples:
                Write rate limit exceeded:
                  summary: Más de 300 solicitudes de escritura en el minuto actual
                  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 clave de API de tu aplicación, que encontrarás en Developers -> API
        keys en la Business Console. La clave principal tiene acceso completo.
        Una clave con nombre puede tener un alcance limitado: ninguno, lectura o
        escritura por recurso, limitada a algunos flujos o a sesiones aprobadas,
        a una lista de direcciones IP y a una fecha de caducidad. 401 significa
        que la clave es incorrecta, se revocó o expiró; 403 significa que no se
        envió ninguna clave, que la clave no tiene acceso a este recurso o
        acción, o que la solicitud provino de una dirección fuera de su lista de
        IP; 404 en una ruta de sesión significa que la sesión está fuera de los
        flujos o estados de la clave. Una clave sin acceso a contenido
        multimedia recibe las URL de imágenes, videos y PDF como null, y una
        clave sin permiso de escritura en sesiones recibe los enlaces y tokens
        de sesión como null. Consulta https://docs.didit.me/console/api-keys.

````

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