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>"API истории пользователя в PDF: все сессии
Скачайте один PDF со всеми отчётными сессиями верификации пользователя по vendor_data для аудитов, SAR и периодических выгрузок комплаенса в Didit.
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 с полной историей верификаций сущности User, найденной поvendor_data.
Это тот же документ, который Console формирует по пути User detail → Actions → Download PDF. Комплаенс-команды могут автоматизировать экспорт и не выгружать данные по каждому пользователю вручную.
Отчёт содержит:
- Титульную страницу со сводкой профиля (имя, дата рождения, страны выдачи, подтверждённые адреса электронной почты и телефоны), последним статусом каждой функции, счётчиками сессий и индексом включённых сессий.
- Полный отчёт по каждой включённой сессии в хронологическом порядке (от самой старой к самой новой). Каждый такой отчёт совпадает с тем, что Генерация PDF возвращает для этой сессии отдельно.
Подходящие сессии и лимит
В отчёт включаются только сессии проверки пользователей (KYC) в статусахApproved, Declined, In Review или Kyc Expired. Сессии в любом другом статусе (Not Started, In Progress, Abandoned, Expired, …) пропускаются.
Отчёт ограничен 20 самыми последними подходящими сессиями. Если у пользователя их больше, включаются 20 самых новых, а на титульной странице указано, сколько более старых сессий не вошло в отчёт. Если нужен полный список в формате JSON, используйте Список сессий с фильтром по vendor_data.
Ответ
Тело ответа — это сам PDF (application/pdf), а не JSON-обёртка и не ссылка для скачивания. Заголовок Content-Disposition имеет вид attachment; filename=user_<didit_internal_id>.pdf, где didit_internal_id — это стабильный идентификатор пользователя в Didit.
White label
Если для вашего приложения включена настройка White label, на титульной странице и в каждом отчёте по сессии вместо брендинга Didit отображаются ваш логотип и URL политики конфиденциальности, так же как в эндпоинте для одной сессии. Настройка выполняется в разделе 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-ключ недействителен или отозван либо вместо API-ключа передан токен пользователя Console. | 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 в минуту с одних и тех же учётных данных. Лимит общий с Генерация 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 (роли и разрешения, включаяread:users и остальные) определяют, что может делать человек в Console, и не проверяются для трафика Management API. Ключ может экспортировать только пользователей своего приложения.
Связанные материалы
- Генерация PDF: тот же отчёт для одной сессии
- История KYC пользователя: список и просмотр сессий пользователя в формате JSON
- Экспорт PDF и CSV: обе выгрузки в Console
- Получить пользователя: профиль пользователя и карта функций в формате JSON
Авторизации
API-ключ вашего приложения из раздела «Разработчикам» -> «API-ключи» в Business Console. Основной ключ имеет полный доступ. Именованный ключ может иметь ограниченную область действия: без доступа, чтение или запись для каждого ресурса, ограничение определенными сценариями или одобренными сессиями, списком IP-адресов и сроком действия. 401 означает, что ключ неверен, отозван или его срок действия истек; 403 означает, что ключ не был передан, у ключа нет доступа к этому ресурсу или действию, либо запрос поступил с адреса вне его списка IP-адресов; 404 на маршруте сессии означает, что сессия не входит в сценарии или статусы ключа. Ключ без доступа к медиа получает URL изображений, видео и PDF как null, а ключ без прав на запись сессий получает ссылки на сессии и токены как null. См. https://docs.didit.me/console/api-keys.
Параметры пути
Ваш уникальный идентификатор пользователя — произвольная строка (НЕ UUID). Это то же значение, которое вы передавали в vendor_data при создании сессий пользователя; сопоставляется в точности в переданном виде. Примените URL-encoding; значение, содержащее /, не может быть адресовано этим маршрутом.
Ответ
Сформированный PDF-документ, возвращаемый напрямую как бинарные данные application/pdf — без обёртки JSON и без перенаправления по URL для скачивания. Тело ответа начинается с сигнатуры %PDF. Сохраните его в файл .pdf или передайте потоком вызывающей стороне.
The response is of type file.