> ## 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 d'import du visage : profil utilisateur fournisseur

> Importez une image de visage en base64 dans un profil utilisateur Didit existant, après création ou import d'un utilisateur avec vendor_data.



Prompt de téléversement du visage utilisateur
        Copier le prompt dans le presse-papiers



      
      

\<pre>

\`Goal: Attach a trusted imported face image to an existing Didit User profile.

Use case: I am migrating users from another provider. I already have a stable vendor_data and a face image I am allowed to process. I want the User profile to carry that face for evidence, duplicate detection, and face search.

Flow:
1\. Create or retrieve the User by vendor_data:
POST https://verification.didit.me/v3/users/create/
GET  https://verification.didit.me/v3/users/{vendor_data}/
2\. Read didit_internal_id from the User response.
3\. Upload the face to:
POST https://verification.didit.me/v3/organization/{organization_id}/application/{application_id}/vendor-users/by-id/{didit_internal_id}/faces/upload/

Auth: x-api-key for the same application.
Content-Type: application/json

Request body:
\- image (string, required) — raw base64-encoded JPG or PNG. Do not include a data URL prefix. Max decoded size: 2 MB.
\- comment (string, optional) — operator-visible note, for example "Imported from previous KYC provider".

Response 201:
\{
"uuid": "face-upload-uuid",
"image_url": "https://signed-url.example/...",
"comment": "Imported from previous KYC provider",
"uploaded_by": "api",
"created_at": "2026-05-18T12:00:00Z"
}

Limits:
\- Max 5 manually uploaded faces per User.
\- The image must decode as an image and contain a detectable face.
\- This enrolls the face for profile evidence and matching. It does not add the face to a blocklist.

To block a face, use POST /v3/lists/{list_uuid}/entries/face-upload/ with a face-type list instead.`

\</pre>



      
      

Coller dans

## AperçuUtilisez cet endpoint lorsque vous importez des utilisateurs depuis un autre fournisseur et disposez déjà d'une image de visage fiable pour chaque personne. L'utilisateur reste identifié par votre `vendor_data`, mais cet endpoint de rattachement de profil utilise `didit_internal_id` afin que l'utilisateur cible soit sans ambiguïté.> [!NOTE]
>
> Ceci diffère de [Téléverser un visage dans la liste](https://docs.didit.me/fr/management-api/lists/upload-face.md). Le téléversement dans le profil rattache un visage à un utilisateur comme élément probant, pour la détection de doublons et la recherche faciale. Le téléversement dans la liste ajoute un visage à une liste de blocage de type visage afin que les sessions de correspondance ultérieures puissent être refusées.## Endpoint**`POST /v3/organization/{organization_id}/application/{application_id}/vendor-users/by-id/{didit_internal_id}/faces/upload/`**## Flux de migration**1. Créer ou retrouver l'utilisateur**Appelez [`POST /v3/users/create/`](https://docs.didit.me/fr/management-api/users/create) pour un nouveau profil, ou [`GET /v3/users/{vendor_data}/`](https://docs.didit.me/fr/management-api/users/get) pour un profil existant.**2. Conserver didit\_internal\_id**La réponse de l'utilisateur contient `didit_internal_id`. Continuez à utiliser `vendor_data` dans votre base de données ; n'utilisez `didit_internal_id` que pour les endpoints de rattachement de profil.**3. Téléverser le visage**Envoyez une image base64 brute dans le champ `image`. Le serveur valide le décodage de l'image, sa taille et la détection du visage avant de l'enregistrer.## Exemple```bash theme={null}
# 1. Create the User keyed by your external id
curl -X POST https://verification.didit.me/v3/users/create/ \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "vendor_data": "user-42",
    "display_name": "Jane Doe",
    "metadata": { "previous_provider": "legacy-kyc-vendor" }
  }'

# 2. Upload an imported face to the returned didit_internal_id
curl -X POST https://verification.didit.me/v3/organization/$ORGANIZATION_ID/application/$APPLICATION_ID/vendor-users/by-id/$DIDIT_INTERNAL_ID/faces/upload/ \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "image": "<base64-encoded-jpg-or-png>",
    "comment": "Imported from previous KYC provider"
  }'
```## Corps de la requête| Champ | Type | Obligatoire | Description |
| - | - | - | - |
| `image` | string | Oui | JPG ou PNG brut encodé en base64. N'incluez pas `data:image/...;base64,`. Taille maximale après décodage : 2 Mo. |
| `comment` | string | Non | Note visible par l'opérateur, affichée sur le profil de l'utilisateur. |## Réponse```json theme={null}
{
  "uuid": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee",
  "image_url": "https://signed-url.example/face.jpg",
  "comment": "Imported from previous KYC provider",
  "uploaded_by": "api",
  "created_at": "2026-05-18T12:00:00Z"
}
```## Validation et limites- Maximum 5 visages téléversés manuellement par utilisateur.
- La taille maximale de l'image après décodage est de 2 Mo.
- L'image doit être du base64 valide et se décoder en image.
- L'image doit contenir un visage détectable. Utilisez, si possible, un visage cadré de face et bien éclairé.
- Le visage téléversé est indexé pour la détection future de doublons et la recherche faciale.
- Le visage téléversé n'est pas ajouté automatiquement à la liste de blocage.## Lister ou supprimer les visages téléversésLister les visages du profil :```bash theme={null}
curl https://verification.didit.me/v3/organization/$ORGANIZATION_ID/application/$APPLICATION_ID/vendor-users/by-id/$DIDIT_INTERNAL_ID/faces/ \
  -H "x-api-key: YOUR_API_KEY"
```Supprimer un visage du profil :```bash theme={null}
curl -X DELETE https://verification.didit.me/v3/organization/$ORGANIZATION_ID/application/$APPLICATION_ID/vendor-users/by-id/$DIDIT_INTERNAL_ID/faces/$FACE_UUID/ \
  -H "x-api-key: YOUR_API_KEY"
```## PermissionsUtilisez une clé API de la même application. La clé doit appartenir à une application autorisée à gérer le profil utilisateur cible.## Modes d'échec- `400` : base64 invalide, image invalide, aucun visage détectable, image de plus de 2 Mo, ou l'utilisateur possède déjà 5 visages téléversés.
- `401` : identifiants absents ou invalides.
- `403` : la clé API est valide mais n'est pas autorisée à gérer ce profil utilisateur.
- `404` : aucun utilisateur n'existe pour ce `didit_internal_id` dans l'application.
- `429` : limite de débit atteinte ; temporisez en utilisant `Retry-After`.## Liens connexes- [Créer un utilisateur](https://docs.didit.me/fr/management-api/users/create.md)
- [Récupérer un utilisateur](https://docs.didit.me/fr/management-api/users/get.md)
- [Importer et exporter des utilisateurs](https://docs.didit.me/fr/entities/users/import-export.md)
- [Visages et biométrie](https://docs.didit.me/fr/entities/users/faces-and-biometrics.md)
- [Téléverser un visage dans la liste de blocage](https://docs.didit.me/fr/management-api/lists/upload-face.md)


## OpenAPI

````yaml fr/openapi-25.json POST /v3/organization/{organization_id}/application/{application_id}/vendor-users/by-id/{didit_internal_id}/faces/upload/
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/organization/{organization_id}/application/{application_id}/vendor-users/by-id/{didit_internal_id}/faces/upload/:
    post:
      tags:
        - Users
      summary: Téléverser le visage de l'utilisateur
      description: >-
        Associez une image de visage importée et de confiance à un profil
        utilisateur existant. Utilisez cette action après avoir créé ou récupéré
        un utilisateur via `vendor_data` et lu son `didit_internal_id`. Le
        visage téléversé est stocké sur le profil utilisateur et indexé pour la
        détection de doublons et la recherche faciale. Il n'est pas ajouté à une
        liste de blocage de visages.
      operationId: upload_user_face
      parameters:
        - name: organization_id
          in: path
          required: true
          schema:
            type: string
            format: uuid
          description: UUID de l'organisation propriétaire de l'application.
        - name: application_id
          in: path
          required: true
          schema:
            type: string
            format: uuid
          description: UUID de l'application à laquelle appartient le profil utilisateur.
        - name: didit_internal_id
          in: path
          required: true
          schema:
            type: string
            format: uuid
          description: >-
            UUID interne de l'utilisateur Didit, renvoyé sous la forme
            `didit_internal_id` par `GET /v3/users/{vendor_data}/` et `POST
            /v3/users/create/`.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - image
              properties:
                image:
                  type: string
                  format: byte
                  description: >-
                    Image faciale JPG ou PNG brute encodée en base64. N'incluez
                    pas le préfixe `data:image/...;base64,`. Taille maximale
                    décodée : 2 MB.
                comment:
                  type: string
                  description: >-
                    Note optionnelle visible par l'opérateur pour le visage
                    téléversé.
                  default: ''
            examples:
              Imported face:
                summary: Associer un visage importé d'un précédent fournisseur
                value:
                  image: /9j/4AAQSkZJRgABAQEA...
                  comment: Imported from previous KYC provider
      responses:
        '201':
          description: Visage téléversé et associé au profil utilisateur.
          content:
            application/json:
              schema:
                type: object
                required:
                  - uuid
                  - image_url
                  - comment
                  - uploaded_by
                  - created_at
                properties:
                  uuid:
                    type: string
                    format: uuid
                    description: >-
                      UUID de l'enregistrement de visage de l'utilisateur
                      téléversé.
                  image_url:
                    type: string
                    format: uri
                    nullable: true
                    description: URL signée pour l'image du visage téléversée.
                  comment:
                    type: string
                    nullable: true
                    description: Commentaire fourni lors du téléversement du visage.
                  uploaded_by:
                    type: string
                    nullable: true
                    description: >-
                      E-mail ou identifiant de l'auteur du téléversement
                      lorsqu'il est disponible.
                  created_at:
                    type: string
                    format: date-time
                    description: Horodatage du téléversement.
              examples:
                Uploaded:
                  value:
                    uuid: aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee
                    image_url: https://signed-url.example/face.jpg
                    comment: Imported from previous KYC provider
                    uploaded_by: api
                    created_at: '2026-05-18T12:00:00Z'
        '400':
          description: >-
            Corps de requête ou image non valide. Causes courantes : base64 non
            valide, image non valide, aucun visage détectable, image de plus de
            2 Mo, embedding manquant, ou l'utilisateur a déjà téléversé 5
            visages.
          content:
            application/json:
              examples:
                No face:
                  value:
                    image: >-
                      No face detected in the image. Please upload a clear photo
                      with a visible face.
                Too many faces:
                  value:
                    detail: Maximum of 5 faces per user reached.
                Too large:
                  value:
                    image: Image exceeds maximum size of 2 MB.
        '401':
          description: Clé API manquante ou invalide.
          content:
            application/json:
              examples:
                Missing key:
                  value:
                    detail: Authentication credentials were not provided.
        '403':
          description: >-
            L'identifiant d'authentification est valide, mais ne peut pas écrire
            de profils d'utilisateurs pour cette application.
          content:
            application/json:
              examples:
                Forbidden:
                  value:
                    detail: You do not have permission to perform this action.
        '404':
          description: >-
            Aucun utilisateur n'existe pour ce `didit_internal_id` dans
            l'application.
          content:
            application/json:
              examples:
                Not found:
                  value:
                    detail: Not found.
        '429':
          description: Limite de débit dépassée ; réduisez la cadence et réessayez.
          content:
            application/json:
              examples:
                Rate limited:
                  value:
                    detail: Request was throttled. Expected available in 30 seconds.
      security:
        - ApiKeyAuth: []
      x-codeSamples:
        - lang: curl
          label: curl
          source: >-
            curl -X POST
            'https://verification.didit.me/v3/organization/11111111-2222-3333-4444-555555555555/application/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/vendor-users/by-id/f4e5e1f2-94a9-4f86-8c16-2b7d9b4db418/faces/upload/'
            \
              -H 'x-api-key: YOUR_API_KEY' \
              -H 'Content-Type: application/json' \
              -d '{"image": "/9j/4AAQSkZJRgABAQEA...", "comment": "Imported from previous KYC provider"}'
        - lang: python
          label: Python
          source: |-
            from didit import Didit

            # Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID
            # and DIDIT_APPLICATION_ID.
            client = Didit()

            result = client.users.upload_face(
                "11111111-2222-3333-4444-555555555555",
                image="/9j/4AAQSkZJRgABAQEA...",
                comment="Imported from previous KYC provider",
            )
            print(result)
        - lang: javascript
          label: Node.js
          source: >-
            import Didit from "@didit-protocol/sdk-node";


            // Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID

            // and DIDIT_APPLICATION_ID.

            const didit = new Didit();


            const result = await
            didit.users.uploadFace("11111111-2222-3333-4444-555555555555", {
              image: "/9j/4AAQSkZJRgABAQEA...",
              comment: "Imported from previous KYC provider",
            });

            console.log(result);
        - lang: go
          label: Go
          source: "ctx := context.Background()\n// Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID\n// and DIDIT_APPLICATION_ID.\nclient := didit.NewClient()\n\nresult, err := client.Users.UploadFace(ctx, \"11111111-2222-3333-4444-555555555555\", didit.UsersUploadFaceParams{\n\tImage:   \"/9j/4AAQSkZJRgABAQEA...\",\n\tComment: didit.String(\"Imported from previous KYC provider\"),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
        - lang: java
          label: Java
          source: >-
            import me.didit.Didit;

            import me.didit.types.UsersUploadFaceParams;


            // Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID

            // and DIDIT_APPLICATION_ID.

            Didit client = new Didit();


            var result =
            client.users().uploadFace("11111111-2222-3333-4444-555555555555",
            UsersUploadFaceParams.builder()
                    .image("/9j/4AAQSkZJRgABAQEA...")
                    .comment("Imported from previous KYC provider")
                    .build());
            System.out.println(result);
        - lang: php
          label: PHP
          source: >-
            <?php


            require 'vendor/autoload.php';


            use Didit\DiditClient;


            // Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID

            // and DIDIT_APPLICATION_ID.

            $didit = new DiditClient();


            $result =
            $didit->users->uploadFace('11111111-2222-3333-4444-555555555555', [
                'image' => '/9j/4AAQSkZJRgABAQEA...',
                'comment' => 'Imported from previous KYC provider',
            ]);

            print_r($result->toArray());
        - lang: ruby
          label: Ruby
          source: |-
            require "didit"

            # Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID
            # and DIDIT_APPLICATION_ID.
            didit = Didit::Client.new

            result = didit.users.upload_face(
              "11111111-2222-3333-4444-555555555555",
              image: "/9j/4AAQSkZJRgABAQEA...",
              comment: "Imported from previous KYC provider"
            )
            puts result.to_h
        - lang: csharp
          label: .NET
          source: >-
            using System;

            using System.Text.Json;

            using Didit;


            // Reads DIDIT_API_KEY, DIDIT_ORGANIZATION_ID

            // and DIDIT_APPLICATION_ID.

            using var client = new DiditClient();


            var result = await
            client.Users.UploadFaceAsync("11111111-2222-3333-4444-555555555555",
            new UsersUploadFaceParams

            {
                Image = "/9j/4AAQSkZJRgABAQEA...",
                Comment = "Imported from previous KYC provider",
            });

            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.