> ## 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 création d'utilisateur : entité User fournisseur

> Pré-créez des entités User Didit avant les sessions KYC. Importez des utilisateurs en masse ou pour la surveillance des transactions.



Créer une invite utilisateur
        Copier le prompt dans le presse-papiers



      
      

\<pre>

\`Goal: Pre-create a Didit User entity by vendor_data before any verification session runs, and optionally email the person a verification link in the same call.

Endpoint: POST https://verification.didit.me/v3/users/create/
Auth header: x-api-key: <DIDIT_API_KEY>
Content-Type: application/json

Request body fields:
\- vendor_data (string, REQUIRED) — your unique identifier for this user. Free-form string, NOT a UUID. Must be unique among non-deleted users in the app. Normalised lowercase + whitespace trim, so "USER-1" and "user-1" collide. Max 2000 bytes (UTF-8 encoded); longer values return a 400.
\- full_name (string, max 512, optional)
\- display_name (string, optional) — friendly label for the Console (takes precedence over full_name for UI).
\- date_of_birth (string YYYY-MM-DD, optional)
\- status (enum, optional) — "ACTIVE" | "FLAGGED" | "BLOCKED" (VendorUserStatusChoices). Defaults to "ACTIVE".
\- metadata (object, optional) — arbitrary JSON you attach to the user.
\- approved_emails (object<string, boolean>, optional) — e.g. {"john@example.com": true}.
\- approved_phones (object<string, boolean>, optional).
\- issuing_states (object<ISO3, int>, optional) — e.g. {"USA": 1}.

Contact fields (all optional):
\- first_name, last_name (string, max 255 each): joined with a space into full_name when you don't send full_name.
\- email (string, email): stored in metadata.contact.email.
\- phone_number (string, max 32): stored in metadata.contact.phone_number.
\- country (string): ISO 3166 code, alpha-2 or alpha-3 ("ES" or "ESP"), stored uppercased in metadata.address.country.

Verification link (optional):
\- send_verification_link (boolean, default false): when true, Didit also creates a verification session for the person on workflow_id and emails them the link at email.
\- workflow_id (UUID): REQUIRED with send_verification_link. The workflow must verify a person: a Business Verification (KYB) workflow is refused.
\- language (string, max 10): language of the verification email, a supported language code. English when omitted.
\- The person and the session are created together or not at all. The session runs the same checks as POST /v3/session/ (blocklist, credits).

curl:
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-abc-123", "full_name": "John Doe"}'

curl with a verification link:
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-abc-789", "first_name": "Julia", "last_name": "Martin", "email": "julia.martin@example.com", "send_verification_link": true, "workflow_id": "YOUR_WORKFLOW_ID"}'

Response 201: full UserDetailItem (same shape as GET /v3/users/{vendor_data}/) plus verification_link. Includes didit_internal_id (UUID), session_count, approved_count=0, metadata, comments=[], created_at, updated_at. See /reference/data-models.
\- verification_link is always present: null without a link, otherwise { session_id, session_number, status, url, workflow_id, email }. url is the link Didit emailed.

Failure modes:
\- 400: nothing is written. Most errors are keyed by field. Common cases:
\{ "vendor_data": ["A user with this vendor_data already exists."] }  // conflict, NOT idempotent. Use PATCH /v3/users/{vendor_data}/ to update.
\{ "vendor_data": ["This field is required."] }
\{ "vendor_data": ["Ensure this field has no more than 2000 characters."] }  // oversized vendor_data, rejected before it reaches storage
\{ "metadata": ["Metadata must be a JSON object."] }
\{ "country": ["Use an ISO 3166 country code, like ES or ESP."] }
\{ "email": ["metadata.contact must be a JSON object to store this value."] }  // same on phone_number; metadata.address on country
\{ "email": ["An email address is required to send a verification link."] }
\{ "workflow_id": ["Pick the workflow to send a verification link for."] }
\{ "workflow_id": ["Invalid workflow_id."] }
\{ "workflow_id": ["This workflow verifies a business. Pick a workflow that verifies a person to send them a verification link."] }
\{ "contact_details": { "email_lang": ["Invalid email language. Supported languages are ..."] } }  // unsupported language
\{ "vendor_data": "This user or business has been blocked and cannot create new verification sessions." }
\{ "detail": "You don't have enough credits to perform this request. Please top up at https://business.didit.me" }
\- 401: missing or invalid x-api-key. { "detail": "Authentication credentials were not provided." }
\- 403: the API key is revoked or is not valid for this application. { "detail": "You do not have permission to perform this action." }
\- 403: a scoped key without users write. { "detail": "This API key has no write access to people." }
\- 403: send_verification_link with a scoped key that lacks sessions write. Nothing is written. { "detail": "This API key has no write access to sessions." }
\- 429: rate-limited.

Upsert pattern (this endpoint is NOT idempotent):
GET /v3/users/{vendor_data}/  → on 404, POST /v3/users/create/; on 200, PATCH /v3/users/{vendor_data}/.

Notes:
\- Verified-session-derived identity fields such as full_name and date_of_birth seeded here can be overwritten by the first approved User Verification (KYC) session.
\- If you are migrating from another provider and already have a trusted face image, create the User first, read didit_internal_id from this response, then call POST /v3/organization/{organization_id}/application/{application_id}/vendor-users/by-id/{didit_internal_id}/faces/upload/.
\- The create itself sends no webhook. Later changes to the user send user.data.updated or user.status.updated. With send_verification_link, the new session updates the user (session_count) in the same call, which sends user.data.updated.
\- API key access: a scoped key needs users write; with send_verification_link it also needs sessions write. Full-access keys can always call it.

For end-to-end Didit integration, paste in the full prompt at /integration/integration-prompt.`

\</pre>



      
      

Coller dans

## Vue d'ensembleCrée explicitement une [entité User](https://docs.didit.me/fr/entities/users/overview.md) avant le lancement de toute session.
L'entité renvoyée passe au statut `ACTIVE`, sauf indication contraire.
Vous pouvez également faire en sorte que le même appel envoie à la personne un lien de vérification par e-mail (voir [Envoyer un lien de vérification](#envoyer-un-lien-de-vérification)).## Quand l'utiliser- **Pré-renseigner les métadonnées** (niveau, source d'inscription, étiquettes internes) avant que le client ne procède à sa vérification.
- **Migrer depuis un autre prestataire** : recréer votre liste d'utilisateurs existants dans Didit afin que l'historique et les analyses partent d'une base de référence connue.
- **Importer des visages de profil de confiance** : créez d'abord l'utilisateur, puis appelez [Téléverser un visage utilisateur](https://docs.didit.me/fr/management-api/users/upload-face.md) avec le `didit_internal_id` renvoyé.
- **Cas d'usage limités aux transactions** : enregistrez un utilisateur avec `vendor_data` afin de soumettre des transactions sans jamais lancer de session de Vérification des utilisateurs (KYC).
- **Inviter une personne à se vérifier** : créez la personne et envoyez-lui un lien de vérification par e-mail en un seul appel.## CoordonnéesVous pouvez transmettre les coordonnées de la personne en même temps que les champs du profil.
`first_name` et `last_name` sont concaténés avec un espace dans `full_name` lorsque vous n'envoyez pas `full_name`.
`email` et `phone_number` sont stockés dans `metadata.contact`, et `country` dans `metadata.address`.
`country` accepte un code ISO 3166, alpha-2 ou alpha-3 (`ES` ou `ESP`), et est stocké en majuscules.Si la valeur `metadata` que vous envoyez contient déjà une valeur `contact` ou `address` qui n'est pas un objet JSON, Didit ne l'écrase pas : l'appel renvoie `400` pour le champ concerné.## Envoyer un lien de vérificationDéfinissez `send_verification_link` sur `true` pour inviter la personne à se vérifier dans le même appel.
Didit crée une session de vérification pour la personne selon le workflow indiqué dans `workflow_id` et lui envoie le lien à l'adresse `email`.
Utilisez `language` pour choisir la [langue](https://docs.didit.me/fr/integration/supported-languages.md) de l'e-mail ; il est en anglais si vous ne le renseignez pas.```bash theme={null}
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-abc-789",
    "first_name": "Julia",
    "last_name": "Martin",
    "email": "julia.martin@example.com",
    "send_verification_link": true,
    "workflow_id": "YOUR_WORKFLOW_ID",
    "language": "es"
  }'
```- `email` et `workflow_id` sont obligatoires avec un lien, et le workflow doit vérifier une personne : un workflow de Vérification d'entreprise (KYB) renvoie `400`.
- La session passe par les mêmes contrôles que [Créer une session](https://docs.didit.me/fr/sessions-api/create-session.md).
  Un `vendor_data` figurant sur une liste de blocage, ou un solde de crédits insuffisant, renvoie `400`.
- La personne et la session sont créées ensemble ou pas du tout.
  Si un contrôle échoue, rien n'est écrit et aucun e-mail n'est envoyé.
- La réponse contient `verification_link` avec le `session_id`, le `session_number`, le `status`, l'`url`, le `workflow_id` de la session et l'`email` auquel le lien a été envoyé.
  Sans lien, `verification_link` vaut `null`.## Notes- `vendor_data` est obligatoire et doit être unique par application. Tenter de créer un doublon renvoie une erreur de conflit : utilisez [`PATCH /v3/users/{vendor_data}/`](https://docs.didit.me/fr/management-api/users/update) pour mettre à jour un utilisateur existant.
- `vendor_data` a une limite stricte de 2000 octets (encodage UTF-8). Une valeur qui dépasse cette limite renvoie une erreur de validation 400 au lieu d'être acceptée.
- Les champs normalement issus des sessions vérifiées (`full_name`, `date_of_birth`) peuvent être pré-renseignés ici, mais ils peuvent être **écrasés** par la première session de Vérification des utilisateurs (KYC) approuvée.
- Cet endpoint n'accepte pas les images de visage. Pour associer un visage importé de confiance, utilisez [`POST /v3/organization/{organization_id}/application/{application_id}/vendor-users/by-id/{didit_internal_id}/faces/upload/`](https://docs.didit.me/fr/management-api/users/upload-face) après que cet endpoint a renvoyé `didit_internal_id`.
- La création elle-même n'envoie aucun webhook. Les modifications ultérieures de l'utilisateur envoient `user.data.updated` ou `user.status.updated`.
- Avec `send_verification_link`, la nouvelle session met à jour l'utilisateur dans le même appel, ce qui envoie `user.data.updated`.## AutorisationsLe secret principal et les [clés API](https://docs.didit.me/fr/console/api-keys.md) à accès complet peuvent toujours appeler cet endpoint.
Une clé à accès personnalisé a besoin de l'autorisation d'écriture sur **Personnes** (`users`).
Avec `send_verification_link: true`, elle a aussi besoin de l'autorisation d'écriture sur les **Sessions**, car l'appel crée une session et en transmet le lien.
Sans cette autorisation, l'appel renvoie `403` avec le message `This API key has no write access to sessions.` et rien n'est écrit.
Une clé limitée à certains workflows ou à certaines sessions approuvées ne peut pas accéder à cet endpoint.Les [rôles et autorisations](https://docs.didit.me/fr/console/roles-permissions.md) de la Console déterminent ce qu'un membre de l'équipe peut faire dans la Console.
Ils ne sont pas évalués pour les requêtes effectuées avec une clé API.## Liens connexes- [Modèle de données utilisateur](https://docs.didit.me/fr/entities/users/data-model.md)
- [Téléverser un visage utilisateur](https://docs.didit.me/fr/management-api/users/upload-face.md)
- [Liaison des données fournisseur](https://docs.didit.me/fr/entities/vendor-data-linking.md)
- [Opérations sur les utilisateurs](https://docs.didit.me/fr/entities/users/operations.md)


## OpenAPI

````yaml fr/openapi-25.json POST /v3/users/create/
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/users/create/:
    post:
      tags:
        - Users
      summary: Créer un utilisateur
      description: "Créez un [utilisateur](/entities/users) à l'aide de `vendor_data`, avant ou sans session de vérification. `vendor_data` doit être unique parmi les utilisateurs de l'application (un doublon renvoie `400`). Non idempotent.\n\n**Coordonnées\_:** `email` et `phone_number` sont stockés dans `metadata.contact`, et `country` dans `metadata.address`. Lorsque vous envoyez `first_name` ou `last_name` sans `full_name`, Didit les combine dans `full_name`.\n\n**Lien de vérification\_:** avec `send_verification_link: true`, Didit crée également une session de vérification pour la personne sur `workflow_id` et lui envoie le lien par e-mail à `email`. La session exécute les mêmes vérifications que [Créer une session](/fr/sessions-api/create-session), telles que la liste de blocage et votre solde de crédits. La personne et la session sont créées ensemble ou pas du tout\_: si une vérification échoue, rien n'est écrit et aucun e-mail n'est envoyé. Le champ `verification_link` de la réponse décrit la session, et vaut `null` lorsque vous ne demandez pas de lien.\n\n**Accès par clé API\_:** une clé API restreinte nécessite les droits d'écriture sur `users`. Avec `send_verification_link: true`, elle nécessite également les droits d'écriture sur `sessions`, sinon l'appel renvoie `403` avant que quoi que ce soit ne soit écrit. Les clés à accès complet ne sont pas affectées. Consultez [Clés API](/fr/console/api-keys)."
      operationId: create_user
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - vendor_data
              properties:
                vendor_data:
                  type: string
                  description: >-
                    Votre identifiant unique pour cet utilisateur (chaîne libre,
                    PAS un UUID). Doit être unique parmi les utilisateurs de
                    l'application ; mis en correspondance exactement tel
                    qu'envoyé.
                full_name:
                  type: string
                  nullable: true
                  maxLength: 512
                  description: Nom complet légal de l'utilisateur.
                display_name:
                  type: string
                  nullable: true
                  description: >-
                    Nom d'affichage convivial affiché dans la console (prend le
                    pas sur `full_name` pour l'affichage de l'interface
                    utilisateur).
                  maxLength: 255
                date_of_birth:
                  type: string
                  format: date
                  nullable: true
                  description: Date de naissance au format `YYYY-MM-DD`.
                status:
                  type: string
                  enum:
                    - ACTIVE
                    - FLAGGED
                    - BLOCKED
                  default: ACTIVE
                  description: >-
                    Statut de cycle de vie initial. La valeur par défaut est
                    `ACTIVE`.
                metadata:
                  type: object
                  nullable: true
                  description: >-
                    Objet JSON arbitraire que vous associez à l'utilisateur. La
                    valeur par défaut est `{}`.
                approved_emails:
                  type: array
                  items:
                    type: string
                  description: >-
                    Adresses e-mail pré-approuvées pour cet utilisateur, par
                    exemple `["john@example.com"]`.
                approved_phones:
                  type: array
                  items:
                    type: string
                  description: >-
                    Numéros de téléphone pré-approuvés pour cet utilisateur, par
                    exemple `["+14155551234"]`.
                issuing_states:
                  type: array
                  items:
                    type: string
                  description: >-
                    Pays de délivrance pré-enregistrés (ISO 3166-1 alpha-3), par
                    exemple `["USA"]`.
                first_name:
                  type: string
                  maxLength: 255
                  description: >-
                    Prénom. Lorsque `full_name` n'est pas envoyé, Didit
                    concatène `first_name` et `last_name` avec un espace pour
                    former `full_name`. Non renvoyé sous la forme d'un champ
                    distinct.
                last_name:
                  type: string
                  maxLength: 255
                  description: >-
                    Nom de famille. Combiné avec `first_name` pour former
                    `full_name` lorsque `full_name` n'est pas envoyé. N'est pas
                    renvoyé en tant que champ distinct.
                email:
                  type: string
                  format: email
                  description: >-
                    E-mail de contact, stocké dans `metadata.contact.email` (il
                    remplace un `email` que vous envoyez dans
                    `metadata.contact`). Requis lorsque `send_verification_link`
                    est défini sur `true` : le lien est envoyé à cette adresse.
                    Si `metadata.contact` n'est pas un objet JSON, l'appel
                    renvoie `400` sur ce champ.
                phone_number:
                  type: string
                  maxLength: 32
                  description: >-
                    Numéro de téléphone de contact, stocké dans
                    `metadata.contact.phone_number`. Si `metadata.contact` n'est
                    pas un objet JSON, l'appel renvoie `400` sur ce champ.
                country:
                  type: string
                  maxLength: 3
                  description: >-
                    Pays sous forme de code ISO 3166, alpha-2 ou alpha-3 (`ES`
                    ou `ESP`). Stocké en majuscules dans
                    `metadata.address.country`. Si `metadata.address` n'est pas
                    un objet JSON, l'appel renvoie `400` sur ce champ.
                send_verification_link:
                  type: boolean
                  default: false
                  description: >-
                    Lorsque la valeur est `true`, Didit crée une session de
                    vérification pour la personne sur le workflow `workflow_id`
                    et lui envoie le lien par e-mail à l'adresse `email`.
                    Nécessite `email` et `workflow_id`. Une clé API restreinte
                    nécessite également les droits d'écriture sur `sessions`.
                workflow_id:
                  type: string
                  format: uuid
                  description: >-
                    Le workflow de la session de vérification. Requis lorsque
                    `send_verification_link` vaut `true`. Il doit vérifier une
                    personne : un workflow de Vérification d'entreprise (KYB)
                    est refusé. Ignoré dans le cas contraire.
                language:
                  type: string
                  maxLength: 10
                  description: >-
                    Langue de l'e-mail de vérification, sous forme de code de
                    [langue prise en
                    charge](/fr/integration/supported-languages). Anglais en cas
                    d'omission. Ignoré lorsque `send_verification_link` n'est
                    pas `true`.
            examples:
              Basic:
                summary: Créer avec les informations de base
                value:
                  vendor_data: user-abc-123
                  full_name: John Doe
              Full:
                summary: Tous les champs
                value:
                  vendor_data: user-abc-456
                  full_name: Jane Smith
                  display_name: Jane S.
                  date_of_birth: '1990-05-15'
                  status: ACTIVE
                  metadata:
                    tier: premium
                    source: api
                  approved_emails:
                    - jane@example.com
              Contact details:
                summary: Nom, e-mail, téléphone et pays
                value:
                  vendor_data: user-abc-789
                  first_name: Julia
                  last_name: Martin
                  email: julia.martin@example.com
                  phone_number: '+34600000000'
                  country: ES
              With verification link:
                summary: >-
                  Créer la personne et lui envoyer un lien de vérification par
                  e-mail
                value:
                  vendor_data: user-abc-789
                  first_name: Julia
                  last_name: Martin
                  email: julia.martin@example.com
                  send_verification_link: true
                  workflow_id: 3fa85f64-5717-4562-b3fc-2c963f66afa6
                  language: es
      responses:
        '201':
          description: >-
            Utilisateur créé. Enregistrement utilisateur complet (même format
            que Obtenir un utilisateur), plus `verification_link` : la session
            de vérification envoyée par e-mail par Didit lorsque
            `send_verification_link` était à `true`, sinon `null`.
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/UserDetailItem'
                  - type: object
                    required:
                      - verification_link
                    properties:
                      verification_link:
                        type: object
                        nullable: true
                        description: >-
                          La session de vérification créée et envoyée par e-mail
                          à la personne par Didit. Toujours présent : `null`
                          lorsque `send_verification_link` n'était pas `true`.
                        required:
                          - session_id
                          - session_number
                          - status
                          - url
                          - workflow_id
                          - email
                        properties:
                          session_id:
                            type: string
                            format: uuid
                            description: Identifiant de la session de vérification.
                          session_number:
                            type: integer
                            description: >-
                              Numéro séquentiel de la session au sein de votre
                              application.
                          status:
                            type: string
                            description: >-
                              Statut de la session, `Not Started` pour une
                              session qui vient d'être créée.
                          url:
                            type: string
                            format: uri
                            description: >-
                              Le lien de vérification envoyé par e-mail à la
                              personne par Didit.
                          workflow_id:
                            type: string
                            format: uuid
                            nullable: true
                            description: Le workflow exécuté par la session.
                          email:
                            type: string
                            format: email
                            description: L'adresse à laquelle le lien a été envoyé.
              examples:
                Created:
                  value:
                    didit_internal_id: f4e5e1f2-94a9-4f86-8c16-2b7d9b4db418
                    vendor_data: user-abc-123
                    display_name: null
                    full_name: John Doe
                    date_of_birth: null
                    effective_name: John Doe
                    status: ACTIVE
                    metadata: {}
                    portrait_image_url: null
                    session_count: 0
                    approved_count: 0
                    declined_count: 0
                    in_review_count: 0
                    issuing_states: []
                    approved_emails: []
                    approved_phones: []
                    features: {}
                    features_list: []
                    last_session_at: null
                    last_activity_at: '2025-06-15T10:30:00Z'
                    first_session_at: null
                    tags: []
                    comments: []
                    created_at: '2025-06-15T10:30:00Z'
                    updated_at: '2025-06-15T10:30:00Z'
                    verification_link: null
                Created with verification link:
                  value:
                    didit_internal_id: 9b2f6c1e-3d4a-4e5f-8a7b-1c2d3e4f5a6b
                    vendor_data: user-abc-789
                    display_name: null
                    full_name: Julia Martin
                    date_of_birth: null
                    effective_name: Julia Martin
                    status: ACTIVE
                    metadata:
                      contact:
                        email: julia.martin@example.com
                    portrait_image_url: null
                    session_count: 1
                    approved_count: 0
                    declined_count: 0
                    in_review_count: 0
                    issuing_states: []
                    approved_emails: []
                    approved_phones: []
                    features: {}
                    features_list: []
                    last_session_at: '2025-06-15T10:30:00Z'
                    last_activity_at: '2025-06-15T10:30:00Z'
                    first_session_at: '2025-06-15T10:30:00Z'
                    tags: []
                    comments: []
                    created_at: '2025-06-15T10:30:00Z'
                    updated_at: '2025-06-15T10:30:00Z'
                    verification_link:
                      session_id: 3fa85f64-5717-4562-b3fc-2c963f66afa7
                      session_number: 43762
                      status: Not Started
                      url: https://verify.didit.me/en/session/3FaJ9wLqX2Mz
                      workflow_id: 3fa85f64-5717-4562-b3fc-2c963f66afa6
                      email: julia.martin@example.com
        '400':
          description: >-
            Corps non valide, indexé par champ : généralement un `vendor_data`
            en double, un champ obligatoire manquant ou une valeur malformée.
            Avec `send_verification_link: true`, également un `email` ou un
            `workflow_id` manquant, un workflow inconnu ou de Vérification
            d'entreprise (KYB), une `language` non prise en charge (indexée sous
            `contact_details.email_lang`), un `vendor_data` sur liste de
            blocage, ou un nombre insuffisant de crédits pour démarrer la
            session. Rien n'est écrit.
          content:
            application/json:
              examples:
                Duplicate:
                  value:
                    vendor_data:
                      - A user with this vendor_data already exists.
                Missing vendor_data:
                  value:
                    vendor_data:
                      - This field is required.
                Bad metadata:
                  value:
                    metadata:
                      - Metadata must be a JSON object.
                Bad status:
                  value:
                    status:
                      - >-
                        Invalid status. Valid options are: ACTIVE, FLAGGED,
                        BLOCKED
                Bad country:
                  value:
                    country:
                      - Use an ISO 3166 country code, like ES or ESP.
                Contact not an object:
                  value:
                    email:
                      - >-
                        metadata.contact must be a JSON object to store this
                        value.
                Address not an object:
                  value:
                    country:
                      - >-
                        metadata.address must be a JSON object to store this
                        value.
                Link without email or workflow:
                  value:
                    email:
                      - >-
                        An email address is required to send a verification
                        link.
                    workflow_id:
                      - Pick the workflow to send a verification link for.
                Unknown workflow:
                  value:
                    workflow_id:
                      - Invalid workflow_id.
                Business workflow:
                  value:
                    workflow_id:
                      - >-
                        This workflow verifies a business. Pick a workflow that
                        verifies a person to send them a verification link.
                Blocklisted vendor_data:
                  value:
                    vendor_data: >-
                      This user or business has been blocked and cannot create
                      new verification sessions.
                Insufficient credits:
                  value:
                    detail: >-
                      You don't have enough credits to perform this request.
                      Please top up at https://business.didit.me
        '401':
          description: >-
            Aucun identifiant fourni. Les requêtes vers les chemins
            `/v3/users/*` sans en-tête `x-api-key` (ou token `Authorization:
            Bearer`) sont rejetées par le middleware d'authentification avant
            d'atteindre l'API.
          content:
            application/json:
              examples:
                Missing credentials:
                  value:
                    detail: >-
                      You must be authenticated with a valid access token to
                      access this endpoint.
        '403':
          description: >-
            Clé API non valide ou révoquée, ou la clé ne peut pas créer
            d'utilisateurs pour cette application. Une clé API avec permissions
            restreintes nécessite l'écriture sur `users`, ainsi que l'écriture
            sur `sessions` lorsque `send_verification_link` est `true` ; rien
            n'est écrit. Une clé manquante renvoie `403` ; une clé erronée,
            révoquée ou expirée renvoie `401`.
          content:
            application/json:
              examples:
                Forbidden:
                  value:
                    detail: You do not have permission to perform this action.
                No sessions write:
                  summary: >-
                    Une clé restreinte demande un lien de vérification sans
                    droit d'écriture sur les sessions
                  value:
                    detail: This API key has no write access to sessions.
        '429':
          description: >-
            Limite de débit dépassée ; réduisez la cadence et réessayez après
            l'intervalle indiqué dans `Retry-After`.
          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/users/create/' \
              -H 'x-api-key: YOUR_API_KEY' \
              -H 'Content-Type: application/json' \
              -d '{"vendor_data": "user-abc-123", "full_name": "John Doe"}'
        - lang: python
          label: Python
          source: |-
            from didit import Didit

            # Reads DIDIT_API_KEY.
            client = Didit()

            result = client.users.create(
                vendor_data="user-abc-123",
                full_name="John Doe",
            )
            print(result)
        - lang: javascript
          label: Node.js
          source: |-
            import Didit from "@didit-protocol/sdk-node";

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

            const result = await didit.users.create({
              vendor_data: "user-abc-123",
              full_name: "John Doe",
            });
            console.log(result);
        - lang: go
          label: Go
          source: "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Users.Create(ctx, didit.UsersCreateParams{\n\tVendorData: \"user-abc-123\",\n\tFullName:   didit.String(\"John Doe\"),\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.UsersCreateParams;

            // Reads DIDIT_API_KEY.
            Didit client = new Didit();

            var result = client.users().create(UsersCreateParams.builder()
                    .vendorData("user-abc-123")
                    .fullName("John Doe")
                    .build());
            System.out.println(result);
        - lang: php
          label: PHP
          source: |-
            <?php

            require 'vendor/autoload.php';

            use Didit\DiditClient;

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

            $result = $didit->users->create([
                'vendor_data' => 'user-abc-123',
                'full_name' => 'John Doe',
            ]);
            print_r($result->toArray());
        - lang: ruby
          label: Ruby
          source: |-
            require "didit"

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

            result = didit.users.create(
              vendor_data: "user-abc-123",
              full_name: "John Doe"
            )
            puts result.to_h
        - lang: csharp
          label: .NET
          source: |-
            using System;
            using System.Text.Json;
            using Didit;

            // Reads DIDIT_API_KEY.
            using var client = new DiditClient();

            var result = await client.Users.CreateAsync(new UsersCreateParams
            {
                VendorData = "user-abc-123",
                FullName = "John Doe",
            });
            Console.WriteLine(JsonSerializer.Serialize(result));
components:
  schemas:
    UserDetailItem:
      type: object
      description: >-
        Détails complets de l'utilisateur. Étend UserListItem avec les
        métadonnées, les commentaires et updated_at.
      allOf:
        - $ref: '#/components/schemas/UserListItem'
        - type: object
          properties:
            metadata:
              type: object
              description: >-
                JSON de métadonnées personnalisées que vous avez associé à cet
                utilisateur. La valeur par défaut est `{}`.
            tags:
              type: array
              description: >-
                Attributions de tags. REMARQUE : sur les réponses détaillées,
                chaque entrée est un objet de *liaison* de tag (`{uuid, tag:
                {...}, added_by_email, added_by_name, created_at}`),
                contrairement au format plat `{uuid, name, color}` utilisé sur
                les réponses de liste.
              items:
                type: object
                properties:
                  uuid:
                    type: string
                    format: uuid
                    description: UUID de l'attribution du tag (et non le tag lui-même).
                  tag:
                    type: object
                    properties:
                      uuid:
                        type: string
                        format: uuid
                      name:
                        type: string
                      color:
                        type: string
                      description:
                        type: string
                        nullable: true
                      source:
                        type: string
                        enum:
                          - didit
                          - custom
                      created_at:
                        type: string
                        format: date-time
                      updated_at:
                        type: string
                        format: date-time
                  added_by_email:
                    type: string
                    nullable: true
                  added_by_name:
                    type: string
                    nullable: true
                  created_at:
                    type: string
                    format: date-time
            comments:
              type: array
              items:
                type: object
                properties:
                  uuid:
                    type: string
                    format: uuid
                  comment_type:
                    type: string
                    enum:
                      - COMMENT
                      - STATUS_CHANGED
                      - METADATA_UPDATED
                      - TAG_ADDED
                      - TAG_REMOVED
                      - PROFILE_UPDATED
                  comment:
                    type: string
                    nullable: true
                  actor_email:
                    type: string
                    nullable: true
                  actor_name:
                    type: string
                    nullable: true
                  previous_status:
                    type: string
                    nullable: true
                    enum:
                      - ACTIVE
                      - FLAGGED
                      - BLOCKED
                      - null
                  new_status:
                    type: string
                    nullable: true
                    enum:
                      - ACTIVE
                      - FLAGGED
                      - BLOCKED
                      - null
                  previous_value:
                    type: object
                    nullable: true
                    description: >-
                      Valeurs précédentes des champs pour les entrées
                      PROFILE_UPDATED.
                  new_value:
                    type: object
                    nullable: true
                    description: >-
                      Nouvelles valeurs de champ pour les entrées
                      PROFILE_UPDATED.
                  changed_fields:
                    type: array
                    items:
                      type: string
                    description: Noms des champs modifiés par une entrée PROFILE_UPDATED.
                  metadata:
                    type: object
                    nullable: true
                  mentioned_emails:
                    type: array
                    items:
                      type: string
                  created_at:
                    type: string
                    format: date-time
              description: >-
                Journal d'activité et commentaires pour cet utilisateur
                (changements de statut, modifications de profil, notes
                manuelles).
            updated_at:
              type: string
              format: date-time
    UserListItem:
      type: object
      description: Un utilisateur vérifié.
      properties:
        didit_internal_id:
          type: string
          format: uuid
          description: UUID interne stable de Didit pour cet utilisateur.
        vendor_data:
          type: string
          nullable: true
          description: >-
            Votre identifiant unique pour cet utilisateur (transmis lors de la
            création des sessions). Peut être nul si aucun identifiant
            fournisseur n'a été fourni.
        display_name:
          type: string
          nullable: true
          description: Nom d'affichage personnalisé défini par vous
        full_name:
          type: string
          nullable: true
          description: Nom complet extrait des documents vérifiés
        date_of_birth:
          type: string
          format: date
          nullable: true
        effective_name:
          type: string
          nullable: true
          description: >-
            Meilleur nom disponible : display_name s'il est défini, sinon
            full_name
        status:
          type: string
          enum:
            - ACTIVE
            - FLAGGED
            - BLOCKED
          description: >-
            Statut de cycle de vie de l'enregistrement utilisateur (PAS un
            statut de session). `ACTIVE` est la valeur par défaut, `FLAGGED`
            signale l'utilisateur pour un examen manuel, `BLOCKED` empêche de
            nouvelles sessions pour ce `vendor_data`.
        portrait_image_url:
          type: string
          nullable: true
          description: >-
            URL pré-signée de la photo de portrait de l'utilisateur (expire
            après quelques heures)
        session_count:
          type: integer
          description: Nombre total de sessions de vérification pour cet utilisateur
        approved_count:
          type: integer
          description: Nombre de sessions approuvées
        declined_count:
          type: integer
          description: Nombre de sessions refusées
        in_review_count:
          type: integer
          description: Nombre de sessions en cours d'examen
        issuing_states:
          type: array
          items:
            type: string
          description: >-
            Codes ISO 3166-1 alpha-3 des pays de délivrance observés sur les
            documents d'identité approuvés de cet utilisateur, par ex. `["USA",
            "ESP"]`. Tableau vide s'il n'y en a aucun.
        approved_emails:
          type: array
          items:
            type: string
          description: >-
            Adresses e-mail vérifiées collectées à partir des sessions
            approuvées de cet utilisateur, par ex. `["john@example.com"]`.
        approved_phones:
          type: array
          items:
            type: string
          description: >-
            Numéros de téléphone vérifiés collectés à partir des sessions
            approuvées de cet utilisateur, par ex. `["+14155551234"]`.
        features:
          type: object
          description: "Statut agrégé par fonctionnalité sur l'ensemble des sessions de cet utilisateur. Clés possibles\_: `ID_VERIFICATION`, `NFC`, `LIVENESS`, `FACE_MATCH`, `POA`, `QUESTIONNAIRE`, `EMAIL_VERIFICATION`, `PHONE`, `AML`, `IP_ANALYSIS`, `AGE_ESTIMATION`, `DATABASE_VALIDATION`. Valeurs possibles\_: `Approved`, `Declined`, `In Review`, `Not Finished`, `Resub Requested`."
        features_list:
          type: array
          items:
            type: object
            properties:
              feature:
                type: string
              status:
                type: string
          description: >-
            Mêmes données que `features`, sous la forme d'un tableau ordonné
            d'objets `{feature, status}`.
        last_session_at:
          type: string
          format: date-time
          nullable: true
          description: Horodatage de la session la plus récente
        first_session_at:
          type: string
          format: date-time
          nullable: true
          description: Horodatage de la première session
        last_activity_at:
          type: string
          format: date-time
          nullable: true
          description: >-
            Horodatage de l'activité la plus récente sur cet utilisateur
            (session, transaction, changement de statut, modification des
            données, etc.).
        tags:
          type: array
          items:
            type: object
            properties:
              uuid:
                type: string
                format: uuid
              name:
                type: string
              color:
                type: string
          description: Tags attribués à cet utilisateur
        created_at:
          type: string
          format: date-time
  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.