> ## 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 para generar PDF: informes de cumplimiento KYC y KYB

> Descarga informes PDF de cumplimiento de sesiones KYC o KYB con GET /v3/session/{id}/generate-pdf/ de Didit. Marca blanca, listos para auditoría.



Prompt para generar el PDF
        Copiar el prompt al portapapeles



      
      

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



      
      

Pegar en

## Compatibilidad con KYC y KYBFunciona tanto con sesiones de **Verificación de usuario (KYC)** como de **Verificación de empresas (KYB)**. Didit usa automáticamente la plantilla de PDF que corresponde:- Sesión de Verificación de usuario (KYC) → informe con secciones de verificación de identidad, prueba de vida, coincidencia facial, AML y prueba de domicilio.
- Sesión de Verificación de empresas (KYB) → informe con secciones de registro de empresas, personas clave (UBO y cargos directivos), documentos, AML, cuestionario, teléfono, correo electrónico y análisis de IP, cuando esas funciones forman parte del flujo.Ambos usan el mismo proceso de generación de PDF y admiten personalización de marca blanca (logotipo, URL de la política de privacidad).## Convención de nombres de archivo| Tipo | Nombre de archivo |
| - | - |
| Usuario | `session_<session_id>.pdf` |
| Empresa | `business_<session_id>.pdf` |Se devuelve en el encabezado `Content-Disposition: attachment; filename=...`.## Requisito de estadoPara generar un PDF, la sesión debe estar en `APPROVED`, `DECLINED` o `IN_REVIEW`. Las sesiones en curso o que aún no se han iniciado devuelven `403`.## Ejemplos> [tab] PDF de verificación de usuarios (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ón de empresas (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 blancaCuando la aplicación tiene activada la personalización de marca blanca, el PDF usa tu logotipo y la URL de tu política de privacidad. Configúralo en *Console → Customization*.## PermisoRequiere `read:sessions`. Es el mismo scope para ambos tipos.## Relacionado- [Visión general de las sesiones](https://docs.didit.me/es/sessions-api/overview.md)
- [Obtener una sesión](https://docs.didit.me/es/sessions-api/retrieve-session.md): versión JSON de la misma decisión
- [Descargar el PDF del historial de un usuario](https://docs.didit.me/es/management-api/users/generate-pdf.md): todas las sesiones notificables de un usuario, en un único archivo
- [Esquema de respuesta de KYB](https://docs.didit.me/es/business-verification/response-schema.md): campos incluidos en los PDF de empresas


## OpenAPI

````yaml es/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ón de identidad. Autentícate con el encabezado x-api-key.
servers:
  - url: https://verification.didit.me
security: []
tags: []
paths:
  /v3/session/{sessionId}/generate-pdf/:
    get:
      tags:
        - Sessions
      summary: Descargar un informe PDF de una sesión de verificación
      description: >-
        Genera y descarga un informe PDF listo para cumplimiento normativo de
        una sesión de verificación finalizada. La misma ruta sirve tanto para
        sesiones de Verificación de usuarios (KYC) como de Verificación de
        empresas (KYB): el servidor busca el `sessionId` en ambos tipos de
        sesión y elige la plantilla de informe correspondiente.


        **Estados admitidos.** La sesión ya debe tener un estado final o
        revisable:


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

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


        Cualquier otro estado (`Not Started`, `In Progress`, `Expired`,
        `Abandoned`, …) devuelve `403` con una cadena `detail` explicativa;
        consulta la respuesta `403` más abajo.


        **Qué contiene el informe.** El PDF refleja la vista de la sesión en la
        consola en el momento de la solicitud:


        - **KYC**: el estado consolidado de la sesión, la lista de advertencias
        y una sección por cada función ejecutada: Verificación de identidad
        (imágenes del documento y campos extraídos), NFC, Prueba de vida,
        Coincidencia facial, Verificación de correo electrónico, Verificación de
        teléfono, Prueba de domicilio, respuestas del cuestionario, Validación
        de base de datos, Análisis AML y Análisis de IP; seguido de las
        etiquetas de la sesión, la actividad de revisión en la consola
        (comentarios y cambios de estado) y la cronología de eventos de la
        sesión.

        - **KYB**: comprobaciones en el registro (datos de la empresa), análisis
        AML, verificaciones de documentos de la empresa, comprobaciones de
        personas clave, respuestas de cuestionarios, verificaciones de teléfono
        y correo electrónico, análisis de IP y la cronología de eventos de la
        sesión, seguido de las etiquetas y la actividad de revisión.


        **Marca.** Si tu aplicación tiene personalización de marca blanca, el
        informe se genera con tu logotipo y enlaza a la URL de tu política de
        privacidad; de lo contrario, lleva la marca Didit. Los informes se
        generan en inglés: no existe un parámetro de idioma.


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


        **Latencia.** Antes de componer el PDF, la generación descarga todas las
        imágenes almacenadas (caras del documento, selfies, archivos
        adicionales), por lo que las sesiones con mucho contenido multimedia
        pueden tardar varios segundos. Usa un tiempo de espera de lectura
        generoso en el cliente (se recomiendan 60 s) y escribe el cuerpo en
        disco por streaming.


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


        Si necesitas los datos subyacentes en JSON en lugar de un informe
        generado, usa `GET /v3/session/{sessionId}/decision/`. Para obtener
        todas las sesiones con informe de un usuario en un único documento, usa
        `GET /v3/users/{vendor_data}/generate-pdf/`.
      operationId: get_v3_session_generate_pdf
      parameters:
        - name: sessionId
          in: path
          required: true
          description: >-
            UUID de la sesión de Verificación de usuarios (KYC) o Verificación
            de empresas (KYB) que se va a generar: el `session_id` que devuelve
            `POST /v3/session/`. La misma ruta sirve para ambos tipos de sesión;
            usa el nombre de archivo de `Content-Disposition` en la respuesta
            para saber qué tipo de informe recibiste.


            **Debe ser un UUID bien formado y en minúsculas.** La ruta solo
            coincide con UUID válidos, por lo que el enrutador de URL rechaza un
            valor mal formado antes de que se ejecute cualquier código de la
            aplicación, y la respuesta es una página **HTML** `404` en lugar del
            sobre JSON `{"detail": ...}` que se muestra a continuación. El
            conversor de UUID de la ruta solo coincide con la forma canónica en
            minúsculas: los UUID con hexadecimales en mayúsculas se rechazan con
            el 404 en HTML.
          schema:
            type: string
            format: uuid
            example: 11111111-2222-3333-4444-555555555555
      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` (PDF
            1.7). Guárdalo en un archivo `.pdf` o transmítelo directamente a
            quien hizo la llamada.
          headers:
            Content-Disposition:
              description: >-
                `attachment; filename=session_{sessionId}.pdf` para sesiones KYC
                y `attachment; filename=business_{sessionId}.pdf` para sesiones
                KYB: el prefijo indica qué plantilla de informe se generó.
              schema:
                type: string
                example: >-
                  attachment;
                  filename=session_11111111-2222-3333-4444-555555555555.pdf
            Content-Length:
              description: >-
                Tamaño total del PDF en bytes; el cuerpo no se envía en
                fragmentos.
              schema:
                type: integer
                example: 25191
          content:
            application/pdf:
              schema:
                type: string
                format: binary
        '403':
          description: >-
            Fallo de autenticación, autorización o estado de la sesión. Si falta
            la clave, se devuelve `403`; una clave incorrecta, revocada o
            expirada devuelve `401`. Distingue los modos de fallo por la cadena
            de `detail`:


            - `"Authentication credentials were not provided or are invalid."` —
            no hay encabezado `x-api-key` (ni token `Authorization: Bearer`), o
            la credencial proporcionada no superó la introspección (revocada,
            expirada o con formato incorrecto).

            - `"You do not have permission to perform this action."` — la
            credencial es válida, pero no puede leer esta sesión: un token
            Bearer de usuario de la consola no tiene el permiso `read:sessions`
            o no puede acceder a la aplicación propietaria, o una clave de API
            pertenece a una organización distinta de la de la sesión.

            - `"You can only generate a PDF for sessions in review, declined,
            approved or kyc expired"` — la sesión de KYC existe, pero todavía no
            está en un estado apto (por ejemplo, `Not Started` o `In Progress`).
            Espera al webhook `status.updated` antes de solicitar el informe.

            - `"You can only generate a PDF for sessions in review, declined or
            approved"` — la misma condición para las sesiones de KYB.


            Ten en cuenta que, para un `sessionId` totalmente desconocido, el
            endpoint resuelve la aplicación propietaria antes de validar las
            credenciales, por lo que una sesión inexistente devuelve `404`
            incluso cuando la credencial falta o no es 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 el encabezado x-api-key, o la clave no superó la
                    introspección
                  value:
                    detail: >-
                      Authentication credentials were not provided or are
                      invalid.
                Insufficient permissions:
                  summary: >-
                    Credencial válida sin read:sessions o sin acceso a la
                    aplicación propietaria
                  value:
                    detail: You do not have permission to perform this action.
                KYC session not finished:
                  summary: Sesión KYC todavía en Not Started / In Progress
                  value:
                    detail: >-
                      You can only generate a PDF for sessions in review,
                      declined, approved or kyc expired
                KYB session not finished:
                  summary: Sesión KYB todavía en Not Started / In Progress
                  value:
                    detail: >-
                      You can only generate a PDF for sessions in review,
                      declined or approved
        '404':
          description: >-
            No existe ninguna sesión activa con este `sessionId`: nunca se creó
            o se ha eliminado. La resolución del propietario se realiza antes de
            validar las credenciales, por lo que este `404` se devuelve incluso
            en solicitudes no autenticadas. Según qué búsqueda falle, la cadena
            `detail` es `"Not found."` (el caso habitual) o `"Session not
            found."`.
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
                    example: Not found.
              examples:
                Unknown session:
                  summary: sessionId no coincide con ninguna sesión de KYC o KYB
                  value:
                    detail: Not found.
                Recently deleted session:
                  summary: La sesión se eliminó entre una consulta y otra
                  value:
                    detail: Session 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),
            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/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 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.