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

# KYB : créer un brouillon de personne via l'API

> Ajoutez une personne ou une entreprise à la liste des personnes clés d'une session KYB sans la déclarer encore. Avec Didit.



## OpenAPI

````yaml fr/openapi-25.json POST /v3/session/{sessionId}/kyb/parties/drafts/
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/session/{sessionId}/kyb/parties/drafts/:
    post:
      tags:
        - Sessions
      summary: Créer un brouillon de partie KYB
      description: "Ajouter une partie (une personne ou une entreprise) à la liste que vous préparez pour cette session KYB. Les mêmes champs et règles que pour l'écran hébergé Personnes clés s'appliquent\_: une personne nécessite `full_name` ou `first_name` et `last_name`, au moins un rôle et une nationalité\_; une entreprise nécessite `company_name` et le pays de constitution dans `nationality`. Rien n'est déclaré ni facturé avant `POST /v3/session/{sessionId}/kyb/parties/submit/`. Nécessite `write:businesses`."
      operationId: post_v3_session_kyb_party_drafts
      parameters:
        - name: sessionId
          in: path
          required: true
          description: >-
            UUID de la session de Vérification d'entreprise (KYB). Il doit
            appartenir à l'application de la clé API.
          schema:
            type: string
            format: uuid
            example: 33333333-4444-5555-6666-777777777777
        - name: node_id
          in: query
          required: false
          description: >-
            Nœud de workflow de l'étape KYB. Nécessaire uniquement lorsque le
            workflow comporte plus d'un nœud KYB ; par défaut, Didit utilise le
            nœud propre à la session.
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - entity_type
                - nationality
              properties:
                entity_type:
                  type: string
                  enum:
                    - person
                    - company
                  description: Indique si la partie est un particulier ou une entreprise.
                full_name:
                  type: string
                  maxLength: 255
                  description: >-
                    Nom complet d'une personne. Envoyez-le, ou transmettez
                    `first_name` et `last_name`.
                first_name:
                  type: string
                  maxLength: 128
                last_name:
                  type: string
                  maxLength: 128
                role:
                  type: string
                  enum:
                    - director
                    - non_executive_director
                    - secretary
                    - chairman
                    - ubo
                    - shareholder
                    - representative
                    - founder
                    - legal_advisor
                    - authorized_signatory
                    - trustee
                    - beneficiary
                    - settlor
                    - protector
                    - company_officer
                    - investor
                    - other
                  description: >-
                    Rôle que détient la partie. Interchangeable avec `roles` ;
                    lorsque les deux sont envoyés, ils sont fusionnés.
                roles:
                  type: array
                  items:
                    type: string
                    enum:
                      - director
                      - non_executive_director
                      - secretary
                      - chairman
                      - ubo
                      - shareholder
                      - representative
                      - founder
                      - legal_advisor
                      - authorized_signatory
                      - trustee
                      - beneficiary
                      - settlor
                      - protector
                      - company_officer
                      - investor
                      - other
                  description: >-
                    Chaque rôle détenu par la partie. Une personne a besoin d'au
                    moins un rôle (ici ou dans `role`).
                position:
                  type: string
                  maxLength: 128
                  description: Intitulé du poste d'une personne.
                date_of_birth:
                  type: string
                  format: date
                  nullable: true
                company_name:
                  type: string
                  maxLength: 255
                  description: >-
                    Nom d'une partie représentant l'entreprise. Requis lorsque
                    `entity_type` est `company`.
                registration_number:
                  type: string
                  maxLength: 100
                  description: Numéro d'immatriculation d'une partie de l'entreprise.
                email:
                  type: string
                  format: email
                  description: >-
                    Destination d'envoi du lien de vérification. Requis lorsque
                    la partie doit effectuer une vérification, ce qui dépend des
                    paramètres de rôle et des seuils d'actionnariat du workflow.
                ownership_percent:
                  type: number
                  nullable: true
                  description: Part de l'entreprise détenue par la partie.
                nationality:
                  type: string
                  maxLength: 100
                  description: >-
                    Nationalité d'une personne, ou pays de constitution d'une
                    entreprise. Obligatoire pour chaque partie.
                phone_number:
                  type: string
                  maxLength: 32
                custom_fields:
                  type: object
                  additionalProperties: true
                  description: Champs supplémentaires définis par le workflow.
                skip_verification:
                  type: boolean
                  default: false
                  description: >-
                    Demander d'ignorer la vérification de cette partie. Pris en
                    compte uniquement lorsque le rôle de la partie permet de
                    l'ignorer dans les paramètres Personnes clés du workflow.
            example:
              entity_type: person
              first_name: Ana
              last_name: Lopez
              roles:
                - ubo
                - director
              ownership_percent: 60
              nationality: MEX
              email: ana.lopez@example.com
              date_of_birth: '1984-06-12'
      responses:
        '201':
          description: Brouillon créé.
          content:
            application/json:
              schema:
                type: object
                required:
                  - draft_id
                  - created_at
                  - updated_at
                  - party
                properties:
                  draft_id:
                    type: string
                    format: uuid
                  created_at:
                    type: string
                    format: date-time
                  updated_at:
                    type: string
                    format: date-time
                  party:
                    type: object
                    required:
                      - entity_type
                      - nationality
                    properties:
                      entity_type:
                        type: string
                        enum:
                          - person
                          - company
                        description: >-
                          Indique si la partie est un particulier ou une
                          entreprise.
                      full_name:
                        type: string
                        maxLength: 255
                        description: >-
                          Nom complet d'une personne. Envoyez-le, ou transmettez
                          `first_name` et `last_name`.
                      first_name:
                        type: string
                        maxLength: 128
                      last_name:
                        type: string
                        maxLength: 128
                      role:
                        type: string
                        enum:
                          - director
                          - non_executive_director
                          - secretary
                          - chairman
                          - ubo
                          - shareholder
                          - representative
                          - founder
                          - legal_advisor
                          - authorized_signatory
                          - trustee
                          - beneficiary
                          - settlor
                          - protector
                          - company_officer
                          - investor
                          - other
                        description: >-
                          Rôle que détient la partie. Interchangeable avec
                          `roles` ; lorsque les deux sont envoyés, ils sont
                          fusionnés.
                      roles:
                        type: array
                        items:
                          type: string
                          enum:
                            - director
                            - non_executive_director
                            - secretary
                            - chairman
                            - ubo
                            - shareholder
                            - representative
                            - founder
                            - legal_advisor
                            - authorized_signatory
                            - trustee
                            - beneficiary
                            - settlor
                            - protector
                            - company_officer
                            - investor
                            - other
                        description: >-
                          Chaque rôle détenu par la partie. Une personne a
                          besoin d'au moins un rôle (ici ou dans `role`).
                      position:
                        type: string
                        maxLength: 128
                        description: Intitulé du poste d'une personne.
                      date_of_birth:
                        type: string
                        format: date
                        nullable: true
                      company_name:
                        type: string
                        maxLength: 255
                        description: >-
                          Nom d'une partie représentant l'entreprise. Requis
                          lorsque `entity_type` est `company`.
                      registration_number:
                        type: string
                        maxLength: 100
                        description: Numéro d'immatriculation d'une partie de l'entreprise.
                      email:
                        type: string
                        format: email
                        description: >-
                          Destination d'envoi du lien de vérification. Requis
                          lorsque la partie doit effectuer une vérification, ce
                          qui dépend des paramètres de rôle et des seuils
                          d'actionnariat du workflow.
                      ownership_percent:
                        type: number
                        nullable: true
                        description: Part de l'entreprise détenue par la partie.
                      nationality:
                        type: string
                        maxLength: 100
                        description: >-
                          Nationalité d'une personne, ou pays de constitution
                          d'une entreprise. Obligatoire pour chaque partie.
                      phone_number:
                        type: string
                        maxLength: 32
                      custom_fields:
                        type: object
                        additionalProperties: true
                        description: Champs supplémentaires définis par le workflow.
                      skip_verification:
                        type: boolean
                        default: false
                        description: >-
                          Demander d'ignorer la vérification de cette partie.
                          Pris en compte uniquement lorsque le rôle de la partie
                          permet de l'ignorer dans les paramètres Personnes clés
                          du workflow.
              example:
                draft_id: 5b0d7a52-9d3e-4f0c-8c6a-0e5f3a1b2c4d
                created_at: '2026-10-31T10:00:00Z'
                updated_at: '2026-10-31T10:00:00Z'
                party:
                  entity_type: person
                  first_name: Ana
                  last_name: Lopez
                  roles:
                    - ubo
                    - director
                  ownership_percent: 60
                  nationality: MEX
                  email: ana.lopez@example.com
                  date_of_birth: '1984-06-12'
        '400':
          description: >-
            Un champ de partie prenante est invalide ou un champ obligatoire est
            manquant.
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
                    description: Message d'erreur lisible par l'humain.
              example:
                non_field_errors:
                  - Person parties require at least one role.
        '401':
          description: >-
            La clé API restreinte a expiré. C'est le seul cas qui renvoie `401`
            : une clé manquante, invalide ou révoquée renvoie `403`.
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
                    description: Message d'erreur lisible par l'humain.
              examples:
                Expired key:
                  summary: La date d'expiration de la clé est dépassée
                  value:
                    detail: This API key has expired.
        '403':
          description: >-
            Échec d'authentification ou d'autorisation. Une clé manquante
            renvoie `403`, tout comme la clé d'une autre application, une clé
            restreinte ne disposant pas de l'autorisation requise par cet
            endpoint, ou une requête provenant de l'extérieur de la liste
            d'adresses IP autorisées de la clé ; une clé incorrecte, révoquée ou
            expirée renvoie `401`. Distinguez-les grâce au champ `detail`.
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
                    description: Message d'erreur lisible par l'humain.
              examples:
                Missing or invalid credentials:
                  summary: Aucun en-tête x-api-key, ou la validation de la clé a échoué
                  value:
                    detail: >-
                      Authentication credentials were not provided or are
                      invalid.
                Other application:
                  summary: >-
                    Une clé valide qui appartient à une application différente
                    de la session
                  value:
                    detail: You do not have permission to perform this action.
                Scoped key without decisions write:
                  summary: 'La clé restreinte ne dispose pas de decisions: write'
                  value:
                    detail: This API key has no write access to decisions.
                IP not allowed:
                  summary: >-
                    Requête provenant de l'extérieur de la liste d'adresses IP
                    autorisées de la clé
                  value:
                    detail: This API key can't be used from this IP address.
        '404':
          description: >-
            La session n'existe pas, a été supprimée, appartient à une autre
            application ou se trouve en dehors des limites d'une clé restreinte
            ; aucun détail ne permet de les distinguer.
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
                    description: Message d'erreur lisible par l'humain.
              example:
                detail: Session not found.
        '409':
          description: La session est terminée (`kyb_session_not_writable`).
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
                    description: Message d'erreur lisible par l'humain.
                  code:
                    type: string
              example:
                detail: This verification session is no longer accepting changes.
                code: kyb_session_not_writable
        '429':
          description: >-
            Limite de débit dépassée : 300 requêtes d'écriture (POST, PATCH,
            DELETE) par minute par clé API. Attendez `Retry-After` secondes
            avant de réessayer ; les en-têtes `X-RateLimit-*` indiquent le
            budget.
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
                    description: Message d'erreur lisible par l'humain.
              examples:
                Rate limited:
                  summary: Budget épuisé pour la minute en cours
                  value:
                    detail: >-
                      Write request rate limit exceeded. You can make up to 300
                      requests per minute.
          headers:
            Retry-After:
              description: Secondes à attendre avant de réessayer.
              schema:
                type: integer
                minimum: 1
                example: 30
      security:
        - ApiKeyAuth: []
      x-codeSamples:
        - lang: python
          label: Python
          source: |-
            from didit import Didit

            # Reads DIDIT_API_KEY.
            client = Didit()

            result = client.sessions.create_kyb_party_draft(
                "33333333-4444-5555-6666-777777777777",
                entity_type="person",
                first_name="Ana",
                last_name="Lopez",
                roles=["ubo", "director"],
                date_of_birth="1984-06-12",
                email="ana.lopez@example.com",
                ownership_percent=60.0,
                nationality="MEX",
            )
            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.sessions.createKybPartyDraft("33333333-4444-5555-6666-777777777777",
            {
              entity_type: "person",
              first_name: "Ana",
              last_name: "Lopez",
              roles: ["ubo", "director"],
              date_of_birth: "1984-06-12",
              email: "ana.lopez@example.com",
              ownership_percent: 60.0,
              nationality: "MEX",
            });

            console.log(result);
        - lang: go
          label: Go
          source: "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Sessions.CreateKYBPartyDraft(ctx, \"33333333-4444-5555-6666-777777777777\", didit.SessionsCreateKYBPartyDraftParams{\n\tEntityType:       \"person\",\n\tFirstName:        didit.String(\"Ana\"),\n\tLastName:         didit.String(\"Lopez\"),\n\tRoles:            didit.Some([]didit.SessionsCreateKYBPartyDraftParamsRoles{\"ubo\", \"director\"}),\n\tDateOfBirth:      didit.String(\"1984-06-12\"),\n\tEmail:            didit.String(\"ana.lopez@example.com\"),\n\tOwnershipPercent: didit.Float(60.0),\n\tNationality:      \"MEX\",\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
        - lang: java
          label: Java
          source: >-
            import java.time.LocalDate;

            import java.util.List;

            import me.didit.Didit;

            import me.didit.types.SessionsCreateKybPartyDraftParams;


            // Reads DIDIT_API_KEY.

            Didit client = new Didit();


            var result =
            client.sessions().createKybPartyDraft("33333333-4444-5555-6666-777777777777",
            SessionsCreateKybPartyDraftParams.builder()
                    .entityType(SessionsCreateKybPartyDraftParams.EntityType.of("person"))
                    .firstName("Ana")
                    .lastName("Lopez")
                    .roles(List.of(SessionsCreateKybPartyDraftParams.Roles.of("ubo"), SessionsCreateKybPartyDraftParams.Roles.of("director")))
                    .dateOfBirth(LocalDate.parse("1984-06-12"))
                    .email("ana.lopez@example.com")
                    .ownershipPercent(60.0)
                    .nationality("MEX")
                    .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->sessions->createKybPartyDraft('33333333-4444-5555-6666-777777777777',
            [
                'entity_type' => 'person',
                'first_name' => 'Ana',
                'last_name' => 'Lopez',
                'roles' => ['ubo', 'director'],
                'date_of_birth' => '1984-06-12',
                'email' => 'ana.lopez@example.com',
                'ownership_percent' => 60.0,
                'nationality' => 'MEX',
            ]);

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

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

            result = didit.sessions.create_kyb_party_draft(
              "33333333-4444-5555-6666-777777777777",
              entity_type: "person",
              first_name: "Ana",
              last_name: "Lopez",
              roles: ["ubo", "director"],
              date_of_birth: "1984-06-12",
              email: "ana.lopez@example.com",
              ownership_percent: 60.0,
              nationality: "MEX"
            )
            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.Sessions.CreateKybPartyDraftAsync("33333333-4444-5555-6666-777777777777",
            new SessionsCreateKybPartyDraftParams

            {
                EntityType = "person",
                FirstName = "Ana",
                LastName = "Lopez",
                Roles = new SessionsCreateKybPartyDraftParamsRoles[] { "ubo", "director" },
                DateOfBirth = "1984-06-12",
                Email = "ana.lopez@example.com",
                OwnershipPercent = 60.0,
                Nationality = "MEX",
            });

            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.