> ## 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 Batch Event Pemantauan

> Kirim hingga 500 event pemantauan dalam satu permintaan dengan hasil per item dari Didit, agar satu event cacat tidak menghentikan batch.



Prompt API Batch untuk Membuat Event Pemantauan
        Salin prompt ke papan klip



      
      

\<pre>

\`Send up to 500 monitoring events to Didit in one request from my backend, and handle the per-item outcomes.

Endpoint:
POST https://verification.didit.me/v3/events/batch/

Authentication:
Use the x-api-key header with my Didit API key, from my backend only. A scoped key needs transactions: write.

Goal:
\- Flush a queue of events (logins, gameplay rounds, payment steps, chargebacks) in as few requests as possible, without one bad event blocking the others.

Request body (application/json):
\{
"events": [ { ...one event, same envelope as POST /v3/events/... }, ... ]   // 1 to 500 events
}
A bare JSON array of events is also accepted.

Behavior:
\- Each item is validated, stored and evaluated on its own, exactly like POST /v3/events/. A rejected item never rolls back the others.
\- HTTP 201 when no item was rejected, 207 when at least one was. Treat both as success and read results[].
\- results[] has one entry per item in request order, with index pointing into my events array and outcome accepted, replayed or rejected.
\- accepted and replayed items carry the same fields as the single-event response (event_uuid, status, score, rule_matches, correlation_pending, retention_class, expires_at, idempotent_replay).
\- rejected items carry errors keyed by field, in the same shape as the 400 of POST /v3/events/. A reused event_id with different content is reported as a string under errors.event_id. Send event_id in snake_case so a rejected item's results[].event_id is filled.
\- Retry only the rejected items after fixing them. Resending an accepted item is safe: it comes back as replayed.
\- occurred_at must still be within 7 days in the past and 5 minutes in the future for every item.

Example call:
curl -X POST "https://verification.didit.me/v3/events/batch/" \
-H "x-api-key: YOUR_API_KEY" -H "Content-Type: application/json" \
-d '{"events":[{"event_id":"login-2026-10-17-000001","event_category":"auth","action_type":"login","occurred_at":"2026-10-17T09:15:02.481Z","subject":{"vendor_data":"user-42"}}]}'

What to read from the response:
\- accepted_count, replayed_count, rejected_count.
\- results[].index and results[].outcome.
\- results[].errors for rejected items.
\- results[].event_uuid and results[].status for stored items.

Failure modes:
\- 400 - events missing, not an array, empty, or longer than 500 items ({ "events": "<message>" }). Nothing is stored; split the batch.
\- 429 - more than 600 ingestion requests per minute for this API key (event and transaction ingestion share this budget, apart from the 300 of every other write); honor Retry-After.
\- 401 - the API key has expired.
\- 403 - missing API key (a wrong, revoked or expired key gets 401), a scoped key without transactions: write, or code event_monitoring_disabled (event ingestion is not switched on; nothing is stored).

Side effects: stores every valid item, may create subjects, and applies the actions of matched active rules.

For the full integration shape, see /integration/integration-prompt.`

\</pre>



      
      

Tempel ke

Lihat [Batch](https://docs.didit.me/id/transaction-monitoring/events.md#batch) dalam panduan penyerapan event. Jalur perangkat memiliki hasil per item yang sama untuk operasi flush SDK: lihat [Pengiriman event SDK](https://docs.didit.me/id/transaction-monitoring/sdk-event-submission.md#pengiriman-dalam-batch).


## OpenAPI

````yaml id/openapi-25.json POST /v3/events/batch/
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/events/batch/:
    post:
      tags:
        - Monitoring Events
      summary: Buat event pemantauan secara batch
      description: >-
        Kirim 1 hingga 500 event dalam satu permintaan, masing-masing dalam
        format pembungkus yang sama seperti `POST /v3/events/`. Setiap item
        divalidasi, disimpan, dan dievaluasi secara mandiri serta mendapatkan
        hasilnya sendiri (`accepted`, `replayed`, atau `rejected`), sehingga
        satu event yang salah format tidak pernah membatalkan yang lain: respons
        bernilai `201` jika tidak ada item yang ditolak dan `207` jika
        setidaknya ada satu yang ditolak, dan keduanya berarti permintaan telah
        diproses. Kirim `{"events": [...]}`; array JSON berisi event tanpa
        pembungkus juga diterima. Ingesti event harus diaktifkan untuk aplikasi,
        jika tidak, seluruh permintaan mengembalikan `403` dengan `code:
        event_monitoring_disabled` dan tidak ada yang disimpan. Kunci API scoped
        memerlukan `transactions: write`. Lihat
        [Batch](https://docs.didit.me/id/transaction-monitoring/events#batch).
      operationId: create_monitoring_events_batch
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - events
              properties:
                events:
                  type: array
                  minItems: 1
                  maxItems: 500
                  description: >-
                    1 hingga 500 event. Setiap item mengikuti
                    `MonitoringEventCreateRequest`, termasuk rentang 7 hari ke
                    belakang dan 5 menit ke depan pada `occurred_at`.
                  items:
                    $ref: '#/components/schemas/MonitoringEventCreateRequest'
            example:
              events:
                - event_id: login-2026-10-17-000001
                  event_category: auth
                  action_type: login
                  occurred_at: '2026-10-17T09:15:02.481Z'
                  subject:
                    vendor_data: user-42
                - event_id: deposit-2026-10-17-000002
                  event_category: payment
                  action_type: deposit_completed
                  occurred_at: '2026-10-17T09:16:40Z'
                  subject:
                    vendor_data: user-42
                  transaction_context:
                    amount: '100.00'
                    currency: EUR
                    payment_reference_id: dep_736
                  payload:
                    payment_method: card
                    status: completed
      responses:
        '201':
          description: >-
            Tidak ada item yang ditolak: setiap item berstatus `accepted` atau
            `replayed`.
          content:
            application/json:
              schema:
                type: object
                required:
                  - accepted_count
                  - replayed_count
                  - rejected_count
                  - results
                properties:
                  accepted_count:
                    type: integer
                    minimum: 0
                    description: Item disimpan dan dievaluasi.
                  replayed_count:
                    type: integer
                    minimum: 0
                    description: Item yang sudah tersimpan dengan konten yang sama.
                  rejected_count:
                    type: integer
                    minimum: 0
                    description: Item tidak disimpan.
                  results:
                    type: array
                    description: Satu entri per item, sesuai urutan permintaan.
                    items:
                      type: object
                      description: >-
                        Hasil dari satu item. Item yang diterima dan diputar
                        ulang juga memuat setiap kolom dari
                        `MonitoringEventIngestResult`; item yang ditolak justru
                        memuat `event_id` dan `errors`.
                      required:
                        - index
                        - outcome
                      properties:
                        index:
                          type: integer
                          minimum: 0
                          description: Posisi item dalam array `events` Anda.
                        outcome:
                          type: string
                          enum:
                            - accepted
                            - replayed
                            - rejected
                          description: >-
                            `accepted`: disimpan dan dievaluasi. `replayed`:
                            sudah disimpan dengan konten yang sama. `rejected`:
                            tidak disimpan; lihat `errors`.
                        event_id:
                          type: string
                          nullable: true
                          description: >-
                            `event_id` Anda. Pada item yang ditolak oleh
                            validasi, nilai ini dibaca dari kunci snake_case
                            `event_id` milik item tersebut, sehingga bernilai
                            null ketika item tersebut menghilangkannya atau
                            mengirimkan alias `eventId`.
                        errors:
                          type: object
                          additionalProperties: true
                          description: >-
                            Hanya item yang ditolak. Kesalahan validasi
                            dikelompokkan berdasarkan kolom, dalam format yang
                            sama dengan respons `400` dari `POST /v3/events/`;
                            `event_id` yang digunakan kembali dengan konten
                            berbeda dilaporkan sebagai string di bawah
                            `errors.event_id`.
                        event_uuid:
                          type: string
                          format: uuid
                          description: Hanya item yang diterima dan diputar ulang.
                        status:
                          type: string
                          enum:
                            - ACCEPTED
                            - APPROVED
                            - IN_REVIEW
                            - DECLINED
                          description: Hanya item yang diterima dan diputar ulang.
                        score:
                          type: integer
                          description: Hanya item yang diterima dan diputar ulang.
                        rules_evaluated_count:
                          type: integer
                          description: Hanya item yang diterima dan diputar ulang.
                        rules_matched_count:
                          type: integer
                          description: Hanya item yang diterima dan diputar ulang.
                        correlation_pending:
                          type: boolean
                          description: Hanya item yang diterima dan diputar ulang.
                        retention_class:
                          type: string
                          enum:
                            - low_value
                            - standard
                            - risk_relevant
                            - monetary_or_compliance
                          description: Hanya item yang diterima dan diputar ulang.
                        expires_at:
                          type: string
                          format: date-time
                          nullable: true
                          description: Hanya item yang diterima dan diputar ulang.
                        idempotent_replay:
                          type: boolean
                          description: Hanya item yang diterima dan diputar ulang.
                        rule_matches:
                          type: array
                          description: Hanya item yang diterima dan diputar ulang.
                          items:
                            type: object
                            required:
                              - rule_id
                              - library_key
                              - mode
                              - is_async
                            properties:
                              rule_id:
                                type: string
                                format: uuid
                                description: UUID aturan.
                              library_key:
                                type: string
                                nullable: true
                                description: >-
                                  Kunci pustaka saat aturan dipasang dari
                                  pustaka aturan, jika tidak maka null.
                              mode:
                                type: string
                                enum:
                                  - ACTIVE
                                  - TEST
                                description: >-
                                  Aturan `TEST` mencatat kecocokan tetapi tidak
                                  menerapkan tindakan apa pun.
                              is_async:
                                type: boolean
                                description: >-
                                  `true` saat kecocokan berasal dari proses
                                  asinkron.
              examples:
                All landed:
                  value:
                    accepted_count: 1
                    replayed_count: 1
                    rejected_count: 0
                    results:
                      - index: 0
                        outcome: accepted
                        event_uuid: 33333333-4444-5555-6666-777777777777
                        event_id: login-2026-10-17-000001
                        status: ACCEPTED
                        score: 0
                        rules_evaluated_count: 6
                        rules_matched_count: 0
                        correlation_pending: false
                        retention_class: standard
                        expires_at: '2026-11-16T09:15:02.481000Z'
                        idempotent_replay: false
                        rule_matches: []
                      - index: 1
                        outcome: replayed
                        event_uuid: 11111111-2222-3333-4444-555555555555
                        event_id: deposit-2026-10-17-000002
                        status: ACCEPTED
                        score: 0
                        rules_evaluated_count: 6
                        rules_matched_count: 0
                        correlation_pending: false
                        retention_class: monetary_or_compliance
                        expires_at: null
                        idempotent_replay: true
                        rule_matches: []
        '207':
          description: >-
            Setidaknya satu item ditolak. Item lainnya disimpan; perbaiki dan
            kirim ulang hanya item yang ditolak (mengirim ulang item yang
            diterima aman dilakukan, statusnya kembali sebagai `replayed`).
          content:
            application/json:
              schema:
                type: object
                required:
                  - accepted_count
                  - replayed_count
                  - rejected_count
                  - results
                properties:
                  accepted_count:
                    type: integer
                    minimum: 0
                    description: Item disimpan dan dievaluasi.
                  replayed_count:
                    type: integer
                    minimum: 0
                    description: Item yang sudah tersimpan dengan konten yang sama.
                  rejected_count:
                    type: integer
                    minimum: 0
                    description: Item tidak disimpan.
                  results:
                    type: array
                    description: Satu entri per item, sesuai urutan permintaan.
                    items:
                      type: object
                      description: >-
                        Hasil dari satu item. Item yang diterima dan diputar
                        ulang juga memuat setiap kolom dari
                        `MonitoringEventIngestResult`; item yang ditolak justru
                        memuat `event_id` dan `errors`.
                      required:
                        - index
                        - outcome
                      properties:
                        index:
                          type: integer
                          minimum: 0
                          description: Posisi item dalam array `events` Anda.
                        outcome:
                          type: string
                          enum:
                            - accepted
                            - replayed
                            - rejected
                          description: >-
                            `accepted`: disimpan dan dievaluasi. `replayed`:
                            sudah disimpan dengan konten yang sama. `rejected`:
                            tidak disimpan; lihat `errors`.
                        event_id:
                          type: string
                          nullable: true
                          description: >-
                            `event_id` Anda. Pada item yang ditolak oleh
                            validasi, nilai ini dibaca dari kunci snake_case
                            `event_id` milik item tersebut, sehingga bernilai
                            null ketika item tersebut menghilangkannya atau
                            mengirimkan alias `eventId`.
                        errors:
                          type: object
                          additionalProperties: true
                          description: >-
                            Hanya item yang ditolak. Kesalahan validasi
                            dikelompokkan berdasarkan kolom, dalam format yang
                            sama dengan respons `400` dari `POST /v3/events/`;
                            `event_id` yang digunakan kembali dengan konten
                            berbeda dilaporkan sebagai string di bawah
                            `errors.event_id`.
                        event_uuid:
                          type: string
                          format: uuid
                          description: Hanya item yang diterima dan diputar ulang.
                        status:
                          type: string
                          enum:
                            - ACCEPTED
                            - APPROVED
                            - IN_REVIEW
                            - DECLINED
                          description: Hanya item yang diterima dan diputar ulang.
                        score:
                          type: integer
                          description: Hanya item yang diterima dan diputar ulang.
                        rules_evaluated_count:
                          type: integer
                          description: Hanya item yang diterima dan diputar ulang.
                        rules_matched_count:
                          type: integer
                          description: Hanya item yang diterima dan diputar ulang.
                        correlation_pending:
                          type: boolean
                          description: Hanya item yang diterima dan diputar ulang.
                        retention_class:
                          type: string
                          enum:
                            - low_value
                            - standard
                            - risk_relevant
                            - monetary_or_compliance
                          description: Hanya item yang diterima dan diputar ulang.
                        expires_at:
                          type: string
                          format: date-time
                          nullable: true
                          description: Hanya item yang diterima dan diputar ulang.
                        idempotent_replay:
                          type: boolean
                          description: Hanya item yang diterima dan diputar ulang.
                        rule_matches:
                          type: array
                          description: Hanya item yang diterima dan diputar ulang.
                          items:
                            type: object
                            required:
                              - rule_id
                              - library_key
                              - mode
                              - is_async
                            properties:
                              rule_id:
                                type: string
                                format: uuid
                                description: UUID aturan.
                              library_key:
                                type: string
                                nullable: true
                                description: >-
                                  Kunci pustaka saat aturan dipasang dari
                                  pustaka aturan, jika tidak maka null.
                              mode:
                                type: string
                                enum:
                                  - ACTIVE
                                  - TEST
                                description: >-
                                  Aturan `TEST` mencatat kecocokan tetapi tidak
                                  menerapkan tindakan apa pun.
                              is_async:
                                type: boolean
                                description: >-
                                  `true` saat kecocokan berasal dari proses
                                  asinkron.
              examples:
                Partial success:
                  value:
                    accepted_count: 1
                    replayed_count: 0
                    rejected_count: 2
                    results:
                      - index: 0
                        outcome: accepted
                        event_uuid: 33333333-4444-5555-6666-777777777777
                        event_id: login-2026-10-17-000001
                        status: ACCEPTED
                        score: 0
                        rules_evaluated_count: 6
                        rules_matched_count: 0
                        correlation_pending: false
                        retention_class: standard
                        expires_at: '2026-11-16T09:15:02.481000Z'
                        idempotent_replay: false
                        rule_matches: []
                      - index: 1
                        event_id: deposit-2026-10-17-000002
                        outcome: rejected
                        errors:
                          payload:
                            - >-
                              payment.deposit_completed requires:
                              payment_method, status.
                      - index: 2
                        event_id: login-2026-10-16-000777
                        outcome: rejected
                        errors:
                          event_id: >-
                            event_id 'login-2026-10-16-000777' already exists
                            with a different payload.
        '400':
          description: >-
            Batch itu sendiri tidak valid: `events` tidak ada atau bukan array,
            kosong, atau memiliki lebih dari 500 item. Tidak ada yang disimpan;
            bagi batch yang besar.
          content:
            application/json:
              examples:
                Not a list:
                  value:
                    events: Expected a list of events.
                Empty:
                  value:
                    events: At least one event is required.
                Too many:
                  value:
                    events: A batch accepts at most 500 events; received 612.
        '401':
          description: >-
            Kunci API dengan cakupan terbatas telah kedaluwarsa. Hanya kunci
            yang kedaluwarsa yang menerima `401`; kunci yang hilang atau tidak
            valid menerima `403`.
          content:
            application/json:
              examples:
                Expired key:
                  value:
                    detail: This API key has expired.
        '403':
          description: >-
            `x-api-key` tidak ada (kunci yang salah, dicabut, atau kedaluwarsa
            menghasilkan `401`), kunci dengan pembatasan cakupan tanpa
            `transactions: write`, kunci yang dibatasi pada alur kerja tertentu
            atau pada sesi yang disetujui (kunci semacam itu tidak pernah
            mengakses data pemantauan transaksi), atau permintaan dari luar
            allowlist IP milik kunci tersebut. Juga dikembalikan dengan `code:
            event_monitoring_disabled` saat penyerapan event dinonaktifkan untuk
            aplikasi; tidak ada yang disimpan dalam kasus tersebut, dan
            pemeriksaan berjalan sebelum body divalidasi.
          content:
            application/json:
              examples:
                Event monitoring disabled:
                  value:
                    detail: >-
                      Event monitoring is not enabled for this application. Turn
                      on event ingestion in the transaction monitoring settings
                      before submitting events.
                    code: event_monitoring_disabled
                Missing or invalid API key:
                  value:
                    detail: You do not have permission to perform this action.
                Scoped key without access:
                  value:
                    detail: This API key has no write access to transactions.
                Key limited to workflows or approved sessions:
                  value:
                    detail: >-
                      This API key only reaches sessions inside its workflow or
                      status limits, so it can't use this endpoint.
                IP not allowed:
                  value:
                    detail: This API key can't be used from this IP address.
        '429':
          description: >-
            Batas laju terlampaui: pembuatan transaksi dan penyerapan event
            (`POST /v3/transactions/`, `POST /v3/events/`, `POST
            /v3/events/batch/`) berbagi anggaran sebanyak 600 permintaan per
            menit per kunci API, terpisah dari anggaran 300 permintaan yang
            digunakan bersama oleh semua permintaan tulis lainnya. Tunggu
            `Retry-After` detik, lalu coba lagi.
          headers:
            Retry-After:
              description: >-
                Detik yang harus ditunggu sebelum mencoba lagi, dibulatkan ke
                atas agar percobaan berikutnya berada di jendela berikutnya.
              schema:
                type: integer
                minimum: 1
                example: 30
          content:
            application/json:
              examples:
                Throttled:
                  value:
                    detail: >-
                      Ingestion rate limit exceeded. You can make up to 600
                      requests per minute.
      security:
        - ApiKeyAuth: []
      x-codeSamples:
        - lang: curl
          label: curl
          source: |-
            curl -X POST 'https://verification.didit.me/v3/events/batch/' \
              -H 'x-api-key: YOUR_API_KEY' \
              -H 'Content-Type: application/json' \
              -d '{
                "events": [
                  {"event_id": "login-2026-10-17-000001", "event_category": "auth", "action_type": "login",
                   "occurred_at": "2026-10-17T09:15:02.481Z", "subject": {"vendor_data": "user-42"}},
                  {"event_id": "deposit-2026-10-17-000002", "event_category": "payment", "action_type": "deposit_completed",
                   "occurred_at": "2026-10-17T09:16:40.000Z", "subject": {"vendor_data": "user-42"},
                   "transaction_context": {"amount": "100.00", "currency": "EUR", "payment_reference_id": "dep_736"},
                   "payload": {"payment_method": "card", "status": "completed"}}
                ]
              }'
        - lang: python
          label: Python
          source: |-
            from didit import Didit

            # Reads DIDIT_API_KEY.
            client = Didit()

            result = client.monitoring_events.create_batch(
                events=[{
                    "event_id": "login-2026-10-17-000001",
                    "event_category": "auth",
                    "action_type": "login",
                    "occurred_at": "2026-10-17T09:15:02.481Z",
                    "subject": {
                        "vendor_data": "user-42",
                    },
                }, {
                    "event_id": "deposit-2026-10-17-000002",
                    "event_category": "payment",
                    "action_type": "deposit_completed",
                    "occurred_at": "2026-10-17T09:16:40Z",
                    "subject": {
                        "vendor_data": "user-42",
                    },
                    "transaction_context": {
                        "amount": "100.00",
                        "currency": "EUR",
                        "payment_reference_id": "dep_736",
                    },
                    "payload": {"payment_method": "card", "status": "completed"},
                }],
            )
            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.monitoringEvents.createBatch({
              events: [{
                event_id: "login-2026-10-17-000001",
                event_category: "auth",
                action_type: "login",
                occurred_at: "2026-10-17T09:15:02.481Z",
                subject: {
                  vendor_data: "user-42",
                },
              }, {
                event_id: "deposit-2026-10-17-000002",
                event_category: "payment",
                action_type: "deposit_completed",
                occurred_at: "2026-10-17T09:16:40Z",
                subject: {
                  vendor_data: "user-42",
                },
                transaction_context: {
                  amount: "100.00",
                  currency: "EUR",
                  payment_reference_id: "dep_736",
                },
                payload: { payment_method: "card", status: "completed" },
              }],
            });
            console.log(result);
        - lang: go
          label: Go
          source: "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.MonitoringEvents.CreateBatch(ctx, didit.MonitoringEventsCreateBatchParams{\n\tEvents: []didit.MonitoringEventCreateRequest{{\n\t\tEventID:       \"login-2026-10-17-000001\",\n\t\tEventCategory: \"auth\",\n\t\tActionType:    \"login\",\n\t\tOccurredAt:    time.Date(2026, 10, 17, 9, 15, 2, 0, time.UTC),\n\t\tSubject: didit.MonitoringEventCreateRequestSubject{\n\t\t\tVendorData: \"user-42\",\n\t\t},\n\t}, {\n\t\tEventID:       \"deposit-2026-10-17-000002\",\n\t\tEventCategory: \"payment\",\n\t\tActionType:    \"deposit_completed\",\n\t\tOccurredAt:    time.Date(2026, 10, 17, 9, 16, 40, 0, time.UTC),\n\t\tSubject: didit.MonitoringEventCreateRequestSubject{\n\t\t\tVendorData: \"user-42\",\n\t\t},\n\t\tTransactionContext: didit.Some(didit.MonitoringEventCreateRequestTransactionContext{\n\t\t\tAmount:             didit.String(\"100.00\"),\n\t\t\tCurrency:           didit.String(\"EUR\"),\n\t\t\tPaymentReferenceID: didit.String(\"dep_736\"),\n\t\t}),\n\t\tPayload: didit.Some(map[string]any{\"payment_method\": \"card\", \"status\": \"completed\"}),\n\t}},\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
        - lang: java
          label: Java
          source: >-
            import java.time.OffsetDateTime;

            import java.util.List;

            import java.util.Map;

            import me.didit.Didit;

            import me.didit.types.MonitoringEventCreateRequest;

            import me.didit.types.MonitoringEventsCreateBatchParams;


            // Reads DIDIT_API_KEY.

            Didit client = new Didit();


            var result =
            client.monitoringEvents().createBatch(MonitoringEventsCreateBatchParams.builder()
                    .events(List.of(
                            MonitoringEventCreateRequest.builder()
                                    .eventId("login-2026-10-17-000001")
                                    .eventCategory(MonitoringEventCreateRequest.EventCategory.of("auth"))
                                    .actionType("login")
                                    .occurredAt(OffsetDateTime.parse("2026-10-17T09:15:02.481Z"))
                                    .subject(MonitoringEventCreateRequest.Subject.builder()
                                            .vendorData("user-42")
                                            .build())
                                    .build(),
                            MonitoringEventCreateRequest.builder()
                                    .eventId("deposit-2026-10-17-000002")
                                    .eventCategory(MonitoringEventCreateRequest.EventCategory.of("payment"))
                                    .actionType("deposit_completed")
                                    .occurredAt(OffsetDateTime.parse("2026-10-17T09:16:40Z"))
                                    .subject(MonitoringEventCreateRequest.Subject.builder()
                                            .vendorData("user-42")
                                            .build())
                                    .transactionContext(MonitoringEventCreateRequest.TransactionContext.builder()
                                            .amount("100.00")
                                            .currency("EUR")
                                            .paymentReferenceId("dep_736")
                                            .build())
                                    .payload(Map.of("payment_method", "card", "status", "completed"))
                                    .build()))
                    .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->monitoringEvents->createBatch([
                'events' => [[
                    'event_id' => 'login-2026-10-17-000001',
                    'event_category' => 'auth',
                    'action_type' => 'login',
                    'occurred_at' => '2026-10-17T09:15:02.481Z',
                    'subject' => [
                        'vendor_data' => 'user-42',
                    ],
                ], [
                    'event_id' => 'deposit-2026-10-17-000002',
                    'event_category' => 'payment',
                    'action_type' => 'deposit_completed',
                    'occurred_at' => '2026-10-17T09:16:40Z',
                    'subject' => [
                        'vendor_data' => 'user-42',
                    ],
                    'transaction_context' => [
                        'amount' => '100.00',
                        'currency' => 'EUR',
                        'payment_reference_id' => 'dep_736',
                    ],
                    'payload' => ['payment_method' => 'card', 'status' => 'completed'],
                ]],
            ]);
            print_r($result->toArray());
        - lang: ruby
          label: Ruby
          source: |-
            require "didit"

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

            result = didit.monitoring_events.create_batch(
              events: [{
                event_id: "login-2026-10-17-000001",
                event_category: "auth",
                action_type: "login",
                occurred_at: "2026-10-17T09:15:02.481Z",
                subject: {
                  vendor_data: "user-42",
                },
              }, {
                event_id: "deposit-2026-10-17-000002",
                event_category: "payment",
                action_type: "deposit_completed",
                occurred_at: "2026-10-17T09:16:40Z",
                subject: {
                  vendor_data: "user-42",
                },
                transaction_context: {
                  amount: "100.00",
                  currency: "EUR",
                  payment_reference_id: "dep_736",
                },
                payload: { payment_method: "card", status: "completed" },
              }]
            )
            puts result.to_h
        - lang: csharp
          label: .NET
          source: >-
            using System;

            using System.Collections.Generic;

            using System.Text.Json;

            using Didit;


            // Reads DIDIT_API_KEY.

            using var client = new DiditClient();


            var result = await client.MonitoringEvents.CreateBatchAsync(new
            MonitoringEventsCreateBatchParams

            {
                Events = new MonitoringEventCreateRequest[]
                {
                    new()
                    {
                        EventId = "login-2026-10-17-000001",
                        EventCategory = "auth",
                        ActionType = "login",
                        OccurredAt = DateTimeOffset.Parse("2026-10-17T09:15:02.481Z"),
                        Subject = new()
                        {
                            VendorData = "user-42",
                        },
                    },
                    new()
                    {
                        EventId = "deposit-2026-10-17-000002",
                        EventCategory = "payment",
                        ActionType = "deposit_completed",
                        OccurredAt = DateTimeOffset.Parse("2026-10-17T09:16:40Z"),
                        Subject = new()
                        {
                            VendorData = "user-42",
                        },
                        TransactionContext = new MonitoringEventCreateRequestTransactionContext
                        {
                            Amount = "100.00",
                            Currency = "EUR",
                            PaymentReferenceId = "dep_736",
                        },
                        Payload = new Dictionary<string, object> { ["payment_method"] = "card", ["status"] = "completed" },
                    },
                },
            });

            Console.WriteLine(JsonSerializer.Serialize(result));
components:
  schemas:
    MonitoringEventCreateRequest:
      type: object
      description: >-
        Envelope untuk event, sama untuk setiap kategori. Alias camelCase
        diterima: `eventId`, `eventCategory` (atau `category`), `actionType`,
        `occurredAt`, `timeZone` (atau `zoneId`), `deviceContext` (atau
        `device`), `transactionContext`, `customValues` (atau `props`); di dalam
        `subject`: `vendorData`, `entityType`, `fullName`; di dalam `session`:
        `sessionId`, `pageUrl`; di dalam `transaction_context`:
        `paymentReferenceId`.
      required:
        - event_id
        - event_category
        - action_type
        - occurred_at
        - subject
      properties:
        event_id:
          type: string
          maxLength: 128
          description: >-
            Pengidentifikasi Anda untuk event tersebut, unik per aplikasi. Nilai
            ini merupakan kunci idempotensi: mengirim ulang `event_category`,
            `action_type`, `occurred_at`, `subject.vendor_data`, dan `payload`
            yang sama di bawahnya dianggap sebagai replay, sedangkan perbedaan
            apa pun akan menimbulkan konflik.
          example: login-2026-10-17-000001
        event_category:
          type: string
          enum:
            - auth
            - session
            - gameplay
            - bonus
            - affiliate
            - payment
            - dispute
            - security
            - responsible_gambling
            - custom
          description: Kategori peristiwa.
          example: auth
        action_type:
          type: string
          minLength: 1
          maxLength: 128
          description: >-
            Hal yang terjadi dalam kategori. Kosakata terbuka; tindakan
            terkelola yang tercantum di [Penyerapan
            peristiwa](https://docs.didit.me/id/transaction-monitoring/events)
            (misalnya `login`, `deposit_completed`, `chargeback_opened`) membuka
            validasi bertipe dan kolom aturan terkelola. Spasi di awal dan akhir
            akan dipangkas.
          example: login
        occurred_at:
          type: string
          format: date-time
          description: >-
            Waktu ketika peristiwa terjadi di pihak Anda, ISO 8601 (nilai tanpa
            offset dibaca sebagai UTC). Tidak boleh lebih dari 7 hari di masa
            lalu dan tidak lebih dari 5 menit di masa depan.
          example: '2026-10-17T09:15:02.481Z'
        time_zone:
          type: string
          nullable: true
          maxLength: 64
          description: >-
            Zona waktu kejadian di pihak Anda, misalnya `Europe/Madrid`.
            Disimpan bersama peristiwa; tidak dikembalikan oleh endpoint baca.
        subject:
          type: object
          description: >-
            Pengguna atau perusahaan yang terkait dengan event tersebut. Nilai
            ini merujuk ke pengguna (atau perusahaan) dengan `vendor_data` ini
            di aplikasi Anda; entitas baru akan dibuat jika belum ada.
          required:
            - vendor_data
          properties:
            vendor_data:
              type: string
              minLength: 1
              maxLength: 255
              description: ID Anda untuk subjek tersebut.
              example: user-42
            entity_type:
              type: string
              maxLength: 32
              default: individual
              description: >-
                `company` menetapkan subjek sebagai perusahaan; nilai lainnya
                (default `individual`) menetapkannya sebagai perorangan.
                `vendor_data` yang sama dapat menamai satu dari masing-masing
                jenis.
              example: individual
            full_name:
              type: string
              nullable: true
              maxLength: 512
              description: >-
                Nama tampilan, hanya digunakan saat event ini membuat pengguna
                atau perusahaan.
            email:
              type: string
              format: email
              nullable: true
              description: Divalidasi sebagai alamat email; tidak disimpan pada event.
            phone:
              type: string
              nullable: true
              maxLength: 32
              description: Divalidasi; tidak disimpan pada event.
            country:
              type: string
              nullable: true
              maxLength: 3
              description: Divalidasi; tidak disimpan pada event.
        business:
          type: object
          description: >-
            Bisnis yang memiliki event tersebut, jika berbeda dari subjek. Hanya
            `vendor_data` yang dibaca.
          additionalProperties: true
          properties:
            vendor_data:
              type: string
              maxLength: 255
              description: >-
                ID Anda untuk bisnis tersebut. Dapat difilter sebagai
                `business_vendor_data`.
              example: merchant-7
        session:
          type: object
          description: Konteks sesi Anda untuk peristiwa tersebut.
          properties:
            session_id:
              type: string
              nullable: true
              maxLength: 255
              description: >-
                Pengenal sesi Anda. Dapat difilter dan dikembalikan sebagai
                `session_id`.
            sequence:
              type: integer
              nullable: true
              description: >-
                Posisi event di dalam sesi. Dikembalikan sebagai
                `session_sequence`.
            page_url:
              type: string
              nullable: true
              maxLength: 2048
              description: Divalidasi; tidak disimpan pada event.
            referrer:
              type: string
              nullable: true
              maxLength: 2048
              description: Divalidasi; tidak disimpan pada event.
        device_context:
          type: object
          additionalProperties: true
          description: >-
            Konteks perangkat dan jaringan, disimpan sebagaimana dikirim dan
            dikembalikan oleh `GET /v3/events/{event_uuid}/`. Pada jalur server
            ini Didit tidak melihat koneksi pengguna akhir, sehingga IP yang
            diperkaya dan digunakan oleh aturan adalah
            `network_context.ip_address` sebagaimana Anda mengirimkannya.
          properties:
            fingerprint:
              type: string
              maxLength: 255
              description: >-
                Sidik jari perangkat. Dapat difilter sebagai
                `device_fingerprint`.
            persistent_device_id:
              type: string
              maxLength: 255
              description: Pengenal perangkat persisten Anda.
            bot_score:
              type: integer
              description: Skor bot dari deteksi Anda sendiri, sebagai bilangan bulat.
            network_context:
              type: object
              additionalProperties: true
              properties:
                ip_address:
                  type: string
                  maxLength: 64
                  description: >-
                    Alamat IP pengguna akhir. Alamat publik diperkaya satu kali
                    per alamat unik.
                  example: 203.0.113.42
        transaction_context:
          type: object
          description: >-
            Konteks uang. Nilai yang tidak kosong di sini juga memenuhi kunci
            payload yang diperlukan untuk tindakan.
          properties:
            amount:
              type: string
              nullable: true
              description: Jumlah sebagai string desimal (angka juga diterima).
              example: '1000.00'
            currency:
              type: string
              nullable: true
              maxLength: 10
              description: Kode mata uang.
            direction:
              type: string
              nullable: true
              maxLength: 16
              description: Arah pergerakan uang, misalnya `inbound` atau `outbound`.
            payment_reference_id:
              type: string
              nullable: true
              maxLength: 255
              description: >-
                Referensi pembayaran Anda. Dapat difilter sebagai
                `payment_reference_id`.
        payload:
          type: object
          additionalProperties: true
          description: >-
            Kolom domain kategori, maksimal 16384 byte setelah di-encode ke
            JSON. Beberapa tindakan memerlukan kunci (dalam `payload` atau
            `transaction_context`): `gameplay.p2p_settlement` membutuhkan
            `game_id`, `counterparty_vendor_data`, `stake_amount`,
            `net_result_amount`, `role`, dan salah satu dari `hand_id`,
            `round_id`, `match_id`; `gameplay.bet_placed` dan
            `gameplay.bet_settled` membutuhkan `game_id`;
            `payment.deposit_initiated`, `payment.deposit_completed`,
            `payment.withdrawal_requested`, dan `payment.withdrawal_completed`
            membutuhkan `payment_reference_id`, `amount`, `currency`,
            `payment_method`, `status`; `payment.withdrawal_address_changed`
            membutuhkan `withdrawal_address_hash`; `dispute.chargeback_opened`,
            `dispute.chargeback_won`, dan `dispute.chargeback_lost` membutuhkan
            `payment_reference_id` dan salah satu dari `dispute_id`,
            `chargeback_id`; `session.bot_signal_observed` membutuhkan
            `telemetry_schema_version` dan salah satu dari `bot_score`,
            `actions_per_minute`, `timing_variance_ms`, `pointer_entropy`,
            `keystroke_entropy`, `reaction_time_ms_p50`;
            `responsible_gambling.self_exclusion_match` membutuhkan
            `registry_source`, `exclusion_status`, `identity_match_ref`. Setiap
            tindakan `security` yang berakhiran `_changed` membutuhkan
            `changed_field`, ditambah `previous_reference_hash` atau
            `new_reference_hash` ketika kolom tersebut berupa `password`,
            `mfa_method`, `mfa`, `email`, `phone`, `withdrawal_address`,
            `payout_method`, atau `api_key`. Kirimkan hash dan referensi, jangan
            pernah nomor kartu, alamat penarikan lengkap, hash kata sandi, atau
            rahasia MFA.
        custom_values:
          type: object
          description: >-
            Hingga 100 kunci milik Anda sendiri, dapat diakses dari aturan
            sebagai `custom_values.<key>`. Nilai harus berupa skalar (string,
            number, boolean, atau null); objek bersarang dan larik akan ditolak.
          additionalProperties:
            nullable: true
            oneOf:
              - type: string
              - type: number
              - type: boolean
      example:
        event_id: login-2026-10-17-000001
        event_category: auth
        action_type: login
        occurred_at: '2026-10-17T09:15:02.481Z'
        time_zone: Europe/Madrid
        subject:
          vendor_data: user-42
          entity_type: individual
        session:
          session_id: web-session-abc
          sequence: 142
        device_context:
          fingerprint: fp-a8c1
          network_context:
            ip_address: 203.0.113.42
        payload:
          method: password
        custom_values:
          vip_tier: gold
  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.