> ## 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 subir documentos KYB

> Sube documentos corporativos a una sesión de verificación de empresas de Didit desde tu servidor, con el OCR y los controles del flujo alojado.



## OpenAPI

````yaml es/openapi-25.json POST /v3/session/{sessionId}/kyb/documents/
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/documents/:
    post:
      tags:
        - Sessions
      summary: Subir documentos KYB a una sesión
      description: >-
        Sube uno o varios documentos corporativos (escritura de constitución,
        registro de accionistas, certificado de constitución, ...) al paso
        Documentos KYB de una sesión de Verificación de empresas, desde tu
        propio servidor en lugar de la página alojada. Didit ejecuta el mismo
        proceso que en la página alojada: compresión, OCR, comprobaciones de
        manipulación y entre documentos, agrupación de documentos, y avanza la
        sesión cuando se cumplen los grupos de documentos requeridos. El paso
        tiene una tarifa única, sin importar cuántos archivos envíes. La sesión
        debe estar abierta y en el paso Documentos KYB, y la empresa elegida en
        el paso de registro debe existir. Consulta las personas que mencionan
        los documentos con `GET /v3/session/{sessionId}/kyb/extracted-parties/`.
        Requiere `write:businesses`.
      operationId: post_v3_session_kyb_documents
      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: true
        content:
          multipart/form-data:
            schema:
              type: object
              required:
                - documents
              properties:
                documents:
                  type: array
                  items:
                    type: string
                    format: binary
                  description: >-
                    Archivos que se van a subir: JPG, JPEG, PNG, TIFF, WEBP, PDF
                    o archivos ZIP que los contengan. PDF de hasta 50 MB y fotos
                    de hasta 6 MB antes de la compresión.
                document_passwords:
                  type: array
                  items:
                    type: string
                  description: >-
                    Una entrada por archivo en `documents`, en el mismo orden:
                    la contraseña de un PDF protegido, vacía para cualquier otro
                    archivo.
                document_group:
                  type: string
                  enum:
                    - LEGAL_PRESENCE
                    - COMPANY_DETAILS
                    - OWNERSHIP_STRUCTURE
                    - REPRESENTATIVES_AUTHORIZATION
                  description: Grupo de documentos requerido al que responde esta carga.
                locale:
                  type: string
                  maxLength: 10
                  description: >-
                    Configuración regional usada para traducir la respuesta del
                    siguiente paso.
      responses:
        '200':
          description: >-
            Documentos procesados. Cuando se cumplen todos los grupos
            obligatorios, la sesión avanza y `next_step` indica el siguiente
            paso; de lo contrario, permanece en el paso Documentos y
            `document_groups` y `document_answer` indican lo que aún falta.
          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 tras la subida.
                  kyb_status:
                    type: string
                    description: Estado de la comprobación de la empresa.
                  document_answer:
                    type: object
                    additionalProperties: true
                    description: >-
                      Resultado por cada documento subido y las subidas
                      restantes.
                additionalProperties: true
              example:
                valid: true
                next_step: KYB_KEY_PEOPLE
                kyb_status: In Progress
        '400':
          description: >-
            Se rechazó un documento (manipulado, ilegible o no admitido) o la
            sesión aún no tiene una empresa KYB. Vuelve a intentarlo con otro
            archivo mientras queden intentos.
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
                    description: Mensaje de error legible.
              example:
                message: No KYB company found. Submit company data first.
        '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 el paso de
            documentos.
          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: >-
            La sesión ha finalizado (`kyb_session_not_writable`) o no está en el
            paso de documentos KYB (`kyb_step_mismatch`, con `next_step`
            indicando el paso en el que está).
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
                    description: Mensaje de error legible.
                  code:
                    type: string
                  next_step:
                    type: string
              example:
                detail: The session is not on the step this operation completes.
                code: kyb_step_mismatch
                next_step: KYB_REGISTRY
        '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.upload_kyb_documents(
                "33333333-4444-5555-6666-777777777777",
                documents=[open("document.pdf", "rb")],
            )
            print(result)
        - lang: javascript
          label: Node.js
          source: >-
            import Didit, { fileFromPath } from "@didit-protocol/sdk-node";


            // Reads DIDIT_API_KEY.

            const didit = new Didit();


            const result = await
            didit.sessions.uploadKybDocuments("33333333-4444-5555-6666-777777777777",
            {
              documents: [await fileFromPath("document.pdf")],
            });

            console.log(result);
        - lang: go
          label: Go
          source: "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Sessions.UploadKYBDocuments(ctx, \"33333333-4444-5555-6666-777777777777\", didit.SessionsUploadKYBDocumentsParams{\n\tDocuments: []didit.File{didit.FileFromPath(\"document.pdf\")},\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
        - lang: java
          label: Java
          source: >-
            import java.nio.file.Path;

            import java.util.List;

            import me.didit.Didit;

            import me.didit.types.SessionsUploadKybDocumentsParams;


            // Reads DIDIT_API_KEY.

            Didit client = new Didit();


            var result =
            client.sessions().uploadKybDocuments("33333333-4444-5555-6666-777777777777",
            SessionsUploadKybDocumentsParams.builder()
                    .documents(List.of(Path.of("document.pdf")))
                    .build());
            System.out.println(result);
        - lang: php
          label: PHP
          source: >-
            <?php


            require 'vendor/autoload.php';


            use Didit\DiditClient;

            use Didit\File;


            // Reads DIDIT_API_KEY.

            $didit = new DiditClient();


            $result =
            $didit->sessions->uploadKybDocuments('33333333-4444-5555-6666-777777777777',
            [
                'documents' => [File::fromPath('document.pdf')],
            ]);

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

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

            result = didit.sessions.upload_kyb_documents(
              "33333333-4444-5555-6666-777777777777",
              documents: [Pathname("document.pdf")]
            )
            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.UploadKybDocumentsAsync("33333333-4444-5555-6666-777777777777",
            new SessionsUploadKybDocumentsParams

            {
                Documents = new FileUpload[] { FileUpload.FromPath("document.pdf") },
            });

            Console.WriteLine(JsonSerializer.Serialize(result));
components:
  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.