> ## 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 Unggah Dokumen KYB

> Unggah dokumen perusahaan ke sesi Verifikasi Bisnis dari server Anda sendiri, dengan OCR dan pemeriksaan pipeline hosted Didit.



## OpenAPI

````yaml id/openapi-25.json POST /v3/session/{sessionId}/kyb/documents/
openapi: 3.0.0
info:
  version: 3.0.0
  title: Didit Verification API
  description: API Verifikasi Identitas. Lakukan autentikasi dengan header x-api-key.
servers:
  - url: https://verification.didit.me
security: []
tags: []
paths:
  /v3/session/{sessionId}/kyb/documents/:
    post:
      tags:
        - Sessions
      summary: Unggah dokumen KYB ke sesi
      description: >-
        Unggah satu atau beberapa dokumen perusahaan (anggaran dasar, daftar
        pemegang saham, akta pendirian, ...) ke langkah Dokumen KYB pada sesi
        Verifikasi Bisnis, dari server Anda sendiri alih-alih halaman yang
        di-hosting. Didit menjalankan alur pemrosesan yang di-hosting: kompresi,
        OCR, pemeriksaan manipulasi dan lintas dokumen, pengelompokan dokumen,
        serta melanjutkan sesi ketika grup dokumen yang diperlukan telah
        terpenuhi. Langkah ini dikenai satu biaya tetap berapa pun jumlah file
        yang Anda kirim. Sesi harus terbuka dan berada pada langkah Dokumen KYB,
        dan perusahaan yang dipilih pada langkah registri harus ada. Baca
        pihak-pihak yang disebutkan dalam dokumen dengan `GET
        /v3/session/{sessionId}/kyb/extracted-parties/`. Memerlukan
        `write:businesses`.
      operationId: post_v3_session_kyb_documents
      parameters:
        - name: sessionId
          in: path
          required: true
          description: >-
            UUID dari sesi Verifikasi Bisnis (KYB). UUID ini harus dimiliki oleh
            aplikasi yang terkait dengan kunci API.
          schema:
            type: string
            format: uuid
            example: 33333333-4444-5555-6666-777777777777
        - name: node_id
          in: query
          required: false
          description: >-
            Node alur kerja dari langkah KYB. Hanya diperlukan jika alur kerja
            memiliki lebih dari satu node KYB; secara default Didit menggunakan
            node milik sesi itu sendiri.
          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 yang akan diunggah: JPG, JPEG, PNG, TIFF, WEBP, PDF,
                    atau arsip ZIP yang berisi file-file tersebut. PDF hingga 50
                    MB, foto hingga 6 MB sebelum kompresi.
                document_passwords:
                  type: array
                  items:
                    type: string
                  description: >-
                    Satu entri per file di `documents`, dalam urutan yang sama:
                    kata sandi PDF yang diproteksi, kosong untuk file lainnya.
                document_group:
                  type: string
                  enum:
                    - LEGAL_PRESENCE
                    - COMPANY_DETAILS
                    - OWNERSHIP_STRUCTURE
                    - REPRESENTATIVES_AUTHORIZATION
                  description: Grup dokumen wajib yang dipenuhi oleh unggahan ini.
                locale:
                  type: string
                  maxLength: 10
                  description: >-
                    Lokal yang digunakan untuk menerjemahkan respons langkah
                    berikutnya.
      responses:
        '200':
          description: >-
            Dokumen diproses. Saat setiap grup yang diwajibkan terpenuhi, sesi
            berlanjut dan `next_step` menyebutkan langkah berikutnya; jika
            tidak, sesi tetap berada pada langkah Dokumen serta
            `document_groups` dan `document_answer` menyatakan apa yang masih
            kurang.
          content:
            application/json:
              schema:
                type: object
                properties:
                  valid:
                    type: boolean
                  next_step:
                    type: string
                    nullable: true
                    description: Langkah yang sedang dijalani sesi setelah pengunggahan.
                  kyb_status:
                    type: string
                    description: Status pemeriksaan perusahaan.
                  document_answer:
                    type: object
                    additionalProperties: true
                    description: Hasil per dokumen yang diunggah dan sisa unggahan.
                additionalProperties: true
              example:
                valid: true
                next_step: KYB_KEY_PEOPLE
                kyb_status: In Progress
        '400':
          description: >-
            Dokumen ditolak (manipulasi, tidak terbaca, atau tidak didukung)
            atau sesi belum memiliki perusahaan KYB. Coba lagi dengan file lain
            selama kesempatan mencoba masih ada.
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
                    description: Pesan kesalahan yang mudah dibaca manusia.
              example:
                message: No KYB company found. Submit company data first.
        '401':
          description: >-
            Kunci API dengan cakupan terbatas telah kedaluwarsa. Ini
            satu-satunya kasus yang mengembalikan `401`: kunci yang hilang,
            tidak valid, atau dicabut mengembalikan `403`.
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
                    description: Pesan kesalahan yang mudah dibaca manusia.
              examples:
                Expired key:
                  summary: Tanggal kedaluwarsa kunci telah lewat
                  value:
                    detail: This API key has expired.
        '402':
          description: Organisasi tidak memiliki sisa kredit untuk langkah dokumen.
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
                    description: Pesan kesalahan yang mudah dibaca manusia.
              example:
                detail: Insufficient credits.
        '403':
          description: >-
            Kegagalan autentikasi atau otorisasi. Kunci yang hilang
            mengembalikan `403`, begitu juga dengan kunci dari aplikasi lain,
            kunci dengan cakupan tanpa izin yang dibutuhkan endpoint ini, dan
            permintaan dari luar daftar izin IP kunci tersebut; kunci yang
            salah, dicabut, atau kedaluwarsa mengembalikan `401`. Bedakan
            kegagalan tersebut berdasarkan `detail`.
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
                    description: Pesan kesalahan yang mudah dibaca manusia.
              examples:
                Missing or invalid credentials:
                  summary: Tidak ada header x-api-key, atau kunci gagal divalidasi
                  value:
                    detail: >-
                      Authentication credentials were not provided or are
                      invalid.
                Other application:
                  summary: Kunci valid milik aplikasi yang berbeda dari sesi
                  value:
                    detail: You do not have permission to perform this action.
                Scoped key without decisions write:
                  summary: 'Kunci ber-scope tidak memiliki decisions: write'
                  value:
                    detail: This API key has no write access to decisions.
                IP not allowed:
                  summary: Permintaan dari luar daftar izin IP kunci
                  value:
                    detail: This API key can't be used from this IP address.
        '404':
          description: >-
            Sesi tidak ada, telah dihapus, milik aplikasi lain, atau berada di
            luar batas kunci dengan cakupan terbatas; tidak ada detail yang
            membedakannya.
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
                    description: Pesan kesalahan yang mudah dibaca manusia.
              example:
                detail: Session not found.
        '409':
          description: >-
            Sesi telah selesai (`kyb_session_not_writable`) atau tidak berada
            pada langkah Dokumen KYB (`kyb_step_mismatch`, dengan `next_step`
            menyebutkan langkah tempat sesi tersebut berada).
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
                    description: Pesan kesalahan yang mudah dibaca manusia.
                  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: >-
            Batas laju terlampaui: 300 permintaan penulisan (POST, PATCH,
            DELETE) per menit per kunci API. Tunggu selama `Retry-After` detik
            sebelum mencoba lagi; header `X-RateLimit-*` menunjukkan anggaran
            tersebut.
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
                    description: Pesan kesalahan yang mudah dibaca manusia.
              examples:
                Rate limited:
                  summary: Anggaran untuk menit saat ini habis
                  value:
                    detail: >-
                      Write request rate limit exceeded. You can make up to 300
                      requests per minute.
          headers:
            Retry-After:
              description: Detik untuk menunggu sebelum mencoba lagi.
              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: >-
        Terlalu banyak dokumen yang sedang diproses saat ini, sehingga unggahan
        ini tidak diproses: tidak ada yang disimpan dan tidak ada percobaan yang
        terpakai. Kirim kembali file yang sama setelah menunggu selama jumlah
        detik yang tercantum dalam `Retry-After`. Lakukan percabangan
        berdasarkan `code`, bukan pada teks pesan.
      headers:
        Retry-After:
          description: >-
            Jumlah detik yang harus ditunggu sebelum mengirimkan permintaan yang
            sama lagi.
          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: >-
        Kunci API aplikasi Anda, dari Developers -> API keys di Business
        Console. Kunci utama memiliki akses penuh. Kunci bernama dapat diberi
        cakupan: none, read, atau write per sumber daya, dibatasi pada beberapa
        alur kerja atau pada sesi yang disetujui, pada daftar alamat IP, dan
        pada tanggal kedaluwarsa. 401 berarti kuncinya salah, dicabut, atau
        kedaluwarsa; 403 berarti tidak ada kunci yang dikirimkan, kunci tidak
        memiliki akses ke sumber daya atau tindakan ini, atau permintaan datang
        dari alamat di luar daftar IP-nya; 404 pada rute sesi berarti sesi
        berada di luar alur kerja atau status kunci tersebut. Kunci tanpa akses
        media menerima URL gambar, video, dan PDF sebagai null, dan kunci tanpa
        izin tulis sesi menerima tautan sesi dan token sebagai null. Lihat
        https://docs.didit.me/console/api-keys.

````

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