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

# Create User API: Pembuatan Pengguna Vendor Didit

> Didit: pra-isi entitas User vendor sebelum sesi KYC berjalan. Onboarding massal dari database eksternal atau daftarkan pengguna untuk pemantauan transaksi.



Prompt Membuat Pengguna
        Salin prompt ke papan klip



      
      

\<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>



      
      

Tempel ke

## IkhtisarMembuat [entitas Pengguna](https://docs.didit.me/id/entities/users/overview.md) secara eksplisit sebelum sesi apa pun dijalankan.
Entitas yang dikembalikan berada dalam status `ACTIVE` kecuali Anda menentukan lain.
Secara opsional, panggilan yang sama juga mengirim email berisi tautan verifikasi kepada orang tersebut (lihat [Kirim tautan verifikasi](#kirim-tautan-verifikasi)).## Kapan digunakan- **Isi metadata awal** (tingkat, sumber pendaftaran, tag internal) sebelum pelanggan melakukan verifikasi.
- **Migrasi dari vendor lain**: buat ulang daftar pengguna yang sudah ada di Didit agar riwayat dan analitik dimulai dari titik awal yang diketahui.
- **Impor wajah profil tepercaya**: buat Pengguna terlebih dahulu, lalu panggil [Unggah Wajah Pengguna](https://docs.didit.me/id/management-api/users/upload-face.md) dengan `didit_internal_id` yang dikembalikan.
- **Kasus penggunaan khusus transaksi**: daftarkan Pengguna dengan `vendor_data` agar Anda dapat mengirim transaksi tanpa pernah menjalankan sesi Verifikasi Pengguna (KYC).
- **Undang seseorang untuk memverifikasi**: buat orang tersebut dan kirim tautan verifikasi melalui email dalam satu panggilan.## Detail kontakAnda dapat mengirim detail kontak orang tersebut bersama kolom profil.
`first_name` dan `last_name` digabungkan dengan spasi menjadi `full_name` jika Anda tidak mengirim `full_name`.
`email` dan `phone_number` disimpan di `metadata.contact`, dan `country` disimpan di `metadata.address`.
`country` menerima kode ISO 3166, alpha-2 atau alpha-3 (`ES` atau `ESP`), dan disimpan dalam huruf kapital.Jika `metadata` yang Anda kirim sudah memiliki nilai `contact` atau `address` yang bukan objek JSON, Didit tidak menimpanya: panggilan mengembalikan `400` pada kolom kontak atau alamat yang memerlukannya.## Kirim tautan verifikasiAtur `send_verification_link` ke `true` untuk mengundang orang tersebut memverifikasi dalam panggilan yang sama.
Didit membuat sesi verifikasi untuk orang tersebut pada alur kerja di `workflow_id` dan mengirimkan tautannya ke `email` mereka.
Gunakan `language` untuk memilih [bahasa](https://docs.didit.me/id/integration/supported-languages.md) email; jika Anda tidak mengisinya, bahasanya adalah bahasa Inggris.```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` dan `workflow_id` wajib diisi jika menyertakan tautan, dan alur kerja harus memverifikasi orang: alur kerja Verifikasi Bisnis (KYB) mengembalikan `400`.
- Sesi melewati pemeriksaan yang sama dengan [Buat Sesi](https://docs.didit.me/id/sessions-api/create-session.md).
  `vendor_data` yang masuk daftar blokir atau kredit yang tidak cukup mengembalikan `400`.
- Orang dan sesi dibuat bersamaan atau tidak sama sekali.
  Jika salah satu pemeriksaan gagal, tidak ada yang ditulis dan tidak ada email yang dikirim.
- Respons memuat `verification_link` dengan `session_id`, `session_number`, `status`, `url`, `workflow_id` dari sesi, serta `email` tempat tautan dikirim.
  Tanpa tautan, `verification_link` bernilai `null`.## Catatan- `vendor_data` wajib diisi dan harus unik per aplikasi. Mencoba membuat duplikat akan mengembalikan error konflik. Gunakan [`PATCH /v3/users/{vendor_data}/`](https://docs.didit.me/id/management-api/users/update) untuk memperbarui pengguna yang sudah ada.
- `vendor_data` memiliki batas keras 2000 byte (dienkode UTF-8). Nilai yang melebihi batas itu mengembalikan error validasi 400, alih-alih diterima.
- Kolom yang biasanya diturunkan dari sesi terverifikasi (`full_name`, `date_of_birth`) dapat diisi di sini, tetapi dapat **ditimpa** oleh sesi Verifikasi Pengguna (KYC) pertama yang disetujui.
- Endpoint ini tidak menerima gambar wajah. Untuk melampirkan wajah impor yang tepercaya, gunakan [`POST /v3/organization/{organization_id}/application/{application_id}/vendor-users/by-id/{didit_internal_id}/faces/upload/`](https://docs.didit.me/id/management-api/users/upload-face) setelah endpoint ini mengembalikan `didit_internal_id`.
- Pembuatan itu sendiri tidak mengirim webhook. Perubahan berikutnya pada pengguna mengirim `user.data.updated` atau `user.status.updated`.
- Dengan `send_verification_link`, sesi baru memperbarui pengguna dalam panggilan yang sama, yang mengirim `user.data.updated`.## IzinRahasia utama dan [kunci API](https://docs.didit.me/id/console/api-keys.md) dengan akses penuh selalu dapat memanggil endpoint ini.
Kunci dengan akses kustom memerlukan izin tulis **Orang** (`users`).
Dengan `send_verification_link: true`, kunci juga memerlukan izin tulis **Sesi**, karena panggilan membuat sesi dan memberikan tautannya.
Tanpa izin tersebut, panggilan mengembalikan `403` dengan `This API key has no write access to sessions.` dan tidak ada yang ditulis.
Kunci yang dibatasi pada alur kerja tertentu atau pada sesi yang disetujui tidak dapat mengakses endpoint ini.[Peran dan izin](https://docs.didit.me/id/console/roles-permissions.md) di Konsol menentukan apa yang dapat dilakukan anggota tim di Konsol.
Keduanya tidak dievaluasi untuk permintaan kunci API.## Terkait- [Model data pengguna](https://docs.didit.me/id/entities/users/data-model.md)
- [Unggah Wajah Pengguna](https://docs.didit.me/id/management-api/users/upload-face.md)
- [Penautan data vendor](https://docs.didit.me/id/entities/vendor-data-linking.md)
- [Operasi pengguna](https://docs.didit.me/id/entities/users/operations.md)


## OpenAPI

````yaml id/openapi-25.json POST /v3/users/create/
openapi: 3.0.0
info:
  version: 3.0.0
  title: Didit Verification API
  description: API Verifikasi Identitas. Lakukan autentikasi dengan header x-api-key.
servers:
  - url: https://verification.didit.me
security: []
tags: []
paths:
  /v3/users/create/:
    post:
      tags:
        - Users
      summary: Buat pengguna
      description: >-
        Buat [pengguna](/entities/users) berdasarkan `vendor_data`, sebelum atau
        tanpa sesi verifikasi. `vendor_data` harus unik di antara pengguna
        aplikasi (duplikat mengembalikan `400`). Tidak idempoten.


        **Detail kontak:** `email` dan `phone_number` disimpan di
        `metadata.contact`, dan `country` di `metadata.address`. Saat Anda
        mengirim `first_name` atau `last_name` tanpa `full_name`, Didit
        menggabungkannya menjadi `full_name`.


        **Tautan verifikasi:** dengan `send_verification_link: true`, Didit juga
        membuat sesi verifikasi untuk orang tersebut pada `workflow_id` dan
        mengirimkan tautannya ke `email`. Sesi ini menjalankan pemeriksaan yang
        sama seperti [Create Session](/id/sessions-api/create-session), seperti
        daftar blokir dan saldo kredit Anda. Orang dan sesi tersebut dibuat
        bersamaan atau tidak sama sekali: jika ada pemeriksaan yang gagal, tidak
        ada data yang ditulis dan tidak ada email yang dikirim.
        `verification_link` pada respons mendeskripsikan sesi tersebut, dan
        bernilai `null` jika Anda tidak meminta tautan.


        **Akses kunci API:** kunci API dengan cakupan terbatas memerlukan izin
        tulis `users`. Dengan `send_verification_link: true`, kunci ini juga
        memerlukan izin tulis `sessions`, atau panggilan akan mengembalikan
        `403` sebelum ada data yang ditulis. Kunci akses penuh tidak
        terpengaruh. Lihat [kunci API](/id/console/api-keys).
      operationId: create_user
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - vendor_data
              properties:
                vendor_data:
                  type: string
                  description: >-
                    Pengidentifikasi unik Anda untuk pengguna ini (string bentuk
                    bebas, BUKAN UUID). Harus unik di antara pengguna aplikasi;
                    dicocokkan persis seperti yang dikirim.
                full_name:
                  type: string
                  nullable: true
                  maxLength: 512
                  description: Nama lengkap resmi pengguna.
                display_name:
                  type: string
                  nullable: true
                  description: >-
                    Nama tampilan yang mudah dipahami yang ditampilkan di konsol
                    (lebih diutamakan daripada `full_name` untuk tampilan UI).
                  maxLength: 255
                date_of_birth:
                  type: string
                  format: date
                  nullable: true
                  description: Tanggal lahir dalam format `YYYY-MM-DD`.
                status:
                  type: string
                  enum:
                    - ACTIVE
                    - FLAGGED
                    - BLOCKED
                  default: ACTIVE
                  description: Status siklus hidup awal. Default-nya adalah `ACTIVE`.
                metadata:
                  type: object
                  nullable: true
                  description: >-
                    Objek JSON arbitrer yang Anda lampirkan ke pengguna.
                    Defaultnya adalah `{}`.
                approved_emails:
                  type: array
                  items:
                    type: string
                  description: >-
                    Alamat email yang dipercaya sebelumnya untuk pengguna ini,
                    mis. `["john@example.com"]`.
                approved_phones:
                  type: array
                  items:
                    type: string
                  description: >-
                    Nomor telepon yang dipercaya sebelumnya untuk pengguna ini,
                    mis. `["+14155551234"]`.
                issuing_states:
                  type: array
                  items:
                    type: string
                  description: >-
                    Negara penerbit yang direkam sebelumnya (ISO 3166-1
                    alpha-3), mis. `["USA"]`.
                first_name:
                  type: string
                  maxLength: 255
                  description: >-
                    Nama depan. Ketika `full_name` tidak dikirimkan, Didit
                    menggabungkan `first_name` dan `last_name` dengan spasi
                    menjadi `full_name`. Tidak dikembalikan sebagai kolom
                    terpisah.
                last_name:
                  type: string
                  maxLength: 255
                  description: >-
                    Nama keluarga. Digabungkan dengan `first_name` menjadi
                    `full_name` ketika `full_name` tidak dikirimkan. Tidak
                    dikembalikan sebagai kolom terpisah.
                email:
                  type: string
                  format: email
                  description: >-
                    Email kontak, disimpan di `metadata.contact.email` (ini
                    menggantikan `email` yang Anda kirimkan di dalam
                    `metadata.contact`). Wajib diisi jika
                    `send_verification_link` bernilai `true`: tautan akan
                    dikirim ke alamat ini. Jika `metadata.contact` bukan objek
                    JSON, panggilan akan menghasilkan respons `400` pada kolom
                    ini.
                phone_number:
                  type: string
                  maxLength: 32
                  description: >-
                    Nomor telepon kontak, disimpan di
                    `metadata.contact.phone_number`. Jika `metadata.contact`
                    bukan objek JSON, permintaan akan mengembalikan respons
                    `400` untuk kolom ini.
                country:
                  type: string
                  maxLength: 3
                  description: >-
                    Negara sebagai kode ISO 3166, alpha-2 atau alpha-3 (`ES`
                    atau `ESP`). Disimpan dalam huruf besar di
                    `metadata.address.country`. Jika `metadata.address` bukan
                    objek JSON, panggilan akan merespons `400` pada kolom ini.
                send_verification_link:
                  type: boolean
                  default: false
                  description: >-
                    Jika `true`, Didit membuat sesi verifikasi untuk orang
                    tersebut pada `workflow_id` dan mengirimkan tautan melalui
                    email ke `email`. Memerlukan `email` dan `workflow_id`.
                    Kunci API dengan cakupan juga memerlukan izin tulis
                    `sessions`.
                workflow_id:
                  type: string
                  format: uuid
                  description: >-
                    Alur kerja sesi verifikasi. Wajib diisi ketika
                    `send_verification_link` bernilai `true`. Alur kerja ini
                    harus memverifikasi perorangan: alur kerja Verifikasi Bisnis
                    (KYB) akan ditolak. Jika tidak, parameter ini diabaikan.
                language:
                  type: string
                  maxLength: 10
                  description: >-
                    Bahasa email verifikasi, sebagai kode [bahasa yang
                    didukung](/id/integration/supported-languages). Bahasa
                    Inggris jika diabaikan. Diabaikan jika
                    `send_verification_link` bukan `true`.
            examples:
              Basic:
                summary: Buat dengan info dasar
                value:
                  vendor_data: user-abc-123
                  full_name: John Doe
              Full:
                summary: Semua kolom
                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: Nama, email, telepon, dan negara
                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: >-
                  Buat orang tersebut dan kirimkan tautan verifikasi melalui
                  email
                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: >-
            Pengguna dibuat. Data pengguna lengkap (bentuk yang sama seperti
            Dapatkan Pengguna), ditambah `verification_link`: sesi verifikasi
            yang dikirim melalui email oleh Didit saat `send_verification_link`
            bernilai `true`, jika tidak `null`.
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/UserDetailItem'
                  - type: object
                    required:
                      - verification_link
                    properties:
                      verification_link:
                        type: object
                        nullable: true
                        description: >-
                          Sesi verifikasi yang dibuat dan dikirimkan Didit
                          melalui email kepada orang tersebut. Selalu ada:
                          `null` jika `send_verification_link` tidak bernilai
                          `true`.
                        required:
                          - session_id
                          - session_number
                          - status
                          - url
                          - workflow_id
                          - email
                        properties:
                          session_id:
                            type: string
                            format: uuid
                            description: ID sesi verifikasi.
                          session_number:
                            type: integer
                            description: Nomor urut sesi di dalam aplikasi Anda.
                          status:
                            type: string
                            description: >-
                              Status sesi, `Not Started` untuk sesi yang baru
                              saja dibuat.
                          url:
                            type: string
                            format: uri
                            description: >-
                              Tautan verifikasi yang dikirimkan Didit melalui
                              email kepada orang tersebut.
                          workflow_id:
                            type: string
                            format: uuid
                            nullable: true
                            description: Alur kerja yang dijalankan oleh sesi.
                          email:
                            type: string
                            format: email
                            description: Alamat tujuan pengiriman tautan.
              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: >-
            Body tidak valid, diberi kunci berdasarkan kolom: biasanya duplikat
            `vendor_data`, kolom wajib yang hilang, atau nilai yang salah
            format. Dengan `send_verification_link: true`, juga `email` atau
            `workflow_id` yang hilang, alur kerja Verifikasi Bisnis (KYB) atau
            tidak dikenal, `language` yang tidak didukung (berkunci
            `contact_details.email_lang`), `vendor_data` yang masuk daftar
            blokir, atau kredit terlalu sedikit untuk memulai sesi. Tidak ada
            yang ditulis.
          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: >-
            Tidak ada kredensial yang diberikan. Permintaan ke jalur
            `/v3/users/*` tanpa header `x-api-key` (atau token `Authorization:
            Bearer`) akan ditolak oleh middleware autentikasi sebelum mencapai
            API.
          content:
            application/json:
              examples:
                Missing credentials:
                  value:
                    detail: >-
                      You must be authenticated with a valid access token to
                      access this endpoint.
        '403':
          description: >-
            Kunci API tidak valid atau dicabut, atau kunci tidak dapat membuat
            pengguna untuk aplikasi ini. Kunci API dengan cakupan memerlukan
            izin tulis `users`, dan juga izin tulis `sessions` jika
            `send_verification_link` bernilai `true`; tidak ada yang ditulis.
            Kunci yang hilang mengembalikan `403`; kunci yang salah, dicabut,
            atau kedaluwarsa mengembalikan `401`.
          content:
            application/json:
              examples:
                Forbidden:
                  value:
                    detail: You do not have permission to perform this action.
                No sessions write:
                  summary: >-
                    Kunci ber-scope meminta tautan verifikasi tanpa izin tulis
                    sessions
                  value:
                    detail: This API key has no write access to sessions.
        '429':
          description: >-
            Batas laju terlampaui; kurangi laju permintaan dan coba lagi setelah
            interval yang ditunjukkan dalam `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: >-
        Detail pengguna lengkap. Memperluas UserListItem dengan metadata,
        komentar, dan updated_at.
      allOf:
        - $ref: '#/components/schemas/UserListItem'
        - type: object
          properties:
            metadata:
              type: object
              description: >-
                JSON metadata kustom yang Anda lampirkan ke pengguna ini.
                Default adalah `{}`.
            tags:
              type: array
              description: >-
                Penetapan tag. CATATAN: pada respons detail, setiap entri berupa
                objek *tautan* tag (`{uuid, tag: {...}, added_by_email,
                added_by_name, created_at}`), berbeda dengan format datar
                `{uuid, name, color}` yang digunakan pada respons daftar.
              items:
                type: object
                properties:
                  uuid:
                    type: string
                    format: uuid
                    description: UUID penetapan tag (bukan tag itu sendiri).
                  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: Nilai kolom sebelumnya untuk entri PROFILE_UPDATED.
                  new_value:
                    type: object
                    nullable: true
                    description: Nilai kolom baru untuk entri PROFILE_UPDATED.
                  changed_fields:
                    type: array
                    items:
                      type: string
                    description: Nama kolom yang diubah oleh entri PROFILE_UPDATED.
                  metadata:
                    type: object
                    nullable: true
                  mentioned_emails:
                    type: array
                    items:
                      type: string
                  created_at:
                    type: string
                    format: date-time
              description: >-
                Log aktivitas dan komentar untuk pengguna ini (perubahan status,
                pengeditan profil, catatan manual).
            updated_at:
              type: string
              format: date-time
    UserListItem:
      type: object
      description: Pengguna yang terverifikasi.
      properties:
        didit_internal_id:
          type: string
          format: uuid
          description: UUID internal yang stabil dari Didit untuk pengguna ini.
        vendor_data:
          type: string
          nullable: true
          description: >-
            Pengidentifikasi unik Anda untuk pengguna ini (diteruskan saat
            membuat sesi). Nilai ini dapat berupa null jika tidak ada
            pengidentifikasi vendor yang diberikan.
        display_name:
          type: string
          nullable: true
          description: Nama tampilan kustom yang Anda tetapkan
        full_name:
          type: string
          nullable: true
          description: Nama lengkap yang diekstrak dari dokumen yang diverifikasi
        date_of_birth:
          type: string
          format: date
          nullable: true
        effective_name:
          type: string
          nullable: true
          description: >-
            Nama terbaik yang tersedia: display_name jika disetel, selain itu
            full_name
        status:
          type: string
          enum:
            - ACTIVE
            - FLAGGED
            - BLOCKED
          description: >-
            Status siklus hidup rekaman pengguna (BUKAN status sesi). `ACTIVE`
            adalah default, `FLAGGED` menandai pengguna untuk perhatian manual,
            `BLOCKED` mencegah sesi baru untuk `vendor_data` ini.
        portrait_image_url:
          type: string
          nullable: true
          description: >-
            URL presigned untuk foto potret pengguna (kedaluwarsa setelah
            beberapa jam)
        session_count:
          type: integer
          description: Jumlah total sesi verifikasi untuk pengguna ini
        approved_count:
          type: integer
          description: Jumlah sesi yang disetujui
        declined_count:
          type: integer
          description: Jumlah sesi yang ditolak
        in_review_count:
          type: integer
          description: Jumlah sesi dalam peninjauan
        issuing_states:
          type: array
          items:
            type: string
          description: >-
            Kode ISO 3166-1 alpha-3 dari negara penerbit yang terlihat pada
            dokumen ID pengguna yang disetujui ini, misalnya `["USA", "ESP"]`.
            Berupa array kosong jika tidak ada.
        approved_emails:
          type: array
          items:
            type: string
          description: >-
            Alamat email terverifikasi yang dikumpulkan dari sesi pengguna ini
            yang disetujui, contoh `["john@example.com"]`.
        approved_phones:
          type: array
          items:
            type: string
          description: >-
            Nomor telepon terverifikasi yang dikumpulkan dari sesi pengguna ini
            yang disetujui, contoh `["+14155551234"]`.
        features:
          type: object
          description: >-
            Status per-fitur agregat di semua sesi pengguna ini. Kunci yang
            memungkinkan: `ID_VERIFICATION`, `NFC`, `LIVENESS`, `FACE_MATCH`,
            `POA`, `QUESTIONNAIRE`, `EMAIL_VERIFICATION`, `PHONE`, `AML`,
            `IP_ANALYSIS`, `AGE_ESTIMATION`, `DATABASE_VALIDATION`. Nilai yang
            memungkinkan: `Approved`, `Declined`, `In Review`, `Not Finished`,
            `Resub Requested`.
        features_list:
          type: array
          items:
            type: object
            properties:
              feature:
                type: string
              status:
                type: string
          description: >-
            Data yang sama dengan `features`, sebagai array berurutan dari objek
            `{feature, status}`.
        last_session_at:
          type: string
          format: date-time
          nullable: true
          description: Cap waktu sesi terbaru
        first_session_at:
          type: string
          format: date-time
          nullable: true
          description: Cap waktu sesi pertama
        last_activity_at:
          type: string
          format: date-time
          nullable: true
          description: >-
            Cap waktu aktivitas terbaru pada pengguna ini (sesi, transaksi,
            perubahan status, pengeditan data, dll.).
        tags:
          type: array
          items:
            type: object
            properties:
              uuid:
                type: string
                format: uuid
              name:
                type: string
              color:
                type: string
          description: Tag yang ditetapkan untuk pengguna ini
        created_at:
          type: string
          format: date-time
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: x-api-key
      description: >-
        Kunci API aplikasi Anda, dari Developers -> API keys di Business
        Console. Kunci utama memiliki akses penuh. Kunci bernama dapat diberi
        cakupan: none, read, atau write per sumber daya, dibatasi pada beberapa
        alur kerja atau pada sesi yang disetujui, pada daftar alamat IP, dan
        pada tanggal kedaluwarsa. 401 berarti kuncinya salah, dicabut, atau
        kedaluwarsa; 403 berarti tidak ada kunci yang dikirimkan, kunci tidak
        memiliki akses ke sumber daya atau tindakan ini, atau permintaan datang
        dari alamat di luar daftar IP-nya; 404 pada rute sesi berarti sesi
        berada di luar alur kerja atau status kunci tersebut. Kunci tanpa akses
        media menerima URL gambar, video, dan PDF sebagai null, dan kunci tanpa
        izin tulis sesi menerima tautan sesi dan token sebagai null. Lihat
        https://docs.didit.me/console/api-keys.

````

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