> ## 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 d'esdeveniments de monitoratge en lot

> Envia fins a 500 esdeveniments de monitoratge amb Didit en una sol·licitud, amb un resultat per element. Un error no bloqueja la resta.



Indicació de l'API de lots per crear esdeveniments de monitoratge
        Copia el prompt al porta-retalls



      
      

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



      
      

Enganxa a

Consulta [Lots](https://docs.didit.me/ca/transaction-monitoring/events.md#lots) a la guia d'ingestió d'esdeveniments. El canal de dispositius té els mateixos resultats per element per a les operacions de flush de l'SDK: consulta [Enviament d'esdeveniments del SDK](https://docs.didit.me/ca/transaction-monitoring/sdk-event-submission.md#enviament-per-lots).


## OpenAPI

````yaml ca/openapi-25.json POST /v3/events/batch/
openapi: 3.0.0
info:
  version: 3.0.0
  title: Didit Verification API
  description: API de verificació d'identitat. Autentica't amb la capçalera x-api-key.
servers:
  - url: https://verification.didit.me
security: []
tags: []
paths:
  /v3/events/batch/:
    post:
      tags:
        - Monitoring Events
      summary: Crea esdeveniments de monitoratge per lots
      description: >-
        Envia d'1 a 500 esdeveniments en una sola sol·licitud, cadascun en el
        mateix sobre que `POST /v3/events/`. Cada element es valida,
        s'emmagatzema i s'avalua de manera independent i rep el seu propi
        resultat (`accepted`, `replayed` o `rejected`), de manera que un
        esdeveniment mal format mai reverteix els altres: la resposta és `201`
        quan no s'ha rebutjat cap element i `207` quan se n'ha rebutjat almenys
        un, i tots dos indiquen que la sol·licitud s'ha processat. Envia
        `{"events": [...]}`; també s'accepta un array JSON simple
        d'esdeveniments. La ingesta d'esdeveniments ha d'estar activada per a
        l'aplicació; en cas contrari, tota la sol·licitud retorna `403` amb
        `code: event_monitoring_disabled` i no s'emmagatzema res. Una clau d'API
        amb àmbit necessita `transactions: write`. Consulta
        [Lots](https://docs.didit.me/ca/transaction-monitoring/events#lots).
      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: >-
                    D'1 a 500 esdeveniments. Cada element segueix
                    `MonitoringEventCreateRequest`, inclosa la finestra de 7
                    dies en el passat i 5 minuts en el futur a `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: >-
            No s'ha rebutjat cap element: cada element és `accepted` o
            `replayed`.
          content:
            application/json:
              schema:
                type: object
                required:
                  - accepted_count
                  - replayed_count
                  - rejected_count
                  - results
                properties:
                  accepted_count:
                    type: integer
                    minimum: 0
                    description: Elements emmagatzemats i avaluats.
                  replayed_count:
                    type: integer
                    minimum: 0
                    description: Elements ja emmagatzemats amb el mateix contingut.
                  rejected_count:
                    type: integer
                    minimum: 0
                    description: Elements no emmagatzemats.
                  results:
                    type: array
                    description: Una entrada per element, en l'ordre de la sol·licitud.
                    items:
                      type: object
                      description: >-
                        Resultat d'un element. Els elements acceptats i repetits
                        també inclouen tots els camps de
                        `MonitoringEventIngestResult`; els elements rebutjats
                        inclouen `event_id` i `errors` en el seu lloc.
                      required:
                        - index
                        - outcome
                      properties:
                        index:
                          type: integer
                          minimum: 0
                          description: Posició de l'element al teu array `events`.
                        outcome:
                          type: string
                          enum:
                            - accepted
                            - replayed
                            - rejected
                          description: >-
                            `accepted`: emmagatzemat i avaluat. `replayed`: ja
                            emmagatzemat amb el mateix contingut. `rejected`: no
                            emmagatzemat; consulta `errors`.
                        event_id:
                          type: string
                          nullable: true
                          description: >-
                            El teu `event_id`. En els elements rebutjats per
                            validació es llegeix des de la clau `event_id` en
                            snake_case de l'element, de manera que és null si
                            l'element l'ha omès o ha enviat l'àlies `eventId`.
                        errors:
                          type: object
                          additionalProperties: true
                          description: >-
                            Només elements rebutjats. Errors de validació
                            indexats per camp, amb el mateix format que el `400`
                            de `POST /v3/events/`; un `event_id` reutilitzat amb
                            contingut diferent es notifica com a cadena sota
                            `errors.event_id`.
                        event_uuid:
                          type: string
                          format: uuid
                          description: Només elements acceptats i reproduïts.
                        status:
                          type: string
                          enum:
                            - ACCEPTED
                            - APPROVED
                            - IN_REVIEW
                            - DECLINED
                          description: Només elements acceptats i reproduïts.
                        score:
                          type: integer
                          description: Només elements acceptats i reproduïts.
                        rules_evaluated_count:
                          type: integer
                          description: Només elements acceptats i reproduïts.
                        rules_matched_count:
                          type: integer
                          description: Només elements acceptats i reproduïts.
                        correlation_pending:
                          type: boolean
                          description: Només elements acceptats i reproduïts.
                        retention_class:
                          type: string
                          enum:
                            - low_value
                            - standard
                            - risk_relevant
                            - monetary_or_compliance
                          description: Només elements acceptats i reproduïts.
                        expires_at:
                          type: string
                          format: date-time
                          nullable: true
                          description: Només elements acceptats i reproduïts.
                        idempotent_replay:
                          type: boolean
                          description: Només elements acceptats i reproduïts.
                        rule_matches:
                          type: array
                          description: Només elements acceptats i reproduïts.
                          items:
                            type: object
                            required:
                              - rule_id
                              - library_key
                              - mode
                              - is_async
                            properties:
                              rule_id:
                                type: string
                                format: uuid
                                description: UUID de la regla.
                              library_key:
                                type: string
                                nullable: true
                                description: >-
                                  Clau de la biblioteca quan la regla es va
                                  instal·lar des de la biblioteca de regles; en
                                  cas contrari, null.
                              mode:
                                type: string
                                enum:
                                  - ACTIVE
                                  - TEST
                                description: >-
                                  Les regles `TEST` registren la coincidència
                                  però no apliquen cap acció.
                              is_async:
                                type: boolean
                                description: >-
                                  `true` quan la coincidència prové de la
                                  passada asíncrona.
              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: >-
            Com a mínim un element ha estat rebutjat. Els altres elements s'han
            emmagatzemat; corregeix i torna a enviar només els rebutjats (tornar
            a enviar un element acceptat és segur, es retorna com a `replayed`).
          content:
            application/json:
              schema:
                type: object
                required:
                  - accepted_count
                  - replayed_count
                  - rejected_count
                  - results
                properties:
                  accepted_count:
                    type: integer
                    minimum: 0
                    description: Elements emmagatzemats i avaluats.
                  replayed_count:
                    type: integer
                    minimum: 0
                    description: Elements ja emmagatzemats amb el mateix contingut.
                  rejected_count:
                    type: integer
                    minimum: 0
                    description: Elements no emmagatzemats.
                  results:
                    type: array
                    description: Una entrada per element, en l'ordre de la sol·licitud.
                    items:
                      type: object
                      description: >-
                        Resultat d'un element. Els elements acceptats i repetits
                        també inclouen tots els camps de
                        `MonitoringEventIngestResult`; els elements rebutjats
                        inclouen `event_id` i `errors` en el seu lloc.
                      required:
                        - index
                        - outcome
                      properties:
                        index:
                          type: integer
                          minimum: 0
                          description: Posició de l'element al teu array `events`.
                        outcome:
                          type: string
                          enum:
                            - accepted
                            - replayed
                            - rejected
                          description: >-
                            `accepted`: emmagatzemat i avaluat. `replayed`: ja
                            emmagatzemat amb el mateix contingut. `rejected`: no
                            emmagatzemat; consulta `errors`.
                        event_id:
                          type: string
                          nullable: true
                          description: >-
                            El teu `event_id`. En els elements rebutjats per
                            validació es llegeix des de la clau `event_id` en
                            snake_case de l'element, de manera que és null si
                            l'element l'ha omès o ha enviat l'àlies `eventId`.
                        errors:
                          type: object
                          additionalProperties: true
                          description: >-
                            Només elements rebutjats. Errors de validació
                            indexats per camp, amb el mateix format que el `400`
                            de `POST /v3/events/`; un `event_id` reutilitzat amb
                            contingut diferent es notifica com a cadena sota
                            `errors.event_id`.
                        event_uuid:
                          type: string
                          format: uuid
                          description: Només elements acceptats i reproduïts.
                        status:
                          type: string
                          enum:
                            - ACCEPTED
                            - APPROVED
                            - IN_REVIEW
                            - DECLINED
                          description: Només elements acceptats i reproduïts.
                        score:
                          type: integer
                          description: Només elements acceptats i reproduïts.
                        rules_evaluated_count:
                          type: integer
                          description: Només elements acceptats i reproduïts.
                        rules_matched_count:
                          type: integer
                          description: Només elements acceptats i reproduïts.
                        correlation_pending:
                          type: boolean
                          description: Només elements acceptats i reproduïts.
                        retention_class:
                          type: string
                          enum:
                            - low_value
                            - standard
                            - risk_relevant
                            - monetary_or_compliance
                          description: Només elements acceptats i reproduïts.
                        expires_at:
                          type: string
                          format: date-time
                          nullable: true
                          description: Només elements acceptats i reproduïts.
                        idempotent_replay:
                          type: boolean
                          description: Només elements acceptats i reproduïts.
                        rule_matches:
                          type: array
                          description: Només elements acceptats i reproduïts.
                          items:
                            type: object
                            required:
                              - rule_id
                              - library_key
                              - mode
                              - is_async
                            properties:
                              rule_id:
                                type: string
                                format: uuid
                                description: UUID de la regla.
                              library_key:
                                type: string
                                nullable: true
                                description: >-
                                  Clau de la biblioteca quan la regla es va
                                  instal·lar des de la biblioteca de regles; en
                                  cas contrari, null.
                              mode:
                                type: string
                                enum:
                                  - ACTIVE
                                  - TEST
                                description: >-
                                  Les regles `TEST` registren la coincidència
                                  però no apliquen cap acció.
                              is_async:
                                type: boolean
                                description: >-
                                  `true` quan la coincidència prové de la
                                  passada asíncrona.
              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: >-
            El lot està mal format: `events` falta o no és una matriu, està buit
            o té més de 500 elements. No s'emmagatzema res; divideix els lots
            grans.
          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: >-
            La clau d'API amb abast ha caducat. Només una clau caducada rep
            `401`; una clau absent o no vàlida rep `403`.
          content:
            application/json:
              examples:
                Expired key:
                  value:
                    detail: This API key has expired.
        '403':
          description: >-
            Falta la capçalera `x-api-key` (una clau incorrecta, revocada o
            caducada rep un `401`), una clau amb àmbit sense `transactions:
            write`, una clau limitada a determinats fluxos de treball o a
            sessions aprovades (aquesta clau mai no accedeix a dades de
            monitoratge de transaccions), o una sol·licitud des de fora de la
            llista d'adreces IP permeses de la clau. També es retorna amb `code:
            event_monitoring_disabled` mentre la ingesta d'esdeveniments estigui
            desactivada per a l'aplicació; en aquest cas no s'emmagatzema res, i
            la comprovació s'executa abans de validar el cos.
          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: >-
            S'ha superat el límit de freqüència: les creacions de transaccions i
            la ingesta d'esdeveniments (`POST /v3/transactions/`, `POST
            /v3/events/`, `POST /v3/events/batch/`) comparteixen un pressupost
            de 600 sol·licituds per minut per clau d'API, independent de les 300
            que comparteixen la resta de sol·licituds d'escriptura. Espera els
            segons indicats a `Retry-After` i reintenta-ho.
          headers:
            Retry-After:
              description: >-
                Segons d'espera abans de reintentar, arrodonits a l'alça perquè
                el reintent caigui a la finestra següent.
              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: >-
        El sobre de l'esdeveniment, el mateix per a cada categoria. S'accepten
        àlies en camelCase: `eventId`, `eventCategory` (o `category`),
        `actionType`, `occurredAt`, `timeZone` (o `zoneId`), `deviceContext` (o
        `device`), `transactionContext`, `customValues` (o `props`); dins de
        `subject`: `vendorData`, `entityType`, `fullName`; dins de `session`:
        `sessionId`, `pageUrl`; dins de `transaction_context`:
        `paymentReferenceId`.
      required:
        - event_id
        - event_category
        - action_type
        - occurred_at
        - subject
      properties:
        event_id:
          type: string
          maxLength: 128
          description: >-
            El teu identificador per a l'esdeveniment, únic per aplicació. És la
            clau d'idempotència: reenviar els mateixos `event_category`,
            `action_type`, `occurred_at`, `subject.vendor_data` i `payload` amb
            aquest identificador és una repetició; qualsevol diferència és un
            conflicte.
          example: login-2026-10-17-000001
        event_category:
          type: string
          enum:
            - auth
            - session
            - gameplay
            - bonus
            - affiliate
            - payment
            - dispute
            - security
            - responsible_gambling
            - custom
          description: Categoria de l'esdeveniment.
          example: auth
        action_type:
          type: string
          minLength: 1
          maxLength: 128
          description: >-
            Què ha passat dins de la categoria. Vocabulari obert; les accions
            gestionades llistades a [Event
            ingestion](https://docs.didit.me/ca/transaction-monitoring/events)
            (per exemple, `login`, `deposit_completed`, `chargeback_opened`)
            desbloquegen la validació tipada i els camps de regles gestionades.
            S'eliminen els espais en blanc inicials i finals.
          example: login
        occurred_at:
          type: string
          format: date-time
          description: >-
            Quan va ocórrer l'esdeveniment al teu costat, ISO 8601 (un valor
            sense decalatge es llegeix com a UTC). No ha de ser de més de 7 dies
            en el passat ni de més de 5 minuts en el futur.
          example: '2026-10-17T09:15:02.481Z'
        time_zone:
          type: string
          nullable: true
          maxLength: 64
          description: >-
            Zona horària de l'ocurrència al teu costat, per exemple
            `Europe/Madrid`. S'emmagatzema amb l'esdeveniment; no la retornen
            els endpoints de lectura.
        subject:
          type: object
          description: >-
            L'usuari o empresa a qui pertany l'esdeveniment. Es resol en
            l'usuari (o empresa) amb aquest `vendor_data` a la teva aplicació;
            se'n crea un quan no n'hi ha cap.
          required:
            - vendor_data
          properties:
            vendor_data:
              type: string
              minLength: 1
              maxLength: 255
              description: El teu id per al subjecte.
              example: user-42
            entity_type:
              type: string
              maxLength: 32
              default: individual
              description: >-
                `company` resol el subjecte com a empresa; qualsevol altre valor
                (per defecte `individual`) el resol com a particular. El mateix
                `vendor_data` en pot anomenar un de cada.
              example: individual
            full_name:
              type: string
              nullable: true
              maxLength: 512
              description: >-
                Nom visible, utilitzat només quan aquest esdeveniment crea
                l'usuari o l'empresa.
            email:
              type: string
              format: email
              nullable: true
              description: >-
                Validat com a adreça de correu electrònic; no s'emmagatzema a
                l'esdeveniment.
            phone:
              type: string
              nullable: true
              maxLength: 32
              description: Validat; no s'emmagatzema a l'esdeveniment.
            country:
              type: string
              nullable: true
              maxLength: 3
              description: Validat; no s'emmagatzema a l'esdeveniment.
        business:
          type: object
          description: >-
            L'empresa a la qual pertany l'esdeveniment, quan difereix del
            subjecte. Només es llegeix `vendor_data`.
          additionalProperties: true
          properties:
            vendor_data:
              type: string
              maxLength: 255
              description: >-
                El teu id per a l'empresa. Es pot filtrar com a
                `business_vendor_data`.
              example: merchant-7
        session:
          type: object
          description: El context de la teva sessió per a l'esdeveniment.
          properties:
            session_id:
              type: string
              nullable: true
              maxLength: 255
              description: >-
                El teu identificador de sessió. Filtrable i retornat com a
                `session_id`.
            sequence:
              type: integer
              nullable: true
              description: >-
                Posició de l'esdeveniment dins de la sessió. Es retorna com a
                `session_sequence`.
            page_url:
              type: string
              nullable: true
              maxLength: 2048
              description: Validat; no s'emmagatzema a l'esdeveniment.
            referrer:
              type: string
              nullable: true
              maxLength: 2048
              description: Validat; no s'emmagatzema a l'esdeveniment.
        device_context:
          type: object
          additionalProperties: true
          description: >-
            Context del dispositiu i de la xarxa, emmagatzemat tal com s'ha
            enviat i retornat per `GET /v3/events/{event_uuid}/`. En aquesta via
            de servidor Didit no veu la connexió de l'usuari final, de manera
            que l'adreça IP enriquida i utilitzada per les regles és
            `network_context.ip_address` tal com l'envies.
          properties:
            fingerprint:
              type: string
              maxLength: 255
              description: >-
                Petjada digital del dispositiu. Es pot filtrar com a
                `device_fingerprint`.
            persistent_device_id:
              type: string
              maxLength: 255
              description: El teu identificador de dispositiu persistent.
            bot_score:
              type: integer
              description: Puntuació de bot de la teva pròpia detecció, com a enter.
            network_context:
              type: object
              additionalProperties: true
              properties:
                ip_address:
                  type: string
                  maxLength: 64
                  description: >-
                    Adreça IP de l'usuari final. Les adreces públiques
                    s'enriqueixen una vegada per adreça única.
                  example: 203.0.113.42
        transaction_context:
          type: object
          description: >-
            Context monetari. Els valors no buits d'aquí també satisfan les
            claus de payload requerides de l'acció.
          properties:
            amount:
              type: string
              nullable: true
              description: Import com a cadena decimal (també s'accepta un número).
              example: '1000.00'
            currency:
              type: string
              nullable: true
              maxLength: 10
              description: Codi de moneda.
            direction:
              type: string
              nullable: true
              maxLength: 16
              description: >-
                Direcció del moviment de diners, per exemple `inbound` o
                `outbound`.
            payment_reference_id:
              type: string
              nullable: true
              maxLength: 255
              description: >-
                La teva referència de pagament. Filtrable com a
                `payment_reference_id`.
        payload:
          type: object
          additionalProperties: true
          description: >-
            Els camps de domini de la categoria, com a màxim 16384 bytes un cop
            codificats en JSON. Algunes accions requereixen claus (a `payload` o
            `transaction_context`): `gameplay.p2p_settlement` necessita
            `game_id`, `counterparty_vendor_data`, `stake_amount`,
            `net_result_amount`, `role` i un de `hand_id`, `round_id`,
            `match_id`; `gameplay.bet_placed` i `gameplay.bet_settled`
            necessiten `game_id`; `payment.deposit_initiated`,
            `payment.deposit_completed`, `payment.withdrawal_requested` i
            `payment.withdrawal_completed` necessiten `payment_reference_id`,
            `amount`, `currency`, `payment_method`, `status`;
            `payment.withdrawal_address_changed` necessita
            `withdrawal_address_hash`; `dispute.chargeback_opened`,
            `dispute.chargeback_won` i `dispute.chargeback_lost` necessiten
            `payment_reference_id` i un de `dispute_id`, `chargeback_id`;
            `session.bot_signal_observed` necessita `telemetry_schema_version` i
            un de `bot_score`, `actions_per_minute`, `timing_variance_ms`,
            `pointer_entropy`, `keystroke_entropy`, `reaction_time_ms_p50`;
            `responsible_gambling.self_exclusion_match` necessita
            `registry_source`, `exclusion_status`, `identity_match_ref`. Tota
            acció de `security` que acabi en `_changed` necessita
            `changed_field`, a més de `previous_reference_hash` o
            `new_reference_hash` quan el camp és `password`, `mfa_method`,
            `mfa`, `email`, `phone`, `withdrawal_address`, `payout_method` o
            `api_key`. Envia valors hash i referències, mai un número de
            targeta, una adreça de retirada completa, un hash de contrasenya o
            un secret MFA.
        custom_values:
          type: object
          description: >-
            Fins a 100 claus pròpies, accessibles des de les regles com a
            `custom_values.<key>`. Els valors han de ser escalars (string,
            number, boolean o null); es rebutgen els objectes niats i les
            matrius.
          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: >-
        La clau d'API de la teva aplicació, des de Developers -> API keys a la
        Business Console. La clau primària té accés complet. Una clau amb nom
        pot tenir l'abast limitat: cap, lectura o escriptura per recurs,
        limitada a determinats fluxos de treball o a sessions aprovades, a una
        llista d'adreces IP i a una data de caducitat. 401 significa que la clau
        és incorrecta, revocada o caducada; 403 significa que no s'ha enviat cap
        clau, que la clau no té accés a aquest recurs o acció, o que la
        sol·licitud prové d'una adreça fora de la seva llista d'IP; 404 en una
        ruta de sessió significa que la sessió està fora dels fluxos de treball
        o estats de la clau. Una clau sense accés a fitxers multimèdia rep els
        URL d'imatge, vídeo i PDF com a null, i una clau sense permís
        d'escriptura de sessions rep els enllaços de sessió i els tokens com a
        null. Consulta https://docs.didit.me/console/api-keys.

````

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