> ## Documentation Index
> Fetch the complete documentation index at: https://docs.didit.me/llms.txt
> Use this file to discover all available pages before exploring further.

# 사용자 이력 PDF API: 사용자의 모든 세션

> Didit에서 vendor_data 기준으로 사용자의 보고 가능한 모든 인증 세션을 하나의 PDF로 내려받아 감사, SAR, 정기 컴플라이언스 내보내기에 활용하세요.



사용자 이력 PDF 프롬프트
        프롬프트를 클립보드에 복사



      
      

\<pre>

\`Goal: download one audit-ready PDF containing the full verification history of a Didit user.

Endpoint: GET https://verification.didit.me/v3/users/{vendor_data}/generate-pdf/
Auth header: x-api-key: YOUR_API_KEY

Path param:
\- vendor_data (string, REQUIRED) - your own identifier for the user, the same value you pass when creating sessions. Free-form string, NOT a UUID. URL-encode it; it cannot contain "/".

curl - save the PDF to disk:
curl --fail 'https://verification.didit.me/v3/users/user-abc-123/generate-pdf/' \
-H 'x-api-key: YOUR_API_KEY' \
\--output user-history.pdf

Response:
\- Body is binary (application/pdf). DO NOT parse as JSON.
\- Content-Disposition: attachment; filename=user_{didit_internal_id}.pdf
\- Content: a cover page (profile summary, feature status, session index) followed by the standard report of every included session, oldest first. Each session report is the same document GET /v3/session/{session_id}/generate-pdf/ returns.
\- Only sessions in "Approved", "Declined", "In Review" or "Kyc Expired" are included, capped at the 20 most recent. The cover states when older sessions were left out.
\- Identical to the Console export at User detail → Actions → Download PDF. White-label logo and privacy-policy URL apply when enabled.
\- Rendering is synchronous and takes a few seconds per session: use a read timeout of at least 120s and stream the body to disk.

Failure modes (envelope {"detail": "..."}):
\- 401 - no credentials supplied.
\- 403 - missing API key (a wrong, revoked or expired key gets 401), a Console user token instead of an API key, OR the user exists but has no session in a reportable status ("This user has no sessions in review, declined, approved or kyc expired to report.").
\- 404 - {"detail": "User not found."} - no user with that vendor_data in the application behind the API key. A key can never export a user of another application.
\- 429 - shares the PDF rate limit with the per-session endpoint (50 requests per minute per credential). Wait Retry-After seconds.

Trailing slash: the canonical route ends with "/". Call it as written above.

When to call:
\- Periodic compliance exports of a customer's whole KYC history.
\- SAR / regulator attachments that must cover every verification of one person.
\- Pulling a user's history into your own back office without a Console login.

Related: GET /v3/session/{session_id}/generate-pdf/ for a single session; GET /v3/sessions/?vendor_data=... for the JSON list of sessions.

For end-to-end Didit integration, paste in the full prompt at /integration/integration-prompt.`

\</pre>



      
      

붙여넣을 곳

## 개요[사용자 엔티티](https://docs.didit.me/ko/entities/users/overview.md)의 전체 인증 이력을 담은 PDF 한 부를 `vendor_data` 기준으로 반환합니다.
콘솔에서 **User detail → Actions → Download PDF**를 실행할 때 생성되는 것과 같은 문서이므로, 컴플라이언스 팀은 사용자마다 한 번씩 클릭하는 대신 내보내기를 자동화할 수 있습니다.보고서에는 다음 내용이 포함됩니다.- **표지**: 프로필 요약(이름, 생년월일, 발급 주, 승인된 이메일 및 전화번호), 모든 기능의 최신 상태, 세션 카운터, 포함된 세션의 색인.
- **포함된 세션마다 하나씩 작성되는 전체 세션 보고서**. 시간순(오래된 순)으로 정렬됩니다. 각 보고서는 [PDF 생성](https://docs.didit.me/ko/sessions-api/generate-pdf.md)이 해당 세션 하나에 대해 반환하는 보고서와 같습니다.## 대상 세션 및 상한사용자 인증(KYC) 세션 중 `Approved`, `Declined`, `In Review` 또는 `Kyc Expired` 상태인 세션만 포함됩니다. 그 밖의 상태(`Not Started`, `In Progress`, `Abandoned`, `Expired`, …)인 세션은 건너뜁니다.보고서에는 대상이 되는 세션 중 **가장 최근 20개**까지만 포함됩니다. 사용자의 세션이 이보다 많으면 가장 최근 20개가 포함되고, 표지에 제외된 이전 세션의 수가 표시됩니다. 전체 목록을 JSON으로 받아야 하면 `vendor_data`로 필터링한 [세션 목록 조회](https://docs.didit.me/ko/sessions-api/list-sessions.md)를 사용하세요.## 응답본문은 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 생성](https://docs.didit.me/ko/sessions-api/generate-pdf.md)과 공유됩니다. `Retry-After` 초만큼 기다리세요. | `Session PDF generation rate limit exceeded. You can make up to 50 requests per minute.` |## 예제> [tab] curl
>
> ```bash theme={null}
> curl --fail 'https://verification.didit.me/v3/users/user-abc-123/generate-pdf/' \
>   -H 'x-api-key: YOUR_API_KEY' \
>   --output user-history.pdf
> ```> [tab] Python
>
> ```python theme={null}
> 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)
> ```> [tab] JavaScript
>
> ```javascript theme={null}
> 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 키는 **역할이 아닌 애플리케이션 범위**입니다. 콘솔의 [역할 및 권한](https://docs.didit.me/ko/console/roles-permissions.md)(`read:users` 등)은 *사람*이 콘솔에서 할 수 있는 작업을 결정하며, Management API 트래픽에는 평가되지 않습니다. 키는 자신이 속한 애플리케이션의 사용자만 내보낼 수 있습니다.## 관련 문서- [PDF 생성](https://docs.didit.me/ko/sessions-api/generate-pdf.md): 단일 세션에 대한 동일한 보고서
- [사용자 KYC 이력](https://docs.didit.me/ko/entities/users/kyc-history.md): 사용자의 세션을 JSON으로 나열하고 조회
- [PDF 및 CSV 내보내기](https://docs.didit.me/ko/console/export-pdf-csv.md): 두 내보내기의 콘솔 측 기능
- [사용자 조회](https://docs.didit.me/ko/management-api/users/get.md): 사용자 프로필과 기능 맵을 JSON으로 조회


## OpenAPI

````yaml ko/openapi-25.json GET /v3/users/{vendor_data}/generate-pdf/
openapi: 3.0.0
info:
  version: 3.0.0
  title: Didit Verification API
  description: 신분증 인증 API입니다. x-api-key 헤더로 인증합니다.
servers:
  - url: https://verification.didit.me
security: []
tags: []
paths:
  /v3/users/{vendor_data}/generate-pdf/:
    get:
      tags:
        - Users
      summary: 전체 사용자 이력 PDF 보고서 다운로드
      description: >-
        Render and download one compliance-ready PDF containing the full
        verification history of the user identified by `vendor_data`. It is the
        same document the Console produces from **User detail → Actions →
        Download PDF**, so periodic compliance exports no longer need a person
        clicking in the Console.


        **보고서 포함 내용.** 프로필 요약(성명, 생년월일, 발급 주(또는 발급 지역), 승인된 이메일 및 전화번호), 각 기능의
        최신 상태, 세션 카운터 및 포함된 세션 색인이 포함된 표지가 제공되며, 그 뒤로 포함된 각 세션의 표준 보고서가 시간순(가장
        오래된 항목부터)으로 이어집니다. 각 세션 보고서는 해당 세션에 대해 `GET
        /v3/session/{sessionId}/generate-pdf/`가 반환하는 것과 동일한 문서입니다.


        **대상 세션.** `Approved`, `Declined`, `In Review` 또는 `Kyc Expired` 상태인 사용자
        인증(KYC) 세션만 포함되며, 다른 상태의 세션은 제외됩니다. 사용자가 해당 상태 중 하나에 속한 세션을 보유하고 있지 않으면
        endpoint가 `403`을 반환합니다(아래 참조).


        **제한.** 보고서에는 보고 가능한 **가장 최근 세션 20개**까지 포함됩니다. 사용자의 세션 수가 더 많은 경우 최신
        20개가 포함되며, 제외된 이전 세션 수가 표지에 표시됩니다. 전체 목록을 JSON 형식으로 확인하려면 `GET
        /v3/sessions/?vendor_data=…`를 사용하십시오.


        **브랜딩.** 애플리케이션에 화이트 라벨 커스텀이 적용되어 있는 경우 표지와 모든 세션 보고서가 고객의 로고 및 개인정보
        처리방침 URL로 렌더링됩니다. 그렇지 않은 경우 Didit 브랜딩이 적용됩니다. 보고서는 영어로 렌더링되며, 언어 파라미터는
        제공되지 않습니다.


        **캐싱 없음.** 모든 호출 시 현재 데이터를 바탕으로 PDF를 다시 렌더링하므로, 수동 검토 후 생성된 보고서에는 검토자의
        결정이 반영됩니다. 동일한 사용자에 대해 두 번 호출하면 바이트 단위로 서로 다른 파일이 생성될 수 있으므로, 불변 사본이 필요한
        경우 다운로드한 파일을 보관하십시오.


        **지연 시간.** 렌더링은 동기식으로 진행되며 포함된 각 세션의 저장된 모든 이미지를 다운로드하므로, 미디어가 많은 세션을 다수
        보유한 사용자의 경우 수십 초가 소요될 수 있습니다. 넉넉한 클라이언트 읽기 타임아웃(120초 권장)을 설정하고 본문을 디스크로
        스트리밍하십시오. 생성이 클라이언트 타임아웃까지 무한정 지속되는 대신 서버 측 제한 시간에 도달하면 중단됩니다. 제한 시간에
        도달하더라도 응답은 가장 최근 세션들을 포함하는 유효한 PDF로 반환되며, 표지에 생략된 세션 수가 표시됩니다.


        **범위.** 사용자는 API 키를 소유한 애플리케이션 내에서 확인됩니다. 키는 다른 애플리케이션의 사용자를 내보낼 수 없으며,
        해당 사용자 정보가 존재하지 않아 endpoint에서 `404`를 반환합니다.


        **후행 슬래시.** 정규 경로는 후행 슬래시(`…/generate-pdf/`)로 끝납니다. 슬래시가 없는 요청도 동일한 응답으로
        직접 처리됩니다. `301` 리디렉션이 발생하지 않으므로 클라이언트가 리디렉션을 추적할 필요가 없으며 `curl`에 `-L`을
        사용할 필요도 없습니다. 예시와 같이 슬래시가 포함된 URL을 사용하십시오.
      operationId: get_user_generate_pdf
      parameters:
        - name: vendor_data
          in: path
          required: true
          schema:
            type: string
          description: >-
            귀하가 지정한 사용자의 고유 식별자입니다. 자유 형식 문자열(UUID 아님)입니다. 사용자의 세션을 생성할 때
            `vendor_data`로 전달한 값과 동일하며, 전송된 값과 정확히 일치해야 합니다. URL 인코딩해야 합니다. `/`가
            포함된 값은 이 라우트에서 처리할 수 없습니다.
          example: user-abc-123
      responses:
        '200':
          description: >-
            렌더링된 PDF 문서로, 바이너리 `application/pdf` 형식으로 직접 반환됩니다. JSON 래퍼나 다운로드
            URL 간접 참조가 없습니다. 본문은 `%PDF` 매직 바이트로 시작합니다. `.pdf` 파일로 저장하거나 호출자에게
            스트리밍하세요.
          headers:
            Content-Disposition:
              description: >-
                `attachment; filename=user_{didit_internal_id}.pdf` — 파일 이름은
                `vendor_data`가 아닌 사용자의 안정적인 Didit 식별자(`GET
                /v3/users/{vendor_data}/`의 `didit_internal_id`)를 따릅니다.
              schema:
                type: string
                example: >-
                  attachment;
                  filename=user_f4e5e1f2-94a9-4f86-8c16-2b7d9b4db418.pdf
            Content-Length:
              description: PDF의 총 크기(바이트 단위)이며, 본문은 청크로 분할되지 않습니다.
              schema:
                type: integer
                example: 148213
          content:
            application/pdf:
              schema:
                type: string
                format: binary
        '401':
          description: >-
            자격 증명이 제공되지 않았습니다. `x-api-key` 헤더(또는 `Authorization: Bearer` token)가
            없는 `/v3/users/*` 경로에 대한 요청은 API에 도달하기 전에 인증 미들웨어에 의해 거부됩니다.
          content:
            application/json:
              examples:
                Missing credentials:
                  value:
                    detail: >-
                      You must be authenticated with a valid access token to
                      access this endpoint.
        '403':
          description: >-
            권한 부여 또는 적격성 실패입니다. 두 가지는 `detail` 문자열로 구분하십시오.


            - `"You do not have permission to perform this action."` — API 키가
            유효하지 않거나 취소되었거나, 요청에 애플리케이션 API 키 대신 콘솔 사용자 token이 포함되어 있습니다.

            - `"This user has no sessions in review, declined, approved or kyc
            expired to report."` — 사용자가 애플리케이션에 존재하지만 아직 보고 가능한 상태의 세션이 없습니다(예:
            모든 세션이 여전히 `In Progress` 상태이거나, 사용자가 `POST /v3/users/create/`를 통해
            생성된 후 인증을 진행하지 않음). 보고서를 요청하기 전에 `status.updated` webhook을 기다리십시오.
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
                    example: >-
                      This user has no sessions in review, declined, approved or
                      kyc expired to report.
              examples:
                Invalid credentials:
                  summary: 취소되었거나 유효하지 않은 API 키 또는 콘솔 사용자 token입니다
                  value:
                    detail: You do not have permission to perform this action.
                No reportable sessions:
                  summary: >-
                    사용자가 존재하지만 Approved / Declined / In Review / Kyc Expired 세션이
                    없습니다
                  value:
                    detail: >-
                      This user has no sessions in review, declined, approved or
                      kyc expired to report.
        '404':
          description: >-
            API 키에 연결된 애플리케이션에 제공된 `vendor_data`를 가진 사용자가 존재하지 않습니다. 다른 애플리케이션의
            사용자는 이 키에서 보이지 않으며 동일한 `404`를 반환합니다.
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
                    example: User not found.
              examples:
                Unknown user:
                  summary: vendor_data가 이 애플리케이션의 어떤 사용자와도 일치하지 않습니다
                  value:
                    detail: User not found.
        '429':
          description: >-
            속도 제한을 초과했습니다. PDF 생성에는 전역 GET 한도인 분당 600회 외에 이 endpoint와 `GET
            /v3/session/{sessionId}/generate-pdf/`가 공유하는 **인증 정보당 분당 50회**(API
            키, Bearer token, 또는 미인증 시 소스 IP)의 전용 한도가 적용됩니다.
            `Retry-After`초(`X-RateLimit-*` 헤더에도 반영됨) 동안 대기한 후 재시도하세요. 보고서는 서버 측에
            캐시되지 않으므로, 다시 가져오는 대신 각 보고서를 한 번 다운로드하여 파일을 저장해 두세요.
          headers:
            Retry-After:
              description: 요청을 재시도하기 전에 대기해야 하는 시간(초).
              schema:
                type: integer
                minimum: 1
                example: 30
            X-RateLimit-Limit:
              description: 현재 윈도우에서 허용되는 최대 PDF 생성 횟수(50).
              schema:
                type: integer
                example: 50
            X-RateLimit-Remaining:
              description: 현재 윈도우에 남아 있는 요청 수입니다.
              schema:
                type: integer
                example: 0
            X-RateLimit-Reset:
              description: 현재 윈도우가 리셋되는 Unix 타임스탬프(초)입니다.
              schema:
                type: integer
                example: 1750000000
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
                    description: 속도 제한 초과에 대한 사람이 읽기 쉬운 설명입니다.
                    example: >-
                      Session PDF generation rate limit exceeded. You can make
                      up to 50 requests per minute.
              examples:
                Throttled:
                  summary: 동일한 자격 증명에서 1분 동안 50회를 초과하는 PDF 생성 발생
                  value:
                    detail: >-
                      Session PDF generation rate limit exceeded. You can make
                      up to 50 requests per minute.
      security:
        - ApiKeyAuth: []
      x-codeSamples:
        - lang: curl
          label: cURL
          source: |-
            curl --fail \
              'https://verification.didit.me/v3/users/user-abc-123/generate-pdf/' \
              -H 'x-api-key: YOUR_API_KEY' \
              --output user-history.pdf
        - lang: python
          label: Python
          source: |-
            from 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)
        - lang: javascript
          label: Node.js
          source: >-
            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()));
        - lang: go
          label: Go
          source: "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresp, err := client.Users.GeneratePDF(ctx, \"user-abc-123\")\nif err != nil {\n\tlog.Fatal(err)\n}\ndefer resp.Body.Close()\nfile, err := os.Create(\"download.pdf\")\nif err != nil {\n\tlog.Fatal(err)\n}\ndefer file.Close()\nif _, err := io.Copy(file, resp.Body); err != nil {\n\tlog.Fatal(err)\n}"
        - lang: java
          label: Java
          source: |-
            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"));
        - lang: php
          label: PHP
          source: |-
            <?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');
        - lang: ruby
          label: Ruby
          source: |-
            require "didit"

            # Reads DIDIT_API_KEY.
            didit = Didit::Client.new

            content = didit.users.generate_pdf("user-abc-123")
            File.binwrite("download.pdf", content)
        - lang: csharp
          label: .NET
          source: |-
            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");
components:
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: x-api-key
      description: >-
        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 를 참고하십시오.

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.