> ## 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 Update Status Pengguna: Blokir atau Tandai

> Blokir, tandai, atau aktifkan pengguna Didit. Status berlaku untuk sesi KYC dan skrining transaksi mendatang. Bayar per panggilan.



Prompt Pembaruan Status Pengguna
        Salin prompt ke papan klip



      
      

\<pre>

\`Goal: Flip ONLY the lifecycle status of a Didit User entity. Use the full PATCH /v3/users/{vendor_data}/ when you also need to touch other fields.

Endpoint: PATCH https://verification.didit.me/v3/users/{vendor_data}/update-status/
Auth header: x-api-key: <DIDIT_API_KEY>
Content-Type: application/json

Path param:
\- vendor_data (string, REQUIRED) — free-form string, NOT a UUID. URL-encode.

Request body:
\- status (enum, REQUIRED) — "ACTIVE" | "FLAGGED" | "BLOCKED" (VendorUserStatusChoices, NOT the session enum).
\- reason (string, optional, max 1000): why the status changed. Recorded as the comment of the STATUS_CHANGED entry in the user's activity (comments[].comment), only when the status actually changes. Webhooks do not carry it.

Status semantics:
\- ACTIVE  → normal. New sessions allowed for this vendor_data.
\- FLAGGED → still accepted, highlighted in Console for manual review; filterable with ?status=FLAGGED.
\- BLOCKED → terminal. Adds vendor_data to the system blocklist. Subsequent session creations for the same identifier are rejected with a blocklist hit. Flipping back to ACTIVE/FLAGGED removes the blocklist entry automatically.

curl:
curl -X PATCH 'https://verification.didit.me/v3/users/user-abc-123/update-status/' \
-H 'x-api-key: YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{"status": "BLOCKED", "reason": "Chargeback fraud pattern confirmed"}'

Response 200: full updated UserDetailItem (same shape as GET /v3/users/{vendor_data}/). See /reference/data-models.

Side effects:
\- Toggles the system blocklist entry when entering/leaving BLOCKED.
\- Writes one STATUS_CHANGED entry to the user's comments activity log (actor = API key identity), with reason as its comment.
\- Idempotent — re-sending the same status is a no-op (no extra audit row, no extra blocklist toggle).

Failure modes:
\- 400 — validation:
\{ "status": "This field is required." }
\{ "status": "Invalid status. Valid options are: ACTIVE, FLAGGED, BLOCKED" }
\{ "reason": ["Ensure this field has no more than 1000 characters."] }
\- 401 — missing/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 API key without users write. { "detail": "This API key has no write access to people." }
\- 404 — vendor_data not found (or deleted). { "detail": "Not found." }
\- 429 — rate-limited.

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

\</pre>



      
      

Tempel ke

## IkhtisarMemindahkan [entitas pengguna](https://docs.didit.me/id/entities/users/overview.md) di antara `ACTIVE`, `FLAGGED`, dan `BLOCKED`. Lihat [siklus hidup entitas](https://docs.didit.me/id/entities/lifecycle.md) untuk mesin status lengkap.## Kapan menggunakannya- **Blokir pengguna** setelah memastikan adanya penipuan atau pelanggaran kepatuhan.
- **Tandai pengguna** sambil menunggu peninjauan manual tanpa memblokirnya secara total.
- **Buka blokir** pengguna setelah remediasi berhasil.
- **Teruskan sinyal eksternal**: misalnya, ketika mesin penipuan Anda memberi skor pengguna di atas ambang batas, pindahkan pengguna tersebut ke `FLAGGED` melalui endpoint ini.## Catatan- Nilai yang valid: `ACTIVE`, `FLAGGED`, `BLOCKED`. Nilai yang tidak valid mengembalikan 400.
- Sertakan `reason` opsional (hingga 1000 karakter) untuk mencatat alasan perubahan status.
  Didit menyimpannya sebagai komentar pada entri perubahan status di aktivitas orang tersebut: `comments[].comment` pada pengguna, dan **Aktivitas** di Business Console.
  Alasan hanya dicatat ketika status benar-benar berubah.
- Pengguna `BLOCKED` akan otomatis ditolak untuk semua sesi baru dan semua transaksi baru.
- Mengirim webhook `user.status.updated` dengan `previous_status` dan `status`.
  Webhook tidak menyertakan `reason`.## Penegakan| Status | Dampak pada sesi baru | Dampak pada transaksi baru |
| - | - | - |
| `ACTIVE` | Alur normal | Alur normal |
| `FLAGGED` | Diizinkan, tetapi diarahkan ke `IN_REVIEW` | Diizinkan; dapat dieskalasi otomatis tergantung aturan |
| `BLOCKED` | Ditolak otomatis | Ditolak otomatis |## 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`).
Kunci yang dibatasi pada beberapa alur kerja atau hanya pada sesi yang disetujui tidak dapat mengakses endpoint ini.[Peran dan izin](https://docs.didit.me/id/console/roles-permissions.md) di Console menentukan apa yang dapat dilakukan anggota tim di Console.
Keduanya tidak dievaluasi untuk permintaan kunci API.## Terkait- [Siklus hidup entitas](https://docs.didit.me/id/entities/lifecycle.md)
- [Daftar blokir pengguna](https://docs.didit.me/id/entities/users/blocklist.md)
- [Webhook entitas](https://docs.didit.me/id/entities/webhooks.md)


## OpenAPI

````yaml id/openapi-25.json PATCH /v3/users/{vendor_data}/update-status/
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/{vendor_data}/update-status/:
    patch:
      tags:
        - Users
      summary: Perbarui status pengguna
      description: >-
        Ubah hanya `status` siklus hidup pengguna: `ACTIVE`, `FLAGGED`, atau
        `BLOCKED` (bukan status sesi). `BLOCKED` menambahkan `vendor_data` ke
        daftar blokir sistem; berpindah dari `BLOCKED` akan menghapus entri
        tersebut. Setiap perubahan dicatat sebagai aktivitas `STATUS_CHANGED`
        pada pengguna, dengan `reason` opsional sebagai `comment`-nya. Mengirim
        status saat ini tidak mengubah apa pun dan tidak mencatat `reason`.
        Webhook `user.status.updated` tidak memuat `reason`.
      operationId: update_user_status
      parameters:
        - name: vendor_data
          in: path
          required: true
          schema:
            type: string
          description: Pengidentifikasi unik Anda untuk pengguna.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              allOf:
                - $ref: '#/components/schemas/EntityStatusUpdateRequest'
                - type: object
                  properties:
                    reason:
                      type: string
                      nullable: true
                      maxLength: 1000
                      description: >-
                        Alasan mengapa status berubah. Dicatat pada entri
                        perubahan status aktivitas pengguna
                        (`comments[].comment`, dan **Activity** di Business
                        Console), hanya jika status benar-benar berubah. Webhook
                        tidak menyertakannya.
            examples:
              Activate:
                summary: Aktifkan kembali pengguna
                value:
                  status: ACTIVE
              Flag:
                summary: Tandai pengguna untuk ditinjau
                value:
                  status: FLAGGED
              Block:
                summary: Blokir pengguna (menambahkan ke daftar blokir sistem)
                value:
                  status: BLOCKED
              Block with reason:
                summary: Blokir pengguna dan catat alasannya
                value:
                  status: BLOCKED
                  reason: Chargeback fraud pattern confirmed
      responses:
        '200':
          description: Status pengguna diperbarui. Rekor pengguna lengkap dikembalikan.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UserDetailItem'
              examples:
                Blocked:
                  value:
                    didit_internal_id: f4e5e1f2-94a9-4f86-8c16-2b7d9b4db418
                    vendor_data: user-abc-123
                    display_name: null
                    full_name: John Michael Doe
                    date_of_birth: '1990-05-15'
                    effective_name: John Michael Doe
                    status: BLOCKED
                    metadata:
                      tier: premium
                      source: website
                    portrait_image_url: https://<media-host>/...
                    session_count: 3
                    approved_count: 2
                    declined_count: 0
                    in_review_count: 1
                    issuing_states:
                      - USA
                    approved_emails:
                      - john@example.com
                    approved_phones:
                      - '+14155551234'
                    features:
                      ID_VERIFICATION: Approved
                      LIVENESS: Approved
                      FACE_MATCH: Approved
                      AML: Approved
                    features_list:
                      - feature: ID_VERIFICATION
                        status: Approved
                      - feature: LIVENESS
                        status: Approved
                      - feature: FACE_MATCH
                        status: Approved
                      - feature: AML
                        status: Approved
                    last_session_at: '2025-06-15T10:30:00Z'
                    last_activity_at: '2025-06-15T10:30:00Z'
                    first_session_at: '2025-06-01T08:00:00Z'
                    tags:
                      - uuid: 9a8b7c6d-5e4f-4a3b-8c2d-1e0f9a8b7c6d
                        tag:
                          uuid: e1f2a3b4-c5d6-4e7f-8a9b-0c1d2e3f4a5b
                          name: VIP
                          color: '#2567FF'
                          description: null
                          source: custom
                          created_at: '2025-05-01T09:00:00Z'
                          updated_at: '2025-05-01T09:00:00Z'
                        added_by_email: analyst@acme.com
                        added_by_name: Jane Analyst
                        created_at: '2025-06-02T11:00:00Z'
                    comments:
                      - uuid: c1111111-2222-4333-8444-555555555555
                        comment_type: STATUS_CHANGED
                        comment: Chargeback fraud pattern confirmed
                        actor_email: null
                        actor_name: null
                        previous_status: ACTIVE
                        new_status: BLOCKED
                        previous_value: null
                        new_value: null
                        changed_fields: []
                        metadata: null
                        mentioned_emails: []
                        created_at: '2025-06-15T10:30:00Z'
                    created_at: '2025-06-01T08:00:00Z'
                    updated_at: '2025-06-15T10:30:00Z'
        '400':
          description: >-
            `status` tidak ada atau tidak valid, atau `reason` lebih dari 1000
            karakter.
          content:
            application/json:
              examples:
                Missing status:
                  value:
                    status:
                      - This field is required.
                Bad status:
                  value:
                    status:
                      - >-
                        Invalid status. Valid options are: ACTIVE, FLAGGED,
                        BLOCKED
                Reason too long:
                  value:
                    reason:
                      - Ensure this field has no more than 1000 characters.
        '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 tidak dapat memperbarui pengguna untuk aplikasi ini. 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.
        '404':
          description: >-
            Tidak ada pengguna (yang belum dihapus) dengan `vendor_data` yang
            diberikan untuk aplikasi ini.
          content:
            application/json:
              examples:
                Not found:
                  value:
                    detail: Not found.
        '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 PATCH
            'https://verification.didit.me/v3/users/user-abc-123/update-status/'
            \
              -H 'x-api-key: YOUR_API_KEY' \
              -H 'Content-Type: application/json' \
              -d '{"status": "BLOCKED"}'
        - lang: python
          label: Python
          source: |-
            from didit import Didit

            # Reads DIDIT_API_KEY.
            client = Didit()

            result = client.users.update_status(
                "user-123",
                status="ACTIVE",
            )
            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.updateStatus("user-123", {
              status: "ACTIVE",
            });
            console.log(result);
        - lang: go
          label: Go
          source: "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Users.UpdateStatus(ctx, \"user-123\", didit.UsersUpdateStatusParams{\n\tStatus: \"ACTIVE\",\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.EntityStatusUpdateRequest;

            import me.didit.types.UsersUpdateStatusParams;


            // Reads DIDIT_API_KEY.

            Didit client = new Didit();


            var result = client.users().updateStatus("user-123",
            UsersUpdateStatusParams.builder()
                    .status(EntityStatusUpdateRequest.Status.of("ACTIVE"))
                    .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->updateStatus('user-123', [
                'status' => 'ACTIVE',
            ]);
            print_r($result->toArray());
        - lang: ruby
          label: Ruby
          source: |-
            require "didit"

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

            result = didit.users.update_status(
              "user-123",
              status: "ACTIVE"
            )
            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.UpdateStatusAsync("user-123", new
            UsersUpdateStatusParams

            {
                Status = "ACTIVE",
            });

            Console.WriteLine(JsonSerializer.Serialize(result));
components:
  schemas:
    EntityStatusUpdateRequest:
      type: object
      required:
        - status
      properties:
        status:
          type: string
          enum:
            - ACTIVE
            - FLAGGED
            - BLOCKED
          description: >-
            Status siklus hidup baru. `BLOCKED` juga menambahkan `vendor_data`
            ke daftar blokir sistem.
    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.