> ## 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 Buat Draf Pihak Kunci KYB

> Tambahkan orang atau perusahaan ke daftar pihak kunci sesi Verifikasi Bisnis (KYB) di Didit tanpa langsung mendeklarasikannya.



## OpenAPI

````yaml id/openapi-25.json POST /v3/session/{sessionId}/kyb/parties/drafts/
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/parties/drafts/:
    post:
      tags:
        - Sessions
      summary: Buat draf pihak KYB
      description: >-
        Tambahkan pihak (individu atau perusahaan) ke daftar yang sedang Anda
        siapkan untuk sesi KYB ini. Kolom dan aturan yang sama seperti layar
        Pihak Kunci yang di-hosting berlaku: individu memerlukan `full_name`
        atau `first_name` dan `last_name`, setidaknya satu peran, dan
        kewarganegaraan; perusahaan memerlukan `company_name` dan negara
        pendirian di `nationality`. Tidak ada yang dideklarasikan atau
        ditagihkan hingga `POST /v3/session/{sessionId}/kyb/parties/submit/`.
        Memerlukan `write:businesses`.
      operationId: post_v3_session_kyb_party_drafts
      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:
          application/json:
            schema:
              type: object
              required:
                - entity_type
                - nationality
              properties:
                entity_type:
                  type: string
                  enum:
                    - person
                    - company
                  description: Apakah pihak tersebut adalah individu atau perusahaan.
                full_name:
                  type: string
                  maxLength: 255
                  description: >-
                    Nama lengkap seseorang. Kirimkan ini, atau `first_name` dan
                    `last_name`.
                first_name:
                  type: string
                  maxLength: 128
                last_name:
                  type: string
                  maxLength: 128
                role:
                  type: string
                  enum:
                    - director
                    - non_executive_director
                    - secretary
                    - chairman
                    - ubo
                    - shareholder
                    - representative
                    - founder
                    - legal_advisor
                    - authorized_signatory
                    - trustee
                    - beneficiary
                    - settlor
                    - protector
                    - company_officer
                    - investor
                    - other
                  description: >-
                    Peran yang dipegang oleh pihak terkait. Dapat dipertukarkan
                    dengan `roles`; saat keduanya dikirim, keduanya digabungkan.
                roles:
                  type: array
                  items:
                    type: string
                    enum:
                      - director
                      - non_executive_director
                      - secretary
                      - chairman
                      - ubo
                      - shareholder
                      - representative
                      - founder
                      - legal_advisor
                      - authorized_signatory
                      - trustee
                      - beneficiary
                      - settlor
                      - protector
                      - company_officer
                      - investor
                      - other
                  description: >-
                    Setiap peran yang dipegang pihak tersebut. Seseorang
                    memerlukan setidaknya satu peran (di sini atau di `role`).
                position:
                  type: string
                  maxLength: 128
                  description: Jabatan seseorang.
                date_of_birth:
                  type: string
                  format: date
                  nullable: true
                company_name:
                  type: string
                  maxLength: 255
                  description: >-
                    Nama pihak perusahaan. Wajib jika `entity_type` bernilai
                    `company`.
                registration_number:
                  type: string
                  maxLength: 100
                  description: Nomor registrasi dari pihak perusahaan.
                email:
                  type: string
                  format: email
                  description: >-
                    Tujuan pengiriman tautan verifikasi. Wajib diisi jika pihak
                    tersebut harus menyelesaikan verifikasi, yang bergantung
                    pada pengaturan peran dan ambang batas kepemilikan alur
                    kerja.
                ownership_percent:
                  type: number
                  nullable: true
                  description: Porsi kepemilikan pihak tersebut di dalam perusahaan.
                nationality:
                  type: string
                  maxLength: 100
                  description: >-
                    Kewarganegaraan seseorang, atau negara pendirian perusahaan.
                    Wajib untuk setiap pihak.
                phone_number:
                  type: string
                  maxLength: 32
                custom_fields:
                  type: object
                  additionalProperties: true
                  description: Kolom tambahan yang ditentukan alur kerja.
                skip_verification:
                  type: boolean
                  default: false
                  description: >-
                    Minta untuk melewati verifikasi pihak ini. Hanya dipenuhi
                    jika peran pihak tersebut mengizinkan pelewatan dalam
                    pengaturan Pihak Kunci alur kerja.
            example:
              entity_type: person
              first_name: Ana
              last_name: Lopez
              roles:
                - ubo
                - director
              ownership_percent: 60
              nationality: MEX
              email: ana.lopez@example.com
              date_of_birth: '1984-06-12'
      responses:
        '201':
          description: Draf berhasil dibuat.
          content:
            application/json:
              schema:
                type: object
                required:
                  - draft_id
                  - created_at
                  - updated_at
                  - party
                properties:
                  draft_id:
                    type: string
                    format: uuid
                  created_at:
                    type: string
                    format: date-time
                  updated_at:
                    type: string
                    format: date-time
                  party:
                    type: object
                    required:
                      - entity_type
                      - nationality
                    properties:
                      entity_type:
                        type: string
                        enum:
                          - person
                          - company
                        description: Apakah pihak tersebut adalah individu atau perusahaan.
                      full_name:
                        type: string
                        maxLength: 255
                        description: >-
                          Nama lengkap seseorang. Kirimkan ini, atau
                          `first_name` dan `last_name`.
                      first_name:
                        type: string
                        maxLength: 128
                      last_name:
                        type: string
                        maxLength: 128
                      role:
                        type: string
                        enum:
                          - director
                          - non_executive_director
                          - secretary
                          - chairman
                          - ubo
                          - shareholder
                          - representative
                          - founder
                          - legal_advisor
                          - authorized_signatory
                          - trustee
                          - beneficiary
                          - settlor
                          - protector
                          - company_officer
                          - investor
                          - other
                        description: >-
                          Peran yang dipegang oleh pihak terkait. Dapat
                          dipertukarkan dengan `roles`; saat keduanya dikirim,
                          keduanya digabungkan.
                      roles:
                        type: array
                        items:
                          type: string
                          enum:
                            - director
                            - non_executive_director
                            - secretary
                            - chairman
                            - ubo
                            - shareholder
                            - representative
                            - founder
                            - legal_advisor
                            - authorized_signatory
                            - trustee
                            - beneficiary
                            - settlor
                            - protector
                            - company_officer
                            - investor
                            - other
                        description: >-
                          Setiap peran yang dipegang pihak tersebut. Seseorang
                          memerlukan setidaknya satu peran (di sini atau di
                          `role`).
                      position:
                        type: string
                        maxLength: 128
                        description: Jabatan seseorang.
                      date_of_birth:
                        type: string
                        format: date
                        nullable: true
                      company_name:
                        type: string
                        maxLength: 255
                        description: >-
                          Nama pihak perusahaan. Wajib jika `entity_type`
                          bernilai `company`.
                      registration_number:
                        type: string
                        maxLength: 100
                        description: Nomor registrasi dari pihak perusahaan.
                      email:
                        type: string
                        format: email
                        description: >-
                          Tujuan pengiriman tautan verifikasi. Wajib diisi jika
                          pihak tersebut harus menyelesaikan verifikasi, yang
                          bergantung pada pengaturan peran dan ambang batas
                          kepemilikan alur kerja.
                      ownership_percent:
                        type: number
                        nullable: true
                        description: Porsi kepemilikan pihak tersebut di dalam perusahaan.
                      nationality:
                        type: string
                        maxLength: 100
                        description: >-
                          Kewarganegaraan seseorang, atau negara pendirian
                          perusahaan. Wajib untuk setiap pihak.
                      phone_number:
                        type: string
                        maxLength: 32
                      custom_fields:
                        type: object
                        additionalProperties: true
                        description: Kolom tambahan yang ditentukan alur kerja.
                      skip_verification:
                        type: boolean
                        default: false
                        description: >-
                          Minta untuk melewati verifikasi pihak ini. Hanya
                          dipenuhi jika peran pihak tersebut mengizinkan
                          pelewatan dalam pengaturan Pihak Kunci alur kerja.
              example:
                draft_id: 5b0d7a52-9d3e-4f0c-8c6a-0e5f3a1b2c4d
                created_at: '2026-10-31T10:00:00Z'
                updated_at: '2026-10-31T10:00:00Z'
                party:
                  entity_type: person
                  first_name: Ana
                  last_name: Lopez
                  roles:
                    - ubo
                    - director
                  ownership_percent: 60
                  nationality: MEX
                  email: ana.lopez@example.com
                  date_of_birth: '1984-06-12'
        '400':
          description: Kolom pihak tidak valid atau kolom wajib tidak ada.
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
                    description: Pesan kesalahan yang mudah dibaca manusia.
              example:
                non_field_errors:
                  - Person parties require at least one role.
        '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.
        '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`).
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
                    description: Pesan kesalahan yang mudah dibaca manusia.
                  code:
                    type: string
              example:
                detail: This verification session is no longer accepting changes.
                code: kyb_session_not_writable
        '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
      security:
        - ApiKeyAuth: []
      x-codeSamples:
        - lang: python
          label: Python
          source: |-
            from didit import Didit

            # Reads DIDIT_API_KEY.
            client = Didit()

            result = client.sessions.create_kyb_party_draft(
                "33333333-4444-5555-6666-777777777777",
                entity_type="person",
                first_name="Ana",
                last_name="Lopez",
                roles=["ubo", "director"],
                date_of_birth="1984-06-12",
                email="ana.lopez@example.com",
                ownership_percent=60.0,
                nationality="MEX",
            )
            print(result)
        - lang: javascript
          label: Node.js
          source: >-
            import Didit from "@didit-protocol/sdk-node";


            // Reads DIDIT_API_KEY.

            const didit = new Didit();


            const result = await
            didit.sessions.createKybPartyDraft("33333333-4444-5555-6666-777777777777",
            {
              entity_type: "person",
              first_name: "Ana",
              last_name: "Lopez",
              roles: ["ubo", "director"],
              date_of_birth: "1984-06-12",
              email: "ana.lopez@example.com",
              ownership_percent: 60.0,
              nationality: "MEX",
            });

            console.log(result);
        - lang: go
          label: Go
          source: "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Sessions.CreateKYBPartyDraft(ctx, \"33333333-4444-5555-6666-777777777777\", didit.SessionsCreateKYBPartyDraftParams{\n\tEntityType:       \"person\",\n\tFirstName:        didit.String(\"Ana\"),\n\tLastName:         didit.String(\"Lopez\"),\n\tRoles:            didit.Some([]didit.SessionsCreateKYBPartyDraftParamsRoles{\"ubo\", \"director\"}),\n\tDateOfBirth:      didit.String(\"1984-06-12\"),\n\tEmail:            didit.String(\"ana.lopez@example.com\"),\n\tOwnershipPercent: didit.Float(60.0),\n\tNationality:      \"MEX\",\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
        - lang: java
          label: Java
          source: >-
            import java.time.LocalDate;

            import java.util.List;

            import me.didit.Didit;

            import me.didit.types.SessionsCreateKybPartyDraftParams;


            // Reads DIDIT_API_KEY.

            Didit client = new Didit();


            var result =
            client.sessions().createKybPartyDraft("33333333-4444-5555-6666-777777777777",
            SessionsCreateKybPartyDraftParams.builder()
                    .entityType(SessionsCreateKybPartyDraftParams.EntityType.of("person"))
                    .firstName("Ana")
                    .lastName("Lopez")
                    .roles(List.of(SessionsCreateKybPartyDraftParams.Roles.of("ubo"), SessionsCreateKybPartyDraftParams.Roles.of("director")))
                    .dateOfBirth(LocalDate.parse("1984-06-12"))
                    .email("ana.lopez@example.com")
                    .ownershipPercent(60.0)
                    .nationality("MEX")
                    .build());
            System.out.println(result);
        - lang: php
          label: PHP
          source: >-
            <?php


            require 'vendor/autoload.php';


            use Didit\DiditClient;


            // Reads DIDIT_API_KEY.

            $didit = new DiditClient();


            $result =
            $didit->sessions->createKybPartyDraft('33333333-4444-5555-6666-777777777777',
            [
                'entity_type' => 'person',
                'first_name' => 'Ana',
                'last_name' => 'Lopez',
                'roles' => ['ubo', 'director'],
                'date_of_birth' => '1984-06-12',
                'email' => 'ana.lopez@example.com',
                'ownership_percent' => 60.0,
                'nationality' => 'MEX',
            ]);

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

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

            result = didit.sessions.create_kyb_party_draft(
              "33333333-4444-5555-6666-777777777777",
              entity_type: "person",
              first_name: "Ana",
              last_name: "Lopez",
              roles: ["ubo", "director"],
              date_of_birth: "1984-06-12",
              email: "ana.lopez@example.com",
              ownership_percent: 60.0,
              nationality: "MEX"
            )
            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.CreateKybPartyDraftAsync("33333333-4444-5555-6666-777777777777",
            new SessionsCreateKybPartyDraftParams

            {
                EntityType = "person",
                FirstName = "Ana",
                LastName = "Lopez",
                Roles = new SessionsCreateKybPartyDraftParamsRoles[] { "ubo", "director" },
                DateOfBirth = "1984-06-12",
                Email = "ana.lopez@example.com",
                OwnershipPercent = 60.0,
                Nationality = "MEX",
            });

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