curl --fail \
'https://verification.didit.me/v3/users/user-abc-123/generate-pdf/' \
-H 'x-api-key: YOUR_API_KEY' \
--output user-history.pdffrom didit import Didit
# Reads DIDIT_API_KEY.
client = Didit()
content = client.users.generate_pdf(
"user-abc-123",
)
with open("download.pdf", "wb") as file:
file.write(content)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.users.generatePdf("user-abc-123");
await writeFile("download.pdf", Buffer.from(await content.arrayBuffer()));ctx := context.Background()
// Reads DIDIT_API_KEY.
client := didit.NewClient()
resp, err := client.Users.GeneratePDF(ctx, "user-abc-123")
if err != nil {
log.Fatal(err)
}
defer resp.Body.Close()
file, err := os.Create("download.pdf")
if err != nil {
log.Fatal(err)
}
defer file.Close()
if _, err := io.Copy(file, resp.Body); err != nil {
log.Fatal(err)
}import java.nio.file.Path;
import me.didit.Didit;
// Reads DIDIT_API_KEY.
Didit client = new Didit();
client.users().generatePdf("user-abc-123")
.writeTo(Path.of("download.pdf"));<?php
require 'vendor/autoload.php';
use Didit\DiditClient;
// Reads DIDIT_API_KEY.
$didit = new DiditClient();
$content = $didit->users->generatePdf('user-abc-123');
$content->saveTo('download.pdf');require "didit"
# Reads DIDIT_API_KEY.
didit = Didit::Client.new
content = didit.users.generate_pdf("user-abc-123")
File.binwrite("download.pdf", content)using System;
using Didit;
// Reads DIDIT_API_KEY.
using var client = new DiditClient();
var content = await client.Users.GeneratePdfAsync("user-abc-123");
await content.SaveToAsync("download.pdf");سجل المستخدم بصيغة PDF عبر API: جميع جلسات المستخدم
حمّل ملف PDF واحداً من Didit يجمع كل جلسات التحقق القابلة للإبلاغ لكل مستخدم حسب vendor_data، للتدقيق وتقارير SAR والتصدير الدوري.
curl --fail \
'https://verification.didit.me/v3/users/user-abc-123/generate-pdf/' \
-H 'x-api-key: YOUR_API_KEY' \
--output user-history.pdffrom didit import Didit
# Reads DIDIT_API_KEY.
client = Didit()
content = client.users.generate_pdf(
"user-abc-123",
)
with open("download.pdf", "wb") as file:
file.write(content)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.users.generatePdf("user-abc-123");
await writeFile("download.pdf", Buffer.from(await content.arrayBuffer()));ctx := context.Background()
// Reads DIDIT_API_KEY.
client := didit.NewClient()
resp, err := client.Users.GeneratePDF(ctx, "user-abc-123")
if err != nil {
log.Fatal(err)
}
defer resp.Body.Close()
file, err := os.Create("download.pdf")
if err != nil {
log.Fatal(err)
}
defer file.Close()
if _, err := io.Copy(file, resp.Body); err != nil {
log.Fatal(err)
}import java.nio.file.Path;
import me.didit.Didit;
// Reads DIDIT_API_KEY.
Didit client = new Didit();
client.users().generatePdf("user-abc-123")
.writeTo(Path.of("download.pdf"));<?php
require 'vendor/autoload.php';
use Didit\DiditClient;
// Reads DIDIT_API_KEY.
$didit = new DiditClient();
$content = $didit->users->generatePdf('user-abc-123');
$content->saveTo('download.pdf');require "didit"
# Reads DIDIT_API_KEY.
didit = Didit::Client.new
content = didit.users.generate_pdf("user-abc-123")
File.binwrite("download.pdf", content)using System;
using Didit;
// Reads DIDIT_API_KEY.
using var client = new DiditClient();
var content = await client.Users.GeneratePdfAsync("user-abc-123");
await content.SaveToAsync("download.pdf");نظرة عامة
يعيد هذا المسار ملف PDF واحدًا يحتوي على سجل التحقق الكامل لـ كيان المستخدم، ويُحدَّد المستخدم بالقيمةvendor_data.
وهو المستند نفسه الذي تنتجه Console عبر User detail → Actions → Download PDF، لذلك يمكن لفرق الامتثال أتمتة عمليات التصدير بدلًا من النقر مرة لكل مستخدم.
يتضمن التقرير:
- صفحة غلاف تحتوي على ملخص الملف الشخصي (الاسم وتاريخ الميلاد والولايات المُصدِرة والبريد الإلكتروني والهواتف المعتمدة)، وآخر حالة لكل ميزة، وعدادات الجلسات، وفهرسًا بالجلسات المضمّنة.
- تقرير كامل لكل جلسة مضمّنة، بترتيب زمني من الأقدم إلى الأحدث. وكل تقرير منها هو نفسه التقرير الذي يعيده Generate PDF لتلك الجلسة وحدها.
الجلسات المؤهلة والحد الأقصى
تُضمَّن فقط جلسات التحقق من المستخدمين (KYC) التي تكون في حالةApproved أو Declined أو In Review أو Kyc Expired. أما الجلسات في أي حالة أخرى، مثل Not Started أو In Progress أو Abandoned أو Expired وغيرها، فيتم تجاهلها.
يقتصر التقرير على آخر 20 جلسة قابلة للإدراج. وإذا كان للمستخدم أكثر من ذلك، تُضمَّن أحدث 20 جلسة، ويذكر صفحة الغلاف عدد الجلسات الأقدم التي استُبعدت. استخدم List sessions مع تصفية حسب vendor_data عندما تحتاج إلى القائمة الكاملة بصيغة JSON.
الاستجابة
يكون متن الاستجابة ملف PDF نفسه (application/pdf)، وليس غلافًا بصيغة JSON ولا رابط تنزيل. ترويسة Content-Disposition تكون attachment; filename=user_<didit_internal_id>.pdf، حيث يمثل didit_internal_id معرّف Didit الثابت للمستخدم.
العلامة البيضاء
عند تفعيل تخصيص العلامة البيضاء في تطبيقك، يحمل الغلاف وكل تقرير جلسة شعارك ورابط سياسة الخصوصية الخاص بك بدلًا من علامة Didit التجارية، تمامًا كما في endpoint الخاصة بالجلسة الواحدة. اضبط ذلك من Console → Customization.التخزين المؤقت وزمن الاستجابة
لا يُخزَّن أي شيء مؤقتًا: كل استدعاء يعيد إنشاء التقرير من البيانات الحالية، لذلك يعكس التقرير المطلوب بعد مراجعة يدوية قرار المراجِع. وقد ينتج استدعاءان ملفين مختلفين بايتًا ببايت، لذا احفظ الملف المُنزَّل إذا احتجت إلى نسخة ثابتة لا تتغير. يتم الإنشاء بشكل متزامن، ويُنزِّل كل صورة مخزّنة لكل جلسة مضمّنة، لذلك قد يستغرق إنشاء تقرير مستخدم لديه جلسات كثيرة ذات وسائط كثيفة عشرات الثواني. استخدم مهلة قراءة طويلة من جهة العميل (يُوصى بـ 120 ثانية) وقم ببث المتن إلى القرص. يتوقف الإنشاء عند ميزانية زمنية من جهة الخادم بدلًا من الاستمرار حتى ينفد صبر عميلك: وإذا بلغت هذه الميزانية، يظل التقرير يعيد ملف PDF صالحًا يحتوي على أحدث الجلسات، ويذكر الغلاف عدد الجلسات التي استُبعدت.الشرطة المائلة في نهاية المسار
يحتوي المسار القياسي على شرطة مائلة في نهايته (…/generate-pdf/). يُخدَم الطلب الذي لا يتضمنها مباشرة بالاستجابة نفسها: لا توجد إعادة توجيه 301، فلا يحتاج أي عميل إلى تتبع عمليات إعادة التوجيه، ولا يحتاج curl إلى -L. استخدم المسار المنتهي بالشرطة المائلة كما في الأمثلة، فهو الشكل الذي تُظهره مواصفات OpenAPI وسجلاتك.
الأخطاء
| الحالة | متى | detail |
|---|---|---|
401 | لا توجد ترويسة x-api-key (ولا رمز Authorization: Bearer). | You must be authenticated with a valid access token to access this endpoint. |
403 | مفتاح API غير صالح أو ملغى، أو رمز مستخدم من Console بدلًا من مفتاح API. | You do not have permission to perform this action. |
403 | المستخدم موجود، لكن لا توجد أي جلسة من جلساته في حالة قابلة للإدراج. | This user has no sessions in review, declined, approved or kyc expired to report. |
404 | لا يوجد مستخدم بهذا vendor_data في التطبيق المرتبط بمفتاح API، بما في ذلك المستخدمون الذين ينتمون إلى تطبيق آخر. | User not found. |
429 | أكثر من 50 عملية إنشاء PDF في الدقيقة من بيانات الاعتماد نفسها. تُشارَك الحصة مع Generate PDF. انتظر عدد الثواني المحدد في Retry-After. | Session PDF generation rate limit exceeded. You can make up to 50 requests per minute. |
الأمثلة
- curl
- Python
- JavaScript
curl --fail 'https://verification.didit.me/v3/users/user-abc-123/generate-pdf/' \
-H 'x-api-key: YOUR_API_KEY' \
--output user-history.pdf
import requests
response = requests.get(
"https://verification.didit.me/v3/users/user-abc-123/generate-pdf/",
headers={"x-api-key": "YOUR_API_KEY"},
stream=True,
timeout=120,
)
response.raise_for_status()
with open("user-history.pdf", "wb") as fh:
for chunk in response.iter_content(chunk_size=8192):
fh.write(chunk)
import { writeFile } from 'node:fs/promises';
const vendorData = encodeURIComponent('user-abc-123');
const response = await fetch(
`https://verification.didit.me/v3/users/${vendorData}/generate-pdf/`,
{ headers: { 'x-api-key': process.env.DIDIT_API_KEY } },
);
if (!response.ok) throw new Error(`PDF generation failed: HTTP ${response.status}`);
await writeFile('user-history.pdf', Buffer.from(await response.arrayBuffer()));
الصلاحيات
يمكن لأي مفتاح API نشط للتطبيق استدعاء نقطة النهاية هذه. مفاتيح API في Didit محصورة بالتطبيق، وليست محصورة بالأدوار: فالأدوار والأذونات في Console (Roles and permissions)، مثلread:users وغيرها، هي التي تحدد ما يمكن للشخص فعله في Console، ولا تُطبَّق على حركة مرور Management API. ولا يمكن للمفتاح تصدير إلا مستخدمي تطبيقه.
ذات صلة
- Generate PDF: التقرير نفسه لجلسة واحدة
- User KYC history: عرض جلسات المستخدم وفحصها بصيغة JSON
- Export PDF & CSV: الجانب الخاص بالتصدير في Console لكلا النوعين
- Get user: الملف الشخصي للمستخدم وخريطة الميزات بصيغة JSON
التفويضات
مفتاح API الخاص بتطبيقك، من Developers -> API keys في Business Console. يمتلك المفتاح الأساسي وصولاً كاملاً. يمكن تحديد نطاق المفتاح المسمى: لا شيء، أو قراءة، أو كتابة لكل مورد، ومحدوداً ببعض مسارات العمل أو بالجلسات المقبولة، وبقائمة من عناوين IP، وبتاريخ انتهاء الصلاحية. يشير 401 إلى أن المفتاح غير صحيح أو ملغى أو منتهي الصلاحية؛ ويشير 403 إلى أنه لم يتم إرسال أي مفتاح، أو أن المفتاح ليس لديه حق الوصول إلى هذا المورد أو الإجراء، أو أن الطلب جاء من عنوان خارج قائمة عناوين IP الخاصة به؛ ويشير 404 في مسار جلسة إلى أن الجلسة خارج مسارات العمل أو الحالات الخاصة بالمفتاح. يتلقى المفتاح الذي لا يمتلك حق الوصول إلى الوسائط عناوين URL للصور ومقاطع الفيديو وملفات PDF كـ null، ويتلقى المفتاح الذي لا يمتلك إذن كتابة للجلسات روابط الجلسة وtoken كـ null. راجع https://docs.didit.me/console/api-keys.
معلمات المسار
معرّفك الفريد للمستخدم — سلسلة نصية حرة (وليست UUID). هذه هي نفس القيمة التي مررتها كـ vendor_data عند إنشاء جلسات المستخدم، وتتم مطابقتها تماماً كما أُرسلت. قم بترميزها وفق ترميز URL؛ فالقيمة التي تحتوي على / لا يمكن الوصول إليها عبر هذا المسار.
الاستجابة
مستند PDF المُصيَّر، يتم إرجاعه مباشرة كملف ثنائي application/pdf — لا يوجد غلاف JSON ولا إعادة توجيه عبر رابط تنزيل. يبدأ جسم الاستجابة ببايتات %PDF السحرية. احفظه في ملف بصيغة .pdf أو مرره مباشرة كبث إلى المتصل بك.
The response is of type file.