> ## 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: ملف PDF موقّع

> نزّل ملف PDF الموقّع لمستند واحد من خطوة التوقيع الإلكتروني في جلسة KYC أو KYB باستخدام مفتاح API الخاص بك، من خلال Didit.

يُرجع ملف PDF الموقّع لمستند واحد، بعد أن يوقّعه الموقّع. لا تحتاج إلى بناء عنوان URL: كل مستند موقّع في القرار يحمل مساره في `signatures[].documents[].signed_file`.

```bash theme={null}
curl -L 'https://verification.didit.me/v3/session/{session_id}/signatures/{node_id}/documents/{document_id}/file/' \
  -H 'x-api-key: YOUR_API_KEY' \
  -o agreement-signed.pdf
```

يحتوي الملف على المستند الذي عُرض على الموقّع مع قيم الحقول الخاصة به مطبوعةً عليه، وصفحة الأدلة (ما لم تكن `signature_evidence_page` في الخطوة معطّلة). يحتوي ملف PDF من نوع Advanced (AES) أيضاً على توقيع PAdES مع طابعه الزمني، أما ملف PDF البسيط فلا يحتوي على توقيع رقمي أو ختم أو طابع زمني. قبل إرجاع الملف، يتحقق Didit من الملف المخزَّن مقابل `sha256_signed`، ويُرجع `409` مع `signature_document_changed` إذا اختلفا.

المستند الذي لم يُوقَّع بعد يُرجع `404` مع `signature_not_signed`. بعد أن [تحذف الجلسة](https://docs.didit.me/ar/sessions-api/delete-session.md)، يُرجع المسار `404`.

## ذات صلة

* [تقرير التوقيع الإلكتروني](https://docs.didit.me/ar/core-technology/electronic-signature/report-electronic-signature.md#ملف-pdf-الموقّع): ما يحتويه ملف PDF الموقّع.
* [تنزيل أدلة التوقيع](https://docs.didit.me/ar/sessions-api/electronic-signature/download-evidence.md)
* [التحقق من التوقيعات](https://docs.didit.me/ar/sessions-api/electronic-signature/validate-signatures.md)


## OpenAPI

````yaml ar/openapi-25.json GET /v3/session/{sessionId}/signatures/{nodeId}/documents/{documentId}/file/
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}/signatures/{nodeId}/documents/{documentId}/file/:
    get:
      tags:
        - Sessions
      summary: تنزيل مستند موقّع
      description: >-
        تنزيل ملف PDF الموقّع لمستند واحد من خطوة التوقيع الإلكتروني. استخدم
        مسار `signed_file` في `signatures[].documents[]` ضمن القرار. يحتوي ملف
        PDF على المستند الذي عُرض على الموقِّع مع ختم قيم حقوله وصفحة الأدلة (ما
        لم يتم إيقاف تشغيل `signature_evidence_page`). يحمل ملف PDF لتوقيع متقدم
        (AES) أيضاً توقيع PAdES مع طابعه الزمني؛ بينما لا يحتوي ملف PDF لتوقيع
        بسيط على توقيع رقمي أو ختم أو طابع زمني. تتحقق Didit من الملف بمطابقته
        مع `sha256_signed` قبل إرجاعه.


        يعمل مع جلسات التحقق من المستخدمين (KYC) والتحقق من الشركات (KYB). يتطلب
        `read:sessions`؛ ومفتاح API الخاص بك يعمل. راجع [تقرير التوقيع
        الإلكتروني](/ar/core-technology/electronic-signature/report-electronic-signature#تنزيل-المستندات-الموقعة).
      operationId: get_v3_session_signature_document_file
      parameters:
        - name: sessionId
          in: path
          required: true
          description: جلسة التحقق من المستخدمين (KYC) أو التحقق من الشركات (KYB).
          schema:
            type: string
            format: uuid
            example: 11111111-2222-3333-4444-555555555555
        - name: nodeId
          in: path
          required: true
          description: 'خطوة التوقيع الإلكتروني: `node_id` الخاص بالعنصر في `signatures[]`.'
          schema:
            type: string
            example: feature_signature
        - name: documentId
          in: path
          required: true
          description: '`id` للمستند في `signatures[].documents[]`.'
          schema:
            type: string
            format: uuid
      responses:
        '200':
          description: ملف PDF الموقّع.
          headers:
            Content-Disposition:
              description: مرفق باسم الملف.
              schema:
                type: string
                example: attachment; filename="agreement-signed.pdf"
          content:
            application/pdf:
              schema:
                type: string
                format: binary
        '403':
          description: >-
            بيانات اعتماد مفقودة، أو بيانات اعتماد لا يمكنها قراءة هذه الجلسة.
            يؤدي المفتاح المفقود إلى إرجاع `403`؛ بينما يؤدي المفتاح الخاطئ أو
            الملغى أو منتهي الصلاحية إلى إرجاع `401`.
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
              example:
                detail: You do not have permission to perform this action.
        '404':
          description: >-
            لا يوجد مستند موقّع مطابق: الجلسة أو الخطوة أو المستند غير موجود، أو
            تم حذفه، أو لم يتم توقيعه بعد.
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
                  code:
                    type: string
              examples:
                Not signed yet:
                  summary: لم يوقّع الموقّع بعد
                  value:
                    code: signature_not_signed
                    detail: signature_not_signed
                Unknown document:
                  summary: لا يوجد مستند كهذا في هذه الخطوة
                  value:
                    code: signature_not_found
                    detail: signature_not_found
        '409':
          description: >-
            الملف المخزن لم يعد يطابق تجزئة SHA-256 المسجلة له. لم يتم إرجاع أي
            شيء.
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
                  code:
                    type: string
              examples:
                Changed file:
                  summary: الملف المخزن لا يتطابق مع التجزئة (hash) الخاصة به
                  value:
                    code: signature_document_changed
                    detail: signature_document_changed
      security:
        - ApiKeyAuth: []
      x-codeSamples:
        - lang: python
          label: Python
          source: |-
            from didit import Didit

            # Reads DIDIT_API_KEY.
            client = Didit()

            content = client.sessions.signatures.download_document(
                "11111111-2222-3333-4444-555555555555",
                "feature_signature",
                "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.signatures.downloadDocument(
              "11111111-2222-3333-4444-555555555555",
              "feature_signature",
              "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.Signatures.DownloadDocument(ctx, \"11111111-2222-3333-4444-555555555555\", \"feature_signature\", \"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().signatures().downloadDocument("11111111-2222-3333-4444-555555555555",
            "feature_signature", "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->signatures->downloadDocument('11111111-2222-3333-4444-555555555555',
            'feature_signature', '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.signatures.download_document(
              "11111111-2222-3333-4444-555555555555",
              "feature_signature",
              "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.Signatures.DownloadDocumentAsync("11111111-2222-3333-4444-555555555555",
            "feature_signature", "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.