> ## 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 gerar PDF: relatórios de conformidade KYC e KYB

> Use GET /v3/session/{id}/generate-pdf/ da Didit para baixar relatórios PDF de conformidade de sessões KYC ou KYB, white-label e auditáveis.



Prompt para gerar PDF
        Copiar o prompt para a área de transferência



      
      

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



      
      

Colar em

## Suporte a KYC e KYBFunciona tanto para sessões de **Verificação de Usuário (KYC)** quanto de **Verificação de Empresas (KYB)**. A Didit direciona automaticamente cada sessão ao modelo de PDF adequado:- Sessão de Verificação de Usuário (KYC) → relatório com seções de verificação de identidade, prova de vida, correspondência facial, AML e comprovante de endereço.
- Sessão de Verificação de Empresas (KYB) → relatório com seções de registro de empresas, pessoas-chave (UBOs/administradores), documentos, AML, questionário, telefone, e-mail e análise de IP, quando esses recursos fazem parte do fluxo de verificação (workflow).Ambos usam o mesmo pipeline de geração de PDF e oferecem personalização de marca própria (logotipo, URL da política de privacidade).## Convenção de nomes de arquivo| Tipo | Nome do arquivo |
| - | - |
| Usuário | `session_<session_id>.pdf` |
| Empresa | `business_<session_id>.pdf` |Retornado pelo cabeçalho `Content-Disposition: attachment; filename=...`.## Requisito de statusA sessão precisa estar em `APPROVED`, `DECLINED` ou `IN_REVIEW` para gerar um PDF. Sessões em andamento ou não iniciadas retornam `403`.## Exemplos> [tab] PDF de Verificação de Usuário (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 Verificação 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 própriaQuando a aplicação tem a personalização de marca própria ativada, o PDF usa o seu logotipo e a URL da sua política de privacidade. Configure em *Console → Customization*.## PermissãoRequer `read:sessions`. O mesmo escopo para os dois tipos.## Relacionados- [Visão geral das sessões](https://docs.didit.me/pt-br/sessions-api/overview.md)
- [Obter sessão](https://docs.didit.me/pt-br/sessions-api/retrieve-session.md): versão em JSON da mesma decisão
- [Baixar PDF do histórico do usuário](https://docs.didit.me/pt-br/management-api/users/generate-pdf.md): todas as sessões reportáveis de um usuário em um único arquivo
- [Esquema de resposta KYB](https://docs.didit.me/pt-br/business-verification/response-schema.md): campos incluídos nos PDFs de empresas


## OpenAPI

````yaml pt-br/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 verificação de identidade. Autentique-se com o cabeçalho x-api-key.
servers:
  - url: https://verification.didit.me
security: []
tags: []
paths:
  /v3/session/{sessionId}/generate-pdf/:
    get:
      tags:
        - Sessions
      summary: Baixar um relatório em PDF de uma sessão de verificação
      description: >-
        Gera e baixa um relatório em PDF pronto para conformidade de uma sessão
        de verificação finalizada. O mesmo caminho atende tanto sessões de
        Verificação de usuários (KYC) quanto de Verificação de empresas (KYB): o
        servidor resolve o `sessionId` nos dois tipos de sessão e escolhe o
        modelo de relatório correspondente.


        **Status elegíveis.** A sessão já deve ter um status final ou passível
        de revisão:


        - Sessões KYC: `Approved`, `Declined`, `In Review` ou `Kyc Expired`.

        - Sessões KYB: `Approved`, `Declined` ou `In Review`.


        Qualquer outro status (`Not Started`, `In Progress`, `Expired`,
        `Abandoned`, …) retorna `403` com uma string `detail` explicativa; veja
        a resposta `403` abaixo.


        **O que o relatório contém.** O PDF reproduz a visualização da sessão no
        console no momento da requisição:


        - **KYC**: status consolidado da sessão, a lista de avisos e uma seção
        por recurso executado: Verificação de identidade (imagens do documento e
        campos extraídos), NFC, Prova de vida, Correspondência facial,
        Verificação de e-mail, Verificação de telefone, Comprovante de endereço,
        respostas de Questionários, Validação de banco de dados, Análise AML e
        Análise de IP, seguidas das tags da sessão, da atividade de revisão no
        console (comentários e mudanças de status) e da linha do tempo de
        eventos da sessão.

        - **KYB**: verificações em registros (dados da empresa), análises AML,
        verificações de documentos da empresa, verificações de pessoas-chave,
        respostas de questionários, verificações de telefone/e-mail, análises de
        IP e a linha do tempo de eventos da sessão, seguidas das tags e da
        atividade de revisão.


        **Marca.** Se a sua aplicação tiver personalização de marca própria, o
        relatório é gerado com o seu logotipo e links para a URL da sua política
        de privacidade; caso contrário, ele traz a marca Didit. Os relatórios
        são gerados em inglês; não há parâmetro de idioma.


        **Sem cache.** Cada chamada gera novamente o PDF a partir dos dados
        atuais da sessão, portanto um relatório gerado após uma revisão manual
        reflete a decisão do revisor. Duas chamadas para a mesma sessão podem
        produzir arquivos com bytes diferentes; arquive o arquivo baixado se
        precisar de uma cópia imutável.


        **Latência.** A geração baixa todas as imagens armazenadas (lados do
        documento, selfies, arquivos extras) antes de compor o PDF, portanto
        sessões com muita mídia podem levar vários segundos. Use um tempo limite
        de leitura generoso no cliente (60 s recomendados) e grave o corpo da
        resposta em disco por streaming.


        **Barra final.** A rota canônica termina com uma barra final
        (`…/generate-pdf/`). Uma requisição sem ela é atendida diretamente com a
        mesma resposta: não há redirecionamento `301`, então nenhum cliente
        precisa seguir redirecionamentos e o `curl` não precisa de `-L`. Use a
        URL com barra, como nos exemplos.


        Se você precisar dos dados subjacentes em JSON em vez de um relatório
        gerado, use `GET /v3/session/{sessionId}/decision/`. Para reunir todas
        as sessões reportáveis de um usuário em um único documento, use `GET
        /v3/users/{vendor_data}/generate-pdf/`.
      operationId: get_v3_session_generate_pdf
      parameters:
        - name: sessionId
          in: path
          required: true
          description: >-
            UUID da sessão de Verificação de usuários (KYC) ou de Verificação de
            empresas (KYB) a ser renderizada: o `session_id` retornado por `POST
            /v3/session/`. O mesmo caminho funciona para os dois tipos de
            sessão; use o nome de arquivo do `Content-Disposition` na resposta
            para saber qual tipo de relatório você recebeu.


            **Deve ser um UUID bem formado e em letras minúsculas.** A rota só
            corresponde a UUIDs válidos, então um valor malformado é rejeitado
            pelo roteador de URLs antes de qualquer código da aplicação ser
            executado, e a resposta é uma página **HTML** de `404` em vez do
            envelope JSON `{"detail": ...}` mostrado abaixo. O conversor de UUID
            da rota só corresponde à forma canônica em minúsculas: UUIDs com
            hexadecimais em maiúsculas são rejeitados com o 404 em HTML.
          schema:
            type: string
            format: uuid
            example: 11111111-2222-3333-4444-555555555555
      responses:
        '200':
          description: >-
            O documento PDF renderizado, retornado diretamente como binário
            `application/pdf`: não há wrapper JSON nem indireção por URL de
            download. O corpo começa com os bytes mágicos `%PDF` (PDF 1.7).
            Salve-o em um arquivo `.pdf` ou transmita-o diretamente para quem
            fez a chamada.
          headers:
            Content-Disposition:
              description: >-
                `attachment; filename=session_{sessionId}.pdf` para sessões de
                KYC, `attachment; filename=business_{sessionId}.pdf` para
                sessões de KYB. O prefixo indica qual modelo de relatório foi
                gerado.
              schema:
                type: string
                example: >-
                  attachment;
                  filename=session_11111111-2222-3333-4444-555555555555.pdf
            Content-Length:
              description: >-
                Tamanho total do PDF em bytes; o corpo não é dividido em partes
                (chunked).
              schema:
                type: integer
                example: 25191
          content:
            application/pdf:
              schema:
                type: string
                format: binary
        '403':
          description: >-
            Falha de autenticação, autorização ou de status da sessão. Uma chave
            ausente retorna `403`; uma chave incorreta, revogada ou expirada
            retorna `401`. Diferencie os modos de falha pela string de `detail`:


            - `"Authentication credentials were not provided or are invalid."` —
            não há cabeçalho `x-api-key` (nem token `Authorization: Bearer`), ou
            a credencial fornecida falhou na introspecção (revogada, expirada ou
            malformada).

            - `"You do not have permission to perform this action."` — a
            credencial é válida, mas não pode ler esta sessão: um token Bearer
            de usuário do console não tem a permissão `read:sessions` ou não
            pode acessar a aplicação proprietária, ou uma chave de API pertence
            a uma organização diferente da sessão.

            - `"You can only generate a PDF for sessions in review, declined,
            approved or kyc expired"` — a sessão de KYC existe, mas ainda não
            está em um status elegível (por exemplo, `Not Started` ou `In
            Progress`). Aguarde o webhook `status.updated` antes de solicitar o
            relatório.

            - `"You can only generate a PDF for sessions in review, declined or
            approved"` — a mesma condição para sessões de KYB.


            Observe que, para um `sessionId` totalmente desconhecido, o endpoint
            resolve a aplicação proprietária antes de validar as credenciais;
            portanto, uma sessão inexistente retorna `404` mesmo quando a
            credencial está ausente ou é invá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: >-
                    Cabeçalho x-api-key ausente, ou a chave falhou na
                    introspecção
                  value:
                    detail: >-
                      Authentication credentials were not provided or are
                      invalid.
                Insufficient permissions:
                  summary: >-
                    Credencial válida sem read:sessions ou sem acesso à
                    aplicação proprietária
                  value:
                    detail: You do not have permission to perform this action.
                KYC session not finished:
                  summary: Sessão KYC ainda em 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: Sessão KYB ainda em Not Started / In Progress
                  value:
                    detail: >-
                      You can only generate a PDF for sessions in review,
                      declined or approved
        '404':
          description: >-
            Não existe nenhuma sessão ativa com este `sessionId`: ela nunca foi
            criada ou foi excluída. A identificação do proprietário acontece
            antes da validação das credenciais, então este `404` é retornado
            mesmo para requisições não autenticadas. Dependendo de qual consulta
            falha, a string `detail` é `"Not found."` (o caso mais comum) ou
            `"Session not found."`.
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
                    example: Not found.
              examples:
                Unknown session:
                  summary: sessionId não corresponde a nenhuma sessão de KYC ou KYB
                  value:
                    detail: Not found.
                Recently deleted session:
                  summary: A sessão foi excluída entre as consultas
                  value:
                    detail: Session not found.
        '429':
          description: >-
            Limite de requisições excedido. A geração de PDF tem um limite
            próprio de **50 requisições por minuto por credencial** (chave de
            API, token Bearer ou IP de origem quando não autenticado), além do
            limite global de 600/min para GET. Aguarde `Retry-After` segundos
            (também refletidos nos cabeçalhos `X-RateLimit-*`) e tente
            novamente. Os relatórios não ficam em cache no servidor, então baixe
            cada relatório uma vez e armazene o arquivo em vez de buscá-lo de
            novo.
          headers:
            Retry-After:
              description: Segundos de espera antes de tentar novamente a requisição.
              schema:
                type: integer
                minimum: 1
                example: 30
            X-RateLimit-Limit:
              description: >-
                Número máximo de gerações de PDF permitidas na janela atual
                (50).
              schema:
                type: integer
                example: 50
            X-RateLimit-Remaining:
              description: Requisições restantes na janela atual.
              schema:
                type: integer
                example: 0
            X-RateLimit-Reset:
              description: Timestamp Unix (segundos) em que a janela atual é reiniciada.
              schema:
                type: integer
                example: 1750000000
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
                    description: Explicação legível da violação do limite de requisições.
                    example: >-
                      Session PDF generation rate limit exceeded. You can make
                      up to 50 requests per minute.
              examples:
                Throttled:
                  summary: >-
                    Mais de 50 gerações de PDF em um minuto com a mesma
                    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: >-
        Chave de API da sua aplicação, em Developers -> API keys no Business
        Console. A chave principal tem acesso total. Uma chave nomeada pode ter
        escopo restrito: nenhum acesso, leitura ou escrita por recurso, limitada
        a alguns fluxos ou a sessões aprovadas, a uma lista de endereços IP e a
        uma data de validade. 401 significa que a chave está errada, revogada ou
        expirada; 403 significa que nenhuma chave foi enviada, que a chave não
        tem acesso a este recurso ou ação, ou que a requisição veio de um
        endereço fora da sua lista de IPs; 404 em uma rota de sessão significa
        que a sessão está fora dos fluxos ou status da chave. Uma chave sem
        acesso a mídia recebe URLs de imagem, vídeo e PDF como null, e uma chave
        sem permissão de escrita em sessões recebe links e tokens de sessão como
        null. Consulte https://docs.didit.me/console/api-keys.

````

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