> ## 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 Daftar Event Sesi Verifikasi

> Baca timeline event sesi verifikasi Didit: langkah dari perangkat, perubahan status, dan routing alur kerja, terbaru dulu, dengan paginasi.

Prompt API untuk Mencantumkan Event Sesi
Salin prompt ke papan klip

<pre>
  \`Read the event timeline of one Didit verification session through the API.

  Endpoint:
  GET [https://verification.didit.me/v3/session/\{session\_id}/events/](https://verification.didit.me/v3/session/\{session_id}/events/)

  Authentication:
  Send my Didit API key in the x-api-key header. A scoped key needs sessions: read and decisions: read.

  Goal:

  * See what happened during a session, step by step: which screens the user saw, where they stopped, which attempts failed, when the status changed and how the workflow routed the session.

  Behavior:

  * Works for user (KYC) and business (KYB) session IDs.
  * Ordered by sent\_at, newest first. sent\_at is a Unix timestamp in milliseconds.
  * Paginated with limit (default 50) and offset. The response is { count, next, previous, results }. Follow next until it is null.
  * Device-reported event types: LINK\_OPENED, STEP\_RENDERED, BUTTON\_CLICKED, FORM\_SUBMITTED, FILE\_UPLOADED, ATTEMPT\_FAILED, LOG. Server-recorded types include SESSION\_CREATED, SESSION\_STATUS\_CHANGED (details.old\_status, details.current\_status), FEATURE\_STEP\_CHANGED, WORKFLOW\_BRANCH\_EVALUATED and WORKFLOW\_STATUS\_NODE\_REACHED.
  * Events are stored asynchronously, so a new event can take a few seconds to appear.
  * file\_url is a short-lived presigned link; a scoped key without media: read receives it as null.

  Example call:
  curl -X GET "[https://verification.didit.me/v3/session/11111111-2222-3333-4444-555555555555/events/?limit=50](https://verification.didit.me/v3/session/11111111-2222-3333-4444-555555555555/events/?limit=50)" \
  -H "x-api-key: YOUR\_API\_KEY"

  What to read from the response:

  * results\[].event\_type, feature\_step (OCR, LIVENESS, FACE\_MATCH, ...) and step (the screen, for example DOCUMENT\_CAPTURE\_FRONT).
  * results\[].details: event-specific data; the keys vary by event\_type.
  * results\[].ip\_address, user\_agent and device\_info for device-reported events.
  * count, next and previous for pagination.

  Failure modes:

  * 400: limit or offset above 1,000,000.
  * 401: the API key has expired.
  * 403: missing key (a wrong, revoked or expired key gets 401), a key of another application, a scoped key without the permissions above, or a request from outside the key's IP allowlist.
  * 404: the session does not exist, was deleted, or is outside a scoped key's workflow or status limits.

  Side effects: none. This is a pure read.

  For the full integration shape, see /integration/integration-prompt.\`
</pre>

Tempel ke

Event perutean alur kerja (`WORKFLOW_BRANCH_EVALUATED`, `WORKFLOW_STATUS_NODE_REACHED`) dan `details`-nya dijelaskan di [Ambil sesi](https://docs.didit.me/id/sessions-api/retrieve-session.md), yang juga dapat mengembalikan linimasa sesi Verifikasi Pengguna (KYC) di dalam keputusannya dengan `?include=events`.


## OpenAPI

````yaml id/openapi-25.json GET /v3/session/{sessionId}/events/
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/session/{sessionId}/events/:
    get:
      tags:
        - Sessions
      summary: Mencantumkan daftar event sesi
      description: >-
        Baca linimasa peristiwa dari satu sesi verifikasi, terbaru lebih dahulu
        berdasarkan `sent_at`: layar yang dilihat pengguna, tombol dan unggahan,
        percobaan yang gagal, perubahan status dan langkah fitur, serta
        pelacakan rute alur kerja. Berfungsi untuk ID sesi Verifikasi Pengguna
        (KYC) dan Verifikasi Bisnis (KYB). Event disimpan secara asinkron,
        sehingga event baru memerlukan waktu beberapa detik untuk muncul. Hasil
        dipaginasi dengan `limit` dan `offset`; ikuti `next` hingga bernilai
        `null`. Kunci API dengan pembatasan cakupan memerlukan `sessions: read`
        dan `decisions: read`, dan tanpa `media: read` kunci tersebut menerima
        `file_url` sebagai `null`. Event perutean dijelaskan di [Ambil
        sesi](https://docs.didit.me/id/sessions-api/retrieve-session).
      operationId: get_v3_session_events
      parameters:
        - name: sessionId
          in: path
          required: true
          description: >-
            UUID sesi verifikasi (`session_id` yang dikembalikan oleh `POST
            /v3/session/`). Menerima ID sesi Verifikasi Pengguna (KYC) dan
            Verifikasi Bisnis (KYB): server mencari ID tersebut di kedua jenis
            sesi. Harus berupa UUID dengan format yang benar; nilai yang salah
            format tidak cocok dengan rute dan mengembalikan HTML `404`.
          schema:
            type: string
            format: uuid
            example: 11111111-2222-3333-4444-555555555555
        - name: limit
          in: query
          required: false
          description: >-
            Jumlah event maksimum per halaman. Defaultnya 50. Nilai di bawah 1
            atau nilai non-numerik akan dialihkan ke 50; nilai di atas 1.000.000
            mengembalikan `400`.
          schema:
            type: integer
            default: 50
            minimum: 1
            maximum: 1000000
            example: 50
        - name: offset
          in: query
          required: false
          description: >-
            Jumlah hasil yang dilewati sebelum hasil pertama yang dikembalikan.
            Default-nya 0; nilai negatif atau non-numerik akan kembali ke 0,
            nilai di atas 1.000.000 mengembalikan `400`. Disarankan mengikuti
            URL `next` dan `previous`.
          schema:
            type: integer
            default: 0
            minimum: 0
            maximum: 1000000
            example: 0
        - name: ordering
          in: query
          required: false
          description: >-
            Penggantian pengurutan opsional. Urutan default adalah `-sent_at`.
            Berikan nama kolom hasil (misalnya `sent_at`, `created_at`,
            `event_type`, `feature_step`, atau `step`) untuk mengurutkan secara
            naik, tambahkan awalan `-` untuk mengurutkan secara turun, dan
            pisahkan beberapa kolom dengan tanda koma. Kolom yang tidak dikenal
            akan diabaikan.
          schema:
            type: string
            example: sent_at
      responses:
        '200':
          description: Satu halaman event sesi, terbaru lebih dahulu.
          content:
            application/json:
              schema:
                type: object
                required:
                  - count
                  - next
                  - previous
                  - results
                properties:
                  count:
                    type: integer
                    description: Jumlah total event dari sesi.
                  next:
                    type: string
                    format: uri
                    nullable: true
                    description: URL halaman berikutnya, atau `null` pada halaman terakhir.
                  previous:
                    type: string
                    format: uri
                    nullable: true
                    description: URL halaman sebelumnya, atau `null` pada halaman pertama.
                  results:
                    type: array
                    items:
                      $ref: '#/components/schemas/SessionEvent'
              examples:
                Completed session:
                  value:
                    count: 3
                    next: null
                    previous: null
                    results:
                      - uuid: aaaaaaaa-1111-2222-3333-444444444444
                        event_type: SESSION_STATUS_CHANGED
                        created_at: '2026-09-14T10:02:13.904512Z'
                        component: null
                        feature_step: null
                        step: null
                        details:
                          old_status: In Progress
                          current_status: Approved
                        ip_address: null
                        user_agent: null
                        device_info: null
                        file_url: null
                        sent_at: 1789380131482
                      - uuid: bbbbbbbb-1111-2222-3333-444444444444
                        event_type: FEATURE_STEP_CHANGED
                        created_at: '2026-09-14T10:01:49.210377Z'
                        component: null
                        feature_step: null
                        step: null
                        details:
                          old_feature_step: OCR
                          current_feature_step: LIVENESS
                        ip_address: null
                        user_agent: null
                        device_info: null
                        file_url: null
                        sent_at: 1789380107103
                      - uuid: cccccccc-1111-2222-3333-444444444444
                        event_type: STEP_RENDERED
                        created_at: '2026-09-14T10:01:00.581930Z'
                        component: DocumentCapture
                        feature_step: OCR
                        step: DOCUMENT_CAPTURE_FRONT
                        details: {}
                        ip_address: 203.0.113.24
                        user_agent: >-
                          Mozilla/5.0 (iPhone; CPU iPhone OS 18_5 like Mac OS X)
                          AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.5
                          Mobile/15E148 Safari/604.1
                        device_info:
                          device_model: iPhone
                        file_url: null
                        sent_at: 1789380058776
        '400':
          description: >-
            `limit` atau `offset` berada di atas 1,000,000. Bagian body adalah
            array JSON dengan satu pesan.
          content:
            application/json:
              examples:
                Limit too large:
                  summary: limit=2000000
                  value:
                    - limit must not exceed 1000000.
                Offset too large:
                  summary: offset=2000000
                  value:
                    - offset must not exceed 1000000.
              schema:
                type: array
                items:
                  type: string
        '401':
          description: >-
            Kunci API dengan cakupan terbatas telah kedaluwarsa. Ini
            satu-satunya kasus yang mengembalikan `401`: kunci yang hilang,
            tidak valid, atau dicabut mengembalikan `403`.
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
                    description: Pesan kesalahan yang mudah dibaca manusia.
              examples:
                Expired key:
                  summary: Tanggal kedaluwarsa kunci telah lewat
                  value:
                    detail: This API key has expired.
        '403':
          description: >-
            Kegagalan autentikasi atau otorisasi. Kunci yang hilang
            mengembalikan `403`, begitu juga dengan kunci dari aplikasi lain,
            kunci dengan cakupan tanpa izin yang dibutuhkan endpoint ini, dan
            permintaan dari luar daftar izin IP kunci tersebut; kunci yang
            salah, dicabut, atau kedaluwarsa mengembalikan `401`. Bedakan
            kegagalan tersebut berdasarkan `detail`.
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
                    description: Pesan kesalahan yang mudah dibaca manusia.
              examples:
                Missing or invalid credentials:
                  summary: Tidak ada header x-api-key, atau kunci gagal divalidasi
                  value:
                    detail: >-
                      Authentication credentials were not provided or are
                      invalid.
                Other application:
                  summary: Kunci valid milik aplikasi yang berbeda dari sesi
                  value:
                    detail: You do not have permission to perform this action.
                Scoped key without sessions read:
                  summary: 'Kunci ber-scope tidak memiliki sessions: read'
                  value:
                    detail: This API key has no read access to sessions.
                Scoped key without decisions read:
                  summary: 'Kunci ber-scope tidak memiliki decisions: read'
                  value:
                    detail: This API key has no read access to decisions.
                IP not allowed:
                  summary: Permintaan dari luar daftar izin IP kunci
                  value:
                    detail: This API key can't be used from this IP address.
        '404':
          description: >-
            Sesi tidak ada, telah dihapus, atau berada di luar alur kerja kunci
            dengan cakupan terbatas atau batas yang hanya berlaku untuk sesi
            berstatus disetujui. Pencarian sesi berjalan sebelum pemeriksaan
            kredensial, sehingga `sessionId` yang tidak dikenal mengembalikan
            `404` bahkan tanpa kunci yang valid.
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
                    description: Pesan kesalahan yang mudah dibaca manusia.
              examples:
                Unknown session:
                  summary: Tidak ada sesi dengan ID ini, atau telah dihapus
                  value:
                    detail: Not found.
                Outside key limits:
                  summary: >-
                    Sesi berada di luar alur kerja atau batas yang hanya berlaku
                    untuk sesi yang disetujui milik kunci dengan cakupan
                    terbatas
                  value:
                    detail: Session not found.
        '429':
          description: >-
            Batas laju terlampaui: 600 permintaan GET per menit per kunci API.
            Tunggu `Retry-After` detik sebelum mencoba lagi; header
            `X-RateLimit-*` menampilkan anggaran yang tersedia.
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
                    description: Pesan kesalahan yang mudah dibaca manusia.
              examples:
                Rate limited:
                  summary: Anggaran untuk menit saat ini habis
                  value:
                    detail: >-
                      GET request rate limit exceeded. You can make up to 600
                      requests per minute.
          headers:
            Retry-After:
              description: Detik untuk menunggu sebelum mencoba lagi.
              schema:
                type: integer
                minimum: 1
                example: 30
      security:
        - ApiKeyAuth: []
      x-codeSamples:
        - lang: curl
          label: curl
          source: >-
            curl -X GET
            'https://verification.didit.me/v3/session/11111111-2222-3333-4444-555555555555/events/?limit=50'
            \
              -H 'x-api-key: YOUR_API_KEY'
        - lang: python
          label: Python
          source: |-
            from didit import Didit

            # Reads DIDIT_API_KEY.
            client = Didit()

            for item in client.sessions.list_events(
                "11111111-2222-3333-4444-555555555555",
            ):
                print(item)
        - lang: javascript
          label: Node.js
          source: >-
            import Didit from "@didit-protocol/sdk-node";


            // Reads DIDIT_API_KEY.

            const didit = new Didit();


            for await (const item of
            didit.sessions.listEvents("11111111-2222-3333-4444-555555555555")) {
              console.log(item);
            }
        - lang: go
          label: Go
          source: "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\niter := client.Sessions.ListEventsAutoPaging(ctx, \"11111111-2222-3333-4444-555555555555\", didit.SessionsListEventsParams{})\nfor iter.Next() {\n\tfmt.Printf(\"%+v\\n\", iter.Current())\n}\nif err := iter.Err(); err != nil {\n\tlog.Fatal(err)\n}"
        - lang: java
          label: Java
          source: >-
            import me.didit.Didit;


            // Reads DIDIT_API_KEY.

            Didit client = new Didit();


            for (var item :
            client.sessions().listEvents("11111111-2222-3333-4444-555555555555"))
            {
                System.out.println(item);
            }
        - lang: php
          label: PHP
          source: >-
            <?php


            require 'vendor/autoload.php';


            use Didit\DiditClient;


            // Reads DIDIT_API_KEY.

            $didit = new DiditClient();


            foreach
            ($didit->sessions->listEvents('11111111-2222-3333-4444-555555555555')
            as $item) {
                print_r($item->toArray());
            }
        - lang: ruby
          label: Ruby
          source: >-
            require "didit"


            # Reads DIDIT_API_KEY.

            didit = Didit::Client.new


            didit.sessions.list_events("11111111-2222-3333-4444-555555555555").auto_paging_each
            do |item|
              puts item.to_h
            end
        - lang: csharp
          label: .NET
          source: >-
            using System;

            using System.Text.Json;

            using Didit;


            // Reads DIDIT_API_KEY.

            using var client = new DiditClient();


            await foreach (var item in await
            client.Sessions.ListEventsAsync("11111111-2222-3333-4444-555555555555"))

            {
                Console.WriteLine(JsonSerializer.Serialize(item));
            }
components:
  schemas:
    SessionEvent:
      type: object
      description: Satu entri dari linimasa event sesi verifikasi.
      required:
        - uuid
        - event_type
        - created_at
        - component
        - feature_step
        - step
        - details
        - ip_address
        - user_agent
        - device_info
        - file_url
        - sent_at
      properties:
        uuid:
          type: string
          format: uuid
          description: Pengenal event.
        event_type:
          type: string
          enum:
            - SESSION_CREATED
            - SESSION_COMPLETED
            - SESSION_STATUS_CHANGED
            - LINK_OPENED
            - FORM_SUBMITTED
            - BUTTON_CLICKED
            - FILE_UPLOADED
            - ATTEMPT_FAILED
            - FEATURE_STEP_CHANGED
            - STEP_RENDERED
            - NOTE_ADDED
            - MANUAL_REVIEW_STARTED
            - WORKFLOW_BRANCH_EVALUATED
            - WORKFLOW_STATUS_NODE_REACHED
            - LOG
          description: >-
            Hal yang terjadi. Dilaporkan oleh perangkat selama alur yang
            di-hosting atau SDK: `LINK_OPENED`, `STEP_RENDERED`,
            `BUTTON_CLICKED`, `FORM_SUBMITTED`, `FILE_UPLOADED`,
            `ATTEMPT_FAILED`, dan `LOG` (debugging). Dicatat oleh server:
            `SESSION_CREATED`, `SESSION_STATUS_CHANGED` (`details.old_status`,
            `details.current_status`), `FEATURE_STEP_CHANGED`
            (`details.old_feature_step`, `details.current_feature_step`),
            `WORKFLOW_BRANCH_EVALUATED`, dan `WORKFLOW_STATUS_NODE_REACHED`
            (jejak perutean alur kerja). `SESSION_COMPLETED`, `NOTE_ADDED`, dan
            `MANUAL_REVIEW_STARTED` dapat muncul pada sesi yang lebih lama.
        created_at:
          type: string
          format: date-time
          description: >-
            Waktu ketika Didit menyimpan event tersebut. Event disimpan secara
            asinkron, beberapa detik setelah `sent_at`.
        component:
          type: string
          nullable: true
          description: >-
            Komponen antarmuka pengguna (UI) yang melaporkan event (hanya event
            perangkat).
        feature_step:
          type: string
          nullable: true
          enum:
            - OCR
            - OCR_BACK
            - NFC
            - AML
            - FACE
            - LIVENESS
            - FACE_MATCH
            - IP_ANALYSIS
            - AGE_ESTIMATION
            - PROOF_OF_ADDRESS
            - PHONE_VERIFICATION
            - EMAIL_VERIFICATION
            - FACE_SEARCH
            - DATABASE_VALIDATION
            - QUESTIONNAIRE
            - KYB_REGISTRY
            - KYB_DOCUMENTS
            - KYB_KEY_PEOPLE
            - DOCUMENT_AI
            - GEOLOCATION
            - null
          description: Fitur verifikasi yang sedang digunakan sesi saat event terjadi.
        step:
          type: string
          nullable: true
          description: >-
            Layar dalam fitur, misalnya `DOCUMENT_CAPTURE_FRONT` atau
            `FACE_PASSIVE_LIVENESS`.
        details:
          type: object
          nullable: true
          additionalProperties: true
          description: Data khusus event. Kuncinya bergantung pada `event_type`.
        ip_address:
          type: string
          nullable: true
          description: >-
            Alamat IP tempat perangkat melaporkan peristiwa. `null` untuk
            peristiwa yang dicatat oleh server.
        user_agent:
          type: string
          nullable: true
          description: User agent perangkat. `null` untuk event yang direkam server.
        device_info:
          type: object
          nullable: true
          additionalProperties: true
          description: Detail perangkat yang dilaporkan SDK atau browser.
        file_url:
          type: string
          format: uri
          nullable: true
          description: >-
            Tautan presigned berdurasi singkat ke file yang dilampirkan pada
            event (misalnya gambar yang diambil). `null` jika tidak ada, dan
            selalu `null` untuk kunci API dengan cakupan terbatas tanpa `media:
            read`.
        sent_at:
          type: integer
          format: int64
          description: >-
            Waktu ketika peristiwa terjadi, sebagai stempel waktu Unix dalam
            milidetik. Hasil diurutkan berdasarkan nilai ini.
  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.