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

# Caricare documenti KYB tramite API

> Carica documenti aziendali in una sessione di Verifica aziendale (KYB) dal tuo server, con OCR e controlli della pipeline ospitata di Didit.



## OpenAPI

````yaml it/openapi-25.json POST /v3/session/{sessionId}/kyb/documents/
openapi: 3.0.0
info:
  version: 3.0.0
  title: Didit Verification API
  description: API di verifica dell'identità. Autenticati con l'intestazione x-api-key.
servers:
  - url: https://verification.didit.me
security: []
tags: []
paths:
  /v3/session/{sessionId}/kyb/documents/:
    post:
      tags:
        - Sessions
      summary: Carica i documenti KYB in una sessione
      description: >-
        Carica uno o più documenti aziendali (atto costitutivo, libro dei soci,
        certificato di costituzione, ...) nel passaggio Documenti KYB di una
        sessione di Verifica aziendale (KYB), dal tuo server invece che dalla
        pagina ospitata. Didit esegue la pipeline ospitata: compressione, OCR,
        controlli di manomissione e di corrispondenza tra documenti,
        raggruppamento dei documenti e fa avanzare la sessione quando i gruppi
        di documenti richiesti sono soddisfatti. Il passaggio ha un costo fisso
        forfettario, indipendentemente dal numero di file inviati. La sessione
        deve essere aperta e trovarsi nel passaggio Documenti KYB, e l'azienda
        scelta nel passaggio del registro delle imprese deve esistere. Leggi le
        persone nominate nei documenti con `GET
        /v3/session/{sessionId}/kyb/extracted-parties/`. Richiede
        `write:businesses`.
      operationId: post_v3_session_kyb_documents
      parameters:
        - name: sessionId
          in: path
          required: true
          description: >-
            UUID della sessione di Verifica aziendale (KYB). Deve appartenere
            all'applicazione della chiave API.
          schema:
            type: string
            format: uuid
            example: 33333333-4444-5555-6666-777777777777
        - name: node_id
          in: query
          required: false
          description: >-
            Nodo del workflow del passaggio KYB. Necessario solo quando il
            workflow contiene più di un nodo KYB; per impostazione predefinita
            Didit utilizza il nodo della sessione stessa.
          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: >-
                    File da caricare: JPG, JPEG, PNG, TIFF, WEBP, PDF o archivi
                    ZIP contenenti questi formati. PDF fino a 50 MB, foto fino a
                    6 MB prima della compressione.
                document_passwords:
                  type: array
                  items:
                    type: string
                  description: >-
                    Una voce per ciascun file in `documents`, nello stesso
                    ordine: la password di un PDF protetto, vuota per qualsiasi
                    altro file.
                document_group:
                  type: string
                  enum:
                    - LEGAL_PRESENCE
                    - COMPANY_DETAILS
                    - OWNERSHIP_STRUCTURE
                    - REPRESENTATIVES_AUTHORIZATION
                  description: >-
                    Gruppo di documenti richiesto a cui risponde questo
                    caricamento.
                locale:
                  type: string
                  maxLength: 10
                  description: >-
                    Locale utilizzato per tradurre la risposta del passaggio
                    successivo.
      responses:
        '200':
          description: >-
            Documenti elaborati. Quando ogni gruppo obbligatorio è soddisfatto,
            la sessione avanza e `next_step` indica il passaggio successivo;
            altrimenti rimane nel passaggio Documenti e `document_groups` e
            `document_answer` indicano cosa manca ancora.
          content:
            application/json:
              schema:
                type: object
                properties:
                  valid:
                    type: boolean
                  next_step:
                    type: string
                    nullable: true
                    description: Passaggio in cui si trova la sessione dopo il caricamento.
                  kyb_status:
                    type: string
                    description: Stato del controllo aziendale.
                  document_answer:
                    type: object
                    additionalProperties: true
                    description: >-
                      Risultato per ciascun documento caricato e caricamenti
                      rimanenti.
                additionalProperties: true
              example:
                valid: true
                next_step: KYB_KEY_PEOPLE
                kyb_status: In Progress
        '400':
          description: >-
            Un documento è stato rifiutato (manomesso, illeggibile o non
            supportato) oppure la sessione non ha ancora un'azienda KYB. Riprova
            con un altro file finché restano tentativi disponibili.
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
                    description: Messaggio di errore di facile lettura.
              example:
                message: No KYB company found. Submit company data first.
        '401':
          description: >-
            La chiave API con ambito è scaduta. Questo è l'unico caso che
            restituisce `401`: una chiave mancante, non valida o revocata
            restituisce `403`.
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
                    description: Messaggio di errore di facile lettura.
              examples:
                Expired key:
                  summary: La data di scadenza della chiave è stata superata
                  value:
                    detail: This API key has expired.
        '402':
          description: >-
            L'organizzazione non ha più credito residuo per il passaggio dei
            documenti.
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
                    description: Messaggio di errore di facile lettura.
              example:
                detail: Insufficient credits.
        '403':
          description: >-
            Errore di autenticazione o autorizzazione. Una chiave mancante
            restituisce `403`, così come la chiave di un'altra applicazione, una
            chiave con ambito limitato priva dell'autorizzazione necessaria per
            questo endpoint e una richiesta proveniente dall'esterno
            dell'allowlist IP della chiave; una chiave errata, revocata o
            scaduta restituisce `401`. Distinguili tramite `detail`.
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
                    description: Messaggio di errore di facile lettura.
              examples:
                Missing or invalid credentials:
                  summary: >-
                    Nessuna intestazione x-api-key, oppure validazione della
                    chiave non riuscita
                  value:
                    detail: >-
                      Authentication credentials were not provided or are
                      invalid.
                Other application:
                  summary: >-
                    Una chiave valida appartenente a un'applicazione diversa da
                    quella della sessione
                  value:
                    detail: You do not have permission to perform this action.
                Scoped key without decisions write:
                  summary: 'La chiave con ambito non dispone di decisions: write'
                  value:
                    detail: This API key has no write access to decisions.
                IP not allowed:
                  summary: >-
                    Richiesta proveniente da un indirizzo esterno all'allowlist
                    degli IP della chiave
                  value:
                    detail: This API key can't be used from this IP address.
        '404':
          description: >-
            La sessione non esiste, è stata eliminata, appartiene a un'altra
            applicazione o non rientra nei limiti di una chiave con ambito
            limitato; nessun dettaglio li distingue.
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
                    description: Messaggio di errore di facile lettura.
              example:
                detail: Session not found.
        '409':
          description: >-
            La sessione è terminata (`kyb_session_not_writable`) o non si trova
            nel passaggio Documenti KYB (`kyb_step_mismatch`, con `next_step`
            che indica il passaggio in cui si trova).
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
                    description: Messaggio di errore di facile lettura.
                  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: >-
            Limite di frequenza superato: 300 richieste di scrittura (POST,
            PATCH, DELETE) al minuto per chiave API. Attendi i secondi indicati
            in `Retry-After` prima di riprovare; le intestazioni `X-RateLimit-*`
            indicano il budget.
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
                    description: Messaggio di errore di facile lettura.
              examples:
                Rate limited:
                  summary: Budget per il minuto corrente esaurito
                  value:
                    detail: >-
                      Write request rate limit exceeded. You can make up to 300
                      requests per minute.
          headers:
            Retry-After:
              description: Secondi da attendere prima di effettuare un nuovo tentativo.
              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: >-
        Al momento sono in fase di elaborazione troppi documenti, pertanto
        questo caricamento non è stato elaborato: non è stato memorizzato nulla
        e non è stato utilizzato alcun tentativo. Invia nuovamente lo stesso
        file dopo il numero di secondi indicato in `Retry-After`. Basa la logica
        su `code`, non sul testo del messaggio.
      headers:
        Retry-After:
          description: >-
            Secondi da attendere prima di inviare nuovamente la stessa
            richiesta.
          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 chiave API della tua applicazione, da Developers -> API keys nella
        Business Console. La chiave primaria ha accesso completo. Una chiave con
        nome può avere un ambito definito: nessuno, lettura o scrittura per
        risorsa, limitata ad alcuni workflow o a sessioni approvate, a un elenco
        di indirizzi IP e a una data di scadenza. 401 indica che la chiave è
        errata, revocata o scaduta; 403 indica che non è stata inviata alcuna
        chiave, che la chiave non ha accesso a questa risorsa o azione, oppure
        che la richiesta proviene da un indirizzo non incluso nel suo elenco IP;
        404 su una route di sessione indica che la sessione non rientra nei
        workflow o negli stati previsti dalla chiave. Una chiave senza accesso
        ai media riceve gli URL di immagini, video e PDF come null, e una chiave
        senza permessi di scrittura sulle sessioni riceve link e token di
        sessione come null. Consulta https://docs.didit.me/console/api-keys.

````

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