cURL
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");"<string>"用户
用户历史 PDF API:用户的全部会话
下载一份 Didit 生成的 PDF,汇总某位用户所有可报告的验证会话,按 vendor_data 索引,用于审计、SAR 及定期合规导出。
GET
/
v3
/
users
/
{vendor_data}
/
generate-pdf
/
cURL
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");"<string>"概述
返回一个 PDF 文件,包含某个用户实体的完整验证历史,以vendor_data 作为键。
它与 Console 中 User detail → Actions → Download PDF 生成的文档相同,因此合规团队可以自动导出,而无需为每位用户逐个点击。
该报告包含:
- 封面页,包括资料摘要(姓名、出生日期、签发州/省、已通过的邮箱和电话)、每项功能的最新状态、会话计数,以及所含会话的索引。
- 每个所含会话各对应一份完整的会话报告,按时间顺序排列(最早的在前)。每份报告都与 生成 PDF 为该会话单独返回的报告相同。
符合条件的会话与上限
仅包含状态为Approved、Declined、In Review 或 Kyc Expired 的用户验证(KYC)会话。其他任何状态(Not Started、In Progress、Abandoned、Expired 等)的会话都会被跳过。
报告最多包含 最近的 20 个 可报告会话。如果用户的会话超过 20 个,则包含最新的 20 个,封面页会注明省略了多少个较早的会话。如需以 JSON 格式获取完整列表,请使用按 vendor_data 过滤的 列出会话。
响应
响应体即为 PDF 本身(application/pdf),而不是 JSON 包装或下载链接。Content-Disposition 响应头为 attachment; filename=user_<didit_internal_id>.pdf,其中 didit_internal_id 是用户稳定的 Didit 标识符。
白标
在您的应用中启用白标定制后,封面页和每份会话报告都会显示您的 Logo 和隐私政策 URL,而不是 Didit 品牌标识,与单会话接口的行为完全一致。请在 Console → Customization 中进行配置。缓存与延迟
不做任何缓存:每次调用都会根据当前数据重新生成报告,因此在人工审核之后请求的报告会反映审核员的决定。两次调用可能生成字节内容不同的文件;如需不可变副本,请归档下载的文件。 渲染是同步进行的,并会下载所含每个会话中存储的全部图片,因此对于媒体文件较多会话的用户,可能需要数十秒。请设置较长的客户端读取超时(建议 120 秒),并将响应体流式写入磁盘。生成过程会受服务端时间预算限制,而不会一直运行到客户端放弃等待为止:若达到该预算,报告仍会返回有效的 PDF,包含最近的会话,封面页会注明省略了多少个会话。结尾斜杠
规范路由以斜杠结尾(…/generate-pdf/)。不带斜杠的请求会直接返回相同的响应:不存在 301 重定向,因此任何客户端都无需跟随重定向,curl 也无需 -L 参数。请使用示例中带斜杠的 URL;这也是 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 | 在该 API 密钥所属应用中没有此 vendor_data 对应的用户,包括属于其他应用的用户。 | User not found. |
429 | 同一凭证每分钟生成 PDF 次数超过 50 次。该配额与 生成 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 密钥均可调用此接口。Didit 的 API 密钥是按应用限定,而非按角色限定的:Console 中的角色与权限(read:users 等)决定的是用户本人可以在 Console 中执行哪些操作,对 Management API 的请求不会进行这些权限校验。密钥只能导出其所属应用中的用户。
相关内容
- 生成 PDF:针对单个会话的相同报告
- 用户 KYC 历史记录:以 JSON 格式列出和查看用户的会话
- 导出 PDF 与 CSV:这两种导出在 Console 中的操作入口
- 获取用户:以 JSON 格式获取用户资料和功能映射
授权
您的应用 API 密钥,可在 Business Console 的“开发者 -> API 密钥”中获取。主密钥拥有完整访问权限。指定名称的密钥可设置作用域:针对每个资源设为无权限、只读或读写,限定于特定工作流或已通过的会话、限定于 IP 地址列表,以及设置到期日期。401 表示密钥错误、已撤销或已过期;403 表示未发送密钥、密钥无权访问该资源或操作,或请求来自其 IP 列表之外的地址;在会话路由上返回 404 表示该会话不在该密钥允许的工作流或状态范围内。没有媒体访问权限的密钥获取到的图片、视频和 PDF URL 将为 null;没有会话写入权限的密钥获取到的会话链接和 token 将为 null。请参阅 https://docs.didit.me/console/api-keys。
路径参数
您对该用户的唯一标识符,为自由格式字符串(非 UUID)。该值与您在创建该用户会话时作为 vendor_data 传入的值相同,按发送的内容精确匹配。请对其进行 URL 编码;包含 / 的值无法由此路由寻址。
响应
渲染生成的 PDF 文档,直接以二进制 application/pdf 形式返回,没有 JSON 包装,也没有下载 URL 重定向。正文以 %PDF 魔数开头。可将其保存为 .pdf 文件或直接流式传输给您的调用方。
The response is of type file.
最后修改于 2026年11月7日