> ## 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 de PDF del historial de usuario: todas sus sesiones

> Descarga con Didit un PDF con todas las sesiones reportables de un usuario, por vendor_data, para auditorías, SAR y exportaciones de cumplimiento.



Prompt del PDF del historial del usuario
        Copiar el prompt al portapapeles



      
      

\<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>



      
      

Pegar en

## Descripción generalDevuelve un único PDF con el historial completo de verificaciones de una [entidad de usuario](https://docs.didit.me/es/entities/users/overview.md), identificada por `vendor_data`.
Es el mismo documento que genera la Console desde **User detail → Actions → Download PDF**, para que los equipos de cumplimiento automaticen las exportaciones en lugar de hacer clic una vez por cada usuario.El informe contiene:- **Una portada** con el resumen del perfil (nombre, fecha de nacimiento, estados emisores, correos electrónicos y teléfonos aprobados), el último estado de cada función, los contadores de sesiones y un índice de las sesiones incluidas.
- **Un informe de sesión completo por cada sesión incluida**, en orden cronológico (de la más antigua a la más reciente). Cada uno es el mismo informe que [Generar PDF](https://docs.didit.me/es/sessions-api/generate-pdf.md) devuelve para esa sesión por separado.## Sesiones elegibles y límiteSolo se incluyen las sesiones de Verificación de usuarios (KYC) en estado `Approved`, `Declined`, `In Review` o `Kyc Expired`. Las sesiones en cualquier otro estado (`Not Started`, `In Progress`, `Abandoned`, `Expired`, …) se omiten.El informe se limita a las **20 sesiones más recientes** que se pueden incluir. Cuando un usuario tiene más, se incluyen las 20 más recientes y la portada indica cuántas sesiones más antiguas quedaron fuera. Usa [Listar sesiones](https://docs.didit.me/es/sessions-api/list-sessions.md) filtrando por `vendor_data` cuando necesites la lista completa en JSON.## RespuestaEl cuerpo es el propio PDF (`application/pdf`), no un envoltorio JSON ni una URL de descarga. El encabezado `Content-Disposition` es `attachment; filename=user_<didit_internal_id>.pdf`, donde `didit_internal_id` es el identificador estable del usuario en Didit.## Marca blancaCuando la personalización de marca blanca está activada en tu aplicación, la portada y cada informe de sesión llevan tu logotipo y la URL de tu política de privacidad en lugar de la marca Didit, igual que con el endpoint por sesión. Configúrala en **Console → Customization**.## Caché y latenciaNo se almacena nada en caché: cada llamada vuelve a generar el informe a partir de los datos actuales, de modo que un informe solicitado después de una revisión manual refleja la decisión del revisor. Dos llamadas pueden producir archivos que difieran byte a byte; archiva el archivo descargado cuando necesites una copia inmutable.La generación es síncrona y descarga todas las imágenes almacenadas de cada sesión incluida, por lo que la generación del informe de un usuario con muchas sesiones con abundante contenido multimedia puede tardar decenas de segundos. Usa un tiempo de espera de lectura amplio en el cliente (se recomiendan 120 s) y transmite el cuerpo a disco. La generación se detiene al alcanzar un límite de tiempo en el servidor en lugar de continuar hasta que tu cliente se rinda: si se alcanza ese límite, el informe devuelve igualmente un PDF válido con las sesiones más recientes y la portada indica cuántas se omitieron.## Barra finalLa ruta canónica termina con una barra final (`…/generate-pdf/`). Una solicitud sin ella se atiende directamente con la misma respuesta: no hay redirección `301`, así que ningún cliente tiene que seguir redirecciones y `curl` no necesita `-L`. Usa la URL con barra final como en los ejemplos; es la forma que muestran la especificación OpenAPI y tus registros.## Errores| Estado | Cuándo | `detail` |
| - | - | - |
| `401` | No hay encabezado `x-api-key` (ni token `Authorization: Bearer`). | `You must be authenticated with a valid access token to access this endpoint.` |
| `403` | Clave de API no válida o revocada, o un token de usuario de la Console en lugar de una clave de API. | `You do not have permission to perform this action.` |
| `403` | El usuario existe, pero ninguna de sus sesiones está en un estado que se pueda incluir en el informe. | `This user has no sessions in review, declined, approved or kyc expired to report.` |
| `404` | No existe ningún usuario con este `vendor_data` en la aplicación asociada a la clave de API, incluidos los usuarios que pertenecen a otra aplicación. | `User not found.` |
| `429` | Más de 50 generaciones de PDF por minuto con la misma credencial. El límite se comparte con [Generar PDF](https://docs.didit.me/es/sessions-api/generate-pdf.md). Espera los segundos indicados en `Retry-After`. | `Session PDF generation rate limit exceeded. You can make up to 50 requests per minute.` |## Ejemplos> [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()));
> ```## PermisosCualquier clave de API activa de la aplicación puede llamar a este endpoint. Las claves de API de Didit
tienen **alcance de aplicación, no de rol**: los [roles y permisos](https://docs.didit.me/es/console/roles-permissions.md) de la Console
(`read:users` y los demás) determinan lo que una *persona* puede hacer en la Console, y no se tienen en cuenta
para las solicitudes a la Management API. Una clave solo puede exportar usuarios de su propia aplicación.## Páginas relacionadas- [Generar PDF](https://docs.didit.me/es/sessions-api/generate-pdf.md) — el mismo informe para una sola sesión
- [Historial KYC del usuario](https://docs.didit.me/es/entities/users/kyc-history.md) — listar e inspeccionar las sesiones de un usuario en JSON
- [Exportar PDF y CSV](https://docs.didit.me/es/console/export-pdf-csv.md) — ambas exportaciones desde la consola
- [Obtener usuario](https://docs.didit.me/es/management-api/users/get.md) — el perfil del usuario y su mapa de funciones en JSON


## OpenAPI

````yaml es/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 de verificación de identidad. Autentícate con el encabezado x-api-key.
servers:
  - url: https://verification.didit.me
security: []
tags: []
paths:
  /v3/users/{vendor_data}/generate-pdf/:
    get:
      tags:
        - Users
      summary: Descargar el informe PDF con el historial completo del usuario
      description: >-
        Genera y descarga un único PDF listo para cumplimiento con el historial
        completo de verificaciones del usuario identificado por `vendor_data`.
        Es el mismo documento que genera la consola desde **User detail →
        Actions → Download PDF**, así que las exportaciones periódicas de
        cumplimiento ya no requieren que una persona haga clic en la consola.


        **Qué contiene el informe.** Una portada con el resumen del perfil
        (nombre, fecha de nacimiento, estados emisores, correos electrónicos y
        teléfonos aprobados), el último estado de cada función, los contadores
        de sesiones y un índice de las sesiones incluidas, seguida del informe
        estándar de cada sesión incluida, en orden cronológico (de la más
        antigua a la más reciente). El informe de cada sesión es el mismo
        documento que devuelve `GET /v3/session/{sessionId}/generate-pdf/` para
        esa sesión.


        **Sesiones incluidas.** Solo se incluyen las sesiones de Verificación de
        usuarios (KYC) en estado `Approved`, `Declined`, `In Review` o `Kyc
        Expired`; las sesiones en cualquier otro estado se omiten. Si el usuario
        no tiene ninguna sesión en uno de esos estados, el endpoint devuelve
        `403` (consulta más abajo).


        **Límite.** El informe incluye como máximo las **20 sesiones más
        recientes** que se pueden incluir. Si un usuario tiene más, se incluyen
        las 20 más recientes y la portada indica cuántas sesiones anteriores
        quedaron fuera. Usa `GET /v3/sessions/?vendor_data=…` para obtener la
        lista completa en JSON.


        **Marca.** Si tu aplicación tiene personalización de marca blanca, la
        portada y cada informe de sesión se generan con tu logotipo y la URL de
        tu política de privacidad; de lo contrario, llevan la marca de Didit.
        Los informes se generan en inglés: no hay ningún parámetro de idioma.


        **Sin caché.** Cada llamada vuelve a generar el PDF a partir de los
        datos actuales, por lo que un informe generado después de una revisión
        manual refleja la decisión del revisor. Dos llamadas para el mismo
        usuario pueden producir archivos distintos a nivel de bytes: archiva el
        archivo descargado si necesitas una copia inmutable.


        **Latencia.** La generación es síncrona y descarga todas las imágenes
        almacenadas de cada sesión incluida, así que un usuario con muchas
        sesiones con gran cantidad de contenido multimedia puede tardar decenas
        de segundos. Usa un tiempo de espera de lectura generoso en el cliente
        (se recomiendan 120 s) y escribe el cuerpo en disco mediante streaming.
        La generación se detiene al alcanzar un límite de tiempo en el servidor,
        en lugar de continuar hasta que tu cliente se rinda: si se alcanza ese
        límite, la respuesta sigue siendo un PDF válido con las sesiones más
        recientes y la portada indica cuántas se omitieron.


        **Alcance.** El usuario se busca dentro de la aplicación propietaria de
        la clave de API. Una clave nunca puede exportar un usuario de otra
        aplicación: para ella, ese usuario no existe y el endpoint devuelve
        `404`.


        **Barra final.** La ruta canónica termina con una barra final
        (`…/generate-pdf/`). Una solicitud sin ella se atiende directamente con
        la misma respuesta: no hay redirección `301`, así que ningún cliente
        tiene que seguir redirecciones y `curl` no necesita `-L`. Usa la URL con
        barra, como en los ejemplos.
      operationId: get_user_generate_pdf
      parameters:
        - name: vendor_data
          in: path
          required: true
          schema:
            type: string
          description: >-
            Tu identificador único del usuario: una cadena de texto libre (NO un
            UUID). Es el mismo valor que enviaste como `vendor_data` al crear
            las sesiones del usuario, y se compara exactamente tal como se
            envía. Codifícalo para URL; un valor que contenga `/` no se puede
            usar con esta ruta.
          example: user-abc-123
      responses:
        '200':
          description: >-
            El documento PDF generado, devuelto directamente como binario
            `application/pdf`: no hay envoltorio JSON ni redirección a una URL
            de descarga. El cuerpo empieza con los bytes mágicos `%PDF`.
            Guárdalo en un archivo `.pdf` o transmítelo directamente a quien
            hizo la llamada.
          headers:
            Content-Disposition:
              description: >-
                `attachment; filename=user_{didit_internal_id}.pdf`: el archivo
                lleva el nombre del identificador estable de Didit del usuario
                (`didit_internal_id` en `GET /v3/users/{vendor_data}/`), no el
                de `vendor_data`.
              schema:
                type: string
                example: >-
                  attachment;
                  filename=user_f4e5e1f2-94a9-4f86-8c16-2b7d9b4db418.pdf
            Content-Length:
              description: >-
                Tamaño total del PDF en bytes; el cuerpo no se envía en
                fragmentos.
              schema:
                type: integer
                example: 148213
          content:
            application/pdf:
              schema:
                type: string
                format: binary
        '401':
          description: >-
            No se proporcionaron credenciales. El middleware de autenticación
            rechaza las solicitudes a rutas `/v3/users/*` sin un encabezado
            `x-api-key` (o un token `Authorization: Bearer`) antes de que
            lleguen a la API.
          content:
            application/json:
              examples:
                Missing credentials:
                  value:
                    detail: >-
                      You must be authenticated with a valid access token to
                      access this endpoint.
        '403':
          description: >-
            Error de autorización o de elegibilidad. Distingue ambos casos por
            la cadena `detail`:


            - `"You do not have permission to perform this action."`: la clave
            de API no es válida o se revocó, o la solicitud incluye un token de
            usuario de la Console en lugar de una clave de API de la aplicación.

            - `"This user has no sessions in review, declined, approved or kyc
            expired to report."`: el usuario existe en tu aplicación, pero
            ninguna de sus sesiones está todavía en un estado que permita
            generar el informe (por ejemplo, todas las sesiones siguen en `In
            Progress`, o el usuario se creó mediante `POST /v3/users/create/` y
            nunca se ha verificado). Espera un webhook `status.updated` antes de
            solicitar el informe.
          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: >-
                    Clave de API revocada o no válida, o un token de usuario de
                    la Console
                  value:
                    detail: You do not have permission to perform this action.
                No reportable sessions:
                  summary: >-
                    El usuario existe, pero no tiene ninguna sesión Aprobada /
                    Rechazada / En revisión / KYC expirado
                  value:
                    detail: >-
                      This user has no sessions in review, declined, approved or
                      kyc expired to report.
        '404':
          description: >-
            No existe ningún usuario con el `vendor_data` proporcionado en la
            aplicación asociada a la clave de API. Los usuarios de otras
            aplicaciones no son visibles para esta clave y devuelven el mismo
            `404`.
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
                    example: User not found.
              examples:
                Unknown user:
                  summary: >-
                    vendor_data no coincide con ningún usuario de esta
                    aplicación
                  value:
                    detail: User not found.
        '429':
          description: >-
            Límite de solicitudes superado. La generación de PDF tiene un límite
            propio de **50 solicitudes por minuto por credencial** (clave de
            API, token Bearer o IP de origen cuando no hay autenticación),
            compartido entre este endpoint y `GET
            /v3/session/{sessionId}/generate-pdf/`, además del límite global de
            600 GET por minuto. Espera los segundos indicados en `Retry-After`
            (también reflejados en los encabezados `X-RateLimit-*`) y luego
            reintenta. Los informes no se almacenan en caché en el servidor, así
            que descarga cada informe una sola vez y guarda el archivo en lugar
            de volver a solicitarlo.
          headers:
            Retry-After:
              description: Segundos que hay que esperar antes de reintentar la solicitud.
              schema:
                type: integer
                minimum: 1
                example: 30
            X-RateLimit-Limit:
              description: >-
                Número máximo de generaciones de PDF permitidas en la ventana
                actual (50).
              schema:
                type: integer
                example: 50
            X-RateLimit-Remaining:
              description: Solicitudes restantes en la ventana actual.
              schema:
                type: integer
                example: 0
            X-RateLimit-Reset:
              description: >-
                Marca de tiempo Unix (segundos) en que se restablece la ventana
                actual.
              schema:
                type: integer
                example: 1750000000
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
                    description: >-
                      Explicación legible de la superación del límite de
                      solicitudes.
                    example: >-
                      Session PDF generation rate limit exceeded. You can make
                      up to 50 requests per minute.
              examples:
                Throttled:
                  summary: >-
                    Más de 50 generaciones de PDF en un minuto con la misma
                    credencial
                  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: >-
        La clave de API de tu aplicación, que encontrarás en Developers -> API
        keys en la Business Console. La clave principal tiene acceso completo.
        Una clave con nombre puede tener un alcance limitado: ninguno, lectura o
        escritura por recurso, limitada a algunos flujos o a sesiones aprobadas,
        a una lista de direcciones IP y a una fecha de caducidad. 401 significa
        que la clave es incorrecta, se revocó o expiró; 403 significa que no se
        envió ninguna clave, que la clave no tiene acceso a este recurso o
        acción, o que la solicitud provino de una dirección fuera de su lista de
        IP; 404 en una ruta de sesión significa que la sesión está fuera de los
        flujos o estados de la clave. Una clave sin acceso a contenido
        multimedia recibe las URL de imágenes, videos y PDF como null, y una
        clave sin permiso de escritura en sesiones recibe los enlaces y tokens
        de sesión como null. Consulta https://docs.didit.me/console/api-keys.

````

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