> ## 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 para enviar personas clave de KYB

> Con la API de Didit declaras las personas clave preparadas de una sesión KYB e inicias la verificación KYC de cada parte que la necesite.



## OpenAPI

````yaml es/openapi-25.json POST /v3/session/{sessionId}/kyb/parties/submit/
openapi: 3.0.0
info:
  version: 3.0.0
  title: Didit Verification API
  description: API de verificación de identidad. Autentícate con el encabezado x-api-key.
servers:
  - url: https://verification.didit.me
security: []
tags: []
paths:
  /v3/session/{sessionId}/kyb/parties/submit/:
    post:
      tags:
        - Sessions
      summary: Enviar los borradores de las partes KYB
      description: >-
        Declara los borradores almacenados como las personas clave de la
        empresa. Es el paso alojado de personas clave, ejecutado con tu clave de
        API: Didit decide, a partir de la configuración de roles y los umbrales
        de propiedad del flujo de verificación (workflow), qué partes deben
        verificarse, crea una sesión de KYC individual (o una subsesión de KYB
        para un propietario corporativo) para cada una de ellas, envía los
        correos electrónicos que pide el flujo y hace avanzar la sesión. Cada
        sesión hija se factura igual que en el flujo alojado. Los borradores se
        consumen. Repetir la llamada después de un envío correcto no cambia nada
        y responde `200` con `already_submitted: true` y las partes que ya
        existen. La sesión debe estar en el paso de personas clave. Envía a cada
        persona su `kyc_session_url` o incrústala. Requiere `write:businesses`.
      operationId: post_v3_session_kyb_parties_submit
      parameters:
        - name: sessionId
          in: path
          required: true
          description: >-
            UUID de la sesión de Verificación de empresas (KYB). Debe pertenecer
            a la aplicación de la clave de API.
          schema:
            type: string
            format: uuid
            example: 33333333-4444-5555-6666-777777777777
        - name: node_id
          in: query
          required: false
          description: >-
            Nodo del flujo correspondiente al paso KYB. Solo es necesario cuando
            el flujo tiene más de un nodo KYB; de forma predeterminada, Didit
            usa el propio nodo de la sesión.
          schema:
            type: string
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                locale:
                  type: string
                  maxLength: 10
                  description: >-
                    Configuración regional usada para traducir la respuesta del
                    paso al que avanza la sesión.
            example:
              locale: es
      responses:
        '200':
          description: Partes declaradas (o ya declaradas).
          content:
            application/json:
              schema:
                type: object
                properties:
                  valid:
                    type: boolean
                  next_step:
                    type: string
                    nullable: true
                    description: Paso en el que se encuentra la sesión.
                  status:
                    type: string
                    description: Estado de la sesión de empresa.
                  advanced:
                    type: boolean
                    description: >-
                      `true` cuando esta llamada declaró las partes e hizo
                      avanzar la sesión.
                  already_submitted:
                    type: boolean
                    description: >-
                      `true` cuando las partes ya se habían declarado en una
                      llamada anterior.
                  kyb_key_people_status:
                    type: string
                  parties:
                    type: array
                    items:
                      $ref: '#/components/schemas/KYBKeyPeopleParty'
              example:
                valid: true
                next_step: FINISHED
                status: In Progress
                advanced: true
                already_submitted: false
                kyb_key_people_status: In Progress
                parties: []
        '401':
          description: >-
            La clave de API con alcance limitado ha expirado. Este es el único
            caso que devuelve `401`: una clave ausente, no válida o revocada
            devuelve `403`.
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
                    description: Mensaje de error legible.
              examples:
                Expired key:
                  summary: La fecha de caducidad de la clave ya pasó
                  value:
                    detail: This API key has expired.
        '402':
          description: >-
            La organización no tiene crédito disponible para las sesiones de
            verificación secundarias.
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
                    description: Mensaje de error legible.
              example:
                detail: Insufficient credits.
        '403':
          description: >-
            Fallo de autenticación o autorización. Si falta la clave, se
            devuelve `403`, al igual que con una clave de otra aplicación, una
            clave con alcance limitado sin el permiso que necesita este endpoint
            y una solicitud desde fuera de la lista de IP permitidas de la
            clave; una clave incorrecta, revocada o expirada devuelve `401`.
            Distínguelos por `detail`.
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
                    description: Mensaje de error legible.
              examples:
                Missing or invalid credentials:
                  summary: >-
                    Falta el encabezado x-api-key, o la clave no superó la
                    validación
                  value:
                    detail: >-
                      Authentication credentials were not provided or are
                      invalid.
                Other application:
                  summary: >-
                    Una clave válida que pertenece a una aplicación distinta de
                    la de la sesión
                  value:
                    detail: You do not have permission to perform this action.
                Scoped key without decisions write:
                  summary: 'A la clave con alcance limitado le falta decisions: write'
                  value:
                    detail: This API key has no write access to decisions.
                IP not allowed:
                  summary: >-
                    Solicitud desde fuera de la lista de IP permitidas de la
                    clave
                  value:
                    detail: This API key can't be used from this IP address.
        '404':
          description: >-
            La sesión no existe, se ha eliminado, pertenece a otra aplicación o
            está fuera de los límites de una clave con alcance restringido;
            ningún detalle permite distinguir estos casos.
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
                    description: Mensaje de error legible.
              example:
                detail: Session not found.
        '409':
          description: >-
            `kyb_no_party_drafts`: no hay nada que enviar.
            `kyb_parties_already_submitted`: se añadieron borradores después de
            declarar las partes. `kyb_step_mismatch`: la sesión no está en el
            paso de Personas clave (`next_step` indica su paso).
            `kyb_session_not_writable`: la sesión ha finalizado.
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
                    description: Mensaje de error legible.
                  code:
                    type: string
                  next_step:
                    type: string
              example:
                detail: There are no draft parties to submit.
                code: kyb_no_party_drafts
        '429':
          description: >-
            Límite de solicitudes superado: 300 solicitudes de escritura (POST,
            PATCH, DELETE) por minuto por clave de API. Espera los segundos
            indicados en `Retry-After` antes de reintentar; los encabezados
            `X-RateLimit-*` muestran el presupuesto.
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
                    description: Mensaje de error legible.
              examples:
                Rate limited:
                  summary: Presupuesto del minuto actual agotado
                  value:
                    detail: >-
                      Write request rate limit exceeded. You can make up to 300
                      requests per minute.
          headers:
            Retry-After:
              description: Segundos que hay que esperar antes de reintentar.
              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.submit_kyb_parties(
                "33333333-4444-5555-6666-777777777777",
                locale="es",
            )
            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.submitKybParties("33333333-4444-5555-6666-777777777777",
            {
              locale: "es",
            });

            console.log(result);
        - lang: go
          label: Go
          source: "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Sessions.SubmitKYBParties(ctx, \"33333333-4444-5555-6666-777777777777\", didit.SessionsSubmitKYBPartiesParams{\n\tLocale: didit.String(\"es\"),\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.SessionsSubmitKybPartiesParams;


            // Reads DIDIT_API_KEY.

            Didit client = new Didit();


            var result =
            client.sessions().submitKybParties("33333333-4444-5555-6666-777777777777",
            SessionsSubmitKybPartiesParams.builder()
                    .locale("es")
                    .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->submitKybParties('33333333-4444-5555-6666-777777777777',
            [
                'locale' => 'es',
            ]);

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

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

            result = didit.sessions.submit_kyb_parties(
              "33333333-4444-5555-6666-777777777777",
              locale: "es"
            )
            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.SubmitKybPartiesAsync("33333333-4444-5555-6666-777777777777",
            new SessionsSubmitKybPartiesParams

            {
                Locale = "es",
            });

            Console.WriteLine(JsonSerializer.Serialize(result));
components:
  schemas:
    KYBKeyPeopleParty:
      type: object
      description: >-
        Una parte de Personas clave de una sesión de Verificación de empresas
        (KYB), con su verificación secundaria. La misma parte aparece en
        `key_people_checks[].submitted.parties[]` de la decisión de la sesión de
        empresa.
      required:
        - uuid
        - entity_type
        - source
        - name
        - is_active
        - is_skipped
        - requires_verification
        - roles
        - kyc_session_deleted
        - kyb_sub_session_deleted
      properties:
        uuid:
          type: string
          format: uuid
          description: Identificador de la parte.
        entity_type:
          type: string
          enum:
            - person
            - company
          description: Si la parte es una persona física o una empresa.
        source:
          type: string
          enum:
            - REGISTRY
            - USER
          description: >-
            `REGISTRY`: obtenido del registro de empresas. `USER`: introducido
            en la pantalla Personas clave.
        name:
          type: string
          description: Nombre visible de la parte.
        first_name:
          type: string
          nullable: true
          description: Nombre (personas).
        last_name:
          type: string
          nullable: true
          description: Apellido (personas).
        company_name:
          type: string
          nullable: true
          description: Nombre de la empresa (partes que son empresas).
        registration_number:
          type: string
          nullable: true
          description: Número de registro de la empresa (partes que son empresas).
        email:
          type: string
          format: email
          nullable: true
          description: Correo electrónico al que se envía el enlace de verificación.
        nationality:
          type: string
          nullable: true
          description: Nacionalidad para personas, país de constitución para empresas.
        phone_number:
          type: string
          nullable: true
          description: Número de teléfono recopilado para la parte.
        date_of_birth:
          type: string
          format: date
          nullable: true
          description: Fecha de nacimiento (personas).
        position:
          type: string
          nullable: true
          description: Cargo en texto libre (personas).
        custom_fields:
          type: object
          additionalProperties: true
          description: >-
            Campos personalizados definidos en el flujo y recopilados para la
            parte, indexados por la clave del campo.
        is_active:
          type: boolean
          description: Si la parte está activa.
        is_skipped:
          type: boolean
          description: >-
            Si la parte está exenta de verificación. Al regenerar, este valor se
            borra.
        requires_verification:
          type: boolean
          description: >-
            Si las reglas de rol y propiedad exigen una verificación para esta
            parte.
        roles:
          type: array
          description: Roles que tiene la parte en la empresa.
          items:
            type: object
            required:
              - role
              - ownership_percent
              - voting_percent
            properties:
              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: Código del rol.
              ownership_percent:
                type: number
                nullable: true
                description: >-
                  Porcentaje de propiedad correspondiente a este rol, cuando se
                  conoce.
              voting_percent:
                type: number
                nullable: true
                description: >-
                  Porcentaje de derechos de voto para este rol, cuando se
                  conoce.
        kyc_session_id:
          type: string
          format: uuid
          nullable: true
          description: Sesión KYC individual secundaria (personas).
        kyc_session_status:
          type: string
          nullable: true
          enum:
            - Not Started
            - In Progress
            - Approved
            - Declined
            - In Review
            - Expired
            - Abandoned
            - Kyc Expired
            - Resubmitted
            - Awaiting User
            - null
          description: >-
            Estado de la sesión KYC hija. Una sesión eliminada conserva el
            estado que tenía cuando se eliminó.
        kyc_session_url:
          type: string
          format: uri
          nullable: true
          description: >-
            Enlace alojado de la sesión KYC secundaria. `null` cuando no existe
            o se eliminó, y para una clave de API con alcance limitado sin
            `sessions: write`.
        kyc_session_deleted:
          type: boolean
          description: La sesión KYC hija se eliminó, por lo que nunca podrá resolverse.
        kyb_sub_session_id:
          type: string
          format: uuid
          nullable: true
          description: Sesión KYB secundaria (partes que son empresas).
        kyb_sub_session_status:
          type: string
          nullable: true
          enum:
            - Not Started
            - In Progress
            - Approved
            - Declined
            - In Review
            - Expired
            - Abandoned
            - Kyc Expired
            - Resubmitted
            - Awaiting User
            - null
          description: Estado de la sesión KYB hija.
        kyb_sub_session_url:
          type: string
          format: uri
          nullable: true
          description: >-
            Enlace alojado de la sesión KYB secundaria, con las mismas reglas de
            `null` que `kyc_session_url`.
        kyb_sub_session_deleted:
          type: boolean
          description: >-
            Equivalente de `kyc_session_deleted` para las partes de tipo
            empresa.
        verification_workflow_type:
          type: string
          nullable: true
          enum:
            - kyc
            - kyb
            - adaptive_age_verification
            - biometric_authentication
            - address_verification
            - questionnaire_verification
            - email_verification
            - phone_verification
            - null
          description: Tipo del flujo que ejecuta la sesión secundaria.
        verification_workflow_id:
          type: string
          format: uuid
          nullable: true
          description: Flujo que ejecuta la sesión hija.
        verification_workflow_label:
          type: string
          nullable: true
          description: Etiqueta de ese flujo.
        verification_workflow_features:
          type: array
          nullable: true
          description: Funciones del flujo de la sesión hija con su estado actual.
          items:
            type: object
            required:
              - feature
              - status
            properties:
              feature:
                type: string
                description: >-
                  Código de la función, por ejemplo `ID_VERIFICATION` o
                  `LIVENESS`.
              status:
                type: string
                description: Estado de la función; es `Not Finished` hasta que se ejecuta.
        didit_internal_id:
          type: string
          format: uuid
          nullable: true
          description: Identificador de Didit de la persona verificada, una vez conocido.
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: x-api-key
      description: >-
        La clave de API de tu aplicación, que encontrarás en Developers -> API
        keys en la Business Console. La clave principal tiene acceso completo.
        Una clave con nombre puede tener un alcance limitado: ninguno, lectura o
        escritura por recurso, limitada a algunos flujos o a sesiones aprobadas,
        a una lista de direcciones IP y a una fecha de caducidad. 401 significa
        que la clave es incorrecta, se revocó o expiró; 403 significa que no se
        envió ninguna clave, que la clave no tiene acceso a este recurso o
        acción, o que la solicitud provino de una dirección fuera de su lista de
        IP; 404 en una ruta de sesión significa que la sesión está fuera de los
        flujos o estados de la clave. Una clave sin acceso a contenido
        multimedia recibe las URL de imágenes, videos y PDF como null, y una
        clave sin permiso de escritura en sesiones recibe los enlaces y tokens
        de sesión como null. Consulta https://docs.didit.me/console/api-keys.

````

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