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 PDF cronologia utente: tutte le sessioni di un utente
Scarica con Didit un unico PDF con tutte le sessioni di verifica di un utente, tramite vendor_data, per audit, SAR e export di compliance.
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>"Panoramica
Restituisce un unico PDF con la cronologia completa delle verifiche di un’entità User, identificata tramitevendor_data.
È lo stesso documento che la Console produce da User detail → Actions → Download PDF, così i team di compliance possono automatizzare le esportazioni invece di cliccare una volta per ogni utente.
Il report contiene:
- Una copertina con il riepilogo del profilo (nome, data di nascita, stati di emissione, email e numeri di telefono approvati), lo stato più recente di ogni funzionalità, i contatori delle sessioni e un indice delle sessioni incluse.
- Un report completo per ogni sessione inclusa, in ordine cronologico (dalla più vecchia alla più recente). Ciascuno è lo stesso report che Generate PDF restituisce per quella sessione singola.
Sessioni idonee e limite
Sono incluse solo le sessioni di Verifica degli utenti (KYC) in statoApproved, Declined, In Review o Kyc Expired. Le sessioni in qualsiasi altro stato (Not Started, In Progress, Abandoned, Expired, …) vengono saltate.
Il report è limitato alle 20 sessioni più recenti tra quelle idonee a essere incluse nel report. Quando un utente ne ha di più, vengono incluse le 20 più recenti e la copertina indica quante sessioni più vecchie sono state escluse. Usa List sessions filtrato per vendor_data quando ti serve l’elenco completo in JSON.
Risposta
Il corpo della risposta è il PDF stesso (application/pdf), non un wrapper JSON né un URL di download. L’intestazione Content-Disposition è attachment; filename=user_<didit_internal_id>.pdf, dove didit_internal_id è l’identificativo Didit stabile dell’utente.
White label
Quando la personalizzazione White label è attiva per la tua applicazione, la copertina e ogni report di sessione riportano il tuo logo e l’URL della tua informativa sulla privacy al posto del branding Didit, esattamente come l’endpoint per sessione. Configurala in Console → Customization.Cache e latenza
Non viene usata nessuna cache: ogni chiamata ricalcola il report a partire dai dati correnti, quindi un report richiesto dopo una revisione manuale riflette la decisione del revisore. Due chiamate possono produrre file diversi byte per byte; archivia il file scaricato quando ti serve una copia immutabile. Il rendering è sincrono e scarica ogni immagine memorizzata di ogni sessione inclusa, quindi un utente con molte sessioni ricche di contenuti multimediali può richiedere decine di secondi. Imposta un timeout di lettura generoso sul client (si consigliano 120 s) e scrivi il corpo della risposta su disco in streaming. La generazione si interrompe a un limite di tempo lato server invece di proseguire finché il client non rinuncia: se questo limite viene raggiunto, il report restituisce comunque un PDF valido con le sessioni più recenti e la copertina indica quante sono state omesse.Barra finale
L’URL canonico termina con una barra finale (…/generate-pdf/). Una richiesta senza barra viene servita direttamente con la stessa risposta: non c’è alcun redirect 301, quindi nessun client deve seguire redirect e curl non ha bisogno di -L. Usa l’URL con la barra come negli esempi; è la forma che compare nella specifica OpenAPI e nei tuoi log.
Errori
| Stato | Quando | detail |
|---|---|---|
401 | Manca l’header x-api-key (e manca anche un token Authorization: Bearer). | You must be authenticated with a valid access token to access this endpoint. |
403 | Chiave API non valida o revocata, oppure un token utente della Console al posto di una chiave API. | You do not have permission to perform this action. |
403 | L’utente esiste ma nessuna delle sue sessioni si trova in uno stato idoneo per il report. | This user has no sessions in review, declined, approved or kyc expired to report. |
404 | Nessun utente con questo vendor_data nell’applicazione associata alla chiave API, inclusi gli utenti che appartengono a un’altra applicazione. | User not found. |
429 | Più di 50 generazioni PDF al minuto dalla stessa credenziale. Il budget è condiviso con Generate PDF. Attendi Retry-After secondi. | Session PDF generation rate limit exceeded. You can make up to 50 requests per minute. |
Esempi
- 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()));
Permessi
Qualsiasi chiave API attiva dell’applicazione può chiamare questo endpoint. Le chiavi API di Didit sono limitate all’applicazione, non al ruolo: i ruoli e i permessi della Console (read:users e gli altri) determinano cosa una persona può fare nella Console e non vengono valutati
per il traffico della Management API. Una chiave può esportare solo gli utenti della propria applicazione.
Correlati
- Generate PDF – lo stesso report per una singola sessione
- Cronologia KYC utente – elenco e ispezione delle sessioni di un utente in JSON
- Esporta PDF e CSV – il lato Console di entrambe le esportazioni
- Get user – il profilo dell’utente e la mappa delle funzionalità in JSON
Autorizzazioni
La chiave API della tua applicazione, da Developers -> API keys nella Business Console. La chiave primaria ha accesso completo. Una chiave con nome può avere un ambito definito: nessuno, lettura o scrittura per risorsa, limitata ad alcuni workflow o a sessioni approvate, a un elenco di indirizzi IP e a una data di scadenza. 401 indica che la chiave è errata, revocata o scaduta; 403 indica che non è stata inviata alcuna chiave, che la chiave non ha accesso a questa risorsa o azione, oppure che la richiesta proviene da un indirizzo non incluso nel suo elenco IP; 404 su una route di sessione indica che la sessione non rientra nei workflow o negli stati previsti dalla chiave. Una chiave senza accesso ai media riceve gli URL di immagini, video e PDF come null, e una chiave senza permessi di scrittura sulle sessioni riceve link e token di sessione come null. Consulta https://docs.didit.me/console/api-keys.
Parametri del percorso
Il tuo identificatore univoco per l'utente: una stringa a formato libero (NON un UUID). È lo stesso valore che hai passato come vendor_data durante la creazione delle sessioni dell'utente, confrontato esattamente come inviato. Codificalo come URL; un valore contenente / non può essere indirizzato tramite questo percorso.
Risposta
Il documento PDF renderizzato, restituito direttamente come binario application/pdf — non sono presenti wrapper JSON né reindirizzamenti tramite URL di download. Il corpo inizia con i byte magici %PDF. Salvalo in un file .pdf o trasmettilo in streaming al tuo chiamante.
The response is of type file.