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

# واجهة برمجة تطبيقات إرسال أحداث المراقبة دفعةً واحدة

> يتيح Didit إرسال حتى 500 حدث مراقبة في طلب واحد، مع نتيجة لكل عنصر على حدة، فلا يُعيق حدث واحد مشوَّه بقية الدفعة من الأحداث.



مطالبة إنشاء أحداث المراقبة باستخدام Batch API
        نسخ الموجّه إلى الحافظة



      
      

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



      
      

الصق في

راجع [الدفعات](https://docs.didit.me/ar/transaction-monitoring/events.md#الدفعات) في دليل استيعاب الأحداث. يعرض مسار الجهاز النتائج نفسها لكل عنصر في عمليات التفريغ من SDK، راجع [إرسال أحداث SDK](https://docs.didit.me/ar/transaction-monitoring/sdk-event-submission.md#التجميع-في-دفعات).


## OpenAPI

````yaml ar/openapi-25.json POST /v3/events/batch/
openapi: 3.0.0
info:
  version: 3.0.0
  title: Didit Verification API
  description: API التحقق من الهوية. قم بالمصادقة باستخدام الرأس x-api-key.
servers:
  - url: https://verification.didit.me
security: []
tags: []
paths:
  /v3/events/batch/:
    post:
      tags:
        - Monitoring Events
      summary: إنشاء أحداث مراقبة مجمّعة
      description: >-
        إرسال ما بين 1 و500 حدث في طلب واحد، كل منها داخل نفس الغلاف مثل `POST
        /v3/events/`. يتم التحقق من صحة كل عنصر وتخزينه وتقييمه بشكل مستقل،
        ويحصل على نتيجته الخاصة (`accepted` أو `replayed` أو `rejected`)،
        وبالتالي فإن وجود حدث واحد غير صالح لا يؤدي أبداً إلى التراجع عن بقية
        الأحداث: تكون الاستجابة `201` عندما لا يُرفض أي عنصر و`207` عند رفض عنصر
        واحد على الأقل، وكلاهما يعني أنه تمت معالجة الطلب. أرسل `{"events":
        [...]}`؛ كما تُقبل أيضاً مصفوفة JSON مجردة من الأحداث. يجب تفعيل استقبال
        الأحداث للتطبيق، وإلا سيعيد الطلب بالكامل الرمز `403` مع `code:
        event_monitoring_disabled` ولن يتم تخزين أي شيء. يحتاج مفتاح API محدود
        النطاق إلى `transactions: write`. راجع
        [Batches](https://docs.didit.me/ar/transaction-monitoring/events#الدفعات).
      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 إلى 500 حدث. يتبع كل عنصر
                    `MonitoringEventCreateRequest`، بما في ذلك النافذة الزمنية
                    الممتدة لـ 7 أيام في الماضي و5 دقائق في المستقبل لـ
                    `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: 'لم يتم رفض أي عنصر: كل عنصر حالته `accepted` أو `replayed`.'
          content:
            application/json:
              schema:
                type: object
                required:
                  - accepted_count
                  - replayed_count
                  - rejected_count
                  - results
                properties:
                  accepted_count:
                    type: integer
                    minimum: 0
                    description: العناصر المخزنة والمقيّمة.
                  replayed_count:
                    type: integer
                    minimum: 0
                    description: العناصر المخزنة بالفعل بنفس المحتوى.
                  rejected_count:
                    type: integer
                    minimum: 0
                    description: العناصر غير المخزنة.
                  results:
                    type: array
                    description: إدخال واحد لكل عنصر، وفق ترتيب الطلب.
                    items:
                      type: object
                      description: >-
                        نتيجة عنصر واحد. تحمل العناصر المقبولة والمعاد تشغيلها
                        أيضاً كل حقل من `MonitoringEventIngestResult`؛ بينما
                        تحمل العناصر المرفوضة `event_id` و`errors` بدلاً من ذلك.
                      required:
                        - index
                        - outcome
                      properties:
                        index:
                          type: integer
                          minimum: 0
                          description: موضع العنصر في مصفوفة `events` الخاصة بك.
                        outcome:
                          type: string
                          enum:
                            - accepted
                            - replayed
                            - rejected
                          description: >-
                            `accepted`: تم التخزين والتقييم. `replayed`: تم
                            تخزينه بالفعل بنفس المحتوى. `rejected`: لم يتم
                            التخزين؛ راجع `errors`.
                        event_id:
                          type: string
                          nullable: true
                          description: >-
                            حقل `event_id` الخاص بك. في العناصر المرفوضة بواسطة
                            التحقق من الصحة، تتم قراءته من مفتاح `event_id`
                            بصيغة snake_case الخاص بالعنصر، لذا يكون null عندما
                            يُغفله العنصر أو يرسل الاسم المستعار `eventId`.
                        errors:
                          type: object
                          additionalProperties: true
                          description: >-
                            العناصر المرفوضة فقط. أخطاء التحقق مفهرسة حسب الحقل،
                            بنفس شكل استجابة `400` الخاصة بـ `POST /v3/events/`؛
                            ويتم الإبلاغ عن `event_id` المُعاد استخدامه بمحتوى
                            مختلف كسلسلة نصية تحت `errors.event_id`.
                        event_uuid:
                          type: string
                          format: uuid
                          description: العناصر المقبولة والمعاد تشغيلها فقط.
                        status:
                          type: string
                          enum:
                            - ACCEPTED
                            - APPROVED
                            - IN_REVIEW
                            - DECLINED
                          description: العناصر المقبولة والمعاد تشغيلها فقط.
                        score:
                          type: integer
                          description: العناصر المقبولة والمعاد تشغيلها فقط.
                        rules_evaluated_count:
                          type: integer
                          description: العناصر المقبولة والمعاد تشغيلها فقط.
                        rules_matched_count:
                          type: integer
                          description: العناصر المقبولة والمعاد تشغيلها فقط.
                        correlation_pending:
                          type: boolean
                          description: العناصر المقبولة والمعاد تشغيلها فقط.
                        retention_class:
                          type: string
                          enum:
                            - low_value
                            - standard
                            - risk_relevant
                            - monetary_or_compliance
                          description: العناصر المقبولة والمعاد تشغيلها فقط.
                        expires_at:
                          type: string
                          format: date-time
                          nullable: true
                          description: العناصر المقبولة والمعاد تشغيلها فقط.
                        idempotent_replay:
                          type: boolean
                          description: العناصر المقبولة والمعاد تشغيلها فقط.
                        rule_matches:
                          type: array
                          description: العناصر المقبولة والمعاد تشغيلها فقط.
                          items:
                            type: object
                            required:
                              - rule_id
                              - library_key
                              - mode
                              - is_async
                            properties:
                              rule_id:
                                type: string
                                format: uuid
                                description: معرّف UUID للقاعدة.
                              library_key:
                                type: string
                                nullable: true
                                description: >-
                                  مفتاح المكتبة عندما يتم تثبيت القاعدة من مكتبة
                                  القواعد، وإلا يكون null.
                              mode:
                                type: string
                                enum:
                                  - ACTIVE
                                  - TEST
                                description: >-
                                  تسجل قواعد `TEST` التطابق ولكنها لا تطبق أي
                                  إجراءات.
                              is_async:
                                type: boolean
                                description: >-
                                  تكون `true` عندما تكون المطابقة ناتجة عن
                                  المعالجة غير المتزامنة.
              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: >-
            تم رفض عنصر واحد على الأقل. تم تخزين العناصر الأخرى؛ قم بتصحيح
            العناصر المرفوضة وإعادة إرسالها فقط (إعادة إرسال عنصر مقبول آمنة،
            حيث يعود بحالة `replayed`).
          content:
            application/json:
              schema:
                type: object
                required:
                  - accepted_count
                  - replayed_count
                  - rejected_count
                  - results
                properties:
                  accepted_count:
                    type: integer
                    minimum: 0
                    description: العناصر المخزنة والمقيّمة.
                  replayed_count:
                    type: integer
                    minimum: 0
                    description: العناصر المخزنة بالفعل بنفس المحتوى.
                  rejected_count:
                    type: integer
                    minimum: 0
                    description: العناصر غير المخزنة.
                  results:
                    type: array
                    description: إدخال واحد لكل عنصر، وفق ترتيب الطلب.
                    items:
                      type: object
                      description: >-
                        نتيجة عنصر واحد. تحمل العناصر المقبولة والمعاد تشغيلها
                        أيضاً كل حقل من `MonitoringEventIngestResult`؛ بينما
                        تحمل العناصر المرفوضة `event_id` و`errors` بدلاً من ذلك.
                      required:
                        - index
                        - outcome
                      properties:
                        index:
                          type: integer
                          minimum: 0
                          description: موضع العنصر في مصفوفة `events` الخاصة بك.
                        outcome:
                          type: string
                          enum:
                            - accepted
                            - replayed
                            - rejected
                          description: >-
                            `accepted`: تم التخزين والتقييم. `replayed`: تم
                            تخزينه بالفعل بنفس المحتوى. `rejected`: لم يتم
                            التخزين؛ راجع `errors`.
                        event_id:
                          type: string
                          nullable: true
                          description: >-
                            حقل `event_id` الخاص بك. في العناصر المرفوضة بواسطة
                            التحقق من الصحة، تتم قراءته من مفتاح `event_id`
                            بصيغة snake_case الخاص بالعنصر، لذا يكون null عندما
                            يُغفله العنصر أو يرسل الاسم المستعار `eventId`.
                        errors:
                          type: object
                          additionalProperties: true
                          description: >-
                            العناصر المرفوضة فقط. أخطاء التحقق مفهرسة حسب الحقل،
                            بنفس شكل استجابة `400` الخاصة بـ `POST /v3/events/`؛
                            ويتم الإبلاغ عن `event_id` المُعاد استخدامه بمحتوى
                            مختلف كسلسلة نصية تحت `errors.event_id`.
                        event_uuid:
                          type: string
                          format: uuid
                          description: العناصر المقبولة والمعاد تشغيلها فقط.
                        status:
                          type: string
                          enum:
                            - ACCEPTED
                            - APPROVED
                            - IN_REVIEW
                            - DECLINED
                          description: العناصر المقبولة والمعاد تشغيلها فقط.
                        score:
                          type: integer
                          description: العناصر المقبولة والمعاد تشغيلها فقط.
                        rules_evaluated_count:
                          type: integer
                          description: العناصر المقبولة والمعاد تشغيلها فقط.
                        rules_matched_count:
                          type: integer
                          description: العناصر المقبولة والمعاد تشغيلها فقط.
                        correlation_pending:
                          type: boolean
                          description: العناصر المقبولة والمعاد تشغيلها فقط.
                        retention_class:
                          type: string
                          enum:
                            - low_value
                            - standard
                            - risk_relevant
                            - monetary_or_compliance
                          description: العناصر المقبولة والمعاد تشغيلها فقط.
                        expires_at:
                          type: string
                          format: date-time
                          nullable: true
                          description: العناصر المقبولة والمعاد تشغيلها فقط.
                        idempotent_replay:
                          type: boolean
                          description: العناصر المقبولة والمعاد تشغيلها فقط.
                        rule_matches:
                          type: array
                          description: العناصر المقبولة والمعاد تشغيلها فقط.
                          items:
                            type: object
                            required:
                              - rule_id
                              - library_key
                              - mode
                              - is_async
                            properties:
                              rule_id:
                                type: string
                                format: uuid
                                description: معرّف UUID للقاعدة.
                              library_key:
                                type: string
                                nullable: true
                                description: >-
                                  مفتاح المكتبة عندما يتم تثبيت القاعدة من مكتبة
                                  القواعد، وإلا يكون null.
                              mode:
                                type: string
                                enum:
                                  - ACTIVE
                                  - TEST
                                description: >-
                                  تسجل قواعد `TEST` التطابق ولكنها لا تطبق أي
                                  إجراءات.
                              is_async:
                                type: boolean
                                description: >-
                                  تكون `true` عندما تكون المطابقة ناتجة عن
                                  المعالجة غير المتزامنة.
              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: >-
            الدفعة نفسها غير صالحة: حقل `events` مفقود أو ليس مصفوفة، أو فارغ،
            أو يحتوي على أكثر من 500 عنصر. لم يتم تخزين أي شيء؛ قسّم الدفعات
            الكبيرة.
          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: >-
            انتهت صلاحية مفتاح API محدد النطاق. المفتاح منتهي الصلاحية فقط هو ما
            يتلقى `401`؛ أما المفتاح المفقود أو غير الصالح فيتلقى `403`.
          content:
            application/json:
              examples:
                Expired key:
                  value:
                    detail: This API key has expired.
        '403':
          description: >-
            `x-api-key` مفقود (المفتاح الخاطئ أو الملغى أو منتهي الصلاحية يتلقى
            `401`)، أو مفتاح ذو نطاق محدد يفتقر إلى `transactions: write`، أو
            مفتاح مقتصر على بعض مسارات سير العمل أو على الجلسات المقبولة (مثل
            هذا المفتاح لا يصل أبداً إلى بيانات مراقبة المعاملات)، أو طلب من
            خارج قائمة العناوين المسموح بها للمفتاح. يُرجع أيضاً مع `code:
            event_monitoring_disabled` أثناء تعطيل استيعاب الأحداث للتطبيق؛ لا
            يتم تخزين أي شيء في تلك الحالة، ويتم إجراء الفحص قبل التحقق من صحة
            نص الطلب.
          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: >-
            تم تجاوز حد المعدل: تتشارك عمليات إنشاء المعاملات واستيعاب الأحداث
            (`POST /v3/transactions/`، `POST /v3/events/`، `POST
            /v3/events/batch/`) رصيداً قدره 600 طلب في الدقيقة لكل مفتاح API،
            وهو منفصل عن رصيد الـ 300 المشترك بين سائر طلبات الكتابة الأخرى.
            انتظر لعدد الثواني المحدد في `Retry-After`، ثم أعد المحاولة.
          headers:
            Retry-After:
              description: >-
                عدد الثواني التي يجب انتظارها قبل إعادة المحاولة، مقربة للأعلى
                لتقع إعادة المحاولة في النافذة التالية.
              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)، وهو متطابق لكل فئة. تُقبل الأسماء البديلة بصيغة
        camelCase: `eventId`، و`eventCategory` (أو `category`)، و`actionType`،
        و`occurredAt`، و`timeZone` (أو `zoneId`)، و`deviceContext` (أو
        `device`)، و`transactionContext`، و`customValues` (أو `props`)؛ وداخل
        `subject`: `vendorData`، و`entityType`، و`fullName`؛ وداخل `session`:
        `sessionId`، و`pageUrl`؛ وداخل `transaction_context`:
        `paymentReferenceId`.
      required:
        - event_id
        - event_category
        - action_type
        - occurred_at
        - subject
      properties:
        event_id:
          type: string
          maxLength: 128
          description: >-
            المعرّف الخاص بك للحدث، ويكون فريداً لكل تطبيق. إنه مفتاح
            idempotency: إعادة إرسال نفس `event_category` و`action_type`
            و`occurred_at` و`subject.vendor_data` و`payload` تحته تُعد إعادة
            تشغيل، وأي اختلاف يُعد تعارضاً.
          example: login-2026-10-17-000001
        event_category:
          type: string
          enum:
            - auth
            - session
            - gameplay
            - bonus
            - affiliate
            - payment
            - dispute
            - security
            - responsible_gambling
            - custom
          description: فئة الحدث.
          example: auth
        action_type:
          type: string
          minLength: 1
          maxLength: 128
          description: >-
            ما حدث ضمن الفئة. مفردات مفتوحة؛ تتيح الإجراءات المُدارة المدرجة في
            [استيعاب
            الأحداث](https://docs.didit.me/ar/transaction-monitoring/events)
            (على سبيل المثال `login` و`deposit_completed` و`chargeback_opened`)
            التحقق من النوع وحقول القواعد المُدارة. يتم اقتطاع المسافات البيضاء
            في البداية والنهاية.
          example: login
        occurred_at:
          type: string
          format: date-time
          description: >-
            وقت وقوع الحدث من جانبك، بتنسيق ISO 8601 (أي قيمة بدون فارق زمني
            تُقرأ على أنها UTC). يجب ألا يزيد عمره على 7 أيام في الماضي وألا
            يتجاوز 5 دقائق في المستقبل.
          example: '2026-10-17T09:15:02.481Z'
        time_zone:
          type: string
          nullable: true
          maxLength: 64
          description: >-
            المنطقة الزمنية لحدوث الواقعة من جانبك، على سبيل المثال
            `Europe/Madrid`. يتم تخزينها مع الحدث؛ ولا تُرجعها endpoint الخاصة
            بالقراءة.
        subject:
          type: object
          description: >-
            المستخدم أو الشركة التي ينتمي إليها الحدث. ويُحدَّد بالمستخدم (أو
            الشركة) التي تملك `vendor_data` هذه في تطبيقك؛ ويتم إنشاء واحد عند
            عدم وجوده.
          required:
            - vendor_data
          properties:
            vendor_data:
              type: string
              minLength: 1
              maxLength: 255
              description: المعرّف الخاص بك للكيان.
              example: user-42
            entity_type:
              type: string
              maxLength: 32
              default: individual
              description: >-
                يحلّ `company` الموضوع إلى شركة؛ وأي قيمة أخرى (الافتراضية
                `individual`) تحلّه إلى فرد. يمكن لنفس `vendor_data` تسمية واحد
                من كل منهما.
              example: individual
            full_name:
              type: string
              nullable: true
              maxLength: 512
              description: اسم العرض، يُستخدم فقط عندما يُنشئ هذا الحدث المستخدم أو الشركة.
            email:
              type: string
              format: email
              nullable: true
              description: تم التحقق من صحته كعنوان بريد إلكتروني؛ ولا يتم تخزينه في الحدث.
            phone:
              type: string
              nullable: true
              maxLength: 32
              description: تم التحقق من صحته؛ ولا يتم تخزينه في الحدث.
            country:
              type: string
              nullable: true
              maxLength: 3
              description: تم التحقق من صحته؛ ولا يتم تخزينه في الحدث.
        business:
          type: object
          description: >-
            الشركة التي ينتمي إليها الحدث، عندما تختلف عن الكيان المعني. تُقرأ
            `vendor_data` فقط.
          additionalProperties: true
          properties:
            vendor_data:
              type: string
              maxLength: 255
              description: المعرّف الخاص بك للشركة. يمكن تصفيته كـ `business_vendor_data`.
              example: merchant-7
        session:
          type: object
          description: سياق الجلسة الخاص بك للحدث.
          properties:
            session_id:
              type: string
              nullable: true
              maxLength: 255
              description: معرّف الجلسة الخاص بك. قابل للتصفية ويُعاد كـ `session_id`.
            sequence:
              type: integer
              nullable: true
              description: موضع الحدث داخل الجلسة. يُرجع كـ `session_sequence`.
            page_url:
              type: string
              nullable: true
              maxLength: 2048
              description: تم التحقق من صحته؛ ولا يتم تخزينه في الحدث.
            referrer:
              type: string
              nullable: true
              maxLength: 2048
              description: تم التحقق من صحته؛ ولا يتم تخزينه في الحدث.
        device_context:
          type: object
          additionalProperties: true
          description: >-
            سياق الجهاز والشبكة، يُخزن كما تم إرساله ويُرجع بواسطة `GET
            /v3/events/{event_uuid}/`. في مسار الخادم هذا، لا ترى Didit اتصال
            المستخدم النهائي، لذا فإن عنوان IP المُثرى والمُستخدم بواسطة القواعد
            هو `network_context.ip_address` كما ترسله أنت.
          properties:
            fingerprint:
              type: string
              maxLength: 255
              description: بصمة الجهاز. قابلة للتصفية كـ `device_fingerprint`.
            persistent_device_id:
              type: string
              maxLength: 255
              description: معرّف جهازك الدائم.
            bot_score:
              type: integer
              description: درجة البوت من نظام الكشف الخاص بك، كعدد صحيح.
            network_context:
              type: object
              additionalProperties: true
              properties:
                ip_address:
                  type: string
                  maxLength: 64
                  description: >-
                    عنوان IP الخاص بالمستخدم النهائي. يتم إثراء العناوين العامة
                    مرة واحدة لكل عنوان فريد.
                  example: 203.0.113.42
        transaction_context:
          type: object
          description: >-
            سياق الأموال. تلبي القيم غير الفارغة هنا أيضاً مفاتيح payload
            المطلوبة للإجراء.
          properties:
            amount:
              type: string
              nullable: true
              description: المبلغ كسلسلة عشرية (يُقبل أيضاً كرقم).
              example: '1000.00'
            currency:
              type: string
              nullable: true
              maxLength: 10
              description: رمز العملة.
            direction:
              type: string
              nullable: true
              maxLength: 16
              description: اتجاه حركة الأموال، على سبيل المثال `inbound` أو `outbound`.
            payment_reference_id:
              type: string
              nullable: true
              maxLength: 255
              description: مرجع الدفع الخاص بك. يمكن تصفيته كـ `payment_reference_id`.
        payload:
          type: object
          additionalProperties: true
          description: >-
            حقول النطاق الخاصة بالفئة، بحد أقصى 16384 بايت بمجرد ترميزها بتنسيق
            JSON. تتطلب بعض الإجراءات مفاتيح (في `payload` أو
            `transaction_context`): يتطلب `gameplay.p2p_settlement` كلاً من
            `game_id` و`counterparty_vendor_data` و`stake_amount`
            و`net_result_amount` و`role` وواحداً من `hand_id` أو `round_id` أو
            `match_id`؛ ويتطلب `gameplay.bet_placed` و`gameplay.bet_settled`
            المعرّف `game_id`؛ ويتطلب `payment.deposit_initiated`
            و`payment.deposit_completed` و`payment.withdrawal_requested`
            و`payment.withdrawal_completed` كلاً من `payment_reference_id`
            و`amount` و`currency` و`payment_method` و`status`؛ ويتطلب
            `payment.withdrawal_address_changed` المعرّف
            `withdrawal_address_hash`؛ ويتطلب `dispute.chargeback_opened`
            و`dispute.chargeback_won` و`dispute.chargeback_lost` الحقل
            `payment_reference_id` وواحداً من `dispute_id` أو `chargeback_id`؛
            ويتطلب `session.bot_signal_observed` الحقل
            `telemetry_schema_version` وواحداً من `bot_score` أو
            `actions_per_minute` أو `timing_variance_ms` أو `pointer_entropy` أو
            `keystroke_entropy` أو `reaction_time_ms_p50`؛ ويتطلب
            `responsible_gambling.self_exclusion_match` كلاً من
            `registry_source` و`exclusion_status` و`identity_match_ref`. يتطلب
            كل إجراء `security` ينتهي بـ `_changed` الحقل `changed_field`،
            بالإضافة إلى `previous_reference_hash` أو `new_reference_hash` عندما
            يكون الحقل هو `password` أو `mfa_method` أو `mfa` أو `email` أو
            `phone` أو `withdrawal_address` أو `payout_method` أو `api_key`.
            أرسل التجزئات والمراجع، ولا ترسل أبداً رقم بطاقة أو عنوان سحب كاملاً
            أو تجزئة كلمة مرور أو سر MFA.
        custom_values:
          type: object
          description: >-
            ما يصل إلى 100 مفتاح خاص بك، يمكن الرجوع إليها من القواعد بصيغة
            `custom_values.<key>`. يجب أن تكون القيم عددية أو نصية بسيطة (string
            أو number أو boolean أو null)؛ ويتم رفض الكائنات والمصفوفات
            المتداخلة.
          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: >-
        مفتاح API الخاص بتطبيقك، من Developers -> API keys في Business Console.
        يمتلك المفتاح الأساسي وصولاً كاملاً. يمكن تحديد نطاق المفتاح المسمى: لا
        شيء، أو قراءة، أو كتابة لكل مورد، ومحدوداً ببعض مسارات العمل أو بالجلسات
        المقبولة، وبقائمة من عناوين IP، وبتاريخ انتهاء الصلاحية. يشير 401 إلى أن
        المفتاح غير صحيح أو ملغى أو منتهي الصلاحية؛ ويشير 403 إلى أنه لم يتم
        إرسال أي مفتاح، أو أن المفتاح ليس لديه حق الوصول إلى هذا المورد أو
        الإجراء، أو أن الطلب جاء من عنوان خارج قائمة عناوين IP الخاصة به؛ ويشير
        404 في مسار جلسة إلى أن الجلسة خارج مسارات العمل أو الحالات الخاصة
        بالمفتاح. يتلقى المفتاح الذي لا يمتلك حق الوصول إلى الوسائط عناوين URL
        للصور ومقاطع الفيديو وملفات PDF كـ null، ويتلقى المفتاح الذي لا يمتلك
        إذن كتابة للجلسات روابط الجلسة وtoken كـ null. راجع
        https://docs.didit.me/console/api-keys.

````

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