> ## 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.

# 사용자 생성 API: 벤더 사용자 엔티티

> KYC 세션 실행 전에 Didit 벤더 User 엔티티를 미리 생성합니다. 외부 데이터베이스에서 일괄 온보딩하거나 거래 모니터링을 위해 사용자를 등록하세요.



사용자 생성 프롬프트
        프롬프트를 클립보드에 복사



      
      

\<pre>

\`Goal: Pre-create a Didit User entity by vendor_data before any verification session runs, and optionally email the person a verification link in the same call.

Endpoint: POST https://verification.didit.me/v3/users/create/
Auth header: x-api-key: <DIDIT_API_KEY>
Content-Type: application/json

Request body fields:
\- vendor_data (string, REQUIRED) — your unique identifier for this user. Free-form string, NOT a UUID. Must be unique among non-deleted users in the app. Normalised lowercase + whitespace trim, so "USER-1" and "user-1" collide. Max 2000 bytes (UTF-8 encoded); longer values return a 400.
\- full_name (string, max 512, optional)
\- display_name (string, optional) — friendly label for the Console (takes precedence over full_name for UI).
\- date_of_birth (string YYYY-MM-DD, optional)
\- status (enum, optional) — "ACTIVE" | "FLAGGED" | "BLOCKED" (VendorUserStatusChoices). Defaults to "ACTIVE".
\- metadata (object, optional) — arbitrary JSON you attach to the user.
\- approved_emails (object<string, boolean>, optional) — e.g. {"john@example.com": true}.
\- approved_phones (object<string, boolean>, optional).
\- issuing_states (object<ISO3, int>, optional) — e.g. {"USA": 1}.

Contact fields (all optional):
\- first_name, last_name (string, max 255 each): joined with a space into full_name when you don't send full_name.
\- email (string, email): stored in metadata.contact.email.
\- phone_number (string, max 32): stored in metadata.contact.phone_number.
\- country (string): ISO 3166 code, alpha-2 or alpha-3 ("ES" or "ESP"), stored uppercased in metadata.address.country.

Verification link (optional):
\- send_verification_link (boolean, default false): when true, Didit also creates a verification session for the person on workflow_id and emails them the link at email.
\- workflow_id (UUID): REQUIRED with send_verification_link. The workflow must verify a person: a Business Verification (KYB) workflow is refused.
\- language (string, max 10): language of the verification email, a supported language code. English when omitted.
\- The person and the session are created together or not at all. The session runs the same checks as POST /v3/session/ (blocklist, credits).

curl:
curl -X POST 'https://verification.didit.me/v3/users/create/' \
-H 'x-api-key: YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{"vendor_data": "user-abc-123", "full_name": "John Doe"}'

curl with a verification link:
curl -X POST 'https://verification.didit.me/v3/users/create/' \
-H 'x-api-key: YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{"vendor_data": "user-abc-789", "first_name": "Julia", "last_name": "Martin", "email": "julia.martin@example.com", "send_verification_link": true, "workflow_id": "YOUR_WORKFLOW_ID"}'

Response 201: full UserDetailItem (same shape as GET /v3/users/{vendor_data}/) plus verification_link. Includes didit_internal_id (UUID), session_count, approved_count=0, metadata, comments=[], created_at, updated_at. See /reference/data-models.
\- verification_link is always present: null without a link, otherwise { session_id, session_number, status, url, workflow_id, email }. url is the link Didit emailed.

Failure modes:
\- 400: nothing is written. Most errors are keyed by field. Common cases:
\{ "vendor_data": ["A user with this vendor_data already exists."] }  // conflict, NOT idempotent. Use PATCH /v3/users/{vendor_data}/ to update.
\{ "vendor_data": ["This field is required."] }
\{ "vendor_data": ["Ensure this field has no more than 2000 characters."] }  // oversized vendor_data, rejected before it reaches storage
\{ "metadata": ["Metadata must be a JSON object."] }
\{ "country": ["Use an ISO 3166 country code, like ES or ESP."] }
\{ "email": ["metadata.contact must be a JSON object to store this value."] }  // same on phone_number; metadata.address on country
\{ "email": ["An email address is required to send a verification link."] }
\{ "workflow_id": ["Pick the workflow to send a verification link for."] }
\{ "workflow_id": ["Invalid workflow_id."] }
\{ "workflow_id": ["This workflow verifies a business. Pick a workflow that verifies a person to send them a verification link."] }
\{ "contact_details": { "email_lang": ["Invalid email language. Supported languages are ..."] } }  // unsupported language
\{ "vendor_data": "This user or business has been blocked and cannot create new verification sessions." }
\{ "detail": "You don't have enough credits to perform this request. Please top up at https://business.didit.me" }
\- 401: missing or invalid x-api-key. { "detail": "Authentication credentials were not provided." }
\- 403: the API key is revoked or is not valid for this application. { "detail": "You do not have permission to perform this action." }
\- 403: a scoped key without users write. { "detail": "This API key has no write access to people." }
\- 403: send_verification_link with a scoped key that lacks sessions write. Nothing is written. { "detail": "This API key has no write access to sessions." }
\- 429: rate-limited.

Upsert pattern (this endpoint is NOT idempotent):
GET /v3/users/{vendor_data}/  → on 404, POST /v3/users/create/; on 200, PATCH /v3/users/{vendor_data}/.

Notes:
\- Verified-session-derived identity fields such as full_name and date_of_birth seeded here can be overwritten by the first approved User Verification (KYC) session.
\- If you are migrating from another provider and already have a trusted face image, create the User first, read didit_internal_id from this response, then call POST /v3/organization/{organization_id}/application/{application_id}/vendor-users/by-id/{didit_internal_id}/faces/upload/.
\- The create itself sends no webhook. Later changes to the user send user.data.updated or user.status.updated. With send_verification_link, the new session updates the user (session_count) in the same call, which sends user.data.updated.
\- API key access: a scoped key needs users write; with send_verification_link it also needs sessions write. Full-access keys can always call it.

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)를 명시적으로 생성합니다.
별도로 지정하지 않으면 반환된 엔티티는 `ACTIVE` 상태가 됩니다.
선택적으로, 같은 호출에서 해당 사람에게 인증 링크를 이메일로 보낼 수 있습니다 ([인증 링크 보내기](#인증-링크-보내기) 참조).## 사용 시기- **메타데이터 미리 설정**: 고객이 인증하기 전에 등급, 가입 경로, 내부 태그 같은 정보를 지정합니다.
- **다른 벤더에서 이전**: 기존 사용자 목록을 Didit에 다시 만들어, 기록과 분석이 알려진 기준점에서 시작되도록 합니다.
- **신뢰할 수 있는 프로필 얼굴 가져오기**: 먼저 사용자를 생성한 다음, 반환된 `didit_internal_id`로 [사용자 얼굴 업로드](https://docs.didit.me/ko/management-api/users/upload-face.md)를 호출합니다.
- **거래 전용 사용 사례**: `vendor_data`로 사용자를 등록하면 사용자 인증(KYC) 세션을 한 번도 실행하지 않고도 거래를 제출할 수 있습니다.
- **인증 초대**: 한 번의 호출로 사람을 생성하고 인증 링크를 이메일로 보냅니다.## 연락처 정보프로필 필드와 함께 사람의 연락처 정보를 보낼 수 있습니다.
`full_name`을 보내지 않으면 `first_name`과 `last_name`이 공백으로 연결되어 `full_name`이 됩니다.
`email`과 `phone_number`는 `metadata.contact`에, `country`는 `metadata.address`에 저장됩니다.
`country`는 ISO 3166 코드(alpha-2 또는 alpha-3, 예: `ES` 또는 `ESP`)를 받으며, 대문자로 변환되어 저장됩니다.보낸 `metadata`에 이미 JSON 객체가 아닌 `contact` 또는 `address` 값이 있으면 Didit은 이를 덮어쓰지 않습니다. 이 경우 문제가 있는 필드에 대해 호출은 `400`을 반환합니다.## 인증 링크 보내기`send_verification_link`를 `true`로 설정하면 같은 호출에서 사람을 인증에 초대합니다.
Didit은 `workflow_id`의 워크플로로 해당 사람의 인증 세션을 생성하고, 링크를 `email`로 보냅니다.
`language`를 사용하면 이메일의 [언어](https://docs.didit.me/ko/integration/supported-languages.md)를 지정할 수 있습니다. 생략하면 영어로 보냅니다.```bash theme={null}
curl -X POST https://verification.didit.me/v3/users/create/ \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "vendor_data": "user-abc-789",
    "first_name": "Julia",
    "last_name": "Martin",
    "email": "julia.martin@example.com",
    "send_verification_link": true,
    "workflow_id": "YOUR_WORKFLOW_ID",
    "language": "es"
  }'
```- 링크를 보내려면 `email`과 `workflow_id`가 필수이며, 워크플로는 사람을 인증하는 워크플로여야 합니다. 기업 확인(KYB) 워크플로를 지정하면 `400`을 반환합니다.
- 세션은 [세션 생성](https://docs.didit.me/ko/sessions-api/create-session.md)과 같은 검사를 거칩니다. `vendor_data`가 차단 목록에 있거나 크레딧이 부족하면 `400`을 반환합니다.
- 사용자와 세션은 함께 생성되거나 전혀 생성되지 않습니다. 어떤 검사라도 실패하면 아무것도 저장되지 않고 이메일도 보내지 않습니다.
- 응답의 `verification_link`에는 세션의 `session_id`, `session_number`, `status`, `url`, `workflow_id`와 링크가 전송된 `email`이 포함됩니다. 링크를 보내지 않으면 `verification_link`는 `null`입니다.## 참고 사항- `vendor_data`는 필수이며 애플리케이션마다 고유해야 합니다. 중복 생성을 시도하면 충돌 오류가 반환됩니다. 기존 사용자를 업데이트하려면 [`PATCH /v3/users/{vendor_data}/`](https://docs.didit.me/ko/management-api/users/update)를 사용합니다.
- `vendor_data`의 한도는 2000바이트(UTF-8 인코딩)입니다. 이 한도를 넘는 값은 허용되지 않고 400 검증 오류가 반환됩니다.
- 보통 검증된 세션에서 도출되는 필드(`full_name`, `date_of_birth`)는 여기서 미리 설정할 수 있지만, 처음으로 승인된 사용자 인증(KYC) 세션에서 **덮어써질** 수 있습니다.
- 이 endpoint는 얼굴 이미지를 받지 않습니다. 신뢰할 수 있는 가져온 얼굴을 첨부하려면, 이 endpoint가 `didit_internal_id`를 반환한 뒤 [`POST /v3/organization/{organization_id}/application/{application_id}/vendor-users/by-id/{didit_internal_id}/faces/upload/`](https://docs.didit.me/ko/management-api/users/upload-face)를 사용합니다.
- 생성 자체는 webhook을 보내지 않습니다. 이후 사용자 정보가 변경되면 `user.data.updated` 또는 `user.status.updated`가 전송됩니다.
- `send_verification_link`를 사용하면 새 세션이 같은 호출에서 사용자를 업데이트하며, 이때 `user.data.updated`가 전송됩니다.## 권한기본 시크릿 키와 전체 접근 권한이 있는 [API 키](https://docs.didit.me/ko/console/api-keys.md)는 언제든지 이 endpoint를 호출할 수 있습니다.
사용자 지정 접근 권한이 있는 키에는 **People**(`users`) 쓰기 권한이 필요합니다.
`send_verification_link: true`를 사용하면 **세션** 쓰기 권한도 필요합니다. 호출이 세션을 생성하고 그 링크를 전달하기 때문입니다.
이 권한이 없으면 호출은 `403`을 반환하며, 메시지는 `This API key has no write access to sessions.`이고 아무것도 저장되지 않습니다.
일부 워크플로나 승인된 세션으로만 제한된 키는 이 endpoint에 접근할 수 없습니다.Console의 [역할 및 권한](https://docs.didit.me/ko/console/roles-permissions.md)은 팀원이 Console에서 할 수 있는 작업을 결정합니다. 이는 API 키 요청에 대해서는 평가되지 않습니다.## 관련 문서- [사용자 데이터 모델](https://docs.didit.me/ko/entities/users/data-model.md)
- [사용자 얼굴 업로드](https://docs.didit.me/ko/management-api/users/upload-face.md)
- [벤더 데이터 연결](https://docs.didit.me/ko/entities/vendor-data-linking.md)
- [사용자 작업](https://docs.didit.me/ko/entities/users/operations.md)


## OpenAPI

````yaml ko/openapi-25.json POST /v3/users/create/
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/create/:
    post:
      tags:
        - Users
      summary: 사용자 생성
      description: >-
        인증 세션을 만들기 전에 또는 인증 세션 없이 `vendor_data`로 [사용자](/entities/users)를 생성합니다.
        `vendor_data`는 애플리케이션의 사용자 간에 고유해야 합니다(중복 시 `400` 반환). 멱등성이 없습니다.


        **연락처 세부 정보:** `email` 및 `phone_number`는 `metadata.contact`에 저장되며,
        `country`는 `metadata.address`에 저장됩니다. `full_name` 없이 `first_name` 또는
        `last_name`을 전송하면 Didit이 이를 `full_name`으로 결합합니다.


        **인증 링크:** `send_verification_link: true`를 지정하면 Didit은 `workflow_id`에
        해당하는 대상자의 인증 세션도 생성하고 `email`로 링크를 이메일 전송합니다. 해당 세션은 차단 목록 및 크레딧 잔액 확인과
        같이 [세션 생성](/ko/sessions-api/create-session)과 동일한 검사를 실행합니다. 대상자와 세션은 함께
        생성되거나 전혀 생성되지 않습니다. 검사 중 하나라도 실패하면 아무것도 기록되지 않고 이메일도 전송되지 않습니다. 응답의
        `verification_link`는 세션을 설명하며, 링크를 요청하지 않은 경우 `null`입니다.


        **API 키 접근 권한:** 범위가 지정된 API 키에는 `users` 쓰기 권한이 필요합니다.
        `send_verification_link: true`인 경우 `sessions` 쓰기 권한도 필요하며, 그렇지 않으면 아무것도
        기록되기 전에 호출에 `403`으로 응답합니다. 전체 접근 키에는 영향이 없습니다. [API
        키](/ko/console/api-keys)를 참조하십시오.
      operationId: create_user
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - vendor_data
              properties:
                vendor_data:
                  type: string
                  description: >-
                    귀하가 지정한 해당 사용자의 고유 식별자입니다(자유 형식 문자열, UUID 아님). 애플리케이션의 사용자
                    간에 고유해야 하며, 전송된 값과 정확히 일치해야 합니다.
                full_name:
                  type: string
                  nullable: true
                  maxLength: 512
                  description: 사용자의 법적 성명입니다.
                display_name:
                  type: string
                  nullable: true
                  description: 콘솔에 표시되는 친숙한 표시 이름입니다(UI 표시 시 `full_name`보다 우선 적용됨).
                  maxLength: 255
                date_of_birth:
                  type: string
                  format: date
                  nullable: true
                  description: '`YYYY-MM-DD` 형식의 생년월일입니다.'
                status:
                  type: string
                  enum:
                    - ACTIVE
                    - FLAGGED
                    - BLOCKED
                  default: ACTIVE
                  description: 초기 라이프사이클 상태입니다. 기본값은 `ACTIVE`입니다.
                metadata:
                  type: object
                  nullable: true
                  description: 사용자에게 연결하는 임의의 JSON 객체입니다. 기본값은 `{}`입니다.
                approved_emails:
                  type: array
                  items:
                    type: string
                  description: '이 사용자에 대해 사전 신뢰된 이메일 주소 목록입니다(예: `["john@example.com"]`).'
                approved_phones:
                  type: array
                  items:
                    type: string
                  description: '이 사용자에 대해 사전 신뢰된 전화번호 목록입니다(예: `["+14155551234"]`).'
                issuing_states:
                  type: array
                  items:
                    type: string
                  description: '사전 기록된 발급 국가(ISO 3166-1 alpha-3) 목록입니다(예: `["USA"]`).'
                first_name:
                  type: string
                  maxLength: 255
                  description: >-
                    이름. `full_name`을 전송하지 않으면 Didit은 `first_name`과 `last_name`을
                    공백으로 결합하여 `full_name`으로 만듭니다. 별도의 필드로 반환되지 않습니다.
                last_name:
                  type: string
                  maxLength: 255
                  description: >-
                    성. `full_name`이 전송되지 않은 경우 `first_name`과 결합되어 `full_name`이
                    됩니다. 별도의 필드로 반환되지 않습니다.
                email:
                  type: string
                  format: email
                  description: >-
                    `metadata.contact.email`에 저장되는 연락처 이메일입니다(`metadata.contact`
                    내에 전송한 `email`을 대체함). `send_verification_link`가 `true`인 경우
                    필수이며, 인증 링크가 이 주소로 전송됩니다. `metadata.contact`가 JSON 객체가 아닌
                    경우, 호출 시 이 필드에 대해 `400`으로 응답합니다.
                phone_number:
                  type: string
                  maxLength: 32
                  description: >-
                    `metadata.contact.phone_number`에 저장되는 연락처 전화번호입니다.
                    `metadata.contact`가 JSON 객체가 아닌 경우 이 필드에 대해 호출 시 `400`을
                    반환합니다.
                country:
                  type: string
                  maxLength: 3
                  description: >-
                    ISO 3166 코드(alpha-2 또는 alpha-3, 예: `ES` 또는 `ESP`)로 표현된
                    국가입니다. `metadata.address.country`에 대문자로 저장됩니다.
                    `metadata.address`가 JSON 객체가 아닌 경우, 호출 시 이 필드에 대해 `400`을
                    반환합니다.
                send_verification_link:
                  type: boolean
                  default: false
                  description: >-
                    `true`인 경우 Didit은 해당 사용자를 위해 `workflow_id`에 대한 인증 세션을 생성하고
                    `email` 주소로 링크를 이메일로 전송합니다. `email` 및 `workflow_id`가 필요합니다.
                    범위가 지정된 API 키에는 `sessions` 쓰기 권한도 필요합니다.
                workflow_id:
                  type: string
                  format: uuid
                  description: >-
                    인증 세션의 워크플로입니다. `send_verification_link`가 `true`일 때 필수입니다.
                    개인을 인증해야 하며, 기업 확인(KYB) 워크플로는 거부됩니다. 그렇지 않은 경우 무시됩니다.
                language:
                  type: string
                  maxLength: 10
                  description: >-
                    인증 이메일 언어로, [지원 언어](/ko/integration/supported-languages) 코드
                    형태입니다. 생략 시 영어로 설정됩니다. `send_verification_link`가 `true`가 아니면
                    무시됩니다.
            examples:
              Basic:
                summary: 기본 정보로 생성
                value:
                  vendor_data: user-abc-123
                  full_name: John Doe
              Full:
                summary: 모든 필드
                value:
                  vendor_data: user-abc-456
                  full_name: Jane Smith
                  display_name: Jane S.
                  date_of_birth: '1990-05-15'
                  status: ACTIVE
                  metadata:
                    tier: premium
                    source: api
                  approved_emails:
                    - jane@example.com
              Contact details:
                summary: 이름, 이메일, 전화번호 및 국가
                value:
                  vendor_data: user-abc-789
                  first_name: Julia
                  last_name: Martin
                  email: julia.martin@example.com
                  phone_number: '+34600000000'
                  country: ES
              With verification link:
                summary: 사람을 생성하고 인증 링크를 이메일로 전송
                value:
                  vendor_data: user-abc-789
                  first_name: Julia
                  last_name: Martin
                  email: julia.martin@example.com
                  send_verification_link: true
                  workflow_id: 3fa85f64-5717-4562-b3fc-2c963f66afa6
                  language: es
      responses:
        '201':
          description: >-
            사용자가 생성되었습니다. 전체 사용자 레코드(Get User와 동일한 형식)와 함께 `verification_link`가
            반환됩니다. `send_verification_link`가 `true`인 경우 Didit이 이메일로 전송한 인증 세션이며,
            그렇지 않으면 `null`입니다.
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/UserDetailItem'
                  - type: object
                    required:
                      - verification_link
                    properties:
                      verification_link:
                        type: object
                        nullable: true
                        description: >-
                          Didit이 생성하여 해당 사용자에게 이메일로 전송한 인증 세션입니다. 항상 존재하며,
                          `send_verification_link`가 `true`가 아닌 경우 `null`입니다.
                        required:
                          - session_id
                          - session_number
                          - status
                          - url
                          - workflow_id
                          - email
                        properties:
                          session_id:
                            type: string
                            format: uuid
                            description: 인증 세션의 ID입니다.
                          session_number:
                            type: integer
                            description: 애플리케이션 내 세션의 순차 번호입니다.
                          status:
                            type: string
                            description: 세션의 상태로, 방금 생성된 세션의 경우 `Not Started`입니다.
                          url:
                            type: string
                            format: uri
                            description: Didit이 해당 사용자에게 이메일로 전송한 인증 링크입니다.
                          workflow_id:
                            type: string
                            format: uuid
                            nullable: true
                            description: 세션에서 실행되는 워크플로입니다.
                          email:
                            type: string
                            format: email
                            description: 링크가 전송된 주소입니다.
              examples:
                Created:
                  value:
                    didit_internal_id: f4e5e1f2-94a9-4f86-8c16-2b7d9b4db418
                    vendor_data: user-abc-123
                    display_name: null
                    full_name: John Doe
                    date_of_birth: null
                    effective_name: John Doe
                    status: ACTIVE
                    metadata: {}
                    portrait_image_url: null
                    session_count: 0
                    approved_count: 0
                    declined_count: 0
                    in_review_count: 0
                    issuing_states: []
                    approved_emails: []
                    approved_phones: []
                    features: {}
                    features_list: []
                    last_session_at: null
                    last_activity_at: '2025-06-15T10:30:00Z'
                    first_session_at: null
                    tags: []
                    comments: []
                    created_at: '2025-06-15T10:30:00Z'
                    updated_at: '2025-06-15T10:30:00Z'
                    verification_link: null
                Created with verification link:
                  value:
                    didit_internal_id: 9b2f6c1e-3d4a-4e5f-8a7b-1c2d3e4f5a6b
                    vendor_data: user-abc-789
                    display_name: null
                    full_name: Julia Martin
                    date_of_birth: null
                    effective_name: Julia Martin
                    status: ACTIVE
                    metadata:
                      contact:
                        email: julia.martin@example.com
                    portrait_image_url: null
                    session_count: 1
                    approved_count: 0
                    declined_count: 0
                    in_review_count: 0
                    issuing_states: []
                    approved_emails: []
                    approved_phones: []
                    features: {}
                    features_list: []
                    last_session_at: '2025-06-15T10:30:00Z'
                    last_activity_at: '2025-06-15T10:30:00Z'
                    first_session_at: '2025-06-15T10:30:00Z'
                    tags: []
                    comments: []
                    created_at: '2025-06-15T10:30:00Z'
                    updated_at: '2025-06-15T10:30:00Z'
                    verification_link:
                      session_id: 3fa85f64-5717-4562-b3fc-2c963f66afa7
                      session_number: 43762
                      status: Not Started
                      url: https://verify.didit.me/en/session/3FaJ9wLqX2Mz
                      workflow_id: 3fa85f64-5717-4562-b3fc-2c963f66afa6
                      email: julia.martin@example.com
        '400':
          description: >-
            필드별로 구분된 유효하지 않은 본문: 일반적으로 중복된 `vendor_data`, 필수 필드 누락 또는 잘못된 형식의
            값입니다. `send_verification_link: true`인 경우 `email` 또는 `workflow_id`
            누락, 알 수 없거나 기업 확인(KYB) 워크플로, 지원되지 않는
            `language`(`contact_details.email_lang` 키), 차단 목록에 포함된
            `vendor_data`, 또는 세션을 시작하기에 크레딧이 부족한 경우도 포함됩니다. 아무것도 기록되지 않습니다.
          content:
            application/json:
              examples:
                Duplicate:
                  value:
                    vendor_data:
                      - A user with this vendor_data already exists.
                Missing vendor_data:
                  value:
                    vendor_data:
                      - This field is required.
                Bad metadata:
                  value:
                    metadata:
                      - Metadata must be a JSON object.
                Bad status:
                  value:
                    status:
                      - >-
                        Invalid status. Valid options are: ACTIVE, FLAGGED,
                        BLOCKED
                Bad country:
                  value:
                    country:
                      - Use an ISO 3166 country code, like ES or ESP.
                Contact not an object:
                  value:
                    email:
                      - >-
                        metadata.contact must be a JSON object to store this
                        value.
                Address not an object:
                  value:
                    country:
                      - >-
                        metadata.address must be a JSON object to store this
                        value.
                Link without email or workflow:
                  value:
                    email:
                      - >-
                        An email address is required to send a verification
                        link.
                    workflow_id:
                      - Pick the workflow to send a verification link for.
                Unknown workflow:
                  value:
                    workflow_id:
                      - Invalid workflow_id.
                Business workflow:
                  value:
                    workflow_id:
                      - >-
                        This workflow verifies a business. Pick a workflow that
                        verifies a person to send them a verification link.
                Blocklisted vendor_data:
                  value:
                    vendor_data: >-
                      This user or business has been blocked and cannot create
                      new verification sessions.
                Insufficient credits:
                  value:
                    detail: >-
                      You don't have enough credits to perform this request.
                      Please top up at https://business.didit.me
        '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: >-
            유효하지 않거나 해지된 API 키이거나, 키에 이 애플리케이션의 사용자를 생성할 권한이 없습니다. 범위가 지정된 API
            키에는 `users` 쓰기 권한이 필요하며, `send_verification_link`가 `true`인 경우
            `sessions` 쓰기 권한도 필요합니다. 아무것도 기록되지 않습니다. 키가 누락되면 `403`을 반환하며, 잘못되었거나
            해지되었거나 만료된 키는 `401`을 반환합니다.
          content:
            application/json:
              examples:
                Forbidden:
                  value:
                    detail: You do not have permission to perform this action.
                No sessions write:
                  summary: 스코프 지정 키가 sessions 쓰기 권한 없이 인증 링크를 요청함
                  value:
                    detail: This API key has no write access to sessions.
        '429':
          description: 속도 제한 초과. 대기 후 `Retry-After`에 지정된 시간 간격이 지난 뒤 재시도하세요.
          content:
            application/json:
              examples:
                Rate limited:
                  value:
                    detail: Request was throttled. Expected available in 30 seconds.
      security:
        - ApiKeyAuth: []
      x-codeSamples:
        - lang: curl
          label: curl
          source: |-
            curl -X POST 'https://verification.didit.me/v3/users/create/' \
              -H 'x-api-key: YOUR_API_KEY' \
              -H 'Content-Type: application/json' \
              -d '{"vendor_data": "user-abc-123", "full_name": "John Doe"}'
        - lang: python
          label: Python
          source: |-
            from didit import Didit

            # Reads DIDIT_API_KEY.
            client = Didit()

            result = client.users.create(
                vendor_data="user-abc-123",
                full_name="John Doe",
            )
            print(result)
        - lang: javascript
          label: Node.js
          source: |-
            import Didit from "@didit-protocol/sdk-node";

            // Reads DIDIT_API_KEY.
            const didit = new Didit();

            const result = await didit.users.create({
              vendor_data: "user-abc-123",
              full_name: "John Doe",
            });
            console.log(result);
        - lang: go
          label: Go
          source: "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Users.Create(ctx, didit.UsersCreateParams{\n\tVendorData: \"user-abc-123\",\n\tFullName:   didit.String(\"John Doe\"),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
        - lang: java
          label: Java
          source: |-
            import me.didit.Didit;
            import me.didit.types.UsersCreateParams;

            // Reads DIDIT_API_KEY.
            Didit client = new Didit();

            var result = client.users().create(UsersCreateParams.builder()
                    .vendorData("user-abc-123")
                    .fullName("John Doe")
                    .build());
            System.out.println(result);
        - lang: php
          label: PHP
          source: |-
            <?php

            require 'vendor/autoload.php';

            use Didit\DiditClient;

            // Reads DIDIT_API_KEY.
            $didit = new DiditClient();

            $result = $didit->users->create([
                'vendor_data' => 'user-abc-123',
                'full_name' => 'John Doe',
            ]);
            print_r($result->toArray());
        - lang: ruby
          label: Ruby
          source: |-
            require "didit"

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

            result = didit.users.create(
              vendor_data: "user-abc-123",
              full_name: "John Doe"
            )
            puts result.to_h
        - lang: csharp
          label: .NET
          source: |-
            using System;
            using System.Text.Json;
            using Didit;

            // Reads DIDIT_API_KEY.
            using var client = new DiditClient();

            var result = await client.Users.CreateAsync(new UsersCreateParams
            {
                VendorData = "user-abc-123",
                FullName = "John Doe",
            });
            Console.WriteLine(JsonSerializer.Serialize(result));
components:
  schemas:
    UserDetailItem:
      type: object
      description: 전체 사용자 세부정보입니다. UserListItem을 메타데이터, 댓글 및 updated_at으로 확장합니다.
      allOf:
        - $ref: '#/components/schemas/UserListItem'
        - type: object
          properties:
            metadata:
              type: object
              description: 이 사용자에 첨부한 커스텀 메타데이터 JSON입니다. 기본값은 `{}`입니다.
            tags:
              type: array
              description: >-
                태그 할당입니다. 참고: 목록 응답에 사용되는 플랫한 `{uuid, name, color}` 형태와 달리, 상세
                응답의 각 항목은 태그 *링크* 객체(`{uuid, tag: {...}, added_by_email,
                added_by_name, created_at}`)입니다.
              items:
                type: object
                properties:
                  uuid:
                    type: string
                    format: uuid
                    description: 태그 할당의 UUID입니다(태그 자체의 UUID가 아님).
                  tag:
                    type: object
                    properties:
                      uuid:
                        type: string
                        format: uuid
                      name:
                        type: string
                      color:
                        type: string
                      description:
                        type: string
                        nullable: true
                      source:
                        type: string
                        enum:
                          - didit
                          - custom
                      created_at:
                        type: string
                        format: date-time
                      updated_at:
                        type: string
                        format: date-time
                  added_by_email:
                    type: string
                    nullable: true
                  added_by_name:
                    type: string
                    nullable: true
                  created_at:
                    type: string
                    format: date-time
            comments:
              type: array
              items:
                type: object
                properties:
                  uuid:
                    type: string
                    format: uuid
                  comment_type:
                    type: string
                    enum:
                      - COMMENT
                      - STATUS_CHANGED
                      - METADATA_UPDATED
                      - TAG_ADDED
                      - TAG_REMOVED
                      - PROFILE_UPDATED
                  comment:
                    type: string
                    nullable: true
                  actor_email:
                    type: string
                    nullable: true
                  actor_name:
                    type: string
                    nullable: true
                  previous_status:
                    type: string
                    nullable: true
                    enum:
                      - ACTIVE
                      - FLAGGED
                      - BLOCKED
                      - null
                  new_status:
                    type: string
                    nullable: true
                    enum:
                      - ACTIVE
                      - FLAGGED
                      - BLOCKED
                      - null
                  previous_value:
                    type: object
                    nullable: true
                    description: PROFILE_UPDATED 항목의 이전 필드 값입니다.
                  new_value:
                    type: object
                    nullable: true
                    description: PROFILE_UPDATED 항목의 새 필드 값입니다.
                  changed_fields:
                    type: array
                    items:
                      type: string
                    description: PROFILE_UPDATED 항목에 의해 변경된 필드의 이름입니다.
                  metadata:
                    type: object
                    nullable: true
                  mentioned_emails:
                    type: array
                    items:
                      type: string
                  created_at:
                    type: string
                    format: date-time
              description: 이 사용자의 활동 로그 및 댓글입니다(상태 변경, 프로필 수정, 수동 메모).
            updated_at:
              type: string
              format: date-time
    UserListItem:
      type: object
      description: 인증된 사용자입니다.
      properties:
        didit_internal_id:
          type: string
          format: uuid
          description: 이 사용자에 대한 Didit의 고유 내부 UUID입니다.
        vendor_data:
          type: string
          nullable: true
          description: >-
            귀하가 지정한 해당 사용자의 고유 식별자입니다(세션 생성 시 전달됨). 벤더 식별자가 제공되지 않은 경우 null일 수
            있습니다.
        display_name:
          type: string
          nullable: true
          description: 직접 설정한 커스텀 표시 이름
        full_name:
          type: string
          nullable: true
          description: 인증된 문서에서 추출된 성명
        date_of_birth:
          type: string
          format: date
          nullable: true
        effective_name:
          type: string
          nullable: true
          description: '사용 가능한 최적의 이름: display_name이 설정된 경우 해당 값, 그렇지 않으면 full_name'
        status:
          type: string
          enum:
            - ACTIVE
            - FLAGGED
            - BLOCKED
          description: >-
            사용자 레코드의 수명 주기 상태입니다(세션 상태가 아님). 기본값은 `ACTIVE`이며, `FLAGGED`는 사용자를 수동
            확인 필요로 표시하고, `BLOCKED`는 해당 `vendor_data`에 대한 새 세션을 방지합니다.
        portrait_image_url:
          type: string
          nullable: true
          description: 사용자의 사전 서명된 인물 사진 URL(몇 시간 후 만료됨)
        session_count:
          type: integer
          description: 해당 사용자의 총 인증 세션 수
        approved_count:
          type: integer
          description: 승인된 세션 수
        declined_count:
          type: integer
          description: 거부된 세션 수
        in_review_count:
          type: integer
          description: 검토 중인 세션 수
        issuing_states:
          type: array
          items:
            type: string
          description: >-
            이 사용자의 승인된 신분증 문서에서 확인된 발급 국가의 ISO 3166-1 alpha-3 코드 목록입니다(예:
            `["USA", "ESP"]`). 없는 경우 빈 배열입니다.
        approved_emails:
          type: array
          items:
            type: string
          description: '이 사용자의 승인된 세션에서 수집된 인증된 이메일 주소입니다(예: `["john@example.com"]`).'
        approved_phones:
          type: array
          items:
            type: string
          description: '이 사용자의 승인된 세션에서 수집된 인증된 전화번호입니다(예: `["+14155551234"]`).'
        features:
          type: object
          description: >-
            이 사용자의 모든 세션에 걸쳐 집계된 기능별 상태입니다. 가능한 키: `ID_VERIFICATION`, `NFC`,
            `LIVENESS`, `FACE_MATCH`, `POA`, `QUESTIONNAIRE`,
            `EMAIL_VERIFICATION`, `PHONE`, `AML`, `IP_ANALYSIS`,
            `AGE_ESTIMATION`, `DATABASE_VALIDATION`. 가능한 값: `Approved`,
            `Declined`, `In Review`, `Not Finished`, `Resub Requested`.
        features_list:
          type: array
          items:
            type: object
            properties:
              feature:
                type: string
              status:
                type: string
          description: '`features`와 동일한 데이터로, `{feature, status}` 객체의 정렬된 배열입니다.'
        last_session_at:
          type: string
          format: date-time
          nullable: true
          description: 가장 최근 세션의 타임스탬프
        first_session_at:
          type: string
          format: date-time
          nullable: true
          description: 첫 번째 세션의 타임스탬프
        last_activity_at:
          type: string
          format: date-time
          nullable: true
          description: 이 사용자에 대한 가장 최근 활동(세션, 거래, 상태 변경, 데이터 편집 등)의 타임스탬프입니다.
        tags:
          type: array
          items:
            type: object
            properties:
              uuid:
                type: string
                format: uuid
              name:
                type: string
              color:
                type: string
          description: 이 사용자에게 할당된 태그
        created_at:
          type: string
          format: date-time
  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.