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");"<string>"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.
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");"<string>"Visão geral
Devolve um único PDF com o histórico completo de verificações de uma entidade de utilizador, identificada porvendor_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 devolve para essa sessão isoladamente.
Sessões elegíveis e limite
Só são incluídas as sessões de Verificação de utilizadores (KYC) nos estadosApproved, 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 com filtro por vendor_data quando precisar da lista completa em JSON.
Resposta
O 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 branca
Quando 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ência
Nada 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 final
O 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. 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
- 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 são limitadas à aplicação, e não a funções: as funções e permissões 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: o mesmo relatório para uma única sessão
- Histórico KYC do utilizador: listar e consultar as sessões de um utilizador em JSON
- Exportar PDF e CSV: o lado da Console das duas exportações
- Obter utilizador: o perfil do utilizador e o mapa de funcionalidades em JSON
Autorizações
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.
Parâmetros de caminho
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.
Resposta
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.
The response is of type file.