> ## 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 generare report PDF KYC e KYB

> Genera con Didit report PDF di compliance KYC o KYB tramite GET /v3/session/{id}/generate-pdf/. White label, pronti per audit, prezzi a consumo.



Genera il prompt PDF
        Copia il prompt negli appunti



      
      

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



      
      

Incolla in

## Supporto KYC e KYBFunziona sia per le sessioni di **Verifica degli utenti (KYC)** sia per quelle di **Verifica aziendale (KYB)**. Didit sceglie automaticamente il modello PDF appropriato:- Sessione di Verifica degli utenti (KYC) → report con verifica dell'identità, rilevamento della vitalità, confronto facciale, AML, sezioni POA.
- Sessione di Verifica aziendale (KYB) → report con registro delle imprese, persone chiave (UBO/amministratori), documenti, AML, questionario, telefono, email e sezioni di analisi IP, quando queste funzionalità fanno parte del workflow.Entrambi usano la stessa pipeline di generazione PDF e supportano la personalizzazione White label (logo, URL dell'informativa sulla privacy).## Convenzione per il nome del file| Tipo | Nome del file |
| - | - |
| Utente | `session_<session_id>.pdf` |
| Azienda | `business_<session_id>.pdf` |Viene restituito tramite l'intestazione `Content-Disposition: attachment; filename=...`.## Requisito di statoLa sessione deve trovarsi in `APPROVED`, `DECLINED` o `IN_REVIEW` per generare un PDF. Le sessioni in corso o non ancora avviate restituiscono `403`.## Esempi> [tab] PDF di Verifica degli utenti (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 di Verifica aziendale (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
> ```## White labelQuando per l'applicazione è attiva la personalizzazione White label, il PDF usa il tuo logo e l'URL dell'informativa sulla privacy. Configurala in *Console → Customization*.## PermessoRichiede `read:sessions`. Stessa autorizzazione per entrambi i tipi.## Correlati- [Panoramica delle sessioni](https://docs.didit.me/it/sessions-api/overview.md)
- [Recupero della sessione](https://docs.didit.me/it/sessions-api/retrieve-session.md) — versione JSON della stessa decisione
- [Scarica il PDF della cronologia utente](https://docs.didit.me/it/management-api/users/generate-pdf.md) — tutte le sessioni di un utente incluse nei report
- [Schema della risposta KYB](https://docs.didit.me/it/business-verification/response-schema.md) — campi inclusi nei PDF aziendali


## OpenAPI

````yaml it/openapi-25.json GET /v3/session/{sessionId}/generate-pdf/
openapi: 3.0.0
info:
  version: 3.0.0
  title: Didit Verification API
  description: API di verifica dell'identità. Autenticati con l'intestazione x-api-key.
servers:
  - url: https://verification.didit.me
security: []
tags: []
paths:
  /v3/session/{sessionId}/generate-pdf/:
    get:
      tags:
        - Sessions
      summary: Scarica un report PDF per una sessione di verifica
      description: >-
        Genera ed esegue il download di un report PDF pronto per la compliance
        per una sessione di verifica completata. Lo stesso percorso gestisce sia
        sessioni di Verifica degli utenti (KYC) sia di Verifica aziendale (KYB)
        — il server risolve il `sessionId` per entrambi i tipi di sessione e
        seleziona il modello di report corrispondente.


        **Stati idonei.** La sessione deve avere già uno stato finale o
        revisionabile:


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

        - Sessioni KYB: `Approved`, `Declined` o `In Review`.


        Qualsiasi altro stato (`Not Started`, `In Progress`, `Expired`,
        `Abandoned`, …) restituisce `403` con una stringa `detail` esplicativa —
        consulta la risposta `403` di seguito.


        **Cosa contiene il report.** Il PDF riflette la visualizzazione della
        sessione nella console al momento della richiesta:


        - **KYC** — stato aggregato della sessione, lista degli avvisi e una
        sezione per ciascuna funzionalità eseguita: Verifica dell'identità
        (immagini dei documenti e campi estratti), NFC, Rilevamento della
        vitalità, Confronto facciale, Verifica email, Verifica telefonica, Prova
        di residenza, risposte ai Questionari, Validazione su database,
        Screening AML e Analisi IP — seguiti dai tag della sessione,
        dall'attività di revisione nella console (commenti e cambi di stato) e
        dalla cronologia degli eventi della sessione.

        - **KYB** — verifiche nei registri (dati aziendali), screening AML,
        verifiche dei documenti aziendali, verifiche sulle persone chiave,
        risposte ai questionari, verifiche telefono/email, analisi IP e
        cronologia degli eventi della sessione, seguiti da tag e attività di
        revisione.


        **Personalizzazione del brand.** Se la tua applicazione dispone di
        personalizzazione white label, il report viene generato con il tuo logo
        e i link all'URL della tua informativa sulla privacy; in caso contrario
        include il brand di Didit. I report vengono generati in inglese — non è
        presente un parametro per la lingua.


        **Nessuna memorizzazione nella cache.** Ogni chiamata rigenera il PDF a
        partire dai dati correnti della sessione, pertanto un report generato
        dopo una revisione manuale riflette la decisione del revisore. Due
        chiamate per la stessa sessione possono produrre file con differenze a
        livello di byte — archivia il file scaricato se necessiti di una copia
        immutabile.


        **Latenza.** La generazione scarica ogni immagine archiviata
        (fronte/retro dei documenti, selfie, file aggiuntivi) prima di comporre
        il PDF, quindi le sessioni con molti contenuti multimediali possono
        richiedere diversi secondi. Utilizza un timeout di lettura lato client
        generoso (consigliati 60 s) e trasmetti il corpo in streaming su disco.


        **Barra finale.** Il percorso canonico termina con una barra finale
        (`…/generate-pdf/`). Una richiesta priva della barra viene gestita
        direttamente con la stessa risposta — non viene effettuato alcun
        reindirizzamento `301`, quindi nessun client deve seguire i
        reindirizzamenti e `curl` non necessita di `-L`. Utilizza l'URL con la
        barra come negli esempi.


        Se hai bisogno dei dati sottostanti in formato JSON invece di un report
        generato, usa `GET /v3/session/{sessionId}/decision/`. Per tutte le
        sessioni per cui è possibile generare un report di un utente in un unico
        documento, usa `GET /v3/users/{vendor_data}/generate-pdf/`.
      operationId: get_v3_session_generate_pdf
      parameters:
        - name: sessionId
          in: path
          required: true
          description: >-
            UUID della sessione di Verifica degli utenti (KYC) o Verifica
            aziendale (KYB) da visualizzare — il `session_id` restituito da
            `POST /v3/session/`. Lo stesso percorso funziona per entrambi i tipi
            di sessione; usa il nome file nell'intestazione
            `Content-Disposition` della risposta per verificare quale tipo di
            report hai ricevuto.


            **Deve essere un UUID ben formato e in caratteri minuscoli.** Il
            percorso accetta solo UUID validi, quindi un valore non corretto
            viene rifiutato dal router degli URL prima che venga eseguito il
            codice dell'applicazione e la risposta è una pagina **HTML** `404`
            invece dell'envelope JSON `{"detail": ...}` mostrato sotto. Il
            convertitore di UUID del percorso accetta solo il formato canonico
            in minuscolo — gli UUID esadecimali in maiuscolo vengono rifiutati
            con l'errore HTML 404.
          schema:
            type: string
            format: uuid
            example: 11111111-2222-3333-4444-555555555555
      responses:
        '200':
          description: >-
            Il documento PDF renderizzato, restituito direttamente come binario
            `application/pdf` — non sono presenti wrapper JSON né
            reindirizzamenti tramite URL di download. Il corpo inizia con i byte
            magici `%PDF` (PDF 1.7). Salvalo in un file `.pdf` o trasmettilo in
            streaming al tuo chiamante.
          headers:
            Content-Disposition:
              description: >-
                `attachment; filename=session_{sessionId}.pdf` per le sessioni
                KYC, `attachment; filename=business_{sessionId}.pdf` per le
                sessioni KYB — il prefisso indica quale modello di report è
                stato generato.
              schema:
                type: string
                example: >-
                  attachment;
                  filename=session_11111111-2222-3333-4444-555555555555.pdf
            Content-Length:
              description: >-
                Dimensione totale del PDF in byte; il corpo non è frammentato in
                blocchi.
              schema:
                type: integer
                example: 25191
          content:
            application/pdf:
              schema:
                type: string
                format: binary
        '403':
          description: >-
            Errore di autenticazione, autorizzazione o stato della sessione. Una
            chiave mancante restituisce `403`; una chiave errata, revocata o
            scaduta restituisce `401`. Distingui le modalità di errore tramite
            la stringa `detail`:


            - `"Authentication credentials were not provided or are invalid."` —
            nessuna intestazione `x-api-key` (e nessun token `Authorization:
            Bearer`), oppure la credenziale fornita non ha superato
            l'introspezione (revocata, scaduta o non valida).

            - `"You do not have permission to perform this action."` — la
            credenziale è valida ma non può leggere questa sessione: a un token
            Bearer di un utente della console manca l'autorizzazione
            `read:sessions` o non può accedere all'applicazione proprietaria,
            oppure una chiave API appartiene a un'organizzazione diversa
            rispetto alla sessione.

            - `"You can only generate a PDF for sessions in review, declined,
            approved or kyc expired"` — la sessione KYC esiste ma non è ancora
            in uno stato idoneo (ad esempio `Not Started` o `In Progress`).
            Attendi il webhook `status.updated` prima di richiedere il report.

            - `"You can only generate a PDF for sessions in review, declined or
            approved"` — stessa condizione per le sessioni KYB.


            Nota che per un `sessionId` del tutto sconosciuto l'endpoint
            individua l'applicazione proprietaria prima di convalidare le
            credenziali, quindi una sessione mancante restituisce `404` anche
            quando la credenziale è mancante o non valida.
          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: >-
                    Nessuna intestazione x-api-key, oppure introspezione della
                    chiave non riuscita
                  value:
                    detail: >-
                      Authentication credentials were not provided or are
                      invalid.
                Insufficient permissions:
                  summary: >-
                    Credenziale valida priva di read:sessions o dell'accesso
                    all'applicazione proprietaria
                  value:
                    detail: You do not have permission to perform this action.
                KYC session not finished:
                  summary: Sessione KYC ancora Non avviata / In corso
                  value:
                    detail: >-
                      You can only generate a PDF for sessions in review,
                      declined, approved or kyc expired
                KYB session not finished:
                  summary: Sessione KYB ancora Non avviata / In corso
                  value:
                    detail: >-
                      You can only generate a PDF for sessions in review,
                      declined or approved
        '404':
          description: >-
            Non esiste alcuna sessione attiva con questo `sessionId` — non è mai
            stata creata o è stata eliminata. La risoluzione del proprietario
            avviene prima della convalida delle credenziali, quindi questo `404`
            viene restituito anche per le richieste non autenticate. A seconda
            di quale ricerca non va a buon fine, la stringa `detail` è `"Not
            found."` (il caso più comune) o `"Session not found."`.
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
                    example: Not found.
              examples:
                Unknown session:
                  summary: sessionId non corrisponde ad alcuna sessione KYC o KYB
                  value:
                    detail: Not found.
                Recently deleted session:
                  summary: La sessione è stata eliminata tra una ricerca e l'altra
                  value:
                    detail: Session not found.
        '429':
          description: >-
            Limite di frequenza superato. La generazione di PDF ha un limite
            dedicato di **50 richieste al minuto per credenziale** (chiave API,
            token Bearer o IP di origine se non autenticato), oltre al limite
            globale di 600 richieste GET al minuto. Attendi i secondi indicati
            in `Retry-After` (riportati anche nelle intestazioni
            `X-RateLimit-*`), poi riprova. I report non vengono memorizzati in
            cache lato server, pertanto scarica ciascun report una sola volta e
            archivia il file invece di recuperarlo nuovamente.
          headers:
            Retry-After:
              description: Secondi da attendere prima di riprovare la richiesta.
              schema:
                type: integer
                minimum: 1
                example: 30
            X-RateLimit-Limit:
              description: >-
                Numero massimo di generazioni di PDF consentite nella finestra
                temporale corrente (50).
              schema:
                type: integer
                example: 50
            X-RateLimit-Remaining:
              description: Richieste rimanenti nell'intervallo corrente.
              schema:
                type: integer
                example: 0
            X-RateLimit-Reset:
              description: Timestamp Unix (secondi) in cui la finestra corrente si azzera.
              schema:
                type: integer
                example: 1750000000
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
                    description: >-
                      Spiegazione di facile lettura del superamento del limite
                      di frequenza.
                    example: >-
                      Session PDF generation rate limit exceeded. You can make
                      up to 50 requests per minute.
              examples:
                Throttled:
                  summary: >-
                    Più di 50 generazioni di PDF in un minuto dalla stessa
                    credenziale
                  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 chiave API della tua applicazione, da Developers -> API keys nella
        Business Console. La chiave primaria ha accesso completo. Una chiave con
        nome può avere un ambito definito: nessuno, lettura o scrittura per
        risorsa, limitata ad alcuni workflow o a sessioni approvate, a un elenco
        di indirizzi IP e a una data di scadenza. 401 indica che la chiave è
        errata, revocata o scaduta; 403 indica che non è stata inviata alcuna
        chiave, che la chiave non ha accesso a questa risorsa o azione, oppure
        che la richiesta proviene da un indirizzo non incluso nel suo elenco IP;
        404 su una route di sessione indica che la sessione non rientra nei
        workflow o negli stati previsti dalla chiave. Una chiave senza accesso
        ai media riceve gli URL di immagini, video e PDF come null, e una chiave
        senza permessi di scrittura sulle sessioni riceve link e token di
        sessione come null. Consulta https://docs.didit.me/console/api-keys.

````

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