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

# PDF do histórico do usuário via API: todas as sessões

> A API da Didit gera um PDF com todas as sessões reportáveis de um usuário, por vendor_data, para auditorias, SARs e exportações de conformidade.



Prompt do PDF do histórico do usuário
        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 geralRetorna um único PDF com o histórico completo de verificações de uma [entidade User](https://docs.didit.me/pt-br/entities/users/overview.md), identificada por `vendor_data`.
É o mesmo documento que o Console gera em **User detail → Actions → Download PDF**, para que as equipes de conformidade possam automatizar as exportações em vez de clicar uma vez por usuário.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 status mais recente de cada recurso, os contadores de sessões e um índice das sessões incluídas.
- **Um relatório completo para cada sessão incluída**, em ordem cronológica (da mais antiga para a mais recente). Cada um é o mesmo relatório que o [Generate PDF](https://docs.didit.me/pt-br/sessions-api/generate-pdf.md) retorna para aquela sessão individualmente.## Sessões elegíveis e limiteSomente sessões de Verificação de usuários (KYC) com status `Approved`, `Declined`, `In Review` ou `Kyc Expired` são incluídas. Sessões com qualquer outro status (`Not Started`, `In Progress`, `Abandoned`, `Expired`, …) são ignoradas.O relatório é limitado às **20 sessões mais recentes** qualificadas para o relatório. Quando um usuário tem mais, as 20 mais recentes são incluídas e a página de capa informa quantas sessões mais antigas ficaram de fora. Use [List sessions](https://docs.didit.me/pt-br/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`), não um objeto JSON externo nem uma URL de download. O cabeçalho `Content-Disposition` é `attachment; filename=user_<didit_internal_id>.pdf`, em que `didit_internal_id` é o identificador estável do usuário na Didit.## Marca própriaQuando a personalização de marca própria está habilitada na sua aplicação, a capa e cada relatório de sessão exibem o seu logotipo e a URL da sua política de privacidade em vez da marca Didit, exatamente como no endpoint por sessão. Configure-a em **Console → Customization**.## Cache e latênciaNada fica em cache: cada chamada gera o relatório novamente a partir dos dados atuais, então um relatório solicitado após uma revisão manual reflete a decisão do revisor. Duas chamadas podem gerar arquivos diferentes byte a byte; arquive o arquivo baixado quando precisar de uma cópia imutável.A geração é síncrona e baixa todas as imagens armazenadas de todas as sessões incluídas, então a geração do relatório de um usuário com muitas sessões com grande volume de mídia pode levar dezenas de segundos. Use um timeout de leitura generoso no cliente (120 s recomendados) e grave o corpo em disco via streaming. A geração para ao atingir um limite de tempo no servidor, em vez de continuar até o seu cliente desistir: se esse limite for atingido, ainda é retornado um PDF válido com as sessões mais recentes e a capa informa quantas foram omitidas.## Barra finalA rota canônica termina com barra final (`…/generate-pdf/`). Uma requisição sem a barra é 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; é a forma que aparece na especificação OpenAPI e nos seus logs.## Erros| Status | Quando | `detail` |
| - | - | - |
| `401` | Sem 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 usuário do Console em vez de uma chave de API. | `You do not have permission to perform this action.` |
| `403` | O usuário existe, mas nenhuma das suas sessões está em um status elegível para gerar um relatório. | `This user has no sessions in review, declined, approved or kyc expired to report.` |
| `404` | Nenhum usuário com esse `vendor_data` na aplicação vinculada à chave de API, incluindo usuários que pertencem a outra aplicação. | `User not found.` |
| `429` | Mais de 50 gerações de PDF por minuto com a mesma credencial. O limite é compartilhado com o [Generate PDF](https://docs.didit.me/pt-br/sessions-api/generate-pdf.md). Aguarde `Retry-After` segundos. | `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 têm
**escopo de aplicação, não de função**: as [funções e permissões](https://docs.didit.me/pt-br/console/roles-permissions.md) do Console
(`read:users` e as demais) definem o que uma *pessoa* pode fazer no Console e não são avaliadas
no tráfego da Management API. Uma chave só pode exportar usuários da própria aplicação.## Relacionados- [Generate PDF](https://docs.didit.me/pt-br/sessions-api/generate-pdf.md) — o mesmo relatório para uma única sessão
- [Histórico de KYC do usuário](https://docs.didit.me/pt-br/entities/users/kyc-history.md) — listar e inspecionar as sessões de um usuário em JSON
- [Exportar PDF e CSV](https://docs.didit.me/pt-br/console/export-pdf-csv.md) — a parte do Console de ambas as exportações
- [Get user](https://docs.didit.me/pt-br/management-api/users/get.md) — o perfil do usuário e o mapa de recursos em JSON


## OpenAPI

````yaml pt-br/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: Baixar o relatório em PDF do histórico completo do usuário
      description: >-
        Gere e baixe um único PDF pronto para conformidade com o histórico
        completo de verificação do usuário identificado por `vendor_data`. É o
        mesmo documento que o Console produz em **User detail → Actions →
        Download PDF**, então as exportações periódicas de conformidade não
        dependem mais de alguém clicando no Console.


        **O que 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 status mais recente de cada recurso, os contadores de
        sessões e um índice das sessões incluídas, seguida do relatório padrão
        de cada sessão incluída, em ordem cronológica (da mais antiga para a
        mais recente). O relatório de cada sessão é o mesmo documento que `GET
        /v3/session/{sessionId}/generate-pdf/` retorna para essa sessão.


        **Sessões elegíveis.** Somente sessões de Verificação de usuários (KYC)
        com status `Approved`, `Declined`, `In Review` ou `Kyc Expired` são
        incluídas; sessões com qualquer outro status são ignoradas. Se o usuário
        não tiver nenhuma sessão em um desses status, o endpoint retorna `403`
        (veja abaixo).


        **Limite.** O relatório é limitado às **20 sessões mais recentes** que
        podem entrar no relatório. Quando um usuário tem mais, as 20 mais
        recentes são incluídas e a página de capa informa quantas sessões mais
        antigas ficaram de fora. Use `GET /v3/sessions/?vendor_data=…` para
        obter a lista completa em JSON.


        **Identidade visual.** Se a sua aplicação tiver personalização de marca
        própria, a capa e cada relatório de sessão são gerados com o seu
        logotipo e a URL da sua política de privacidade; caso contrário, levam a
        identidade visual da Didit. Os relatórios são gerados em inglês; não há
        parâmetro de idioma.


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


        **Latência.** A geração é síncrona e baixa todas as imagens armazenadas
        de cada sessão incluída, então um usuário com muitas sessões ricas em
        mídia pode levar dezenas de segundos. Use um tempo limite de leitura
        generoso no cliente (120 s recomendados) e grave o corpo em disco via
        streaming. A geração para ao atingir um limite de tempo definido no
        servidor, em vez de continuar até o seu cliente desistir: se esse limite
        for atingido, a resposta ainda é um PDF válido com as sessões mais
        recentes, e a capa informa quantas foram omitidas.


        **Escopo.** O usuário é localizado dentro da aplicação dona da chave de
        API. Uma chave nunca pode exportar um usuário de outra aplicação: para
        ela, esse usuário não existe e o endpoint retorna `404`.


        **Barra final.** A rota canônica termina com barra (`…/generate-pdf/`).
        Uma requisição sem a barra é 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.
      operationId: get_user_generate_pdf
      parameters:
        - name: vendor_data
          in: path
          required: true
          schema:
            type: string
          description: >-
            Seu identificador exclusivo do usuário: uma string livre (NÃO um
            UUID). É o mesmo valor que você passou como `vendor_data` ao criar
            as sessões do usuário, comparado 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, 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`. Salve-o em um
            arquivo `.pdf` ou transmita-o diretamente para quem fez a chamada.
          headers:
            Content-Disposition:
              description: >-
                `attachment; filename=user_{didit_internal_id}.pdf`: o arquivo
                recebe o nome do identificador estável do usuário na Didit
                (`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 é dividido em partes
                (chunked).
              schema:
                type: integer
                example: 148213
          content:
            application/pdf:
              schema:
                type: string
                format: binary
        '401':
          description: >-
            Nenhuma credencial fornecida. Requisições para caminhos
            `/v3/users/*` sem um cabeçalho `x-api-key` (ou token `Authorization:
            Bearer`) são rejeitadas 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 de elegibilidade. Diferencie as duas pela
            string `detail`:


            - `"You do not have permission to perform this action."`: a chave de
            API é inválida ou foi revogada, ou a requisição traz um token de
            usuário do Console 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 usuário existe na sua aplicação, mas nenhuma
            das sessões dele está ainda em um status que permita gerar relatório
            (por exemplo, todas as sessões ainda estão `In Progress`, ou o
            usuário foi criado por meio de `POST /v3/users/create/` e nunca fez
            a verificação). Aguarde 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 um token de usuário do
                    Console
                  value:
                    detail: You do not have permission to perform this action.
                No reportable sessions:
                  summary: >-
                    O usuário existe, mas não tem nenhuma sessão Aprovada /
                    Recusada / Em revisão / KYC expirado
                  value:
                    detail: >-
                      This user has no sessions in review, declined, approved or
                      kyc expired to report.
        '404':
          description: >-
            Não existe nenhum usuário com o `vendor_data` informado na aplicação
            associada à chave de API. Usuários de outras aplicações são
            invisíveis para esta chave e retornam 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 usuário desta aplicação
                  value:
                    detail: User 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),
            compartilhado entre este endpoint e `GET
            /v3/session/{sessionId}/generate-pdf/`, 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/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: >-
        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.