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 API: 사용자의 모든 세션
Didit에서 vendor_data 기준으로 사용자의 보고 가능한 모든 인증 세션을 하나의 PDF로 내려받아 감사, 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>"개요
사용자 엔티티의 전체 인증 이력을 담은 PDF 한 부를vendor_data 기준으로 반환합니다.
콘솔에서 User detail → Actions → Download PDF를 실행할 때 생성되는 것과 같은 문서이므로, 컴플라이언스 팀은 사용자마다 한 번씩 클릭하는 대신 내보내기를 자동화할 수 있습니다.
보고서에는 다음 내용이 포함됩니다.
- 표지: 프로필 요약(이름, 생년월일, 발급 주, 승인된 이메일 및 전화번호), 모든 기능의 최신 상태, 세션 카운터, 포함된 세션의 색인.
- 포함된 세션마다 하나씩 작성되는 전체 세션 보고서. 시간순(오래된 순)으로 정렬됩니다. 각 보고서는 PDF 생성이 해당 세션 하나에 대해 반환하는 보고서와 같습니다.
대상 세션 및 상한
사용자 인증(KYC) 세션 중Approved, Declined, In Review 또는 Kyc Expired 상태인 세션만 포함됩니다. 그 밖의 상태(Not Started, In Progress, Abandoned, Expired, …)인 세션은 건너뜁니다.
보고서에는 대상이 되는 세션 중 가장 최근 20개까지만 포함됩니다. 사용자의 세션이 이보다 많으면 가장 최근 20개가 포함되고, 표지에 제외된 이전 세션의 수가 표시됩니다. 전체 목록을 JSON으로 받아야 하면 vendor_data로 필터링한 세션 목록 조회를 사용하세요.
응답
본문은 JSON 래퍼나 다운로드 URL이 아니라 PDF 파일 자체(application/pdf)입니다. Content-Disposition 헤더는 attachment; filename=user_<didit_internal_id>.pdf이며, 여기서 didit_internal_id는 사용자의 고정 Didit 식별자입니다.
화이트 라벨
애플리케이션에서 화이트 라벨 맞춤 설정을 활성화하면, 표지와 모든 세션 보고서에 Didit 브랜딩 대신 애플리케이션의 로고와 개인정보 처리방침 URL이 표시됩니다. 세션별 엔드포인트와 정확히 동일하게 적용됩니다. 설정 위치는 콘솔 → Customization입니다.캐싱 및 지연 시간
캐시되지 않습니다. 호출할 때마다 현재 데이터로 보고서를 다시 렌더링하므로, 수동 검토 후에 요청한 보고서에는 검토자의 결정이 반영됩니다. 두 번 호출하면 바이트 단위로 다른 파일이 생성될 수 있으므로, 변경되지 않는 사본이 필요하면 다운로드한 파일을 보관하세요. 렌더링은 동기식으로 처리되며, 포함된 모든 세션의 저장된 이미지를 전부 내려받습니다. 미디어가 많은 세션이 많은 사용자는 수십 초가 걸릴 수 있습니다. 넉넉한 클라이언트 읽기 타임아웃(120초 권장)을 설정하고 응답 본문을 디스크에 스트리밍하세요. 생성은 클라이언트가 포기할 때까지 계속되지 않고 서버 측 시간 제한에서 멈춥니다. 이 제한에 도달하면 보고서는 여전히 유효한 PDF로 반환되며, 가장 최근 세션이 포함되고 표지에 제외된 세션 수가 표시됩니다.후행 슬래시
표준 경로는 후행 슬래시로 끝납니다(…/generate-pdf/). 슬래시 없이 요청해도 같은 응답을 바로 반환합니다. 301 리디렉션이 없으므로 클라이언트가 리디렉션을 따라갈 필요가 없고 curl에 -L도 필요하지 않습니다. 예제와 같이 슬래시가 있는 URL을 사용하세요. OpenAPI 명세와 로그에 나타나는 형식이 이것입니다.
오류
| 상태 | 발생 조건 | detail |
|---|---|---|
401 | x-api-key 헤더가 없는 경우(Authorization: Bearer 토큰도 없는 경우). | You must be authenticated with a valid access token to access this endpoint. |
403 | 유효하지 않거나 취소된 API 키인 경우, 또는 API 키 대신 콘솔 사용자 토큰을 사용한 경우. | You do not have permission to perform this action. |
403 | 사용자는 존재하지만 해당 사용자의 세션 중 보고할 수 있는 상태의 세션이 없는 경우. | This user has no sessions in review, declined, approved or kyc expired to report. |
404 | API 키가 속한 애플리케이션에 이 vendor_data를 가진 사용자가 없는 경우(다른 애플리케이션에 속한 사용자 포함). | User not found. |
429 | 같은 자격 증명으로 분당 50회를 초과해 PDF를 생성한 경우. 이 한도는 PDF 생성과 공유됩니다. Retry-After 초만큼 기다리세요. | Session PDF generation rate limit exceeded. You can make up to 50 requests per minute. |
예제
- 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()));
권한
활성 상태인 API 키라면 애플리케이션의 어떤 키로도 이 엔드포인트를 호출할 수 있습니다. Didit API 키는 역할이 아닌 애플리케이션 범위입니다. 콘솔의 역할 및 권한(read:users 등)은 사람이 콘솔에서 할 수 있는 작업을 결정하며, Management API 트래픽에는 평가되지 않습니다. 키는 자신이 속한 애플리케이션의 사용자만 내보낼 수 있습니다.
관련 문서
- PDF 생성: 단일 세션에 대한 동일한 보고서
- 사용자 KYC 이력: 사용자의 세션을 JSON으로 나열하고 조회
- PDF 및 CSV 내보내기: 두 내보내기의 콘솔 측 기능
- 사용자 조회: 사용자 프로필과 기능 맵을 JSON으로 조회
인증
Business Console의 Developers -> API keys에서 발급받은 귀하 애플리케이션의 API 키입니다. 기본 키는 전체 접근 권한을 갖습니다. 이름이 지정된 키는 리소스별 none, read, write 범위로 권한을 제한할 수 있으며 특정 워크플로나 승인된 세션, IP 주소 목록, 만료일 등으로 제한할 수도 있습니다. 401은 키가 잘못되었거나 폐기되었거나 만료되었음을 의미합니다. 403은 키가 전송되지 않았거나, 키에 해당 리소스나 작업에 대한 접근 권한이 없거나, 요청이 허용된 IP 목록 외부 주소에서 발생했음을 의미합니다. 세션 경로에서의 404는 해당 세션이 키의 허용 워크플로 또는 상태 범위를 벗어났음을 의미합니다. 미디어 접근 권한이 없는 키는 이미지, 비디오, PDF URL을 null로 수신하며, 세션 write 권한이 없는 키는 세션 링크와 token을 null로 수신합니다. https://docs.didit.me/console/api-keys 를 참고하십시오.
경로 매개변수
귀하가 지정한 사용자의 고유 식별자입니다. 자유 형식 문자열(UUID 아님)입니다. 사용자의 세션을 생성할 때 vendor_data로 전달한 값과 동일하며, 전송된 값과 정확히 일치해야 합니다. URL 인코딩해야 합니다. /가 포함된 값은 이 라우트에서 처리할 수 없습니다.
응답
렌더링된 PDF 문서로, 바이너리 application/pdf 형식으로 직접 반환됩니다. JSON 래퍼나 다운로드 URL 간접 참조가 없습니다. 본문은 %PDF 매직 바이트로 시작합니다. .pdf 파일로 저장하거나 호출자에게 스트리밍하세요.
The response is of type file.