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

# واجهة إنشاء PDF: تقارير امتثال KYC وKYB

> GET /v3/session/{id}/generate-pdf/ لتنزيل تقارير امتثال بعلامتك التجارية لجلسات KYC أو KYB. علامة بيضاء، جاهزة للتدقيق، وتسعير حسب الاستخدام - من Didit.



توليد مطالبة PDF
        نسخ الموجّه إلى الحافظة



      
      

\<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>



      
      

الصق في

## دعم KYC وKYBيعمل هذا مع جلسات **التحقق من المستخدمين (KYC)** و**التحقق من الشركات (KYB)**. يوجّه Didit الجلسة تلقائياً إلى قالب PDF المناسب:- جلسة **التحقق من المستخدمين (KYC)** ← تقرير يتضمن أقسام التحقق من الهوية، وكشف الحيوية، ومطابقة الوجه، وAML، وإثبات العنوان.
- جلسة **التحقق من الشركات (KYB)** ← تقرير يتضمن أقسام سجل الشركات، والأشخاص الرئيسيين (UBOs والمسؤولين)، والمستندات، وAML، والاستبيان، والهاتف، والبريد الإلكتروني، وتحليل عنوان IP، وذلك عندما تكون هذه الميزات جزءاً من سير العمل.يستخدم الاثنان مسار إنشاء PDF نفسه، ويدعمان تخصيص العلامة البيضاء (الشعار ورابط سياسة الخصوصية).## اصطلاح اسم الملف| النوع | اسم الملف |
| - | - |
| المستخدم | `session_<session_id>.pdf` |
| الشركة | `business_<session_id>.pdf` |يُعاد الملف عبر الرأس `Content-Disposition: attachment; filename=...`.## متطلب الحالةيجب أن تكون الجلسة في حالة `APPROVED` أو `DECLINED` أو `IN_REVIEW` لإنشاء ملف PDF. الجلسات قيد التنفيذ أو التي لم تبدأ بعد تُعيد `403`.## أمثلة> [tab] ملف PDF للتحقق من المستخدمين (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 للتحقق من الشركات (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
> ```## العلامة البيضاءعند تفعيل تخصيص العلامة البيضاء للتطبيق، يستخدم ملف PDF شعارك ورابط سياسة الخصوصية الخاص بك. يُضبط ذلك من *Console → Customization*.## الإذنيتطلب `read:sessions`. النطاق نفسه لكلا النوعين.## مواضيع ذات صلة- [نظرة عامة على الجلسات](https://docs.didit.me/ar/sessions-api/overview.md)
- [استرجاع الجلسة](https://docs.didit.me/ar/sessions-api/retrieve-session.md)، وهي نسخة JSON من القرار نفسه
- [تنزيل PDF لسجل المستخدم](https://docs.didit.me/ar/management-api/users/generate-pdf.md)، وهو جميع الجلسات القابلة للإدراج في التقرير لمستخدم واحد في ملف واحد
- [مخطط استجابة KYB](https://docs.didit.me/ar/business-verification/response-schema.md)، أي الحقول المضمّنة في ملفات PDF للشركات


## OpenAPI

````yaml ar/openapi-25.json GET /v3/session/{sessionId}/generate-pdf/
openapi: 3.0.0
info:
  version: 3.0.0
  title: Didit Verification API
  description: API التحقق من الهوية. قم بالمصادقة باستخدام الرأس x-api-key.
servers:
  - url: https://verification.didit.me
security: []
tags: []
paths:
  /v3/session/{sessionId}/generate-pdf/:
    get:
      tags:
        - Sessions
      summary: تنزيل تقرير PDF لجلسة التحقق
      description: >-
        عرض وتنزيل تقرير PDF جاهز للامتثال لجلسة تحقق مكتملة. يخدم نفس المسار
        كلاً من جلسات التحقق من المستخدمين (KYC) والتحقق من الشركات (KYB) —
        يُطابق الخادم `sessionId` مع كلا نوعي الجلسات ويختار قالب التقرير
        المناسب.


        **الحالات المؤهلة.** يجب أن تحمل الجلسة بالفعل حالة نهائية أو قابلة
        للمراجعة:


        - جلسات KYC: `Approved`، أو `Declined`، أو `In Review`، أو `Kyc
        Expired`.

        - جلسات KYB: `Approved`، أو `Declined`، أو `In Review`.


        تُرجع أي حالة أخرى (`Not Started`، أو `In Progress`، أو `Expired`، أو
        `Abandoned`، …) رمز `403` مع نص `detail` توضيحي — انظر استجابة `403`
        أدناه.


        **ما يحتويه التقرير.** يعكس ملف PDF عرض الجلسة في لوحة التحكم في لحظة
        الطلب:


        - **KYC** — حالة الجلسة الإجمالية، وقائمة التحذيرات، وقسم واحد لكل ميزة
        تم تنفيذها: التحقق من الهوية (صور المستندات بالإضافة إلى الحقول
        المستخرجة)، وNFC، وكشف الحيوية، ومطابقة الوجه، والتحقق من البريد
        الإلكتروني، والتحقق من رقم الهاتف، وإثبات العنوان، وإجابات الاستبيانات،
        والتحقق من قواعد البيانات، وفحص AML، وتحليل عنوان IP — متبوعاً بوسوم
        الجلسة، ونشاط المراجعة في لوحة التحكم (التعليقات وتغييرات الحالة)،
        والجدول الزمني لأحداث الجلسة.

        - **KYB** — عمليات التحقق من السجل (بيانات الشركة)، وفحوصات AML، والتحقق
        من مستندات الشركة، وفحوصات الأشخاص الرئيسيين، والردود على الاستبيانات،
        والتحقق من رقم الهاتف/البريد الإلكتروني، وتحليلات عنوان IP، والجدول
        الزمني لأحداث الجلسة، متبوعة بالوسوم ونشاط المراجعة.


        **العلامة التجارية.** إذا كان تطبيقك يتضمن تخصيص العلامة البيضاء، فسيتم
        إنشاء التقرير مع شعارك وروابط إلى عنوان URL لسياسة الخصوصية الخاصة بك؛
        وإلا فإنه يحمل العلامة التجارية لـ Didit. يتم إنشاء التقارير باللغة
        الإنجليزية — لا يوجد معامل للغة.


        **عدم التخزين المؤقت.** يُعيد كل استدعاء إنشاء ملف PDF من بيانات الجلسة
        الحالية، لذلك يعكس التقرير الذي تم إنشاؤه بعد مراجعة يدوية قرار
        المراجِع. يمكن أن ينتج عن استدعاءين لنفس الجلسة ملفان مختلفان من حيث
        البايتات — احتفظ بنسخة من الملف المُنزّل إذا كنت بحاجة إلى نسخة غير
        قابلة للتغيير.


        **زمن الاستجابة.** تقوم عملية العرض بتنزيل كل صورة مخزنة (أوجه
        المستندات، وصور السيلفي، والملفات الإضافية) قبل تكوين ملف PDF، لذا قد
        تستغرق الجلسات كثيفة الوسائط عدة ثوانٍ. استخدم مهلة قراءة سخية في العميل
        (يوصى بـ 60 ثانية) وقم بدفق محتوى الاستجابة مباشرة إلى القرص.


        **الشرطة المائلة في النهاية.** ينتهي المسار القياسي بشرطة مائلة في
        النهاية (`…/generate-pdf/`). يتم تقديم الطلب بدونها مباشرة مع نفس
        الاستجابة — لا توجد إعادة توجيه `301`، لذا لا يتعين على أي عميل اتباع
        عمليات إعادة التوجيه ولا يحتاج `curl` إلى `-L`. استخدم عنوان URL المزود
        بشرطة مائلة كما هو موضح في الأمثلة.


        إذا كنت بحاجة إلى البيانات الأساسية بتنسيق JSON بدلاً من تقرير تم
        إنشاؤه، فاستخدم `GET /v3/session/{sessionId}/decision/`. للحصول على جميع
        جلسات مستخدم واحد التي يمكن إعداد تقارير عنها في مستند واحد، استخدم `GET
        /v3/users/{vendor_data}/generate-pdf/`.
      operationId: get_v3_session_generate_pdf
      parameters:
        - name: sessionId
          in: path
          required: true
          description: >-
            معرّف UUID لجلسة التحقق من المستخدمين (KYC) أو التحقق من الشركات
            (KYB) المراد عرضها — وهو `session_id` الذي تم إرجاعه بواسطة `POST
            /v3/session/`. يعمل المسار نفسه لكلا نوعي الجلسات؛ استخدم اسم الملف
            في `Content-Disposition` بالاستجابة لمعرفة نوع التقرير الذي تلقيته.


            **يجب أن يكون معرّف UUID منسقاً بشكل سليم وبأحرف صغيرة.** يتطابق
            المسار فقط مع معرّفات UUID الصالحة، لذا يتم رفض أي قيمة غير صحيحة
            التنسيق بواسطة موجه URL قبل تشغيل أي تعليمات برمجية للتطبيق، وتكون
            الاستجابة صفحة **HTML** برمز `404` بدلاً من غلاف JSON `{"detail":
            ...}` الموضح أدناه. لا يتطابق محول UUID للمسار إلا مع الصيغة
            القياسية ذات الأحرف الصغيرة — ويتم رفض معرّفات UUID الست عشرية ذات
            الأحرف الكبيرة برمز HTML 404.
          schema:
            type: string
            format: uuid
            example: 11111111-2222-3333-4444-555555555555
      responses:
        '200':
          description: >-
            مستند PDF المُصيَّر، يتم إرجاعه مباشرة كملف ثنائي `application/pdf`
            — لا يوجد غلاف JSON ولا إعادة توجيه عبر رابط تنزيل. يبدأ جسم
            الاستجابة ببايتات `%PDF` السحرية (PDF 1.7). احفظه في ملف بصيغة
            `.pdf` أو مرره مباشرة كبث إلى المتصل بك.
          headers:
            Content-Disposition:
              description: >-
                `attachment; filename=session_{sessionId}.pdf` لجلسات KYC،
                و`attachment; filename=business_{sessionId}.pdf` لجلسات KYB —
                وتوضح لك البادئة قالب التقرير الذي تم إنشاؤه.
              schema:
                type: string
                example: >-
                  attachment;
                  filename=session_11111111-2222-3333-4444-555555555555.pdf
            Content-Length:
              description: الحجم الإجمالي لملف PDF بالبايت؛ لا يتم تقسيم المحتوى إلى أجزاء.
              schema:
                type: integer
                example: 25191
          content:
            application/pdf:
              schema:
                type: string
                format: binary
        '403':
          description: >-
            فشل في المصادقة أو التفويض أو حالة الجلسة. يؤدي المفتاح المفقود إلى
            إرجاع `403`؛ بينما يؤدي المفتاح الخاطئ أو الملغى أو منتهي الصلاحية
            إلى إرجاع `401`. يمكنك التمييز بين أوضاع الفشل من خلال نص `detail`:


            - `"Authentication credentials were not provided or are invalid."` —
            لا يوجد رأس `x-api-key` (ولا يوجد token لـ `Authorization: Bearer`)،
            أو فشل فحص بيانات الاعتماد المقدمة (ملغاة أو منتهية الصلاحية أو غير
            صالحة التنسيق).

            - `"You do not have permission to perform this action."` — بيانات
            الاعتماد صالحة ولكن لا يمكنها قراءة هذه الجلسة: يفتقر Bearer token
            الخاص بمستخدم لوحة التحكم إلى إذن `read:sessions` أو لا يمكنه الوصول
            إلى التطبيق المالك، أو ينتمي مفتاح API إلى مؤسسة مختلفة عن الجلسة.

            - `"You can only generate a PDF for sessions in review, declined,
            approved or kyc expired"` — جلسة KYC موجودة ولكنها ليست في حالة
            مؤهلة بعد (على سبيل المثال `Not Started` أو `In Progress`). انتظر
            حدث webhook من نوع `status.updated` قبل طلب التقرير.

            - `"You can only generate a PDF for sessions in review, declined or
            approved"` — الشرط نفسه لجلسات KYB.


            لاحظ أنه بالنسبة لـ `sessionId` غير معروف تماماً، يتحقق endpoint من
            التطبيق المالك قبل التحقق من صحة بيانات الاعتماد، لذا فإن الجلسة
            المفقودة تُرجع `404` حتى عندما تكون بيانات الاعتماد مفقودة أو غير
            صالحة.
          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: لا يوجد رأس x-api-key، أو فشل فحص المفتاح
                  value:
                    detail: >-
                      Authentication credentials were not provided or are
                      invalid.
                Insufficient permissions:
                  summary: >-
                    بيانات اعتماد صالحة تفتقر إلى read:sessions أو حق الوصول إلى
                    التطبيق المالِك
                  value:
                    detail: You do not have permission to perform this action.
                KYC session not finished:
                  summary: جلسة KYC لا تزال لم تبدأ / قيد التقدم
                  value:
                    detail: >-
                      You can only generate a PDF for sessions in review,
                      declined, approved or kyc expired
                KYB session not finished:
                  summary: جلسة KYB لا تزال لم تبدأ / قيد التقدم
                  value:
                    detail: >-
                      You can only generate a PDF for sessions in review,
                      declined or approved
        '404':
          description: >-
            لا توجد جلسة نشطة بهذا المعرّف `sessionId` — لم يتم إنشاؤها مطلقاً،
            أو تم حذفها. يتم تحديد المالك قبل التحقق من صحة بيانات الاعتماد،
            لذلك يتم إرجاع رمز الحالة `404` هذا حتى للطلبات غير المصادق عليها.
            بناءً على عملية البحث التي تعذرت، تكون سلسلة `detail` إما `"Not
            found."` (الحالة الشائعة) أو `"Session not found."`.
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
                    example: Not found.
              examples:
                Unknown session:
                  summary: sessionId لا يطابق أي جلسة KYC أو KYB
                  value:
                    detail: Not found.
                Recently deleted session:
                  summary: تم حذف الجلسة بين عمليات البحث
                  value:
                    detail: Session not found.
        '429':
          description: >-
            تم تجاوز حد المعدل. يمتلك إنشاء ملفات PDF حداً مخصصاً قدره **50
            طلباً في الدقيقة لكل بيانات اعتماد** (مفتاح API أو Bearer token أو
            عنوان IP المصدر في حال عدم المصادقة)، بالإضافة إلى حد GET العام
            البالغ 600/دقيقة. انتظر عدد الثواني المحدد في `Retry-After` (الموضح
            أيضاً في رؤوس `X-RateLimit-*`)، ثم أعد المحاولة. لا يتم تخزين
            التقارير مؤقتاً على جانب الخادم، لذا قم بتنزيل كل تقرير مرة واحدة
            واحفظ الملف بدلاً من إعادة جلبه.
          headers:
            Retry-After:
              description: عدد الثواني التي يجب انتظارها قبل إعادة محاولة إرسال الطلب.
              schema:
                type: integer
                minimum: 1
                example: 30
            X-RateLimit-Limit:
              description: >-
                الحد الأقصى لعدد عمليات إنشاء PDF المسموح بها في النافذة الحالية
                (50).
              schema:
                type: integer
                example: 50
            X-RateLimit-Remaining:
              description: الطلبات المتبقية في النافذة الحالية.
              schema:
                type: integer
                example: 0
            X-RateLimit-Reset:
              description: >-
                طابع Unix الزمني (بالثواني) الذي تتم عنده إعادة تعيين النافذة
                الحالية.
              schema:
                type: integer
                example: 1750000000
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
                    description: تفسير سهل القراءة لتجاوز حد المعدل.
                    example: >-
                      Session PDF generation rate limit exceeded. You can make
                      up to 50 requests per minute.
              examples:
                Throttled:
                  summary: >-
                    أكثر من 50 عملية إنشاء لملفات PDF في دقيقة واحدة من نفس
                    بيانات الاعتماد
                  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: >-
        مفتاح API الخاص بتطبيقك، من Developers -> API keys في Business Console.
        يمتلك المفتاح الأساسي وصولاً كاملاً. يمكن تحديد نطاق المفتاح المسمى: لا
        شيء، أو قراءة، أو كتابة لكل مورد، ومحدوداً ببعض مسارات العمل أو بالجلسات
        المقبولة، وبقائمة من عناوين IP، وبتاريخ انتهاء الصلاحية. يشير 401 إلى أن
        المفتاح غير صحيح أو ملغى أو منتهي الصلاحية؛ ويشير 403 إلى أنه لم يتم
        إرسال أي مفتاح، أو أن المفتاح ليس لديه حق الوصول إلى هذا المورد أو
        الإجراء، أو أن الطلب جاء من عنوان خارج قائمة عناوين IP الخاصة به؛ ويشير
        404 في مسار جلسة إلى أن الجلسة خارج مسارات العمل أو الحالات الخاصة
        بالمفتاح. يتلقى المفتاح الذي لا يمتلك حق الوصول إلى الوسائط عناوين URL
        للصور ومقاطع الفيديو وملفات PDF كـ null، ويتلقى المفتاح الذي لا يمتلك
        إذن كتابة للجلسات روابط الجلسة وtoken كـ null. راجع
        https://docs.didit.me/console/api-keys.

````

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