curl --fail \
'https://verification.didit.me/v3/users/user-abc-123/generate-pdf/' \
-H 'x-api-key: YOUR_API_KEY' \
--output user-history.pdffrom 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)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()));ctx := context.Background()
// Reads DIDIT_API_KEY.
client := didit.NewClient()
resp, err := client.Users.GeneratePDF(ctx, "user-abc-123")
if err != nil {
log.Fatal(err)
}
defer resp.Body.Close()
file, err := os.Create("download.pdf")
if err != nil {
log.Fatal(err)
}
defer file.Close()
if _, err := io.Copy(file, resp.Body); err != nil {
log.Fatal(err)
}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"));<?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');require "didit"
# Reads DIDIT_API_KEY.
didit = Didit::Client.new
content = didit.users.generate_pdf("user-abc-123")
File.binwrite("download.pdf", content)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");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.
curl --fail \
'https://verification.didit.me/v3/users/user-abc-123/generate-pdf/' \
-H 'x-api-key: YOUR_API_KEY' \
--output user-history.pdffrom 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)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()));ctx := context.Background()
// Reads DIDIT_API_KEY.
client := didit.NewClient()
resp, err := client.Users.GeneratePDF(ctx, "user-abc-123")
if err != nil {
log.Fatal(err)
}
defer resp.Body.Close()
file, err := os.Create("download.pdf")
if err != nil {
log.Fatal(err)
}
defer file.Close()
if _, err := io.Copy(file, resp.Body); err != nil {
log.Fatal(err)
}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"));<?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');require "didit"
# Reads DIDIT_API_KEY.
didit = Didit::Client.new
content = didit.users.generate_pdf("user-abc-123")
File.binwrite("download.pdf", content)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");Visão geral
Retorna um único PDF com o histórico completo de verificações de uma entidade User, identificada porvendor_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 retorna para aquela sessão individualmente.
Sessões elegíveis e limite
Somente sessões de Verificação de usuários (KYC) com statusApproved, 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 com filtro por vendor_data quando precisar da lista completa em JSON.
Resposta
O 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ópria
Quando 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ência
Nada 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 final
A 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. Aguarde Retry-After segundos. | Session PDF generation rate limit exceeded. You can make up to 50 requests per minute. |
Exemplos
- curl
- Python
- JavaScript
curl --fail 'https://verification.didit.me/v3/users/user-abc-123/generate-pdf/' \
-H 'x-api-key: YOUR_API_KEY' \
--output user-history.pdf
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)
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ões
Qualquer 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 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 — o mesmo relatório para uma única sessão
- Histórico de KYC do usuário — listar e inspecionar as sessões de um usuário em JSON
- Exportar PDF e CSV — a parte do Console de ambas as exportações
- Get user — o perfil do usuário e o mapa de recursos em JSON
Autorizações
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.
Parâmetros de caminho
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.
Resposta
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.
The response is of type file.