> ## 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 de PDF do histórico do utilizador: todas as sessões

> Obtenha na Didit um único PDF com todas as sessões de verificação reportáveis de um utilizador, por vendor_data, para auditorias e SAR.



Prompt do PDF do histórico do utilizador
        Copiar o prompt para a área de transferência



      
      

\<pre>

\`Goal: download one audit-ready PDF containing the full verification history of a Didit user.

Endpoint: GET https://verification.didit.me/v3/users/{vendor_data}/generate-pdf/
Auth header: x-api-key: YOUR_API_KEY

Path param:
\- vendor_data (string, REQUIRED) - your own identifier for the user, the same value you pass when creating sessions. Free-form string, NOT a UUID. URL-encode it; it cannot contain "/".

curl - save the PDF to disk:
curl --fail 'https://verification.didit.me/v3/users/user-abc-123/generate-pdf/' \
-H 'x-api-key: YOUR_API_KEY' \
\--output user-history.pdf

Response:
\- Body is binary (application/pdf). DO NOT parse as JSON.
\- Content-Disposition: attachment; filename=user_{didit_internal_id}.pdf
\- Content: a cover page (profile summary, feature status, session index) followed by the standard report of every included session, oldest first. Each session report is the same document GET /v3/session/{session_id}/generate-pdf/ returns.
\- Only sessions in "Approved", "Declined", "In Review" or "Kyc Expired" are included, capped at the 20 most recent. The cover states when older sessions were left out.
\- Identical to the Console export at User detail → Actions → Download PDF. White-label logo and privacy-policy URL apply when enabled.
\- Rendering is synchronous and takes a few seconds per session: use a read timeout of at least 120s and stream the body to disk.

Failure modes (envelope {"detail": "..."}):
\- 401 - no credentials supplied.
\- 403 - missing API key (a wrong, revoked or expired key gets 401), a Console user token instead of an API key, OR the user exists but has no session in a reportable status ("This user has no sessions in review, declined, approved or kyc expired to report.").
\- 404 - {"detail": "User not found."} - no user with that vendor_data in the application behind the API key. A key can never export a user of another application.
\- 429 - shares the PDF rate limit with the per-session endpoint (50 requests per minute per credential). Wait Retry-After seconds.

Trailing slash: the canonical route ends with "/". Call it as written above.

When to call:
\- Periodic compliance exports of a customer's whole KYC history.
\- SAR / regulator attachments that must cover every verification of one person.
\- Pulling a user's history into your own back office without a Console login.

Related: GET /v3/session/{session_id}/generate-pdf/ for a single session; GET /v3/sessions/?vendor_data=... for the JSON list of sessions.

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

\</pre>



      
      

Colar em

## Visão geralDevolve um único PDF com o histórico completo de verificações de uma [entidade de utilizador](https://docs.didit.me/pt/entities/users/overview.md), identificada por `vendor_data`.
É o mesmo documento que a Console produz em **User detail → Actions → Download PDF**, para que as equipas de conformidade possam automatizar exportações em vez de clicar uma vez por utilizador.O relatório contém:- **Uma página de capa** com o resumo do perfil (nome, data de nascimento, estados emissores, e-mails e telefones aprovados), o estado mais recente de cada funcionalidade, os contadores de sessões e um índice das sessões incluídas.
- **Um relatório completo de sessão por cada sessão incluída**, por ordem cronológica (da mais antiga para a mais recente). Cada um é o mesmo relatório que [Gerar PDF](https://docs.didit.me/pt/sessions-api/generate-pdf.md) devolve para essa sessão isoladamente.## Sessões elegíveis e limiteSó são incluídas as sessões de Verificação de utilizadores (KYC) nos estados `Approved`, `Declined`, `In Review` ou `Kyc Expired`. As sessões em qualquer outro estado (`Not Started`, `In Progress`, `Abandoned`, `Expired`, …) são ignoradas.O relatório está limitado às **20 sessões elegíveis mais recentes**. Quando um utilizador tem mais, são incluídas as 20 mais recentes e a página de capa indica quantas sessões mais antigas ficaram de fora. Use [Listar sessões](https://docs.didit.me/pt/sessions-api/list-sessions.md) com filtro por `vendor_data` quando precisar da lista completa em JSON.## RespostaO corpo é o próprio PDF (`application/pdf`), e não um invólucro JSON nem um URL de transferência. O cabeçalho `Content-Disposition` é `attachment; filename=user_<didit_internal_id>.pdf`, em que `didit_internal_id` é o identificador Didit estável do utilizador.## Marca brancaQuando a personalização de marca branca estiver ativada na sua aplicação, a capa e todos os relatórios de sessão apresentam o seu logótipo e o URL da política de privacidade em vez da marca Didit, exatamente como no endpoint por sessão. Configure em **Console → Customization**.## Cache e latênciaNada fica em cache: cada chamada volta a gerar o relatório a partir dos dados atuais, pelo que um relatório pedido depois de uma revisão manual reflete a decisão do revisor. Duas chamadas podem produzir ficheiros com bytes diferentes; arquive o ficheiro transferido quando precisar de uma cópia imutável.A geração é síncrona e transfere todas as imagens guardadas de cada sessão incluída, pelo que um utilizador com muitas sessões com muitos conteúdos multimédia pode demorar dezenas de segundos. Use um tempo limite de leitura generoso no cliente (recomendado: 120 s) e transmita o corpo em fluxo para o disco. A geração para num limite de tempo do lado do servidor em vez de continuar até o cliente desistir: se esse limite for atingido, o relatório continua a devolver um PDF válido com as sessões mais recentes e a capa indica quantas foram omitidas.## Barra finalO endereço canónico termina com uma barra (`…/generate-pdf/`). Um pedido sem ela é atendido diretamente com a mesma resposta: não há redirecionamento `301`, por isso nenhum cliente tem de seguir redirecionamentos e o `curl` não precisa de `-L`. Use o URL com barra, como nos exemplos; é a forma que a especificação OpenAPI e os seus registos mostram.## Erros| Estado | Quando | `detail` |
| - | - | - |
| `401` | Sem o cabeçalho `x-api-key` (e sem token `Authorization: Bearer`). | `You must be authenticated with a valid access token to access this endpoint.` |
| `403` | Chave de API inválida ou revogada, ou um token de utilizador da Console em vez de uma chave de API. | `You do not have permission to perform this action.` |
| `403` | O utilizador existe, mas nenhuma das suas sessões está num estado elegível para relatório. | `This user has no sessions in review, declined, approved or kyc expired to report.` |
| `404` | Não existe nenhum utilizador com este `vendor_data` na aplicação associada à chave de API, incluindo utilizadores que pertencem a outra aplicação. | `User not found.` |
| `429` | Mais de 50 gerações de PDF por minuto a partir da mesma credencial. O limite é partilhado com [Gerar PDF](https://docs.didit.me/pt/sessions-api/generate-pdf.md). Aguarde o número de segundos indicado em `Retry-After`. | `Session PDF generation rate limit exceeded. You can make up to 50 requests per minute.` |## Exemplos> [tab] curl
>
> ```bash theme={null}
> curl --fail 'https://verification.didit.me/v3/users/user-abc-123/generate-pdf/' \
>   -H 'x-api-key: YOUR_API_KEY' \
>   --output user-history.pdf
> ```> [tab] Python
>
> ```python theme={null}
> import requests
>
> response = requests.get(
>     "https://verification.didit.me/v3/users/user-abc-123/generate-pdf/",
>     headers={"x-api-key": "YOUR_API_KEY"},
>     stream=True,
>     timeout=120,
> )
> response.raise_for_status()
> with open("user-history.pdf", "wb") as fh:
>     for chunk in response.iter_content(chunk_size=8192):
>         fh.write(chunk)
> ```> [tab] JavaScript
>
> ```javascript theme={null}
> import { writeFile } from 'node:fs/promises';
>
> const vendorData = encodeURIComponent('user-abc-123');
> const response = await fetch(
>   `https://verification.didit.me/v3/users/${vendorData}/generate-pdf/`,
>   { headers: { 'x-api-key': process.env.DIDIT_API_KEY } },
> );
> if (!response.ok) throw new Error(`PDF generation failed: HTTP ${response.status}`);
> await writeFile('user-history.pdf', Buffer.from(await response.arrayBuffer()));
> ```## PermissõesQualquer chave de API ativa da aplicação pode chamar este endpoint. As chaves de API da Didit são
**limitadas à aplicação, e não a funções**: as [funções e permissões](https://docs.didit.me/pt/console/roles-permissions.md) da Console
(`read:users` e as restantes) determinam o que uma *pessoa* pode fazer na Console, e não são avaliadas
no tráfego da Management API. Uma chave só pode exportar utilizadores da sua própria aplicação.## Relacionados- [Gerar PDF](https://docs.didit.me/pt/sessions-api/generate-pdf.md): o mesmo relatório para uma única sessão
- [Histórico KYC do utilizador](https://docs.didit.me/pt/entities/users/kyc-history.md): listar e consultar as sessões de um utilizador em JSON
- [Exportar PDF e CSV](https://docs.didit.me/pt/console/export-pdf-csv.md): o lado da Console das duas exportações
- [Obter utilizador](https://docs.didit.me/pt/management-api/users/get.md): o perfil do utilizador e o mapa de funcionalidades em JSON


## OpenAPI

````yaml pt/openapi-25.json GET /v3/users/{vendor_data}/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/users/{vendor_data}/generate-pdf/:
    get:
      tags:
        - Users
      summary: Descarregar o relatório PDF completo do histórico do utilizador
      description: >-
        Renderize e descarregue um PDF pronto para efeitos de conformidade
        contendo o histórico completo de verificação do utilizador identificado
        por `vendor_data`. É o mesmo documento que a Console produz a partir de
        **User detail → Actions → Download PDF**, pelo que as exportações
        periódicas de conformidade já não necessitam da intervenção de uma
        pessoa na Console.


        **O que o relatório contém.** Uma página de rosto com o resumo do perfil
        (nome, data de nascimento, estados emissores, e-mails e telefones
        aprovados), o estado mais recente de cada funcionalidade, os contadores
        de sessões e um índice das sessões incluídas — seguido do relatório
        padrão de cada sessão incluída, por ordem cronológica (a mais antiga
        primeiro). O relatório de cada sessão é o mesmo documento retornado por
        `GET /v3/session/{sessionId}/generate-pdf/` para essa sessão.


        **Sessões elegíveis.** Apenas são incluídas sessões de Verificação de
        utilizadores (KYC) em `Approved`, `Declined`, `In Review` ou `Kyc
        Expired`; as sessões em qualquer outro estado são ignoradas. Se o
        utilizador não tiver nenhuma sessão num desses estados, o endpoint
        devolve `403` — veja abaixo.


        **Limite máximo.** O relatório está limitado às **20 sessões mais
        recentes** passíveis de relatório. Quando um utilizador tem mais, são
        incluídas as 20 mais recentes e a página de rosto indica quantas sessões
        mais antigas foram omitidas. Utilize `GET /v3/sessions/?vendor_data=…`
        para obter a lista completa em formato JSON.


        **Personalização de marca.** Se a sua aplicação tiver personalização de
        marca branca, a página de rosto e o relatório de cada sessão são
        renderizados com o seu logótipo e o URL da política de privacidade; caso
        contrário, apresentam a marca da Didit. Os relatórios são renderizados
        em inglês — não existe um parâmetro de idioma.


        **Sem colocação em cache.** Cada chamada volta a renderizar o PDF a
        partir dos dados atuais, pelo que um relatório gerado após uma revisão
        manual reflete a decisão do revisor. Duas chamadas para o mesmo
        utilizador podem produzir ficheiros diferentes ao nível dos bytes —
        arquive o ficheiro descarregado se precisar de uma cópia imutável.


        **Latência.** A renderização é síncrona e descarrega todas as imagens
        armazenadas de cada sessão incluída, pelo que um utilizador com muitas
        sessões ricas em conteúdos multimédia pode demorar dezenas de segundos.
        Utilize um tempo limite de leitura no cliente generoso (recomendam-se
        120 s) e transmita o corpo diretamente para o disco. A geração é
        interrompida num limite de tempo do lado do servidor em vez de continuar
        até que o seu cliente desista: se esse limite for atingido, a resposta
        continua a ser um PDF válido contendo as sessões mais recentes, e a
        página de rosto indica quantas foram omitidas.


        **Âmbito.** O utilizador é resolvido no âmbito da aplicação à qual
        pertence a chave de API. Uma chave nunca pode exportar um utilizador de
        outra aplicação — esse utilizador não existe para ela e o endpoint
        devolve `404`.


        **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
        tem de seguir redirecionamentos e o `curl` não necessita de `-L`.
        Utilize o URL com a barra final como nos exemplos.
      operationId: get_user_generate_pdf
      parameters:
        - name: vendor_data
          in: path
          required: true
          schema:
            type: string
          description: >-
            O seu identificador exclusivo para o utilizador — uma string de
            formato livre (NÃO um UUID). Este é o mesmo valor que indicou como
            `vendor_data` ao criar as sessões do utilizador, correspondido
            exatamente como enviado. Codifique-o para URL; um valor que contenha
            `/` não pode ser endereçado por esta rota.
          example: user-abc-123
      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`.
            Guarde-o num ficheiro `.pdf` ou transmita-o diretamente para o
            chamador.
          headers:
            Content-Disposition:
              description: >-
                `attachment; filename=user_{didit_internal_id}.pdf` — o ficheiro
                tem o nome do identificador estável Didit do utilizador
                (`didit_internal_id` em `GET /v3/users/{vendor_data}/`), e não
                de `vendor_data`.
              schema:
                type: string
                example: >-
                  attachment;
                  filename=user_f4e5e1f2-94a9-4f86-8c16-2b7d9b4db418.pdf
            Content-Length:
              description: Tamanho total do PDF em bytes; o corpo não é fragmentado.
              schema:
                type: integer
                example: 148213
          content:
            application/pdf:
              schema:
                type: string
                format: binary
        '401':
          description: >-
            Nenhuma credencial fornecida. Os pedidos para caminhos `/v3/users/*`
            sem um cabeçalho `x-api-key` (ou token `Authorization: Bearer`) são
            rejeitados pelo middleware de autenticação antes de chegarem à API.
          content:
            application/json:
              examples:
                Missing credentials:
                  value:
                    detail: >-
                      You must be authenticated with a valid access token to
                      access this endpoint.
        '403':
          description: >-
            Falha de autorização ou elegibilidade. Distinga as duas pela string
            `detail`:


            - `"You do not have permission to perform this action."` — a chave
            de API é inválida ou foi revogada, ou o pedido inclui um token de
            utilizador da consola em vez de uma chave de API da aplicação.

            - `"This user has no sessions in review, declined, approved or kyc
            expired to report."` — o utilizador existe na sua aplicação mas
            nenhuma das suas sessões está ainda num estado passível de relatório
            (por exemplo, todas as sessões continuam em `In Progress`, ou o
            utilizador foi criado através de `POST /v3/users/create/` e nunca
            realizou verificação). Aguarde por um webhook `status.updated` antes
            de solicitar o relatório.
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
                    example: >-
                      This user has no sessions in review, declined, approved or
                      kyc expired to report.
              examples:
                Invalid credentials:
                  summary: >-
                    Chave de API revogada ou inválida, ou token de utilizador da
                    Consola
                  value:
                    detail: You do not have permission to perform this action.
                No reportable sessions:
                  summary: >-
                    O utilizador existe mas não tem sessão Aprovada / Recusada /
                    Em análise / KYC expirado
                  value:
                    detail: >-
                      This user has no sessions in review, declined, approved or
                      kyc expired to report.
        '404':
          description: >-
            Não existe nenhum utilizador com o `vendor_data` fornecido na
            aplicação associada à chave de API. Os utilizadores de outras
            aplicações são invisíveis para esta chave e devolvem o mesmo `404`.
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
                    example: User not found.
              examples:
                Unknown user:
                  summary: >-
                    vendor_data não corresponde a nenhum utilizador desta
                    aplicação
                  value:
                    detail: User 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), partilhado entre este
            endpoint e `GET /v3/session/{sessionId}/generate-pdf/`, 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/users/user-abc-123/generate-pdf/' \
              -H 'x-api-key: YOUR_API_KEY' \
              --output user-history.pdf
        - lang: python
          label: Python
          source: |-
            from didit import Didit

            # Reads DIDIT_API_KEY.
            client = Didit()

            content = client.users.generate_pdf(
                "user-abc-123",
            )
            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.users.generatePdf("user-abc-123");

            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.Users.GeneratePDF(ctx, \"user-abc-123\")\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.users().generatePdf("user-abc-123")
                    .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->users->generatePdf('user-abc-123');
            $content->saveTo('download.pdf');
        - lang: ruby
          label: Ruby
          source: |-
            require "didit"

            # Reads DIDIT_API_KEY.
            didit = Didit::Client.new

            content = didit.users.generate_pdf("user-abc-123")
            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.Users.GeneratePdfAsync("user-abc-123");
            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.