> ## 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 Generate PDF: Laporan Kepatuhan KYC & KYB

> GET /v3/session/{id}/generate-pdf/ untuk mengunduh laporan kepatuhan KYC atau KYB ber-branding dari Didit. White Label, siap audit, harga per penggunaan.



Prompt Pembuatan PDF
        Salin prompt ke papan klip



      
      

\<pre>

\`Download an audit-ready PDF report for a finished Didit verification session.

Endpoint:
GET https://verification.didit.me/v3/session/{session_id}/generate-pdf/

Authentication:
Use the x-api-key header with your Didit API key (or a user-auth token). Privilege: read:sessions.

Path parameter:
\- session_id (UUID) — works for both User Verification (KYC) and Business Verification (KYB) sessions. Didit routes to the correct template automatically.

Prerequisites:
\- Session status must be one of "Approved", "Declined", "In Review". Any other status returns 403.
\- Session must belong to the authenticated application — cross-application reads return 404.

curl example — save the PDF to disk:
curl https://verification.didit.me/v3/session/<SESSION_ID>/generate-pdf/ \
-H "x-api-key: <API_KEY>" \
-o report.pdf

Response:
\- Body is binary (application/pdf). DO NOT parse as JSON.
\- Content-Type: application/pdf
\- Content-Disposition: attachment; filename=session_<session_id>.pdf for KYC sessions, business_<session_id>.pdf for KYB sessions.
\- Typical wall time ~1-3s (server-side WeasyPrint rendering).

Template contents:
\- KYC PDF: Identity (OCR), Liveness, Face Match, AML, POA, IP analysis, reviews, events.
\- KYB PDF: Company registry data, officers, beneficial owners (UBOs), KYB documents, AML hits, questionnaires, phone verification, email verification, IP analysis, reviews, events.

White-label:
If white-label customization is enabled on your application, the PDF uses your logo and privacy-policy URL. Configure at Console → Customization.

Failure modes:
\- 401 — invalid credentials.
\- 403 — { "detail": "You do not have permission to perform this action." } when the key lacks read:sessions OR when the session is in a non-printable status (Not Started, In Progress, Expired, Abandoned, Kyc Expired, Resubmitted, Awaiting User).
\- 404 — { "detail": "Not found." } when the session is not visible to this application.

Idempotency & cost:
Safe to retry — generation is read-only. Counts against the standard rate limit.

When to call:
\- Compliance archives (regulator submissions, internal audit binders).
\- Customer support replies (proof of decision for a specific session).
\- After approve / decline via /sessions-api/update-status — render and store the resulting PDF.
\- For every session of one user in a single file, use GET /v3/users/{vendor_data}/generate-pdf/ instead (see /management-api/users/generate-pdf).

For end-to-end Didit integration, paste in the full prompt at /integration/integration-prompt.`

\</pre>



      
      

Tempel ke

## Dukungan KYC dan KYBBerlaku untuk sesi **Verifikasi Pengguna (KYC)** dan **Verifikasi Bisnis (KYB)**. Didit secara otomatis mengarahkan ke templat PDF yang sesuai:- Sesi Verifikasi Pengguna (KYC) → laporan dengan bagian verifikasi identitas, Deteksi Liveness, pencocokan wajah, AML, dan POA.
- Sesi Verifikasi Bisnis (KYB) → laporan dengan bagian registri perusahaan, pihak kunci (UBO/pejabat), dokumen, AML, kuesioner, telepon, email, dan analisis IP jika fitur tersebut termasuk dalam alur kerja.Keduanya menggunakan alur pembuatan PDF yang sama dan mendukung kustomisasi White Label (logo, URL kebijakan privasi).## Konvensi nama file| Jenis | Nama file |
| - | - |
| Pengguna | `session_<session_id>.pdf` |
| Bisnis | `business_<session_id>.pdf` |Dikembalikan melalui header `Content-Disposition: attachment; filename=...`.## Persyaratan statusSesi harus berada di `APPROVED`, `DECLINED`, atau `IN_REVIEW` agar PDF dapat dibuat. Sesi yang sedang berjalan atau belum dimulai akan mengembalikan `403`.## Contoh> [tab] PDF Verifikasi Pengguna (KYC)
>
> ```bash theme={null}
> curl https://verification.didit.me/v3/session/4c5c7f3a-.../generate-pdf/ \
>   -H "x-api-key: YOUR_API_KEY" \
>   -o kyc-report.pdf
> ```> [tab] PDF Verifikasi Bisnis (KYB)
>
> ```bash theme={null}
> curl https://verification.didit.me/v3/session/bs-01HJX1.../generate-pdf/ \
>   -H "x-api-key: YOUR_API_KEY" \
>   -o kyb-report.pdf
> ```## White LabelKetika aplikasi memiliki kustomisasi White Label yang aktif, PDF akan menggunakan logo dan URL kebijakan privasi Anda. Atur di *Console → Customization*.## IzinMemerlukan `read:sessions`. Cakupan yang sama berlaku untuk kedua jenis.## Terkait- [Ikhtisar sesi](https://docs.didit.me/id/sessions-api/overview.md)
- [Ambil sesi](https://docs.didit.me/id/sessions-api/retrieve-session.md): versi JSON dari keputusan yang sama
- [Unduh PDF riwayat pengguna](https://docs.didit.me/id/management-api/users/generate-pdf.md): setiap sesi yang dapat dilaporkan dari satu pengguna dalam satu file
- [Skema respons KYB](https://docs.didit.me/id/business-verification/response-schema.md): kolom yang disertakan dalam PDF bisnis


## OpenAPI

````yaml id/openapi-25.json GET /v3/session/{sessionId}/generate-pdf/
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}/generate-pdf/:
    get:
      tags:
        - Sessions
      summary: Unduh laporan PDF untuk sesi verifikasi
      description: >-
        Render dan unduh laporan PDF siap kepatuhan untuk sesi verifikasi yang
        telah selesai. Jalur yang sama melayani sesi Verifikasi Pengguna (KYC)
        dan Verifikasi Bisnis (KYB) — server mencocokkan `sessionId` terhadap
        kedua jenis sesi dan memilih templat laporan yang sesuai.


        **Status yang memenuhi syarat.** Sesi harus sudah memiliki status final
        atau yang dapat ditinjau:


        - Sesi KYC: `Approved`, `Declined`, `In Review`, atau `Kyc Expired`.

        - Sesi KYB: `Approved`, `Declined`, atau `In Review`.


        Status lainnya (`Not Started`, `In Progress`, `Expired`, `Abandoned`, …)
        mengembalikan `403` dengan string `detail` penjelas — lihat respons
        `403` di bawah.


        **Isi laporan.** PDF mencerminkan tampilan sesi konsol pada saat
        permintaan dibuat:


        - **KYC** — status sesi yang diagregasi, daftar peringatan, dan satu
        bagian per fitur yang dijalankan: Verifikasi Identitas (gambar dokumen
        beserta kolom yang diekstraksi), NFC, Deteksi Liveness, Pencocokan
        Wajah, Verifikasi Email, Verifikasi Telepon, Bukti Alamat, jawaban
        Kuesioner, Validasi Database, Skrining AML, dan Analisis IP — diikuti
        oleh tag sesi, aktivitas peninjauan konsol (komentar dan perubahan
        status), serta linimasa peristiwa sesi.

        - **KYB** — pemeriksaan registri (data perusahaan), skrining AML,
        verifikasi dokumen bisnis, pemeriksaan pihak kunci, tanggapan kuesioner,
        verifikasi telepon/email, analisis IP, dan linimasa peristiwa sesi,
        diikuti oleh tag dan aktivitas peninjauan.


        **Branding.** Jika aplikasi Anda memiliki kustomisasi White Label,
        laporan akan dirender dengan logo Anda dan tautan ke URL kebijakan
        privasi Anda; jika tidak, laporan akan menggunakan branding Didit.
        Laporan dirender dalam bahasa Inggris — tidak ada parameter bahasa.


        **Tanpa penyimpanan cache.** Setiap panggilan merender ulang PDF dari
        data sesi saat ini, sehingga laporan yang dibuat setelah peninjauan
        manual mencerminkan keputusan peninjau. Dua panggilan untuk sesi yang
        sama dapat menghasilkan file dengan byte yang berbeda — arsipkan file
        yang diunduh jika Anda memerlukan salinan yang tidak dapat diubah
        (immutable).


        **Latensi.** Proses render mengunduh setiap gambar yang disimpan (sisi
        dokumen, swafoto, file tambahan) sebelum menyusun PDF, sehingga sesi
        dengan banyak media dapat memakan waktu beberapa detik. Gunakan batas
        waktu baca klien yang longgar (disarankan 60 dtk) dan alirkan isi
        respons ke disk.


        **Garis miring penutup.** Rute kanonis diakhiri dengan garis miring
        penutup (`…/generate-pdf/`). Permintaan tanpanya akan dilayani langsung
        dengan respons yang sama — tidak ada pengalihan `301`, sehingga klien
        tidak perlu mengikuti pengalihan dan `curl` tidak memerlukan `-L`.
        Gunakan URL dengan garis miring seperti pada contoh.


        Jika Anda memerlukan data yang mendasari dalam format JSON alih-alih
        laporan yang dirender, gunakan `GET /v3/session/{sessionId}/decision/`.
        Untuk semua sesi yang dapat dilaporkan dari satu pengguna dalam satu
        dokumen tunggal, gunakan `GET /v3/users/{vendor_data}/generate-pdf/`.
      operationId: get_v3_session_generate_pdf
      parameters:
        - name: sessionId
          in: path
          required: true
          description: >-
            UUID dari sesi Verifikasi Pengguna (KYC) atau Verifikasi Bisnis
            (KYB) yang akan dirender — `session_id` yang dikembalikan oleh `POST
            /v3/session/`. Path yang sama berlaku untuk kedua jenis sesi;
            gunakan nama file `Content-Disposition` pada respons untuk
            mengetahui jenis laporan yang Anda terima.


            **Harus berupa UUID huruf kecil dengan format yang benar.** Rute ini
            hanya cocok dengan UUID yang valid, sehingga nilai yang salah format
            akan ditolak oleh router URL sebelum kode aplikasi apa pun berjalan
            dan responsnya adalah halaman **HTML** `404`, bukan envelope JSON
            `{"detail": ...}` yang ditunjukkan di bawah ini. Pengonversi UUID
            rute hanya cocok dengan bentuk huruf kecil kanonikal — UUID
            heksadesimal huruf besar akan ditolak dengan HTML 404.
          schema:
            type: string
            format: uuid
            example: 11111111-2222-3333-4444-555555555555
      responses:
        '200':
          description: >-
            Dokumen PDF hasil render, dikembalikan langsung sebagai biner
            `application/pdf` — tidak ada pembungkus JSON dan tidak ada
            pengalihan URL unduhan. Isi dimulai dengan magic bytes `%PDF` (PDF
            1.7). Simpan ke file `.pdf` atau alirkan langsung ke pemanggil Anda.
          headers:
            Content-Disposition:
              description: >-
                `attachment; filename=session_{sessionId}.pdf` untuk sesi KYC,
                `attachment; filename=business_{sessionId}.pdf` untuk sesi KYB —
                prefiks memberi tahu Anda templat laporan mana yang dirender.
              schema:
                type: string
                example: >-
                  attachment;
                  filename=session_11111111-2222-3333-4444-555555555555.pdf
            Content-Length:
              description: >-
                Ukuran total PDF dalam byte; badan respons tidak dibagi menjadi
                beberapa chunk.
              schema:
                type: integer
                example: 25191
          content:
            application/pdf:
              schema:
                type: string
                format: binary
        '403':
          description: >-
            Kegagalan autentikasi, otorisasi, atau status sesi. Kunci yang
            hilang mengembalikan `403`; kunci yang salah, dicabut, atau
            kedaluwarsa mengembalikan `401`. Bedakan jenis kegagalan berdasarkan
            string `detail`:


            - `"Authentication credentials were not provided or are invalid."` —
            tidak ada header `x-api-key` (dan tidak ada token `Authorization:
            Bearer`), atau kredensial yang diberikan gagal diintrospeksi
            (dicabut, kedaluwarsa, atau format salah).

            - `"You do not have permission to perform this action."` —
            kredensial valid tetapi tidak dapat membaca sesi ini: token Bearer
            pengguna konsol tidak memiliki izin `read:sessions` atau tidak dapat
            mengakses aplikasi pemilik, atau kunci API milik organisasi yang
            berbeda dari sesi tersebut.

            - `"You can only generate a PDF for sessions in review, declined,
            approved or kyc expired"` — sesi KYC ada tetapi belum berada dalam
            status yang memenuhi syarat (misalnya `Not Started` atau `In
            Progress`). Tunggu webhook `status.updated` sebelum meminta laporan.

            - `"You can only generate a PDF for sessions in review, declined or
            approved"` — kondisi yang sama untuk sesi KYB.


            Perhatikan bahwa untuk `sessionId` yang sama sekali tidak dikenal,
            endpoint akan mencari aplikasi pemilik sebelum memvalidasi
            kredensial, sehingga sesi yang tidak ditemukan mengembalikan `404`
            bahkan ketika kredensial tidak ada atau tidak valid.
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
                    example: >-
                      You can only generate a PDF for sessions in review,
                      declined, approved or kyc expired
              examples:
                Missing or invalid credentials:
                  summary: Tidak ada header x-api-key, atau kunci gagal diintrospeksi
                  value:
                    detail: >-
                      Authentication credentials were not provided or are
                      invalid.
                Insufficient permissions:
                  summary: >-
                    Kredensial valid yang tidak memiliki read:sessions atau
                    akses ke aplikasi pemilik
                  value:
                    detail: You do not have permission to perform this action.
                KYC session not finished:
                  summary: Sesi KYC masih Belum Dimulai / Sedang Berlangsung
                  value:
                    detail: >-
                      You can only generate a PDF for sessions in review,
                      declined, approved or kyc expired
                KYB session not finished:
                  summary: Sesi KYB masih Belum Dimulai / Sedang Berlangsung
                  value:
                    detail: >-
                      You can only generate a PDF for sessions in review,
                      declined or approved
        '404':
          description: >-
            Tidak ada sesi aktif dengan `sessionId` ini — sesi tidak pernah
            dibuat, atau telah dihapus. Resolusi pemilik dilakukan sebelum
            validasi kredensial, sehingga `404` ini tetap dikembalikan bahkan
            untuk permintaan tanpa autentikasi. Bergantung pada pencarian mana
            yang tidak menemukan hasil, string `detail` adalah `"Not found."`
            (kasus umum) atau `"Session not found."`.
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
                    example: Not found.
              examples:
                Unknown session:
                  summary: sessionId tidak cocok dengan sesi KYC atau KYB apa pun
                  value:
                    detail: Not found.
                Recently deleted session:
                  summary: Sesi telah dihapus di antara pencarian
                  value:
                    detail: Session not found.
        '429':
          description: >-
            Batas laju terlampaui. Pembuatan PDF memiliki batas khusus sebesar
            **50 permintaan per menit per kredensial** (kunci API, token Bearer,
            atau IP sumber saat tidak terautentikasi), selain batas GET global
            600/menit. Tunggu selama `Retry-After` detik (juga tercermin dalam
            header `X-RateLimit-*`), lalu coba lagi. Laporan tidak di-cache di
            sisi server, jadi unduh setiap laporan satu kali dan simpan filenya
            alih-alih mengambilnya kembali.
          headers:
            Retry-After:
              description: >-
                Detik yang harus ditunggu sebelum mencoba lagi mengirimkan
                permintaan.
              schema:
                type: integer
                minimum: 1
                example: 30
            X-RateLimit-Limit:
              description: >-
                Jumlah maksimum pembuatan PDF yang diizinkan dalam jendela saat
                ini (50).
              schema:
                type: integer
                example: 50
            X-RateLimit-Remaining:
              description: Permintaan yang tersisa dalam jendela saat ini.
              schema:
                type: integer
                example: 0
            X-RateLimit-Reset:
              description: Timestamp Unix (detik) saat jendela saat ini direset.
              schema:
                type: integer
                example: 1750000000
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
                    description: >-
                      Penjelasan pelanggaran batas laju yang mudah dibaca
                      manusia.
                    example: >-
                      Session PDF generation rate limit exceeded. You can make
                      up to 50 requests per minute.
              examples:
                Throttled:
                  summary: >-
                    Lebih dari 50 pembuatan PDF dalam satu menit dari kredensial
                    yang sama
                  value:
                    detail: >-
                      Session PDF generation rate limit exceeded. You can make
                      up to 50 requests per minute.
      security:
        - ApiKeyAuth: []
      x-codeSamples:
        - lang: curl
          label: cURL
          source: |-
            curl --fail \
              https://verification.didit.me/v3/session/11111111-2222-3333-4444-555555555555/generate-pdf/ \
              -H 'x-api-key: YOUR_API_KEY' \
              --output report.pdf
        - lang: python
          label: Python
          source: |-
            from didit import Didit

            # Reads DIDIT_API_KEY.
            client = Didit()

            content = client.sessions.generate_pdf(
                "11111111-2222-3333-4444-555555555555",
            )
            with open("download.pdf", "wb") as file:
                file.write(content)
        - lang: javascript
          label: Node.js
          source: >-
            import { writeFile } from "node:fs/promises";

            import Didit from "@didit-protocol/sdk-node";


            // Reads DIDIT_API_KEY.

            const didit = new Didit();


            const content = await
            didit.sessions.generatePdf("11111111-2222-3333-4444-555555555555");

            await writeFile("download.pdf", Buffer.from(await
            content.arrayBuffer()));
        - lang: go
          label: Go
          source: "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresp, err := client.Sessions.GeneratePDF(ctx, \"11111111-2222-3333-4444-555555555555\")\nif err != nil {\n\tlog.Fatal(err)\n}\ndefer resp.Body.Close()\nfile, err := os.Create(\"download.pdf\")\nif err != nil {\n\tlog.Fatal(err)\n}\ndefer file.Close()\nif _, err := io.Copy(file, resp.Body); err != nil {\n\tlog.Fatal(err)\n}"
        - lang: java
          label: Java
          source: >-
            import java.nio.file.Path;

            import me.didit.Didit;


            // Reads DIDIT_API_KEY.

            Didit client = new Didit();


            client.sessions().generatePdf("11111111-2222-3333-4444-555555555555")
                    .writeTo(Path.of("download.pdf"));
        - lang: php
          label: PHP
          source: >-
            <?php


            require 'vendor/autoload.php';


            use Didit\DiditClient;


            // Reads DIDIT_API_KEY.

            $didit = new DiditClient();


            $content =
            $didit->sessions->generatePdf('11111111-2222-3333-4444-555555555555');

            $content->saveTo('download.pdf');
        - lang: ruby
          label: Ruby
          source: >-
            require "didit"


            # Reads DIDIT_API_KEY.

            didit = Didit::Client.new


            content =
            didit.sessions.generate_pdf("11111111-2222-3333-4444-555555555555")

            File.binwrite("download.pdf", content)
        - lang: csharp
          label: .NET
          source: >-
            using System;

            using Didit;


            // Reads DIDIT_API_KEY.

            using var client = new DiditClient();


            var content = await
            client.Sessions.GeneratePdfAsync("11111111-2222-3333-4444-555555555555");

            await content.SaveToAsync("download.pdf");
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.