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

# Pujar documents KYB amb l'API

> Puja documents corporatius a una sessió KYB des del teu servidor, amb l'OCR i les comprovacions del pipeline allotjat de Didit.



## OpenAPI

````yaml ca/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ó d'identitat. Autentica't amb la capçalera x-api-key.
servers:
  - url: https://verification.didit.me
security: []
tags: []
paths:
  /v3/session/{sessionId}/kyb/documents/:
    post:
      tags:
        - Sessions
      summary: Puja documents de KYB a una sessió
      description: >-
        Puja un o més documents corporatius (escriptures de constitució,
        registre d'accionistes, certificat de constitució, ...) al pas de
        Documents de KYB d'una sessió de Verificació d'empreses (KYB), des del
        teu propi servidor en lloc de la pàgina allotjada. Didit executa el
        procés allotjat: compressió, OCR, comprovacions de manipulació i
        creuades entre documents, agrupació de documents, i fa avançar la sessió
        quan se satisfan els grups de documents requerits. El pas té una tarifa
        fixa única independentment de quants fitxers enviïs. La sessió ha
        d'estar oberta i en el pas de Documents de KYB, i l'empresa seleccionada
        en el pas de registre ha d'existir. Consulta les persones que anomenen
        els documents amb `GET /v3/session/{sessionId}/kyb/extracted-parties/`.
        Requereix `write:businesses`.
      operationId: post_v3_session_kyb_documents
      parameters:
        - name: sessionId
          in: path
          required: true
          description: >-
            UUID de la sessió de Verificació d'empreses (KYB). Ha de pertànyer a
            l'aplicació de la clau d'API.
          schema:
            type: string
            format: uuid
            example: 33333333-4444-5555-6666-777777777777
        - name: node_id
          in: query
          required: false
          description: >-
            Node del flux de treball del pas de KYB. Només cal quan el flux de
            treball té més d'un node de KYB; per defecte, Didit utilitza el node
            propi de la sessió.
          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: >-
                    Fitxers per penjar: JPG, JPEG, PNG, TIFF, WEBP, PDF o arxius
                    ZIP que en continguin. PDF de fins a 50 MB, fotos de fins a
                    6 MB abans de la compressió.
                document_passwords:
                  type: array
                  items:
                    type: string
                  description: >-
                    Una entrada per fitxer a `documents`, en el mateix ordre: la
                    contrasenya d'un PDF protegit, buit per a qualsevol altre
                    fitxer.
                document_group:
                  type: string
                  enum:
                    - LEGAL_PRESENCE
                    - COMPANY_DETAILS
                    - OWNERSHIP_STRUCTURE
                    - REPRESENTATIVES_AUTHORIZATION
                  description: Grup de documents obligatori al qual respon aquesta càrrega.
                locale:
                  type: string
                  maxLength: 10
                  description: >-
                    Configuració regional utilitzada per traduir la resposta del
                    pas següent.
      responses:
        '200':
          description: >-
            Documents processats. Quan es compleix cada grup requerit, la sessió
            avança i `next_step` indica el pas següent; en cas contrari, roman
            al pas de Documents i `document_groups` i `document_answer` indiquen
            què falta encara.
          content:
            application/json:
              schema:
                type: object
                properties:
                  valid:
                    type: boolean
                  next_step:
                    type: string
                    nullable: true
                    description: Pas en què es troba la sessió després de la càrrega.
                  kyb_status:
                    type: string
                    description: Estat de la comprovació de l'empresa.
                  document_answer:
                    type: object
                    additionalProperties: true
                    description: Resultat per document pujat i les càrregues restants.
                additionalProperties: true
              example:
                valid: true
                next_step: KYB_KEY_PEOPLE
                kyb_status: In Progress
        '400':
          description: >-
            S'ha rebutjat un document (manipulació, il·legible o no admès) o la
            sessió encara no té cap empresa de KYB. Reintenta-ho amb un altre
            fitxer mentre quedin intents.
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
                    description: Missatge d'error fàcil de llegir.
              example:
                message: No KYB company found. Submit company data first.
        '401':
          description: >-
            La clau d'API amb abast ha caducat. Aquest és l'únic cas que retorna
            `401`: una clau absent, no vàlida o revocada retorna `403`.
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
                    description: Missatge d'error fàcil de llegir.
              examples:
                Expired key:
                  summary: La data de caducitat de la clau ha passat
                  value:
                    detail: This API key has expired.
        '402':
          description: L'organització no té prou crèdit per al pas de documents.
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
                    description: Missatge d'error fàcil de llegir.
              example:
                detail: Insufficient credits.
        '403':
          description: >-
            Fallada d'autenticació o d'autorització. Si falta la clau es retorna
            `403`, igual que amb una clau d'una altra aplicació, una clau amb
            àmbit sense el permís que necessita aquest endpoint o una
            sol·licitud des de fora de la llista d'adreces IP permeses de la
            clau; una clau incorrecta, revocada o caducada retorna `401`.
            Distingeix-les pel camp `detail`.
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
                    description: Missatge d'error fàcil de llegir.
              examples:
                Missing or invalid credentials:
                  summary: >-
                    Falta la capçalera x-api-key, o la clau ha fallat la
                    validació
                  value:
                    detail: >-
                      Authentication credentials were not provided or are
                      invalid.
                Other application:
                  summary: >-
                    Una clau vàlida que pertany a una aplicació diferent de la
                    de la sessió
                  value:
                    detail: You do not have permission to perform this action.
                Scoped key without decisions write:
                  summary: >-
                    A la clau amb abast li manca el permís d'escriptura de
                    decisions
                  value:
                    detail: This API key has no write access to decisions.
                IP not allowed:
                  summary: >-
                    Sol·licitud des de fora de la llista d'adreces IP permeses
                    de la clau
                  value:
                    detail: This API key can't be used from this IP address.
        '404':
          description: >-
            La sessió no existeix, s'ha suprimit, pertany a una altra aplicació
            o queda fora dels límits d'una clau amb abast limitat; cap detall no
            permet distingir entre aquests casos.
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
                    description: Missatge d'error fàcil de llegir.
              example:
                detail: Session not found.
        '409':
          description: >-
            La sessió ha finalitzat (`kyb_session_not_writable`) o no es troba
            al pas KYB Documents (`kyb_step_mismatch`, amb `next_step` indicant
            el pas en què es troba).
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
                    description: Missatge d'error fàcil de llegir.
                  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: >-
            S'ha superat el límit de freqüència: 300 sol·licituds d'escriptura
            (POST, PATCH, DELETE) per minut per clau d'API. Espera els segons
            indicats a `Retry-After` abans de reintentar; les capçaleres
            `X-RateLimit-*` mostren el pressupost restant.
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
                    description: Missatge d'error fàcil de llegir.
              examples:
                Rate limited:
                  summary: Pressupost per al minut actual esgotat
                  value:
                    detail: >-
                      Write request rate limit exceeded. You can make up to 300
                      requests per minute.
          headers:
            Retry-After:
              description: Segons que cal esperar abans de reintentar.
              schema:
                type: integer
                minimum: 1
                example: 30
        '503':
          $ref: '#/components/responses/DocumentProcessingBusy'
      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:
  responses:
    DocumentProcessingBusy:
      description: >-
        Ara mateix s'estan processant massa documents, de manera que aquesta
        càrrega no s'ha processat: no s'ha emmagatzemat res i no s'ha consumit
        cap intent. Torna a enviar el mateix fitxer després del nombre de segons
        indicat a `Retry-After`. Bifurca segons `code`, no segons el text del
        missatge.
      headers:
        Retry-After:
          description: >-
            Nombre de segons que cal esperar abans de tornar a enviar la mateixa
            sol·licitud.
          schema:
            type: integer
            example: 10
      content:
        application/json:
          schema:
            type: object
            required:
              - detail
              - code
            properties:
              detail:
                type: string
              code:
                type: string
                enum:
                  - document_processing_busy
          example:
            detail: We are busy processing documents. Please try again in a moment.
            code: document_processing_busy
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: x-api-key
      description: >-
        La clau d'API de la teva aplicació, des de Developers -> API keys a la
        Business Console. La clau primària té accés complet. Una clau amb nom
        pot tenir l'abast limitat: cap, lectura o escriptura per recurs,
        limitada a determinats fluxos de treball o a sessions aprovades, a una
        llista d'adreces IP i a una data de caducitat. 401 significa que la clau
        és incorrecta, revocada o caducada; 403 significa que no s'ha enviat cap
        clau, que la clau no té accés a aquest recurs o acció, o que la
        sol·licitud prové d'una adreça fora de la seva llista d'IP; 404 en una
        ruta de sessió significa que la sessió està fora dels fluxos de treball
        o estats de la clau. Una clau sense accés a fitxers multimèdia rep els
        URL d'imatge, vídeo i PDF com a null, i una clau sense permís
        d'escriptura de sessions rep els enllaços de sessió i els tokens com a
        null. Consulta https://docs.didit.me/console/api-keys.

````

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