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 del historial de usuario: todas sus sesiones
Descarga con Didit un PDF con todas las sesiones reportables de un usuario, por vendor_data, para auditorías, SAR y exportaciones de cumplimiento.
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>"Descripción general
Devuelve un único PDF con el historial completo de verificaciones de una entidad de usuario, identificada porvendor_data.
Es el mismo documento que genera la Console desde User detail → Actions → Download PDF, para que los equipos de cumplimiento automaticen las exportaciones en lugar de hacer clic una vez por cada usuario.
El informe contiene:
- Una portada con el resumen del perfil (nombre, fecha de nacimiento, estados emisores, correos electrónicos y teléfonos aprobados), el último estado de cada función, los contadores de sesiones y un índice de las sesiones incluidas.
- Un informe de sesión completo por cada sesión incluida, en orden cronológico (de la más antigua a la más reciente). Cada uno es el mismo informe que Generar PDF devuelve para esa sesión por separado.
Sesiones elegibles y límite
Solo se incluyen las sesiones de Verificación de usuarios (KYC) en estadoApproved, Declined, In Review o Kyc Expired. Las sesiones en cualquier otro estado (Not Started, In Progress, Abandoned, Expired, …) se omiten.
El informe se limita a las 20 sesiones más recientes que se pueden incluir. Cuando un usuario tiene más, se incluyen las 20 más recientes y la portada indica cuántas sesiones más antiguas quedaron fuera. Usa Listar sesiones filtrando por vendor_data cuando necesites la lista completa en JSON.
Respuesta
El cuerpo es el propio PDF (application/pdf), no un envoltorio JSON ni una URL de descarga. El encabezado Content-Disposition es attachment; filename=user_<didit_internal_id>.pdf, donde didit_internal_id es el identificador estable del usuario en Didit.
Marca blanca
Cuando la personalización de marca blanca está activada en tu aplicación, la portada y cada informe de sesión llevan tu logotipo y la URL de tu política de privacidad en lugar de la marca Didit, igual que con el endpoint por sesión. Configúrala en Console → Customization.Caché y latencia
No se almacena nada en caché: cada llamada vuelve a generar el informe a partir de los datos actuales, de modo que un informe solicitado después de una revisión manual refleja la decisión del revisor. Dos llamadas pueden producir archivos que difieran byte a byte; archiva el archivo descargado cuando necesites una copia inmutable. La generación es síncrona y descarga todas las imágenes almacenadas de cada sesión incluida, por lo que la generación del informe de un usuario con muchas sesiones con abundante contenido multimedia puede tardar decenas de segundos. Usa un tiempo de espera de lectura amplio en el cliente (se recomiendan 120 s) y transmite el cuerpo a disco. La generación se detiene al alcanzar un límite de tiempo en el servidor en lugar de continuar hasta que tu cliente se rinda: si se alcanza ese límite, el informe devuelve igualmente un PDF válido con las sesiones más recientes y la portada indica cuántas se omitieron.Barra final
La ruta canónica termina con una barra final (…/generate-pdf/). Una solicitud sin ella se atiende directamente con la misma respuesta: no hay redirección 301, así que ningún cliente tiene que seguir redirecciones y curl no necesita -L. Usa la URL con barra final como en los ejemplos; es la forma que muestran la especificación OpenAPI y tus registros.
Errores
| Estado | Cuándo | detail |
|---|---|---|
401 | No hay encabezado x-api-key (ni token Authorization: Bearer). | You must be authenticated with a valid access token to access this endpoint. |
403 | Clave de API no válida o revocada, o un token de usuario de la Console en lugar de una clave de API. | You do not have permission to perform this action. |
403 | El usuario existe, pero ninguna de sus sesiones está en un estado que se pueda incluir en el informe. | This user has no sessions in review, declined, approved or kyc expired to report. |
404 | No existe ningún usuario con este vendor_data en la aplicación asociada a la clave de API, incluidos los usuarios que pertenecen a otra aplicación. | User not found. |
429 | Más de 50 generaciones de PDF por minuto con la misma credencial. El límite se comparte con Generar PDF. Espera los segundos indicados en Retry-After. | Session PDF generation rate limit exceeded. You can make up to 50 requests per minute. |
Ejemplos
- 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
Cualquier clave de API activa de la aplicación puede llamar a este endpoint. Las claves de API de Didit tienen alcance de aplicación, no de rol: los roles y permisos de la Console (read:users y los demás) determinan lo que una persona puede hacer en la Console, y no se tienen en cuenta
para las solicitudes a la Management API. Una clave solo puede exportar usuarios de su propia aplicación.
Páginas relacionadas
- Generar PDF — el mismo informe para una sola sesión
- Historial KYC del usuario — listar e inspeccionar las sesiones de un usuario en JSON
- Exportar PDF y CSV — ambas exportaciones desde la consola
- Obtener usuario — el perfil del usuario y su mapa de funciones en JSON
Autorizaciones
La clave de API de tu aplicación, que encontrarás en Developers -> API keys en la Business Console. La clave principal tiene acceso completo. Una clave con nombre puede tener un alcance limitado: ninguno, lectura o escritura por recurso, limitada a algunos flujos o a sesiones aprobadas, a una lista de direcciones IP y a una fecha de caducidad. 401 significa que la clave es incorrecta, se revocó o expiró; 403 significa que no se envió ninguna clave, que la clave no tiene acceso a este recurso o acción, o que la solicitud provino de una dirección fuera de su lista de IP; 404 en una ruta de sesión significa que la sesión está fuera de los flujos o estados de la clave. Una clave sin acceso a contenido multimedia recibe las URL de imágenes, videos y PDF como null, y una clave sin permiso de escritura en sesiones recibe los enlaces y tokens de sesión como null. Consulta https://docs.didit.me/console/api-keys.
Parámetros de ruta
Tu identificador único del usuario: una cadena de texto libre (NO un UUID). Es el mismo valor que enviaste como vendor_data al crear las sesiones del usuario, y se compara exactamente tal como se envía. Codifícalo para URL; un valor que contenga / no se puede usar con esta ruta.
Respuesta
El documento PDF generado, devuelto directamente como binario application/pdf: no hay envoltorio JSON ni redirección a una URL de descarga. El cuerpo empieza con los bytes mágicos %PDF. Guárdalo en un archivo .pdf o transmítelo directamente a quien hizo la llamada.
The response is of type file.