> ## 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.

# PDF d'historial d'usuari: totes les sessions d'un usuari

> Descarrega un PDF de Didit amb totes les sessions de verificació d'un usuari, per vendor_data, per a auditories, SAR i exportacions periòdiques.



Indicació de PDF de l'historial d'usuari
        Copia el prompt al porta-retalls



      
      

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



      
      

Enganxa a

## Visió generalRetorna un únic PDF amb tot l'historial de verificació d'una [entitat d'usuari](https://docs.didit.me/ca/entities/users/overview.md), identificada per `vendor_data`.
És el mateix document que produeix la Console amb **User detail → Actions → Download PDF**, de manera que els equips de compliment poden automatitzar les exportacions en lloc de fer clic una vegada per cada usuari.L'informe conté:- **Una portada** amb el resum del perfil (nom, data de naixement, estats emissors, correus electrònics i telèfons aprovats), l'estat més recent de cada funcionalitat, els comptadors de sessions i un índex de les sessions incloses.
- **Un informe complet de sessió per cada sessió inclosa**, en ordre cronològic (de la més antiga a la més recent). Cadascun és el mateix informe que retorna [Generar PDF](https://docs.didit.me/ca/sessions-api/generate-pdf.md) per a aquesta sessió individualment.## Sessions elegibles i límitNomés s'inclouen les sessions de verificació d'usuaris (KYC) en estat `Approved`, `Declined`, `In Review` o `Kyc Expired`. Les sessions en qualsevol altre estat (`Not Started`, `In Progress`, `Abandoned`, `Expired`, …) s'ometen.L'informe es limita a les **20 sessions reportables més recents**. Quan un usuari en té més, s'inclouen les 20 més noves i la portada indica quantes sessions més antigues s'han deixat fora. Fes servir [Llistar sessions](https://docs.didit.me/ca/sessions-api/list-sessions.md) amb un filtre per `vendor_data` quan necessitis la llista completa en JSON.## RespostaEl cos de la resposta és el PDF en si (`application/pdf`), no un contenidor JSON ni una URL de descàrrega. La capçalera `Content-Disposition` és `attachment; filename=user_<didit_internal_id>.pdf`, on `didit_internal_id` és l'identificador estable de Didit de l'usuari.## Marca blancaQuan la personalització de marca blanca està activada a la teva aplicació, la portada i cada informe de sessió mostren el teu logotip i l'URL de la política de privacitat en lloc de la marca de Didit, exactament igual que l'endpoint per sessió. Configura-ho a **Console → Customization**.## Memòria cau i latènciaNo es guarda res a la memòria cau: cada crida torna a generar l'informe amb les dades actuals, de manera que un informe sol·licitat després d'una revisió manual reflecteix la decisió del revisor. Dues crides poden produir fitxers amb bytes diferents; arxiva el fitxer descarregat quan necessitis una còpia immutable.La generació és síncrona i descarrega cada imatge emmagatzemada de cada sessió inclosa, de manera que un usuari amb moltes sessions amb molt contingut multimèdia pot trigar desenes de segons. Fes servir un temps de lectura generós al client (es recomanen 120 s) i transmet el cos de la resposta al disc. La generació s'atura en arribar a un límit de temps del servidor, en lloc de continuar fins que el client es rendeixi: si s'arriba a aquest límit, l'informe igualment retorna un PDF vàlid amb les sessions més recents i la portada indica quantes se n'han omès.## Barra finalLa ruta canònica acaba amb una barra final (`…/generate-pdf/`). Una sol·licitud sense la barra final es serveix directament amb la mateixa resposta: no hi ha cap redirecció `301`, de manera que cap client no ha de seguir redireccions i `curl` no necessita `-L`. Fes servir l'URL amb la barra final, tal com als exemples; és la forma que mostren l'especificació OpenAPI i els teus registres.## Errors| Estat | Quan | `detail` |
| - | - | - |
| `401` | No hi ha cap capçalera `x-api-key` (ni cap token `Authorization: Bearer`). | `You must be authenticated with a valid access token to access this endpoint.` |
| `403` | Clau d'API no vàlida o revocada, o un token d'usuari de la Console en lloc d'una clau d'API. | `You do not have permission to perform this action.` |
| `403` | L'usuari existeix però cap de les seves sessions està en un estat reportable. | `This user has no sessions in review, declined, approved or kyc expired to report.` |
| `404` | No hi ha cap usuari amb aquest `vendor_data` a l'aplicació de la clau d'API, inclosos els usuaris que pertanyen a una altra aplicació. | `User not found.` |
| `429` | Més de 50 generacions de PDF per minut des de la mateixa credencial. El límit es comparteix amb [Generar PDF](https://docs.didit.me/ca/sessions-api/generate-pdf.md). Espera tants segons com indiqui `Retry-After`. | `Session PDF generation rate limit exceeded. You can make up to 50 requests per minute.` |## Exemples> [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()));
> ```## PermisosQualsevol clau d'API activa de l'aplicació pot cridar aquest endpoint. Les claus d'API de Didit tenen **abast d'aplicació, no de rol**: els [rols i permisos](https://docs.didit.me/ca/console/roles-permissions.md) de la Console (`read:users` i la resta) decideixen què pot fer una *persona* a la Console, i no s'avaluen per al trànsit de la Management API. Una clau només pot exportar usuaris de la seva pròpia aplicació.## Relacionat- [Generar PDF](https://docs.didit.me/ca/sessions-api/generate-pdf.md): el mateix informe per a una sola sessió
- [Historial KYC de l'usuari](https://docs.didit.me/ca/entities/users/kyc-history.md): llistar i inspeccionar les sessions d'un usuari en JSON
- [Exportar PDF i CSV](https://docs.didit.me/ca/console/export-pdf-csv.md): la vista de la Console per a les dues exportacions
- [Obtenir usuari](https://docs.didit.me/ca/management-api/users/get.md): el perfil de l'usuari i el mapa de funcionalitats en JSON


## OpenAPI

````yaml ca/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ó d'identitat. Autentica't amb la capçalera x-api-key.
servers:
  - url: https://verification.didit.me
security: []
tags: []
paths:
  /v3/users/{vendor_data}/generate-pdf/:
    get:
      tags:
        - Users
      summary: Descarrega l'informe complet en PDF de l'historial de l'usuari
      description: >-
        Renderitza i descarrega un PDF apte per a compliment que conté
        l'historial complet de verificació de l'usuari identificat per
        `vendor_data`. És el mateix document que genera la Console des de **User
        detail → Actions → Download PDF**, de manera que les exportacions
        periòdiques de compliment ja no requereixen que una persona faci clic a
        la Console.


        **Què conté l'informe.** Una portada amb el resum del perfil (nom, data
        de naixement, estats emissors, correus electrònics i telèfons aprovats),
        l'últim estat de cada funcionalitat, els comptadors de sessions i un
        índex de les sessions incloses; seguit de l'informe estàndard de cada
        sessió inclosa, en ordre cronològic (de més antiga a més recent).
        L'informe de cada sessió és el mateix document que retorna `GET
        /v3/session/{sessionId}/generate-pdf/` per a aquesta sessió.


        **Sessions aptes.** Només s'inclouen les sessions de Verificació
        d'usuaris (KYC) en estat `Approved`, `Declined`, `In Review` o `Kyc
        Expired`; les sessions en qualsevol altre estat s'ometen. Si l'usuari no
        té cap sessió en un d'aquests estats, l'endpoint retorna `403` (vegeu
        més avall).


        **Límit.** L'informe està limitat a les **20 sessions notificables més
        recents**. Quan un usuari en té més, s'inclouen les 20 més noves i la
        portada indica quantes sessions més antigues han quedat excloses. Fes
        servir `GET /v3/sessions/?vendor_data=…` per obtenir la llista completa
        en format JSON.


        **Personalització de marca.** Si la teva aplicació té personalització de
        marca blanca, la portada i l'informe de cada sessió es renderitzen amb
        el teu logotip i l'URL de la teva política de privadesa; en cas
        contrari, porten la marca de Didit. Els informes es renderitzen en
        anglès; no hi ha cap paràmetre d'idioma.


        **Sense memòria cau.** Cada crida torna a renderitzar el PDF a partir de
        les dades actuals, de manera que un informe generat després d'una
        revisió manual reflecteix la decisió del revisor. Dues crides per al
        mateix usuari poden produir fitxers diferents byte a byte; arxiva el
        fitxer descarregat si necessites una còpia immutable.


        **Latència.** La renderització és síncrona i descarrega totes les
        imatges emmagatzemades de cada sessió inclosa, de manera que un usuari
        amb moltes sessions amb fitxers multimèdia pot trigar desenes de segons.
        Fes servir un temps d'espera de lectura de client generós (es recomanen
        120 s) i transmet el cos directament al disc. La generació s'atura
        segons un pressupost de temps al servidor en comptes d'executar-se fins
        que el teu client es rendeixi: si s'assoleix aquest pressupost, la
        resposta continua sent un PDF vàlid que conté les sessions més recents,
        i la portada indica quantes se n'han omès.


        **Abast.** L'usuari es resol dins de l'aplicació propietària de la clau
        d'API. Una clau mai no pot exportar un usuari d'una altra aplicació:
        aquest usuari no existeix per a ella i l'endpoint retorna `404`.


        **Barra final.** La ruta canònica acaba amb una barra final
        (`…/generate-pdf/`). Una sol·licitud sense aquesta barra es processa
        directament amb la mateixa resposta; no hi ha cap redirecció `301`, de
        manera que cap client ha de seguir redireccions i `curl` no necessita
        `-L`. Fes servir l'URL amb barra com als exemples.
      operationId: get_user_generate_pdf
      parameters:
        - name: vendor_data
          in: path
          required: true
          schema:
            type: string
          description: >-
            El teu identificador únic per a l'usuari — una cadena de text lliure
            (NO un UUID). És el mateix valor que vas passar com a `vendor_data`
            quan vas crear les sessions de l'usuari, que coincideix exactament
            com s'ha enviat. Codifica'l com a URL; un valor que contingui `/` no
            es pot adreçar mitjançant aquesta ruta.
          example: user-abc-123
      responses:
        '200':
          description: >-
            El document PDF renderitzat, retornat directament com a binari
            `application/pdf`: no hi ha cap contenidor JSON ni cap redirecció
            d'URL de descàrrega. El cos comença amb els bytes màgics `%PDF`.
            Guarda'l en un fitxer `.pdf` o transmet-lo directament a qui fa la
            crida.
          headers:
            Content-Disposition:
              description: >-
                `attachment; filename=user_{didit_internal_id}.pdf` — el fitxer
                rep el nom de l'identificador estable de Didit de l'usuari
                (`didit_internal_id` a `GET /v3/users/{vendor_data}/`), no pas
                de `vendor_data`.
              schema:
                type: string
                example: >-
                  attachment;
                  filename=user_f4e5e1f2-94a9-4f86-8c16-2b7d9b4db418.pdf
            Content-Length:
              description: Mida total del PDF en bytes; el cos no està fragmentat.
              schema:
                type: integer
                example: 148213
          content:
            application/pdf:
              schema:
                type: string
                format: binary
        '401':
          description: >-
            No s'han proporcionat credencials. Les sol·licituds a rutes
            `/v3/users/*` sense una capçalera `x-api-key` (o token
            `Authorization: Bearer`) són rebutjades pel middleware
            d'autenticació abans d'arribar a l'API.
          content:
            application/json:
              examples:
                Missing credentials:
                  value:
                    detail: >-
                      You must be authenticated with a valid access token to
                      access this endpoint.
        '403':
          description: >-
            Fallada d'autorització o d'aptitud. Distingeix les dues mitjançant
            la cadena `detail`:


            - `"You do not have permission to perform this action."` — la clau
            d'API no és vàlida o està revocada, o la sol·licitud porta un token
            d'usuari de la Console en lloc d'una clau d'API d'aplicació.

            - `"This user has no sessions in review, declined, approved or kyc
            expired to report."` — l'usuari existeix a la teva aplicació però
            cap de les seves sessions es troba encara en un estat apte per a
            l'informe (per exemple, totes les sessions encara estan `In
            Progress`, o l'usuari s'ha creat mitjançant `POST /v3/users/create/`
            i no s'ha verificat mai). Espera un webhook `status.updated` abans
            de sol·licitar l'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: >-
                    Clau d'API revocada o no vàlida, o bé un token d'usuari de
                    la Console
                  value:
                    detail: You do not have permission to perform this action.
                No reportable sessions:
                  summary: >-
                    L'usuari existeix però no té cap sessió en estat Aprovada /
                    Rebutjada / En revisió / KYC caducat
                  value:
                    detail: >-
                      This user has no sessions in review, declined, approved or
                      kyc expired to report.
        '404':
          description: >-
            No existeix cap usuari amb el `vendor_data` proporcionat a
            l'aplicació vinculada a la clau d'API. Els usuaris d'altres
            aplicacions són invisibles per a aquesta clau i retornen el mateix
            `404`.
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
                    example: User not found.
              examples:
                Unknown user:
                  summary: vendor_data no coincideix amb cap usuari d'aquesta aplicació
                  value:
                    detail: User not found.
        '429':
          description: >-
            S'ha superat el límit de freqüència. La generació de PDF té un límit
            dedicat de **50 sol·licituds per minut per credencial** (clau d'API,
            token Bearer o IP d'origen si no s'ha autenticat), compartit entre
            aquest endpoint i `GET /v3/session/{sessionId}/generate-pdf/`, a més
            del límit global de GET de 600/min. Espera els segons indicats a
            `Retry-After` (també reflectits a les capçaleres `X-RateLimit-*`) i
            després reintenta-ho. Els informes no s'emmagatzemen a la memòria
            cau del servidor, de manera que és millor descarregar cada informe
            un sol cop i desar el fitxer en comptes de tornar-lo a sol·licitar.
          headers:
            Retry-After:
              description: Segons d'espera abans de reintentar la sol·licitud.
              schema:
                type: integer
                minimum: 1
                example: 30
            X-RateLimit-Limit:
              description: >-
                Nombre màxim de generacions de PDF permeses a la finestra actual
                (50).
              schema:
                type: integer
                example: 50
            X-RateLimit-Remaining:
              description: Sol·licituds restants a la finestra actual.
              schema:
                type: integer
                example: 0
            X-RateLimit-Reset:
              description: >-
                Marca de temps Unix (segons) en què es reinicia la finestra
                actual.
              schema:
                type: integer
                example: 1750000000
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
                    description: >-
                      Explicació fàcil de llegir de la superació del límit de
                      freqüència.
                    example: >-
                      Session PDF generation rate limit exceeded. You can make
                      up to 50 requests per minute.
              examples:
                Throttled:
                  summary: >-
                    Més de 50 generacions de PDF en un minut des de la mateixa
                    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 clau d'API de la teva aplicació, des de Developers -> API keys a la
        Business Console. La clau primària té accés complet. Una clau amb nom
        pot tenir l'abast limitat: cap, lectura o escriptura per recurs,
        limitada a determinats fluxos de treball o a sessions aprovades, a una
        llista d'adreces IP i a una data de caducitat. 401 significa que la clau
        és incorrecta, revocada o caducada; 403 significa que no s'ha enviat cap
        clau, que la clau no té accés a aquest recurs o acció, o que la
        sol·licitud prové d'una adreça fora de la seva llista d'IP; 404 en una
        ruta de sessió significa que la sessió està fora dels fluxos de treball
        o estats de la clau. Una clau sense accés a fitxers multimèdia rep els
        URL d'imatge, vídeo i PDF com a null, i una clau sense permís
        d'escriptura de sessions rep els enllaços de sessió i els tokens com a
        null. Consulta https://docs.didit.me/console/api-keys.

````

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