> ## 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-Dokumente hochladen API

> Laden Sie Unternehmensdokumente per API in eine KYB-Sitzung hoch, mit OCR und Prüfungen der Didit-Pipeline – direkt von Ihrem Server.



## OpenAPI

````yaml de/openapi-25.json POST /v3/session/{sessionId}/kyb/documents/
openapi: 3.0.0
info:
  version: 3.0.0
  title: Didit Verification API
  description: API für Ausweisverifizierung. Authentifizierung über den x-api-key-Header.
servers:
  - url: https://verification.didit.me
security: []
tags: []
paths:
  /v3/session/{sessionId}/kyb/documents/:
    post:
      tags:
        - Sessions
      summary: KYB-Dokumente zu einer Sitzung hochladen
      description: >-
        Ein oder mehrere Unternehmensdokumente (Satzung, Gesellschafterliste,
        Handelsregisterauszug, ...) für den Schritt „KYB-Dokumente“ einer
        Sitzung zur Unternehmensverifizierung (KYB) hochladen, und zwar direkt
        von Ihrem eigenen Server statt über die gehostete Seite. Didit führt die
        gehostete Pipeline aus: Komprimierung, OCR, Prüfungen auf Manipulation
        und dokumentenübergreifende Abgleiche sowie Dokumentgruppierung; die
        Sitzung wird fortgeführt, sobald die erforderlichen Dokumentgruppen
        erfüllt sind. Für diesen Schritt fällt unabhängig von der Anzahl der
        gesendeten Dateien eine Pauschalgebühr an. Die Sitzung muss geöffnet
        sein und sich im Schritt „KYB-Dokumente“ befinden, und das im
        Registerschritt ausgewählte Unternehmen muss existieren. Rufen Sie die
        in den Dokumenten genannten Personen mit `GET
        /v3/session/{sessionId}/kyb/extracted-parties/` ab. Erfordert
        `write:businesses`.
      operationId: post_v3_session_kyb_documents
      parameters:
        - name: sessionId
          in: path
          required: true
          description: >-
            UUID der Sitzung zur Unternehmensverifizierung (KYB). Sie muss zu
            der Anwendung des API-Schlüssels gehören.
          schema:
            type: string
            format: uuid
            example: 33333333-4444-5555-6666-777777777777
        - name: node_id
          in: query
          required: false
          description: >-
            Workflow-Knoten des KYB-Schritts. Nur erforderlich, wenn der
            Workflow mehr als einen KYB-Knoten enthält; standardmäßig verwendet
            Didit den sitzungseigenen Knoten.
          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: >-
                    Hochzuladende Dateien: JPG, JPEG, PNG, TIFF, WEBP, PDF oder
                    ZIP-Archive dieser Dateien. PDFs bis zu 50 MB, Fotos bis zu
                    6 MB vor der Komprimierung.
                document_passwords:
                  type: array
                  items:
                    type: string
                  description: >-
                    Ein Eintrag pro Datei in `documents`, in derselben
                    Reihenfolge: das Passwort eines geschützten PDFs, leer bei
                    jeder anderen Datei.
                document_group:
                  type: string
                  enum:
                    - LEGAL_PRESENCE
                    - COMPANY_DETAILS
                    - OWNERSHIP_STRUCTURE
                    - REPRESENTATIVES_AUTHORIZATION
                  description: >-
                    Erforderliche Dokumentengruppe, auf die dieser Upload
                    antwortet.
                locale:
                  type: string
                  maxLength: 10
                  description: >-
                    Gebietsschema zur Übersetzung der Antwort des nächsten
                    Schritts.
      responses:
        '200':
          description: >-
            Dokumente verarbeitet. Wenn jede erforderliche Gruppe erfüllt ist,
            schreitet die Sitzung voran und `next_step` benennt den nächsten
            Schritt; andernfalls verbleibt sie beim Schritt Documents und
            `document_groups` sowie `document_answer` geben an, was noch fehlt.
          content:
            application/json:
              schema:
                type: object
                properties:
                  valid:
                    type: boolean
                  next_step:
                    type: string
                    nullable: true
                    description: Schritt, in dem sich die Sitzung nach dem Upload befindet.
                  kyb_status:
                    type: string
                    description: Status der Unternehmensprüfung.
                  document_answer:
                    type: object
                    additionalProperties: true
                    description: >-
                      Ergebnis pro hochgeladenem Dokument und verbleibende
                      Uploads.
                additionalProperties: true
              example:
                valid: true
                next_step: KYB_KEY_PEOPLE
                kyb_status: In Progress
        '400':
          description: >-
            Ein Dokument wurde abgelehnt (Manipulation, unlesbar oder nicht
            unterstützt) oder die Sitzung hat noch kein KYB-Unternehmen.
            Wiederholen Sie den Vorgang mit einer anderen Datei, solange noch
            Versuche verbleiben.
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
                    description: Lesbare Fehlermeldung.
              example:
                message: No KYB company found. Submit company data first.
        '401':
          description: >-
            Der API-Schlüssel mit eingeschränktem Geltungsbereich ist
            abgelaufen. Dies ist der einzige Fall, der `401` zurückgibt: Ein
            fehlender, ungültiger oder widerrufener Schlüssel gibt `403` zurück.
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
                    description: Lesbare Fehlermeldung.
              examples:
                Expired key:
                  summary: Das Ablaufdatum des Schlüssels ist überschritten
                  value:
                    detail: This API key has expired.
        '402':
          description: >-
            Die Organisation hat keinen Credit mehr für den Dokumentenschritt
            übrig.
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
                    description: Lesbare Fehlermeldung.
              example:
                detail: Insufficient credits.
        '403':
          description: >-
            Authentifizierungs- oder Autorisierungsfehler. Ein fehlender
            Schlüssel gibt `403` zurück, ebenso wie der Schlüssel einer anderen
            Anwendung, ein berechtigungsbeschränkter Schlüssel ohne die für
            diesen Endpoint erforderliche Berechtigung sowie eine Anfrage von
            außerhalb der IP-Allowlist des Schlüssels; ein falscher,
            widerrufener oder abgelaufener Schlüssel gibt `401` zurück.
            Unterscheiden Sie diese anhand von `detail`.
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
                    description: Lesbare Fehlermeldung.
              examples:
                Missing or invalid credentials:
                  summary: >-
                    Kein x-api-key-Header vorhanden oder die Validierung des
                    Schlüssels ist fehlgeschlagen
                  value:
                    detail: >-
                      Authentication credentials were not provided or are
                      invalid.
                Other application:
                  summary: >-
                    Ein gültiger Schlüssel, der zu einer anderen Anwendung als
                    die Sitzung gehört
                  value:
                    detail: You do not have permission to perform this action.
                Scoped key without decisions write:
                  summary: >-
                    Dem Schlüssel mit eingeschränktem Berechtigungsumfang fehlt
                    decisions: write
                  value:
                    detail: This API key has no write access to decisions.
                IP not allowed:
                  summary: Anfrage von außerhalb der IP-Allowlist des Schlüssels
                  value:
                    detail: This API key can't be used from this IP address.
        '404':
          description: >-
            Die Sitzung existiert nicht, wurde gelöscht, gehört zu einer anderen
            Anwendung oder liegt außerhalb der Beschränkungen eines Scoped Keys;
            kein Detail unterscheidet diese Fälle.
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
                    description: Lesbare Fehlermeldung.
              example:
                detail: Session not found.
        '409':
          description: >-
            Die Sitzung ist abgeschlossen (`kyb_session_not_writable`) oder
            befindet sich nicht im Schritt für KYB-Dokumente
            (`kyb_step_mismatch`, wobei `next_step` den aktuellen Schritt
            angibt).
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
                    description: Lesbare Fehlermeldung.
                  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: >-
            Rate-Limit überschritten: 300 Schreibanfragen (POST, PATCH, DELETE)
            pro Minute pro API-Schlüssel. Warten Sie `Retry-After` Sekunden vor
            einem Wiederholungsversuch; die `X-RateLimit-*`-Header zeigen das
            Budget an.
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
                    description: Lesbare Fehlermeldung.
              examples:
                Rate limited:
                  summary: Budget für die aktuelle Minute erschöpft
                  value:
                    detail: >-
                      Write request rate limit exceeded. You can make up to 300
                      requests per minute.
          headers:
            Retry-After:
              description: >-
                Sekunden, die vor einem Wiederholungsversuch gewartet werden
                müssen.
              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: >-
        Zurzeit werden zu viele Dokumente verarbeitet, daher wurde dieser Upload
        nicht verarbeitet: Es wurde nichts gespeichert und kein Versuch
        verbraucht. Senden Sie dieselbe Datei nach der in `Retry-After`
        angegebenen Anzahl an Sekunden erneut. Verzweigen Sie anhand von `code`,
        nicht anhand des Nachrichtentexts.
      headers:
        Retry-After:
          description: >-
            Sekunden, die gewartet werden müssen, bevor dieselbe Anfrage erneut
            gesendet wird.
          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: >-
        Der API-Schlüssel Ihrer Anwendung, aus Entwickler -> API-Schlüssel in
        der Business Console. Der Primärschlüssel hat Vollzugriff. Ein benannter
        Schlüssel kann im Geltungsbereich eingeschränkt werden: keine, Lese-
        oder Schreibberechtigung pro Ressource, beschränkt auf bestimmte
        Workflows oder genehmigte Sitzungen, auf eine Liste von IP-Adressen und
        auf ein Ablaufdatum. 401 bedeutet, dass der Schlüssel falsch, widerrufen
        oder abgelaufen ist; 403 bedeutet, dass kein Schlüssel gesendet wurde,
        der Schlüssel keinen Zugriff auf diese Ressource oder Aktion hat oder
        die Anfrage von einer Adresse außerhalb seiner IP-Liste stammte; 404 bei
        einer Sitzungsroute bedeutet, dass die Sitzung außerhalb der Workflows
        oder Status des Schlüssels liegt. Ein Schlüssel ohne Medienzugriff
        erhält Bild-, Video- und PDF-URLs als null, und ein Schlüssel ohne
        Schreibberechtigung für Sitzungen erhält Sitzungslinks und Token als
        null. Siehe https://docs.didit.me/console/api-keys.

````

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