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

> Descarregue relatórios PDF de KYC ou KYB com marca branca, prontos para auditoria, via GET /v3/session/{id}/generate-pdf/ na Didit.



Gerar prompt de 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 utilizadores (KYC)** como de **Verificação de empresas (KYB)**. A Didit encaminha automaticamente para o modelo de PDF adequado:- Sessão de Verificação de utilizadores (KYC) → relatório com as secções de verificação de identidade, prova de vida, correspondência facial, AML e comprovativo de morada.
- Sessão de Verificação de empresas (KYB) → relatório com as secções de registo de empresas, pessoas-chave (beneficiários efetivos/administradores), documentos, AML, questionário, telefone, e-mail e análise de IP, quando essas funcionalidades fazem parte do fluxo.Ambos usam o mesmo pipeline de geração de PDF e suportam personalização em marca branca (logótipo, URL da política de privacidade).## Convenção de nomes de ficheiros| Tipo | Nome do ficheiro |
| - | - |
| Utilizador | `session_<session_id>.pdf` |
| Empresa | `business_<session_id>.pdf` |É devolvido através do cabeçalho `Content-Disposition: attachment; filename=...`.## Requisito de estadoA sessão tem de estar em `APPROVED`, `DECLINED` ou `IN_REVIEW` para gerar um PDF. Sessões em curso ou não iniciadas devolvem `403`.## Exemplos> [tab] PDF de Verificação de utilizadores (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 brancaQuando a aplicação tem a personalização em marca branca ativada, o PDF usa o seu logótipo e o URL da política de privacidade. Configure em *Consola → Personalização*.## PermissãoRequer `read:sessions`. O mesmo âmbito para ambos os tipos.## Conteúdos relacionados- [Visão geral das sessões](https://docs.didit.me/pt/sessions-api/overview.md)
- [Obter sessão](https://docs.didit.me/pt/sessions-api/retrieve-session.md) — versão em JSON da mesma decisão
- [Transferir PDF do histórico do utilizador](https://docs.didit.me/pt/management-api/users/generate-pdf.md) — todas as sessões reportáveis de um utilizador num único ficheiro
- [Esquema de resposta KYB](https://docs.didit.me/pt/business-verification/response-schema.md) — campos incluídos nos PDFs de empresas


## OpenAPI

````yaml pt/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: Descarregar um relatório PDF de uma sessão de verificação
      description: >-
        Renderize e descarregue um relatório em PDF pronto para conformidade de
        uma sessão de verificação terminada. O mesmo caminho serve tanto sessões
        de Verificação de utilizadores (KYC) como de Verificação de empresas
        (KYB) — o servidor resolve o `sessionId` para ambos os tipos de sessão e
        escolhe o modelo de relatório correspondente.


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


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

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


        Qualquer outro estado (`Not Started`, `In Progress`, `Expired`,
        `Abandoned`, …) devolve `403` com uma cadeia explicativa `detail` —
        consulte a resposta `403` abaixo.


        **O que o relatório contém.** O PDF reflete a vista da sessão na consola
        no momento do pedido:


        - **KYC** — o estado agregado da sessão, a lista de avisos e uma secção
        por funcionalidade executada: 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, Comprovativo de
        morada, respostas aos Questionários, Validação de base de dados, Triagem
        AML e Análise de IP — seguidos pelas etiquetas da sessão, atividade de
        revisão na consola (comentários e alterações de estado) e cronologia de
        eventos da sessão.

        - **KYB** — verificações no registo de empresas (dados da empresa),
        triagens AML, verificações de documentos da empresa, verificações de
        pessoas-chave, respostas a questionários, verificações de
        telefone/e-mail, análises de IP e a cronologia de eventos da sessão,
        seguidas pelas etiquetas e atividade de revisão.


        **Marca.** Se a sua aplicação tiver personalização de marca branca, o
        relatório é renderizado com o seu logótipo e ligações para o URL da sua
        política de privacidade; caso contrário, inclui a marca Didit. Os
        relatórios são renderizados em inglês — não existe parâmetro de idioma.


        **Sem colocação em cache.** Cada chamada volta a renderizar o PDF a
        partir dos dados atuais da sessão, pelo que 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 ficheiros com bytes diferentes — arquive o
        ficheiro descarregado se precisar de uma cópia imutável.


        **Latência.** A renderização descarrega todas as imagens armazenadas
        (frentes e versos de documentos, selfies, ficheiros adicionais) antes de
        compor o PDF, pelo que sessões com muitos ficheiros multimédia podem
        demorar vários segundos. Utilize um tempo limite de leitura no cliente
        generoso (60 s recomendado) e faça o streaming do corpo para o disco.


        **Barra final.** O caminho canónico termina com uma barra final
        (`…/generate-pdf/`). Um pedido sem ela é processado diretamente com a
        mesma resposta — não há redirecionamento `301`, pelo que nenhum cliente
        precisa de seguir redirecionamentos e o `curl` não necessita de `-L`.
        Utilize o URL com barra como nos exemplos.


        Se precisar dos dados subjacentes em JSON em vez de um relatório
        renderizado, utilize `GET /v3/session/{sessionId}/decision/`. Para obter
        todas as sessões passíveis de relatório de um utilizador num único
        documento, utilize `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 utilizadores (KYC) ou de
            Verificação de empresas (KYB) a gerar — o `session_id` devolvido por
            `POST /v3/session/`. O mesmo caminho funciona para ambos os tipos de
            sessão; utilize o nome de ficheiro em `Content-Disposition` na
            resposta para saber que tipo de relatório recebeu.


            **Tem de ser um UUID bem formatado e em minúsculas.** A rota apenas
            aceita UUIDs válidos, pelo que um valor mal formatado é rejeitado
            pelo router de URLs antes de qualquer código da aplicação ser
            executado, e a resposta é uma página **HTML** de `404` em vez do
            formato JSON `{"detail": ...}` apresentado abaixo. O conversor de
            UUID da rota apenas aceita o formato canónico em minúsculas — UUIDs
            com carateres 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, devolvido diretamente como binário
            `application/pdf` — não há invólucro JSON nem redirecionamento por
            URL de descarregamento. O corpo começa com os bytes mágicos `%PDF`
            (PDF 1.7). Guarde-o num ficheiro `.pdf` ou transmita-o diretamente
            para o chamador.
          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 é fragmentado.
              schema:
                type: integer
                example: 25191
          content:
            application/pdf:
              schema:
                type: string
                format: binary
        '403':
          description: >-
            Falha de autenticação, autorização ou estado da sessão. Uma chave em
            falta devolve `403`; uma chave incorreta, revogada ou expirada
            devolve `401`. Distinga os modos de falha pela string `detail`:


            - `"Authentication credentials were not provided or are invalid."` —
            nenhum cabeçalho `x-api-key` (e nenhum token `Authorization:
            Bearer`), ou a credencial fornecida falhou a introspeção (revogada,
            expirada ou mal formatada).

            - `"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
            utilizador da consola não tem a permissão `read:sessions` ou não
            pode aceder à 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á num estado elegível (por exemplo, `Not Started` ou `In
            Progress`). Aguarde pelo webhook `status.updated` antes de solicitar
            o relatório.

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


            Tenha em atenção que, para um `sessionId` completamente
            desconhecido, o endpoint resolve a aplicação proprietária antes de
            validar as credenciais, pelo que uma sessão em falta devolve `404`
            mesmo quando a credencial está em falta 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: Sem cabeçalho x-api-key ou a chave falhou a introspeçã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 à qual pertence
                  value:
                    detail: You do not have permission to perform this action.
                KYC session not finished:
                  summary: Sessão KYC ainda Não Iniciada / Em Curso
                  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 Não Iniciada / Em Curso
                  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` — nunca foi
            criada ou foi eliminada. A resolução do proprietário ocorre antes da
            validação das credenciais, pelo que este `404` é retornado mesmo
            para pedidos não autenticados. Consoante a pesquisa que falhar, a
            string `detail` será `"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 eliminada entre pesquisas
                  value:
                    detail: Session not found.
        '429':
          description: >-
            Limite de pedidos excedido. A geração de PDF tem um limite dedicado
            de **50 pedidos por minuto por credencial** (chave de API, Bearer
            token ou IP de origem quando não autenticado), além do limite global
            de pedidos GET de 600/min. Aguarde `Retry-After` segundos (também
            refletido nos cabeçalhos `X-RateLimit-*`) e tente novamente. Os
            relatórios não são guardados em cache no servidor, portanto
            transfira cada relatório uma vez e armazene o ficheiro em vez de o
            voltar a obter.
          headers:
            Retry-After:
              description: Segundos a aguardar antes de tentar novamente o pedido.
              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: Pedidos restantes na janela atual.
              schema:
                type: integer
                example: 0
            X-RateLimit-Reset:
              description: >-
                Carimbo de data/hora Unix (segundos) em que a janela atual é
                reposta.
              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 pedidos.
                    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 num minuto a partir da 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: >-
        A chave de API da sua aplicação, a partir de Programadores -> Chaves de
        API na Business Console. A chave principal tem acesso total. Uma chave
        nomeada pode ter o âmbito definido: nenhum, 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á
        incorreta, 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 o
        pedido veio de um endereço fora da sua lista de IP; 404 numa rota de
        sessão significa que a sessão está fora dos fluxos ou estados da chave.
        Uma chave sem acesso a multimédia recebe URLs de imagens, vídeos e PDFs
        como nulos, e uma chave sem permissão de escrita em sessões recebe
        ligações de sessão e tokens como nulos. Consulte
        https://docs.didit.me/console/api-keys.

````

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