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

# Ricerca facciale API: deduplica 1:N e frodi | Didit

> Didit: POST /v3/face-search/ per ricerca facciale 1:N su utenti verificati. Rileva duplicati, reti di frodi e riautenticazioni. Sotto 2s, a consumo.



## OpenAPI

````yaml it/openapi-25.json POST /v3/face-search/
openapi: 3.0.0
info:
  version: 3.0.0
  title: Didit Verification API
  description: API di verifica dell'identità. Autenticati con l'intestazione x-api-key.
servers:
  - url: https://verification.didit.me
security: []
tags: []
paths:
  /v3/face-search/:
    post:
      tags:
        - Standalone APIs
      summary: Ricerca facciale
      description: >-
        Cerca un'immagine del volto (1:N) nell'indice di Ricerca facciale della
        tua applicazione — volti registrati da sessioni di verifica, chiamate
        API autonome salvate, caricamenti diretti di volti da profili utente e
        le tue blocklist/allowlist — e ottieni corrispondenze ordinate per
        somiglianza, oltre ad avvisi di duplicati e blocklist.


        **Come funziona.** Il volto rilevato più grande in `user_image` viene
        convertito in embedding e cercato nell'indice, con ambito limitato alla
        tua applicazione. Vengono restituite in `matches` fino a **5
        corrispondenze** al di sopra della soglia minima di somiglianza,
        ciascuna con `similarity_percentage`, la sessione di origine
        (`session_id`, `session_number`, `status`, `vendor_data`),
        `user_details` estratti durante la verifica del documento di quella
        sessione, i flag `is_blocklisted` / `is_allowlisted` e un discriminatore
        `source` (`session`, `imported` o `list_entry`).


        - `search_type=most_similar` (predefinito) ordina ogni volto registrato
        in base alla somiglianza — usalo per la deduplicazione e l'indagine su
        reti di frode.

        - `search_type=blocklisted_or_approved` limita i candidati ai volti in
        blocklist, volti in allowlist, volti provenienti da sessioni approvate e
        volti importati da profili utente, ordinando per prime le voci in
        blocklist — usalo quando l'obiettivo principale è lo screening delle
        blocklist.


        `status` è `Declined` solo quando scatta un avviso `FACE_IN_BLOCKLIST` o
        `POSSIBLE_FACE_IN_BLOCKLIST`; `DUPLICATED_FACE` /
        `POSSIBLE_DUPLICATED_FACE` (`information`) e `MULTIPLE_FACES_DETECTED`
        (`warning`) non rifiutano mai. A differenza di Passive Liveness, questo
        endpoint **non** esclude dalla corrispondenza le sessioni precedenti con
        lo stesso `vendor_data`. Anche un'analisi di vitalità passiva viene
        eseguita internamente e salvata con la sessione memorizzata, ma il suo
        risultato non fa parte di questa risposta.


        **Fatturazione.** Ogni risposta `200` consuma un credito dell'API
        Ricerca facciale (scalato dal credito del tuo piano o dal saldo di
        ricarica). Un saldo insufficiente restituisce `403` prima di qualsiasi
        elaborazione delle immagini.


        **Persistenza della sessione e registrazione del volto
        (`save_api_request`, predefinito `true`).** Se impostato su `true`, la
        chiamata viene salvata come sessione di tipo API (Business Console, `GET
        /v3/session/{sessionId}/decision/` tramite il `request_id` restituito,
        webhook `status.updated`) e il volto cercato viene registrato
        nell'indice di Ricerca facciale. I volti registrati dalle chiamate di
        Ricerca facciale sono esclusi dai risultati futuri di Ricerca facciale,
        in modo che ricerche ripetute non corrispondano mai tra loro. Se
        impostato su `false`, la chiamata è monouso: non viene memorizzato
        nulla, il volto non viene registrato e i valori di `match_image_url`
        sono percorsi di archiviazione interni anziché URL scaricabili.


        **Sandbox.** Le chiavi API sandbox saltano qualsiasi elaborazione e
        fatturazione: dopo la validazione della richiesta (l'input non valido
        restituisce comunque `400`), l'endpoint restituisce un payload mock
        statico `Approved`, nessuna sessione viene salvata e nessun credito
        viene consumato.


        **Autenticazione.** Invia la chiave API della tua applicazione
        nell'intestazione `x-api-key`. Credenziali mancanti o non valide
        restituiscono `403` (`{"detail": "You do not have permission to perform
        this action."}`) — questa API non restituisce mai `401`.


        **Limite di frequenza.** Budget di scrittura condiviso di 300
        richieste/min per chiave API su tutti gli endpoint POST/PATCH/DELETE; il
        superamento restituisce `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: >-
                    Immagine frontale del viso da utilizzare per la ricerca.
                    Estensioni consentite: `tiff`, `jpg`, `jpeg`, `png`, `webp`.
                    Dimensione massima di caricamento: **5 MB** (i file più
                    grandi vengono rifiutati con `400`). Le immagini vengono
                    compresse automaticamente a ~0.5 MB prima dell'elaborazione,
                    pertanto risoluzioni molto elevate non migliorano la
                    precisione. L'immagine deve contenere almeno un volto
                    rilevabile — altrimenti l'endpoint restituisce `400`. Quando
                    sono presenti più volti, la ricerca viene eseguita su quello
                    più grande e viene aggiunto un avviso
                    `MULTIPLE_FACES_DETECTED`.
                search_type:
                  type: string
                  default: most_similar
                  enum:
                    - most_similar
                    - blocklisted_or_approved
                  description: >-
                    Politica di ricerca. `most_similar` (predefinita) classifica
                    ogni volto registrato nella tua applicazione in base alla
                    somiglianza. `blocklisted_or_approved` limita i candidati ai
                    volti in blocklist, ai volti in allowlist, ai volti
                    provenienti da sessioni approvate e ai volti dei profili
                    utente importati — posizionando per prime le voci in
                    blocklist.
                  example: most_similar
                rotate_image:
                  type: boolean
                  default: false
                  description: >-
                    Quando è `true`, il servizio prova rotazioni di 90 gradi
                    dell'input e utilizza l'orientamento che offre il miglior
                    rilevamento del volto. Utile quando manca l'orientamento
                    EXIF. Aggiunge latenza.
                  example: false
                save_api_request:
                  type: boolean
                  default: true
                  description: >-
                    Quando è `true` (predefinito), memorizza la chiamata come
                    sessione di tipo API, emette un webhook `status.updated`,
                    pre-firma i valori di `match_image_url` e registra il volto
                    cercato nel tuo indice di Ricerca facciale (le registrazioni
                    di Ricerca facciale sono escluse dalle ricerche future).
                    Quando è `false`, la ricerca è una tantum — non viene
                    memorizzata alcuna sessione e il volto non viene registrato.
                  example: true
                vendor_data:
                  type: string
                  description: >-
                    Identificativo opaco opzionale (il tuo ID utente, email,
                    UUID...) memorizzato nella sessione persistita e restituito.
                    Non esclude i volti dello stesso utente dai risultati di
                    ricerca.
                  example: user-123
                metadata:
                  type: object
                  additionalProperties: true
                  description: >-
                    Oggetto JSON opzionale memorizzato con la sessione (quando
                    `save_api_request=true`) e restituito nella risposta. Nelle
                    richieste multipart, invialo come campo stringa con codifica
                    JSON: viene interpretato come oggetto.
                  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: >-
            Ricerca facciale completata. `face_search.matches` contiene fino a 5
            volti simili ordinati per somiglianza; un array vuoto indica che
            nessun volto registrato ha superato la soglia minima di somiglianza.
            `status` è `Declined` solo in caso di corrispondenze con la
            blocklist; le sole corrispondenze duplicate restituiscono
            `Approved`, quindi esamina `matches` e `warnings`, non solo
            `status`. Quando `save_api_request=true`, `request_id` è l'ID della
            sessione salvata. Ciascuna corrispondenza include `source`
            (`session`, `imported`, `list_entry` o `retained_template`),
            `vendor_user_id` e `biometric_template_id`; una corrispondenza
            `retained_template` proviene da un modello biometrico senza immagini
            conservato dopo l'eliminazione della sessione di origine e presenta
            campi di sessione, `match_image_url` e `user_details` impostati su
            `null`.
          content:
            application/json:
              examples:
                Blocklist hit (Declined):
                  summary: Il volto corrisponde a un volto inserito nella blocklist
                  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: >-
                    Il volto è già apparso in un'altra sessione approvata —
                    informativo, nessun rifiuto
                  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: >-
                    Nessun volto registrato ha superato la soglia minima di
                    somiglianza
                  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 della sessione salvata quando `save_api_request=true`
                      (utilizzabile con `GET
                      /v3/session/{sessionId}/decision/`); altrimenti un UUID di
                      correlazione temporaneo.
                  face_search:
                    type: object
                    properties:
                      status:
                        type: string
                        enum:
                          - Approved
                          - Declined
                        description: >-
                          `Declined` solo quando è scattato un avviso
                          `FACE_IN_BLOCKLIST` o `POSSIBLE_FACE_IN_BLOCKLIST`. Le
                          corrispondenze duplicate e gli avvisi di volti
                          multipli non determinano mai il rifiuto.
                      total_matches:
                        type: integer
                        description: Numero di voci in `matches` (0–5).
                        example: 1
                      matches:
                        type: array
                        maxItems: 5
                        description: >-
                          Fino a 5 volti dal tuo indice di Ricerca facciale che
                          superano la soglia minima di somiglianza, ordinati per
                          somiglianza (con le voci in blocklist classificate per
                          prime quando `search_type=blocklisted_or_approved`).
                          Vuoto se nessun volto registrato è sufficientemente
                          simile.
                        items:
                          type: object
                          properties:
                            session_id:
                              type: string
                              format: uuid
                              nullable: true
                              description: >-
                                ID della sessione di verifica a cui appartiene
                                il volto corrispondente. `null` quando `source`
                                è `imported`, `list_entry` o
                                `retained_template`.
                              example: 882c42d5-8a4d-4d20-8080-a22f57822c86
                            session_number:
                              type: integer
                              nullable: true
                              description: >-
                                Numero di sessione di facile lettura mostrato
                                nella Business Console. `null` per le
                                corrispondenze non legate a una sessione.
                              example: 323442
                            similarity_percentage:
                              type: number
                              format: float
                              minimum: 0
                              maximum: 100
                              description: >-
                                Somiglianza tra il volto inviato e il volto
                                corrispondente (0–100).
                              example: 99.99
                            source:
                              type: string
                              enum:
                                - session
                                - imported
                                - list_entry
                                - retained_template
                              description: >-
                                Da dove è stato registrato il volto
                                corrispondente: `session` — una sessione di
                                verifica o una chiamata API standalone salvata;
                                `imported` — un volto caricato direttamente su
                                un profilo User; `list_entry` — un volto
                                associato a uno dei tuoi elenchi;
                                `retained_template` — un modello biometrico
                                privo di immagini archiviato su un User,
                                elencato sotto `/v3/biometric-templates/`.
                            vendor_data:
                              type: string
                              nullable: true
                              description: >-
                                `vendor_data` della sessione corrispondente o
                                dell'utente collegato per i volti importati e
                                con modello conservato.
                              example: user-1
                            vendor_user_id:
                              type: string
                              format: uuid
                              nullable: true
                              description: >-
                                ID dell'utente collegato. `null` per le voci
                                della lista e per le corrispondenze di sessione
                                prive di utente.
                              example: 2f7c1a9e-4b28-4a6d-97f1-83576f80e1b4
                            biometric_template_id:
                              type: string
                              format: uuid
                              nullable: true
                              description: >-
                                ID del modello biometrico conservato. Impostato
                                solo quando `source` è `retained_template`;
                                `null` altrimenti.
                              example: null
                            verification_date:
                              type: string
                              format: date-time
                              nullable: true
                              description: >-
                                Quando il volto corrispondente è stato
                                originariamente acquisito o quando è stato
                                creato un modello conservato
                                (`YYYY-MM-DDThh:mm:ssZ`). `null` per le
                                corrispondenze di tipo `list_entry`.
                              example: '2025-01-01T00:00:00Z'
                            user_details:
                              type: object
                              nullable: true
                              description: >-
                                Dati di identità estratti durante la verifica
                                del documento della sessione corrispondente.
                                `null` quando la sessione corrispondente non ha
                                dati del documento (es. sessioni di solo
                                rilevamento della vitalità) e sempre `null` per
                                le corrispondenze di tipo `retained_template`.
                                Per le corrispondenze con `source: imported`,
                                viene invece popolato dal profilo Utente:
                                `full_name` impostato,
                                `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: >-
                                URL a tempo (`https://<media-host>/...`)
                                dell'immagine di riferimento del volto
                                corrispondente quando `save_api_request=true`.
                                Con `save_api_request=false` questo è un
                                percorso di archiviazione interno non
                                scaricabile direttamente. Sempre `null` per le
                                corrispondenze di tipo `retained_template`
                                poiché i modelli conservati non contengono
                                immagini.
                              example: https://<media-host>/face/3f6a1c2e/reference.jpg
                            status:
                              type: string
                              nullable: true
                              description: >-
                                Stato della sessione corrispondente (`Approved`,
                                `Declined`, `In Review`, …). `null` per le
                                corrispondenze `imported`/`list_entry`.
                              example: Approved
                            is_blocklisted:
                              type: boolean
                              description: >-
                                `true` quando il volto corrispondente si trova
                                nella tua blocklist dei volti. Qualsiasi
                                corrispondenza sufficientemente simile presente
                                nella blocklist comporta il rifiuto della
                                ricerca.
                            is_allowlisted:
                              type: boolean
                              description: >-
                                `true` quando il volto corrispondente si trova
                                in una delle tue allowlist. Le corrispondenze in
                                allowlist sopprimono gli avvisi di duplicazione.
                            api_service:
                              type: string
                              nullable: true
                              description: >-
                                Impostato quando il volto corrispondente è stato
                                registrato tramite una chiamata API standalone
                                (ad es. `PASSIVE_LIVENESS`); `null` per le
                                normali sessioni di verifica e per i volti
                                importati.
                              example: null
                      user_image:
                        type: object
                        description: >-
                          Risultati del rilevamento facciale per l'immagine
                          inviata. Le voci qui presenti contengono solo `bbox` e
                          `confidence`.
                        properties:
                          entities:
                            type: array
                            description: >-
                              Una voce per ogni volto rilevato. Il volto più
                              grande è quello cercato.
                            items:
                              type: object
                              properties:
                                bbox:
                                  type: array
                                  items:
                                    type: integer
                                  minItems: 4
                                  maxItems: 4
                                  description: >-
                                    Riquadro di delimitazione `[x_min, y_min,
                                    x_max, y_max]` in pixel.
                                  example:
                                    - 40
                                    - 40
                                    - 120
                                    - 120
                                confidence:
                                  type: number
                                  format: float
                                  minimum: 0
                                  maximum: 1
                                  description: Affidabilità del rilevamento facciale (0–1).
                                  example: 0.732973
                          best_angle:
                            type: integer
                            description: >-
                              Rotazione (gradi) che ha prodotto il miglior
                              rilevamento del volto; diversa da zero solo quando
                              `rotate_image=true` ha corretto l'orientamento.
                              Mai null su questo endpoint (il valore predefinito
                              è 0 quando il modello la omette).
                            example: 0
                      warnings:
                        type: array
                        description: >-
                          Segnali di rischio. `FACE_IN_BLOCKLIST` /
                          `POSSIBLE_FACE_IN_BLOCKLIST` (`error`) rifiutano la
                          ricerca; `MULTIPLE_FACES_DETECTED` (`warning`) e
                          `DUPLICATED_FACE` / `POSSIBLE_DUPLICATED_FACE`
                          (`information`) hanno valore informativo.
                        items:
                          type: object
                          properties:
                            risk:
                              type: string
                              enum:
                                - MULTIPLE_FACES_DETECTED
                                - FACE_IN_BLOCKLIST
                                - POSSIBLE_FACE_IN_BLOCKLIST
                                - DUPLICATED_FACE
                                - POSSIBLE_DUPLICATED_FACE
                              description: Codice di rischio leggibile dalla macchina.
                            feature:
                              type: string
                              enum:
                                - LIVENESS
                              description: >-
                                Funzionalità che ha generato l'avviso. Sempre
                                `LIVENESS` su questo endpoint.
                            additional_data:
                              type: object
                              nullable: true
                              additionalProperties: true
                              description: >-
                                `null` per `MULTIPLE_FACES_DETECTED`. Le
                                corrispondenze nella blocklist contengono
                                `{blocklisted_session_id,
                                blocklisted_session_number, api_service}`; i
                                duplicati contengono `{duplicated_session_id,
                                duplicated_session_number, api_service}` che
                                puntano alla prima sessione corrispondente.
                            log_type:
                              type: string
                              enum:
                                - error
                                - warning
                                - information
                              description: >-
                                Gravità. Gli avvisi `error` portano `status` a
                                `Declined`; le voci `warning` e `information`
                                sono informative e non determinano mai un
                                rifiuto da sole.
                            short_description:
                              type: string
                              description: >-
                                Riepilogo del rischio su una riga leggibile
                                dall'utente.
                            long_description:
                              type: string
                              description: Spiegazione di facile lettura del rischio.
                  vendor_data:
                    type: string
                    nullable: true
                    description: Eco del `vendor_data` inviato, o `null`.
                  metadata:
                    type: object
                    nullable: true
                    additionalProperties: true
                    description: Eco dell'oggetto `metadata` inviato, o `null`.
                  created_at:
                    type: string
                    format: date-time
                    description: >-
                      Timestamp ISO 8601 (UTC) di generazione della risposta, ad
                      es. `2026-06-12T01:04:42.763237+00:00`.
        '400':
          description: >-
            Errore di validazione. Restituito quando `user_image` è mancante,
            supera 5 MB, ha un'estensione non supportata o quando **non viene
            rilevato alcun volto** nell'immagine inviata. Gli errori di campo
            utilizzano l'envelope `{field: [messages]}` di DRF; gli errori di
            rilevamento del volto utilizzano `{"error": ...}`.
          content:
            application/json:
              examples:
                No face detected:
                  summary: >-
                    L'immagine viene decodificata correttamente ma non contiene
                    alcun volto rilevabile
                  value:
                    error: No face detected in the image
                Missing image:
                  summary: '`user_image` non incluso nei dati del modulo'
                  value:
                    user_image:
                      - No file was submitted.
                Unsupported file extension:
                  summary: Estensione del file diversa da 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: Il caricamento supera il limite di 5 MB
                  value:
                    user_image:
                      - File size should not exceed 5 MB
        '403':
          description: >-
            Autorizzazione negata. Restituito quando l'intestazione `x-api-key`
            è mancante e anche quando il saldo dell'organizzazione chiamante non
            è sufficiente a coprire la chiamata; una chiave errata, revocata o
            scaduta restituisce `401`. Una chiave mancante restituisce `403` con
            `{"detail": ...}`; una chiave errata, revocata o scaduta restituisce
            `401`. Crediti insufficienti restituiscono `403` con `{"error":
            ...}` prima che avvenga qualsiasi elaborazione delle immagini.
          content:
            application/json:
              examples:
                Missing or invalid API key:
                  summary: >-
                    Nessuna intestazione `x-api-key`, oppure la chiave non è
                    valida/revocata
                  value:
                    detail: You do not have permission to perform this action.
                Not enough credits:
                  summary: >-
                    Il saldo dell'organizzazione non è sufficiente per coprire
                    la chiamata
                  value:
                    error: >-
                      You don't have enough credits to perform this request.
                      Please top up at https://business.didit.me
        '429':
          description: >-
            Limite di frequenza superato. Gli endpoint POST/PATCH/DELETE
            condividono un budget di 300 richieste di scrittura al minuto per
            chiave API (la creazione di transazioni e l'ingestione di eventi
            hanno un budget separato di 600). La risposta contiene le
            intestazioni `X-RateLimit-Limit`, `X-RateLimit-Remaining`,
            `X-RateLimit-Reset` e `Retry-After`.
          content:
            application/json:
              examples:
                Write rate limit exceeded:
                  summary: Più di 300 richieste di scrittura nel minuto corrente
                  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 chiave API della tua applicazione, da Developers -> API keys nella
        Business Console. La chiave primaria ha accesso completo. Una chiave con
        nome può avere un ambito definito: nessuno, lettura o scrittura per
        risorsa, limitata ad alcuni workflow o a sessioni approvate, a un elenco
        di indirizzi IP e a una data di scadenza. 401 indica che la chiave è
        errata, revocata o scaduta; 403 indica che non è stata inviata alcuna
        chiave, che la chiave non ha accesso a questa risorsa o azione, oppure
        che la richiesta proviene da un indirizzo non incluso nel suo elenco IP;
        404 su una route di sessione indica che la sessione non rientra nei
        workflow o negli stati previsti dalla chiave. Una chiave senza accesso
        ai media riceve gli URL di immagini, video e PDF come null, e una chiave
        senza permessi di scrittura sulle sessioni riceve link e token di
        sessione come null. Consulta https://docs.didit.me/console/api-keys.

````

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