> ## 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 per generar PDF: informes de compliment KYC i KYB

> Descarrega informes de compliment en PDF de sessions KYC o KYB amb GET /v3/session/{id}/generate-pdf/ de Didit. Marca blanca i preu per ús.



Prompt per generar el PDF
        Copia el prompt al porta-retalls



      
      

\<pre>

\`Download an audit-ready PDF report for a finished Didit verification session.

Endpoint:
GET https://verification.didit.me/v3/session/{session_id}/generate-pdf/

Authentication:
Use the x-api-key header with your Didit API key (or a user-auth token). Privilege: read:sessions.

Path parameter:
\- session_id (UUID) — works for both User Verification (KYC) and Business Verification (KYB) sessions. Didit routes to the correct template automatically.

Prerequisites:
\- Session status must be one of "Approved", "Declined", "In Review". Any other status returns 403.
\- Session must belong to the authenticated application — cross-application reads return 404.

curl example — save the PDF to disk:
curl https://verification.didit.me/v3/session/<SESSION_ID>/generate-pdf/ \
-H "x-api-key: <API_KEY>" \
-o report.pdf

Response:
\- Body is binary (application/pdf). DO NOT parse as JSON.
\- Content-Type: application/pdf
\- Content-Disposition: attachment; filename=session_<session_id>.pdf for KYC sessions, business_<session_id>.pdf for KYB sessions.
\- Typical wall time ~1-3s (server-side WeasyPrint rendering).

Template contents:
\- KYC PDF: Identity (OCR), Liveness, Face Match, AML, POA, IP analysis, reviews, events.
\- KYB PDF: Company registry data, officers, beneficial owners (UBOs), KYB documents, AML hits, questionnaires, phone verification, email verification, IP analysis, reviews, events.

White-label:
If white-label customization is enabled on your application, the PDF uses your logo and privacy-policy URL. Configure at Console → Customization.

Failure modes:
\- 401 — invalid credentials.
\- 403 — { "detail": "You do not have permission to perform this action." } when the key lacks read:sessions OR when the session is in a non-printable status (Not Started, In Progress, Expired, Abandoned, Kyc Expired, Resubmitted, Awaiting User).
\- 404 — { "detail": "Not found." } when the session is not visible to this application.

Idempotency & cost:
Safe to retry — generation is read-only. Counts against the standard rate limit.

When to call:
\- Compliance archives (regulator submissions, internal audit binders).
\- Customer support replies (proof of decision for a specific session).
\- After approve / decline via /sessions-api/update-status — render and store the resulting PDF.
\- For every session of one user in a single file, use GET /v3/users/{vendor_data}/generate-pdf/ instead (see /management-api/users/generate-pdf).

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

\</pre>



      
      

Enganxa a

## Suport per a KYC i KYBFunciona tant per a sessions de **Verificació d'usuaris (KYC)** com de **Verificació d'empreses (KYB)**. Didit selecciona automàticament la plantilla de PDF adequada:- Sessió de Verificació d'usuaris (KYC): informe amb les seccions de verificació d'identitat, prova de vida, coincidència facial, AML i comprovant de domicili.
- Sessió de Verificació d'empreses (KYB): informe amb les seccions de registre mercantil, persones clau (UBOs i directius), documents, AML, qüestionari, telèfon, correu electrònic i anàlisi d'IP, quan aquestes funcionalitats formen part del flux de treball.Tots dos utilitzen el mateix procés de generació de PDF i admeten la personalització amb marca blanca (logotip i URL de la política de privadesa).## Convenció de noms de fitxer| Tipus | Nom de fitxer |
| - | - |
| Usuari | `session_<session_id>.pdf` |
| Empresa | `business_<session_id>.pdf` |Es retorna mitjançant la capçalera `Content-Disposition: attachment; filename=...`.## Requisit d'estatLa sessió ha d'estar en `APPROVED`, `DECLINED` o `IN_REVIEW` per generar un PDF. Les sessions en curs o no iniciades retornen `403`.## Exemples> [tab] PDF de Verificació d'usuaris (KYC)
>
> ```bash theme={null}
> curl https://verification.didit.me/v3/session/4c5c7f3a-.../generate-pdf/ \
>   -H "x-api-key: YOUR_API_KEY" \
>   -o kyc-report.pdf
> ```> [tab] PDF de Verificació d'empreses (KYB)
>
> ```bash theme={null}
> curl https://verification.didit.me/v3/session/bs-01HJX1.../generate-pdf/ \
>   -H "x-api-key: YOUR_API_KEY" \
>   -o kyb-report.pdf
> ```## Marca blancaQuan l'aplicació té activada la personalització amb marca blanca, el PDF utilitza el teu logotip i la URL de la política de privadesa. Configura-ho a *Console → Customization*.## PermísRequereix `read:sessions`. El mateix àmbit per als dos tipus.## Relacionats- [Visió general de les sessions](https://docs.didit.me/ca/sessions-api/overview.md)
- [Recuperar una sessió](https://docs.didit.me/ca/sessions-api/retrieve-session.md): la versió en JSON de la mateixa decisió
- [Descarregar el PDF de l'historial de l'usuari](https://docs.didit.me/ca/management-api/users/generate-pdf.md): totes les sessions d'un usuari que es poden incloure en un informe en un únic fitxer
- [Esquema de resposta de KYB](https://docs.didit.me/ca/business-verification/response-schema.md): camps inclosos als PDF d'empresa


## OpenAPI

````yaml ca/openapi-25.json GET /v3/session/{sessionId}/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/session/{sessionId}/generate-pdf/:
    get:
      tags:
        - Sessions
      summary: Descarrega un informe en PDF d'una sessió de verificació
      description: >-
        Genera i descarrega un informe en PDF preparat per al compliment
        normatiu per a una sessió de verificació finalitzada. La mateixa ruta
        serveix tant per a sessions de Verificació d'usuaris (KYC) com de
        Verificació d'empreses (KYB): el servidor resol el `sessionId` per a
        tots dos tipus de sessió i tria la plantilla d'informe corresponent.


        **Estats aptes.** La sessió ja ha de tenir un estat final o revisable:


        - Sessions de KYC: `Approved`, `Declined`, `In Review` o `Kyc Expired`.

        - Sessions de KYB: `Approved`, `Declined` o `In Review`.


        Qualsevol altre estat (`Not Started`, `In Progress`, `Expired`,
        `Abandoned`, …) retorna `403` amb una cadena de text explicativa a
        `detail` — consulta la resposta `403` més avall.


        **Què conté l'informe.** El PDF reflecteix la vista de la sessió a la
        consola en el moment de la sol·licitud:


        - **KYC** — estat agregat de la sessió, la llista d'advertències i una
        secció per cada funcionalitat executada: Verificació d'identitat
        (imatges del document més camps extrets), NFC, Prova de vida,
        Coincidència facial, Verificació de correu electrònic, Verificació de
        telèfon, Comprovant de domicili, respostes dels Qüestionaris, Validació
        en bases de dades, Cribratge AML i Anàlisi d'IP — seguit de les
        etiquetes de la sessió, l'activitat de revisió a la consola (comentaris
        i canvis d'estat) i el cronograma d'esdeveniments de la sessió.

        - **KYB** — comprovacions de registres (dades de l'empresa), cribratges
        AML, verificacions de documents d'empresa, comprovacions de persones
        clau, respostes de qüestionaris, verificacions de telèfon/correu
        electrònic, anàlisis d'IP i el cronograma d'esdeveniments de la sessió,
        seguit de les etiquetes i l'activitat de revisió.


        **Personalització de marca.** Si la teva aplicació disposa de
        personalització de marca blanca, l'informe es genera amb el teu logotip
        i enllaços a la teva URL de política de privadesa; altrament, porta la
        marca de Didit. Els informes es generen en anglès — no hi ha paràmetre
        d'idioma.


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


        **Latència.** La generació descarrega cada imatge emmagatzemada (cares
        del document, selfies, fitxers addicionals) abans de compondre el PDF,
        per la qual cosa les sessions amb molt contingut multimèdia poden trigar
        diversos segons. Utilitza un temps d'espera de lectura generós al client
        (es recomanen 60 s) i desa el cos en flux al disc.


        **Barra inclinada final.** La ruta canònica acaba amb una barra
        inclinada al final (`…/generate-pdf/`). Una sol·licitud sense aquesta
        barra es respon directament amb la mateixa resposta — no hi ha
        redirecció `301`, de manera que cap client ha de seguir redireccions i
        `curl` no necessita `-L`. Utilitza la URL amb la barra inclinada tal com
        es mostra als exemples.


        Si necessites les dades subjacents en format JSON en lloc d'un informe
        generat, utilitza `GET /v3/session/{sessionId}/decision/`. Per a totes
        les sessions reportables d'un sol usuari en un únic document, utilitza
        `GET /v3/users/{vendor_data}/generate-pdf/`.
      operationId: get_v3_session_generate_pdf
      parameters:
        - name: sessionId
          in: path
          required: true
          description: >-
            UUID de la sessió de Verificació d'usuaris (KYC) o de Verificació
            d'empreses (KYB) que cal renderitzar: el `session_id` retornat per
            `POST /v3/session/`. La mateixa ruta funciona per a tots dos tipus
            de sessió; fes servir el nom de fitxer de `Content-Disposition` a la
            resposta per saber quin tipus d'informe has rebut.


            **Ha de ser un UUID en minúscules i ben format.** La ruta només
            coincideix amb UUID vàlids, de manera que el router d'URL rebutja
            qualsevol valor mal format abans que s'executi el codi de
            l'aplicació i la resposta és una pàgina **HTML** `404` en comptes de
            l'embolcall JSON `{"detail": ...}` que es mostra a continuació. El
            convertidor d'UUID de la ruta només coincideix amb la forma canònica
            en minúscules; els UUID en hexadecimals en majúscules es rebutgen
            amb l'HTML 404.
          schema:
            type: string
            format: uuid
            example: 11111111-2222-3333-4444-555555555555
      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` (PDF
            1.7). Guarda'l en un fitxer `.pdf` o transmet-lo directament a qui
            fa la crida.
          headers:
            Content-Disposition:
              description: >-
                `attachment; filename=session_{sessionId}.pdf` per a sessions de
                KYC, `attachment; filename=business_{sessionId}.pdf` per a
                sessions de KYB; el prefix t'indica quina plantilla d'informe
                s'ha renderitzat.
              schema:
                type: string
                example: >-
                  attachment;
                  filename=session_11111111-2222-3333-4444-555555555555.pdf
            Content-Length:
              description: Mida total del PDF en bytes; el cos no està fragmentat.
              schema:
                type: integer
                example: 25191
          content:
            application/pdf:
              schema:
                type: string
                format: binary
        '403':
          description: >-
            Fallada d'autenticació, d'autorització o d'estat de la sessió. Si
            falta la clau es retorna `403`; una clau incorrecta, revocada o
            caducada retorna `401`. Distingeix els modes de fallada mitjançant
            la cadena `detail`:


            - `"Authentication credentials were not provided or are invalid."` —
            no hi ha capçalera `x-api-key` (i cap token `Authorization:
            Bearer`), o la credencial proporcionada no ha superat la
            introspecció (revocada, caducada o mal formada).

            - `"You do not have permission to perform this action."` — la
            credencial és vàlida però no pot llegir aquesta sessió: un token
            Bearer d'usuari de la Console no té el permís `read:sessions` o no
            pot accedir a l'aplicació propietària, o una clau d'API pertany a
            una organització diferent de la de la sessió.

            - `"You can only generate a PDF for sessions in review, declined,
            approved or kyc expired"` — la sessió de KYC existeix però encara no
            està en un estat apte (per exemple `Not Started` o `In Progress`).
            Espera el webhook `status.updated` abans de sol·licitar l'informe.

            - `"You can only generate a PDF for sessions in review, declined or
            approved"` — mateixa condició per a sessions de KYB.


            Tingues en compte que per a un `sessionId` completament desconegut
            l'endpoint resol l'aplicació propietària abans de validar les
            credencials, de manera que una sessió que no existeix retorna `404`
            fins i tot quan la credencial falta o no és vàlida.
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
                    example: >-
                      You can only generate a PDF for sessions in review,
                      declined, approved or kyc expired
              examples:
                Missing or invalid credentials:
                  summary: >-
                    Falta la capçalera x-api-key, o la clau ha fallat la
                    introspecció
                  value:
                    detail: >-
                      Authentication credentials were not provided or are
                      invalid.
                Insufficient permissions:
                  summary: >-
                    Credencial vàlida sense read:sessions o sense accés a
                    l'aplicació propietària
                  value:
                    detail: You do not have permission to perform this action.
                KYC session not finished:
                  summary: Sessió de KYC encara No iniciada / En curs
                  value:
                    detail: >-
                      You can only generate a PDF for sessions in review,
                      declined, approved or kyc expired
                KYB session not finished:
                  summary: Sessió de KYB encara No iniciada / En curs
                  value:
                    detail: >-
                      You can only generate a PDF for sessions in review,
                      declined or approved
        '404':
          description: >-
            No existeix cap sessió activa amb aquest `sessionId` — no es va
            crear mai o s'ha suprimit. La resolució del propietari es fa abans
            de la validació de les credencials, de manera que aquest `404` es
            retorna fins i tot per a sol·licituds no autenticades. Depenent de
            quina cerca falli, la cadena `detail` és `"Not found."` (el cas
            habitual) o `"Session not found."`.
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
                    example: Not found.
              examples:
                Unknown session:
                  summary: sessionId no coincideix amb cap sessió de KYC o KYB
                  value:
                    detail: Not found.
                Recently deleted session:
                  summary: La sessió s'ha suprimit entre les cerques
                  value:
                    detail: Session 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), 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/session/11111111-2222-3333-4444-555555555555/generate-pdf/ \
              -H 'x-api-key: YOUR_API_KEY' \
              --output report.pdf
        - lang: python
          label: Python
          source: |-
            from didit import Didit

            # Reads DIDIT_API_KEY.
            client = Didit()

            content = client.sessions.generate_pdf(
                "11111111-2222-3333-4444-555555555555",
            )
            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.sessions.generatePdf("11111111-2222-3333-4444-555555555555");

            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.Sessions.GeneratePDF(ctx, \"11111111-2222-3333-4444-555555555555\")\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.sessions().generatePdf("11111111-2222-3333-4444-555555555555")
                    .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->sessions->generatePdf('11111111-2222-3333-4444-555555555555');

            $content->saveTo('download.pdf');
        - lang: ruby
          label: Ruby
          source: >-
            require "didit"


            # Reads DIDIT_API_KEY.

            didit = Didit::Client.new


            content =
            didit.sessions.generate_pdf("11111111-2222-3333-4444-555555555555")

            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.Sessions.GeneratePdfAsync("11111111-2222-3333-4444-555555555555");

            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.