> ## 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 со всеми отчётными сессиями верификации пользователя по vendor_data для аудитов, SAR и периодических выгрузок комплаенса в Didit.



Промпт: PDF с историей пользователя
        Скопировать промпт в буфер обмена



      
      

\<pre>

\`Goal: download one audit-ready PDF containing the full verification history of a Didit user.

Endpoint: GET https://verification.didit.me/v3/users/{vendor_data}/generate-pdf/
Auth header: x-api-key: YOUR_API_KEY

Path param:
\- vendor_data (string, REQUIRED) - your own identifier for the user, the same value you pass when creating sessions. Free-form string, NOT a UUID. URL-encode it; it cannot contain "/".

curl - save the PDF to disk:
curl --fail 'https://verification.didit.me/v3/users/user-abc-123/generate-pdf/' \
-H 'x-api-key: YOUR_API_KEY' \
\--output user-history.pdf

Response:
\- Body is binary (application/pdf). DO NOT parse as JSON.
\- Content-Disposition: attachment; filename=user_{didit_internal_id}.pdf
\- Content: a cover page (profile summary, feature status, session index) followed by the standard report of every included session, oldest first. Each session report is the same document GET /v3/session/{session_id}/generate-pdf/ returns.
\- Only sessions in "Approved", "Declined", "In Review" or "Kyc Expired" are included, capped at the 20 most recent. The cover states when older sessions were left out.
\- Identical to the Console export at User detail → Actions → Download PDF. White-label logo and privacy-policy URL apply when enabled.
\- Rendering is synchronous and takes a few seconds per session: use a read timeout of at least 120s and stream the body to disk.

Failure modes (envelope {"detail": "..."}):
\- 401 - no credentials supplied.
\- 403 - missing API key (a wrong, revoked or expired key gets 401), a Console user token instead of an API key, OR the user exists but has no session in a reportable status ("This user has no sessions in review, declined, approved or kyc expired to report.").
\- 404 - {"detail": "User not found."} - no user with that vendor_data in the application behind the API key. A key can never export a user of another application.
\- 429 - shares the PDF rate limit with the per-session endpoint (50 requests per minute per credential). Wait Retry-After seconds.

Trailing slash: the canonical route ends with "/". Call it as written above.

When to call:
\- Periodic compliance exports of a customer's whole KYC history.
\- SAR / regulator attachments that must cover every verification of one person.
\- Pulling a user's history into your own back office without a Console login.

Related: GET /v3/session/{session_id}/generate-pdf/ for a single session; GET /v3/sessions/?vendor_data=... for the JSON list of sessions.

For end-to-end Didit integration, paste in the full prompt at /integration/integration-prompt.`

\</pre>



      
      

Вставьте в

## ОбзорВозвращает один PDF с полной историей верификаций [сущности User](https://docs.didit.me/ru/entities/users/overview.md), найденной по `vendor_data`.
Это тот же документ, который Console формирует по пути **User detail → Actions → Download PDF**. Комплаенс-команды могут автоматизировать экспорт и не выгружать данные по каждому пользователю вручную.Отчёт содержит:- **Титульную страницу** со сводкой профиля (имя, дата рождения, страны выдачи, подтверждённые адреса электронной почты и телефоны), последним статусом каждой функции, счётчиками сессий и индексом включённых сессий.
- **Полный отчёт по каждой включённой сессии** в хронологическом порядке (от самой старой к самой новой). Каждый такой отчёт совпадает с тем, что [Генерация PDF](https://docs.didit.me/ru/sessions-api/generate-pdf.md) возвращает для этой сессии отдельно.## Подходящие сессии и лимитВ отчёт включаются только сессии проверки пользователей (KYC) в статусах `Approved`, `Declined`, `In Review` или `Kyc Expired`. Сессии в любом другом статусе (`Not Started`, `In Progress`, `Abandoned`, `Expired`, …) пропускаются.Отчёт ограничен **20 самыми последними** подходящими сессиями. Если у пользователя их больше, включаются 20 самых новых, а на титульной странице указано, сколько более старых сессий не вошло в отчёт. Если нужен полный список в формате JSON, используйте [Список сессий](https://docs.didit.me/ru/sessions-api/list-sessions.md) с фильтром по `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](https://docs.didit.me/ru/sessions-api/generate-pdf.md). Подождите `Retry-After` секунд. | `Session PDF generation rate limit exceeded. You can make up to 50 requests per minute.` |## Примеры> [tab] curl
>
> ```bash theme={null}
> curl --fail 'https://verification.didit.me/v3/users/user-abc-123/generate-pdf/' \
>   -H 'x-api-key: YOUR_API_KEY' \
>   --output user-history.pdf
> ```> [tab] Python
>
> ```python theme={null}
> 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)
> ```> [tab] JavaScript
>
> ```javascript theme={null}
> 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 ([роли и разрешения](https://docs.didit.me/ru/console/roles-permissions.md), включая `read:users` и остальные) определяют, что может делать *человек* в Console, и не проверяются для трафика Management API. Ключ может экспортировать только пользователей своего приложения.## Связанные материалы- [Генерация PDF](https://docs.didit.me/ru/sessions-api/generate-pdf.md): тот же отчёт для одной сессии
- [История KYC пользователя](https://docs.didit.me/ru/entities/users/kyc-history.md): список и просмотр сессий пользователя в формате JSON
- [Экспорт PDF и CSV](https://docs.didit.me/ru/console/export-pdf-csv.md): обе выгрузки в Console
- [Получить пользователя](https://docs.didit.me/ru/management-api/users/get.md): профиль пользователя и карта функций в формате JSON


## OpenAPI

````yaml ru/openapi-25.json GET /v3/users/{vendor_data}/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/users/{vendor_data}/generate-pdf/:
    get:
      tags:
        - Users
      summary: Скачать полный PDF-отчёт об истории пользователя
      description: >-
        Сформируйте и скачайте готовый для комплаенса PDF-документ, содержащий
        полную историю верификаций пользователя, идентифицируемого по
        `vendor_data`. Это тот же самый документ, который формируется в Console
        по пути **User detail → Actions → Download PDF**, благодаря чему для
        регулярного комплаенс-экспорта больше не требуется ручная выгрузка через
        Console.


        **Что содержит отчёт.** Титульный лист со сводкой профиля (имя, дата
        рождения, страны выдачи, одобренные адреса электронной почты и
        телефоны), актуальный статус каждой функции, счётчики сессий и перечень
        включённых сессий — за которыми следуют стандартные отчёты по каждой
        включённой сессии в хронологическом порядке (сначала самые старые).
        Отчёт по каждой сессии представляет собой тот же документ, который
        возвращает `GET /v3/session/{sessionId}/generate-pdf/` для этой сессии.


        **Подходящие сессии.** Включаются только сессии Проверки пользователей
        (KYC) со статусами `Approved`, `Declined`, `In Review` или `Kyc
        Expired`; сессии в любых других статусах пропускаются. Если у
        пользователя нет ни одной сессии в указанных статусах, endpoint
        возвращает `403` — подробнее см. ниже.


        **Ограничение по количеству.** Отчёт ограничен **20 самыми последними**
        сессиями, доступными для отчёта. Если у пользователя их больше,
        включаются 20 новейших, а на титульном листе указывается, сколько более
        старых сессий было пропущено. Для получения полного списка в формате
        JSON используйте `GET /v3/sessions/?vendor_data=…`.


        **Брендирование.** Если в вашем приложении настроена кастомизация White
        label, титульный лист и отчёты по каждой сессии формируются с вашим
        логотипом и URL политики конфиденциальности; в противном случае они
        содержат брендинг Didit. Отчёты формируются на английском языке —
        параметра выбора языка нет.


        **Отсутствие кэширования.** Каждый вызов заново генерирует PDF на основе
        текущих данных, поэтому отчёт, сформированный после ручной проверки,
        отражает решение проверяющего. Два вызова для одного и того же
        пользователя могут вернуть файлы, различающиеся на уровне байтов —
        архивируйте скачанный файл, если вам требуется неизменяемая копия.


        **Задержка.** Рендеринг выполняется синхронно и загружает все
        сохранённые изображения для каждой включённой сессии, поэтому для
        пользователя с большим количеством сессий, содержащих медиафайлы,
        процесс может занять десятки секунд. Установите увеличенный таймаут
        чтения на клиенте (рекомендуется 120 с) и сохраняйте тело ответа
        потоково на диск. Генерация останавливается при достижении серверного
        лимита по времени, не дожидаясь разрыва соединения клиентом: если лимит
        исчерпан, в ответе всё равно возвращается корректный PDF с самыми
        последними сессиями, а на титульном листе указывается, сколько сессий
        было опущено.


        **Область действия.** Поиск пользователя выполняется в рамках
        приложения, которому принадлежит API-ключ. Ключ ни при каких условиях не
        может экспортировать пользователя другого приложения — для него такой
        пользователь не существует, и endpoint возвращает `404`.


        **Замыкающий слэш.** Канонический маршрут оканчивается замыкающим слэшем
        (`…/generate-pdf/`). Запрос без него обрабатывается напрямую с тем же
        ответом — редирект `301` отсутствует, поэтому клиенту не нужно следовать
        перенаправлениям, а для `curl` не требуется флаг `-L`. Используйте URL
        со слэшем, как показано в примерах.
      operationId: get_user_generate_pdf
      parameters:
        - name: vendor_data
          in: path
          required: true
          schema:
            type: string
          description: >-
            Ваш уникальный идентификатор пользователя — произвольная строка (НЕ
            UUID). Это то же значение, которое вы передавали в `vendor_data` при
            создании сессий пользователя; сопоставляется в точности в переданном
            виде. Примените URL-encoding; значение, содержащее `/`, не может
            быть адресовано этим маршрутом.
          example: user-abc-123
      responses:
        '200':
          description: >-
            Сформированный PDF-документ, возвращаемый напрямую как бинарные
            данные `application/pdf` — без обёртки JSON и без перенаправления по
            URL для скачивания. Тело ответа начинается с сигнатуры `%PDF`.
            Сохраните его в файл `.pdf` или передайте потоком вызывающей
            стороне.
          headers:
            Content-Disposition:
              description: >-
                `attachment; filename=user_{didit_internal_id}.pdf` — файл
                назван по постоянному идентификатору пользователя в Didit
                (`didit_internal_id` в `GET /v3/users/{vendor_data}/`), а не по
                `vendor_data`.
              schema:
                type: string
                example: >-
                  attachment;
                  filename=user_f4e5e1f2-94a9-4f86-8c16-2b7d9b4db418.pdf
            Content-Length:
              description: Общий размер PDF в байтах; тело не разбивается на фрагменты.
              schema:
                type: integer
                example: 148213
          content:
            application/pdf:
              schema:
                type: string
                format: binary
        '401':
          description: >-
            Учетные данные не переданы. Запросы к путям `/v3/users/*` без
            заголовка `x-api-key` (или токена `Authorization: Bearer`)
            отклоняются промежуточным ПО аутентификации до попадания в API.
          content:
            application/json:
              examples:
                Missing credentials:
                  value:
                    detail: >-
                      You must be authenticated with a valid access token to
                      access this endpoint.
        '403':
          description: >-
            Ошибка авторизации или соответствия критериям. Различайте их по
            строке `detail`:


            - `"You do not have permission to perform this action."` — API-ключ
            недействителен или отозван, либо запрос содержит токен пользователя
            Консоли вместо API-ключа приложения.

            - `"This user has no sessions in review, declined, approved or kyc
            expired to report."` — пользователь существует в вашем приложении,
            но ни одна из его сессий пока не находится в статусе, доступном для
            отчёта (например, все сессии всё ещё `In Progress`, или пользователь
            был создан через `POST /v3/users/create/` и ни разу не проходил
            верификацию). Дождитесь webhook `status.updated`, прежде чем
            запрашивать отчёт.
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
                    example: >-
                      This user has no sessions in review, declined, approved or
                      kyc expired to report.
              examples:
                Invalid credentials:
                  summary: >-
                    Отозванный или недействительный API-ключ либо token
                    пользователя Console
                  value:
                    detail: You do not have permission to perform this action.
                No reportable sessions:
                  summary: >-
                    Пользователь существует, но у него нет сессии со статусом
                    Approved / Declined / In Review / Kyc Expired
                  value:
                    detail: >-
                      This user has no sessions in review, declined, approved or
                      kyc expired to report.
        '404':
          description: >-
            Пользователь с указанным `vendor_data` не существует в приложении,
            привязанном к API-ключу. Пользователи других приложений невидимы для
            этого ключа и возвращают тот же `404`.
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
                    example: User not found.
              examples:
                Unknown user:
                  summary: >-
                    vendor_data не соответствует ни одному пользователю этого
                    приложения
                  value:
                    detail: User not found.
        '429':
          description: >-
            Превышен лимит запросов. Для генерации PDF действует выделенный
            лимит **50 запросов в минуту на учётные данные** (API-ключ,
            Bearer-токен или IP-адрес источника при неаутентифицированных
            запросах), общий для этого endpoint и `GET
            /v3/session/{sessionId}/generate-pdf/`, в дополнение к глобальному
            лимиту 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/users/user-abc-123/generate-pdf/' \
              -H 'x-api-key: YOUR_API_KEY' \
              --output user-history.pdf
        - lang: python
          label: Python
          source: |-
            from 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)
        - 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.users.generatePdf("user-abc-123");

            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.Users.GeneratePDF(ctx, \"user-abc-123\")\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.users().generatePdf("user-abc-123")
                    .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->users->generatePdf('user-abc-123');
            $content->saveTo('download.pdf');
        - lang: ruby
          label: Ruby
          source: |-
            require "didit"

            # Reads DIDIT_API_KEY.
            didit = Didit::Client.new

            content = didit.users.generate_pdf("user-abc-123")
            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.Users.GeneratePdfAsync("user-abc-123");
            await content.SaveToAsync("download.pdf");
components:
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: x-api-key
      description: >-
        API-ключ вашего приложения из раздела «Разработчикам» -> «API-ключи» в
        Business Console. Основной ключ имеет полный доступ. Именованный ключ
        может иметь ограниченную область действия: без доступа, чтение или
        запись для каждого ресурса, ограничение определенными сценариями или
        одобренными сессиями, списком IP-адресов и сроком действия. 401
        означает, что ключ неверен, отозван или его срок действия истек; 403
        означает, что ключ не был передан, у ключа нет доступа к этому ресурсу
        или действию, либо запрос поступил с адреса вне его списка IP-адресов;
        404 на маршруте сессии означает, что сессия не входит в сценарии или
        статусы ключа. Ключ без доступа к медиа получает URL изображений, видео
        и PDF как null, а ключ без прав на запись сессий получает ссылки на
        сессии и токены как null. См. https://docs.didit.me/console/api-keys.

````

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