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>"PDF d'historial d'usuari: totes les sessions d'un usuari
Descarrega un PDF de Didit amb totes les sessions de verificació d’un usuari, per vendor_data, per a auditories, SAR i exportacions periòdiques.
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>"Visió general
Retorna un únic PDF amb tot l’historial de verificació d’una entitat d’usuari, identificada pervendor_data.
És el mateix document que produeix la Console amb User detail → Actions → Download PDF, de manera que els equips de compliment poden automatitzar les exportacions en lloc de fer clic una vegada per cada usuari.
L’informe conté:
- Una portada amb el resum del perfil (nom, data de naixement, estats emissors, correus electrònics i telèfons aprovats), l’estat més recent de cada funcionalitat, els comptadors de sessions i un índex de les sessions incloses.
- Un informe complet de sessió per cada sessió inclosa, en ordre cronològic (de la més antiga a la més recent). Cadascun és el mateix informe que retorna Generar PDF per a aquesta sessió individualment.
Sessions elegibles i límit
Només s’inclouen les sessions de verificació d’usuaris (KYC) en estatApproved, Declined, In Review o Kyc Expired. Les sessions en qualsevol altre estat (Not Started, In Progress, Abandoned, Expired, …) s’ometen.
L’informe es limita a les 20 sessions reportables més recents. Quan un usuari en té més, s’inclouen les 20 més noves i la portada indica quantes sessions més antigues s’han deixat fora. Fes servir Llistar sessions amb un filtre per vendor_data quan necessitis la llista completa en JSON.
Resposta
El cos de la resposta és el PDF en si (application/pdf), no un contenidor JSON ni una URL de descàrrega. La capçalera Content-Disposition és attachment; filename=user_<didit_internal_id>.pdf, on didit_internal_id és l’identificador estable de Didit de l’usuari.
Marca blanca
Quan la personalització de marca blanca està activada a la teva aplicació, la portada i cada informe de sessió mostren el teu logotip i l’URL de la política de privacitat en lloc de la marca de Didit, exactament igual que l’endpoint per sessió. Configura-ho a Console → Customization.Memòria cau i latència
No es guarda res a la memòria cau: cada crida torna a generar l’informe amb les dades actuals, de manera que un informe sol·licitat després d’una revisió manual reflecteix la decisió del revisor. Dues crides poden produir fitxers amb bytes diferents; arxiva el fitxer descarregat quan necessitis una còpia immutable. La generació és síncrona i descarrega cada imatge emmagatzemada de cada sessió inclosa, de manera que un usuari amb moltes sessions amb molt contingut multimèdia pot trigar desenes de segons. Fes servir un temps de lectura generós al client (es recomanen 120 s) i transmet el cos de la resposta al disc. La generació s’atura en arribar a un límit de temps del servidor, en lloc de continuar fins que el client es rendeixi: si s’arriba a aquest límit, l’informe igualment retorna un PDF vàlid amb les sessions més recents i la portada indica quantes se n’han omès.Barra final
La ruta canònica acaba amb una barra final (…/generate-pdf/). Una sol·licitud sense la barra final es serveix directament amb la mateixa resposta: no hi ha cap redirecció 301, de manera que cap client no ha de seguir redireccions i curl no necessita -L. Fes servir l’URL amb la barra final, tal com als exemples; és la forma que mostren l’especificació OpenAPI i els teus registres.
Errors
| Estat | Quan | detail |
|---|---|---|
401 | No hi ha cap capçalera x-api-key (ni cap token Authorization: Bearer). | You must be authenticated with a valid access token to access this endpoint. |
403 | Clau d’API no vàlida o revocada, o un token d’usuari de la Console en lloc d’una clau d’API. | You do not have permission to perform this action. |
403 | L’usuari existeix però cap de les seves sessions està en un estat reportable. | This user has no sessions in review, declined, approved or kyc expired to report. |
404 | No hi ha cap usuari amb aquest vendor_data a l’aplicació de la clau d’API, inclosos els usuaris que pertanyen a una altra aplicació. | User not found. |
429 | Més de 50 generacions de PDF per minut des de la mateixa credencial. El límit es comparteix amb Generar PDF. Espera tants segons com indiqui Retry-After. | Session PDF generation rate limit exceeded. You can make up to 50 requests per minute. |
Exemples
- 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()));
Permisos
Qualsevol clau d’API activa de l’aplicació pot cridar aquest endpoint. Les claus d’API de Didit tenen abast d’aplicació, no de rol: els rols i permisos de la Console (read:users i la resta) decideixen què pot fer una persona a la Console, i no s’avaluen per al trànsit de la Management API. Una clau només pot exportar usuaris de la seva pròpia aplicació.
Relacionat
- Generar PDF: el mateix informe per a una sola sessió
- Historial KYC de l’usuari: llistar i inspeccionar les sessions d’un usuari en JSON
- Exportar PDF i CSV: la vista de la Console per a les dues exportacions
- Obtenir usuari: el perfil de l’usuari i el mapa de funcionalitats en JSON
Autoritzacions
La clau d'API de la teva aplicació, des de Developers -> API keys a la Business Console. La clau primària té accés complet. Una clau amb nom pot tenir l'abast limitat: cap, lectura o escriptura per recurs, limitada a determinats fluxos de treball o a sessions aprovades, a una llista d'adreces IP i a una data de caducitat. 401 significa que la clau és incorrecta, revocada o caducada; 403 significa que no s'ha enviat cap clau, que la clau no té accés a aquest recurs o acció, o que la sol·licitud prové d'una adreça fora de la seva llista d'IP; 404 en una ruta de sessió significa que la sessió està fora dels fluxos de treball o estats de la clau. Una clau sense accés a fitxers multimèdia rep els URL d'imatge, vídeo i PDF com a null, i una clau sense permís d'escriptura de sessions rep els enllaços de sessió i els tokens com a null. Consulta https://docs.didit.me/console/api-keys.
Paràmetres de ruta
El teu identificador únic per a l'usuari — una cadena de text lliure (NO un UUID). És el mateix valor que vas passar com a vendor_data quan vas crear les sessions de l'usuari, que coincideix exactament com s'ha enviat. Codifica'l com a URL; un valor que contingui / no es pot adreçar mitjançant aquesta ruta.
Resposta
El document PDF renderitzat, retornat directament com a binari application/pdf: no hi ha cap contenidor JSON ni cap redirecció d'URL de descàrrega. El cos comença amb els bytes màgics %PDF. Guarda'l en un fitxer .pdf o transmet-lo directament a qui fa la crida.
The response is of type file.