> ## 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 пакетной отправки событий мониторинга

> До 500 событий мониторинга в одном запросе Didit, с результатом по каждому. Ошибка одного события не блокирует остальные.



Промпт для создания событий мониторинга через 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/ru/transaction-monitoring/events.md#пакетная-отправка) в руководстве по приёму событий. В канале устройств для сброса очереди SDK (flush) результаты по каждому элементу такие же: см. [Отправка событий из SDK](https://docs.didit.me/ru/transaction-monitoring/sdk-event-submission.md#пакетная-отправка).


## OpenAPI

````yaml ru/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`. См.
        [Пакеты](https://docs.didit.me/ru/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`, включая окно для
                    `occurred_at`: не более 7 дней в прошлом и не более 5 минут
                    в будущем.
                  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: >-
        Конверт события, одинаковый для каждой категории. Принимаются псевдонимы
        в 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: >-
            Ваш идентификатор события, уникальный в рамках приложения. Является
            ключом идемпотентности: повторная отправка тех же `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/ru/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: Ваш id для субъекта.
              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: >-
                Ваш id для компании. Можно фильтровать как
                `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 не видит подключение конечного пользователя, поэтому
            адресом, обогащаемым данными и используемым правилами, является
            `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>`. Значения должны быть скалярными (строка,
            число, логическое значение или 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-ключ вашего приложения из раздела «Разработчикам» -> «API-ключи» в
        Business Console. Основной ключ имеет полный доступ. Именованный ключ
        может иметь ограниченную область действия: без доступа, чтение или
        запись для каждого ресурса, ограничение определенными сценариями или
        одобренными сессиями, списком IP-адресов и сроком действия. 401
        означает, что ключ неверен, отозван или его срок действия истек; 403
        означает, что ключ не был передан, у ключа нет доступа к этому ресурсу
        или действию, либо запрос поступил с адреса вне его списка IP-адресов;
        404 на маршруте сессии означает, что сессия не входит в сценарии или
        статусы ключа. Ключ без доступа к медиа получает URL изображений, видео
        и PDF как null, а ключ без прав на запись сессий получает ссылки на
        сессии и токены как null. См. https://docs.didit.me/console/api-keys.

````

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