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

# Monitoring-Event erstellen API

> Mit Didit Login-, Gameplay-, Bonus-, Zahlungs-, Streitfall- oder Sicherheitsereignisse speichern, anreichern und per Regeln bewerten.



API-Prompt für Monitoring-Ereignis erstellen
        Prompt in die Zwischenablage kopieren



      
      

\<pre>

\`Send one non-monetary monitoring event (login, session, gameplay, bonus, affiliate, payment, dispute, security, responsible gambling or custom) from my backend to Didit.

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

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

Goal:
\- Record what happened on my platform so Didit's event rules can score it alongside my transactions, and read the verdict from the response.

Request body (application/json):
\{
"event_id": "login-2026-10-17-000001",   // required - my id, unique per application, the idempotency key (max 128)
"event_category": "auth",                // required - auth, session, gameplay, bonus, affiliate, payment, dispute, security, responsible_gambling, custom
"action_type": "login",                  // required - what happened inside the category (max 128)
"occurred_at": "2026-10-17T09:15:02.481Z", // required - at most 7 days in the past, 5 minutes in the future
"subject": { "vendor_data": "user-42", "entity_type": "individual" }, // required - entity_type individual (default) or company
"session": { "session_id": "web-session-abc", "sequence": 142 },
"device_context": { "fingerprint": "didit-fp-v2:a8c1", "network_context": { "ip_address": "203.0.113.42" } },
"transaction_context": { "amount": "1000.00", "currency": "EUR", "payment_reference_id": "dep_735" },
"payload": { "method": "password" },     // category fields, max 16 KB
"custom_values": { "vip_tier": "gold" }  // max 100 scalar keys
}

Behavior:
\- Validated, stored, IP-enriched and evaluated by the real-time event rules before the response returns. Cross-subject and long-window rules run asynchronously within minutes (correlation_pending: true).
\- Some actions require payload keys, for example gameplay.p2p_settlement (game_id, counterparty_vendor_data, stake_amount, net_result_amount, role, and one of hand_id, round_id, match_id), payment.deposit_completed (payment_reference_id, amount, currency, payment_method, status) and dispute.chargeback_opened (payment_reference_id and one of dispute_id, chargeback_id). transaction_context keys count towards these requirements.
\- Send hashes and references, never a card number, a full withdrawal address, a password hash or an MFA secret.
\- Idempotency: the same event_id with the same event_category, action_type, occurred_at, subject.vendor_data and payload returns 200 with idempotent_replay true and the stored event's result. Different values in those fields return 409; the other fields are not compared. Retry safely on timeouts.
\- The IP address used for enrichment and rules is device_context.network_context.ip_address as you send it.
\- In a sandbox application no rules run: status is ACCEPTED and rules_evaluated_count is 0.
\- The subject resolves to the user (or company) with that vendor_data; one is created when none exists.
\- Event ingestion is opt-in: until it is switched on in Transactions > Settings > Event monitoring, this call returns 403 with code event_monitoring_disabled and stores nothing.

Example call:
curl -X POST "https://verification.didit.me/v3/events/" \
-H "x-api-key: YOUR_API_KEY" -H "Content-Type: application/json" \
-d '{"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"},"device_context":{"network_context":{"ip_address":"203.0.113.42"}},"payload":{"method":"password"}}'

What to read from the response:
\- event_uuid - Didit id of the stored event.
\- status - ACCEPTED (stored, no rule changed it), APPROVED, IN_REVIEW or DECLINED.
\- score, rules_evaluated_count, rules_matched_count, rule_matches[] (rule_id, library_key, mode, is_async).
\- correlation_pending - when true, read GET /v3/events/{event_uuid}/ later for the final status.
\- retention_class and expires_at (null for payment and dispute events).
\- idempotent_replay - true when the event was already stored.

Failure modes:
\- 400 - validation error keyed by field (missing field, occurred_at outside the window, payload over 16 KB, nested custom_values, missing required payload keys).
\- 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.
\- 409 - event_id reused with different content; use a new event_id.
\- 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.

Side effects: stores the event, may create the subject's user or company, and applies the actions of matched active rules (score, status, tags, notes, list entries, cases).

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

\</pre>



      
      

Einfügen in

> [!NOTE]
>
> Die Ereignisaufnahme ist optional. Aktivieren Sie sie unter **Transactions > Settings > Event monitoring**, bevor Sie Ereignisse senden. Bis dahin antwortet dieser Endpoint mit `403` und `"code": "event_monitoring_disabled"`.Die [Ereignisaufnahme](https://docs.didit.me/de/transaction-monitoring/events.md) behandelt den Envelope, die zehn Kategorien, die erforderlichen Payload-Schlüssel und die Aufbewahrungsklassen. [Regeln für Ereignisse](https://docs.didit.me/de/transaction-monitoring/event-rules.md) erklären, welche Regeln direkt in der Anfrage ausgeführt werden und welche asynchron laufen. Um Ereignisse aus einem Browser oder einer App statt aus Ihrem Backend zu senden, verwenden Sie die [SDK-Ereignisübermittlung](https://docs.didit.me/de/transaction-monitoring/sdk-event-submission.md).


## OpenAPI

````yaml de/openapi-25.json POST /v3/events/
openapi: 3.0.0
info:
  version: 3.0.0
  title: Didit Verification API
  description: API für Ausweisverifizierung. Authentifizierung über den x-api-key-Header.
servers:
  - url: https://verification.didit.me
security: []
tags: []
paths:
  /v3/events/:
    post:
      tags:
        - Monitoring Events
      summary: Monitoring-Ereignis erstellen
      description: >-
        Senden Sie ein nicht-monetäres Ereignis (Login, Sitzung, Gameplay,
        Bonus, Affiliate, Zahlung, Streitfall, Sicherheit, verantwortungsvolles
        Spielen oder benutzerdefiniert) von Ihrem Backend. Das Ereignis wird
        anhand seines Kategorievertrags validiert, gespeichert, für jede
        eindeutige öffentliche Adresse einmal mit IP-Daten angereichert und von
        Ihren Echtzeit-Ereignisregeln ausgewertet, bevor die Antwort
        zurückgegeben wird; subjektübergreifende Regeln und Regeln mit langem
        Zeitfenster laufen asynchron (`correlation_pending: true`), und in einer
        Sandbox-Anwendung werden keine Regeln ausgeführt. `event_id` ist der
        Idempotenzschlüssel: dieselbe `event_id` mit derselben `event_category`,
        demselben `action_type`, `occurred_at`, `subject.vendor_data` und
        `payload` gibt `200` mit `idempotent_replay: true` und dem gespeicherten
        Ergebnis zurück (andere Envelope-Felder werden nicht verglichen),
        während abweichende Werte `409` zurückgeben. Die Ereigniserfassung ist
        pro Anwendung optional (Opt-in): Bis sie aktiviert wird, gibt dieser
        Endpoint `403` mit `code: event_monitoring_disabled` zurück und
        speichert nichts. Ein bereichsbezogener API-Schlüssel erfordert
        `transactions: write`. Siehe
        [Ereigniserfassung](https://docs.didit.me/de/transaction-monitoring/events)
        und [Regeln für
        Ereignisse](https://docs.didit.me/de/transaction-monitoring/event-rules);
        um Ereignisse über einen Browser oder eine App zu senden, nutzen Sie die
        [SDK-Ereignisübermittlung](https://docs.didit.me/de/transaction-monitoring/sdk-event-submission).
      operationId: create_monitoring_event
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/MonitoringEventCreateRequest'
            examples:
              Login:
                value:
                  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
              Deposit completed:
                value:
                  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
                    direction: inbound
                    payment_reference_id: dep_736
                  payload:
                    payment_method: card
                    status: completed
              Chargeback opened:
                value:
                  event_id: chargeback-2026-10-16-000318
                  event_category: dispute
                  action_type: chargeback_opened
                  occurred_at: '2026-10-16T14:02:11Z'
                  subject:
                    vendor_data: user-42
                  payload:
                    payment_reference_id: dep_735
                    chargeback_id: cb_5521
                    amount: '250.00'
                    currency: EUR
                    reason_code: fraud
      responses:
        '200':
          description: >-
            Idempotente Wiederholung: Ein Ereignis mit dieser `event_id` und
            demselben Inhalt ist bereits gespeichert. Es wurde nichts erneut
            gespeichert oder ausgewertet; der Body beschreibt das gespeicherte
            Ereignis.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MonitoringEventIngestResult'
              examples:
                Replay:
                  value:
                    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: true
                    rule_matches: []
        '201':
          description: Das Ereignis wurde gespeichert und ausgewertet.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MonitoringEventIngestResult'
              examples:
                Stored, no rule matched:
                  value:
                    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: []
                Rule matched, async rule pending:
                  value:
                    event_uuid: 33333333-4444-5555-6666-777777777777
                    event_id: login-2026-10-17-000001
                    status: IN_REVIEW
                    score: 40
                    rules_evaluated_count: 6
                    rules_matched_count: 1
                    correlation_pending: true
                    retention_class: risk_relevant
                    expires_at: '2027-01-15T09:15:02.481000Z'
                    idempotent_replay: false
                    rule_matches:
                      - rule_id: aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee
                        library_key: null
                        mode: ACTIVE
                        is_async: false
        '400':
          description: >-
            Validierung fehlgeschlagen. Der Body ist nach Feldern
            aufgeschlüsselt; verschachtelte Felder sind verschachtelte Objekte.
            Es wird nichts gespeichert.
          content:
            application/json:
              examples:
                Missing fields:
                  value:
                    event_id:
                      - This field is required.
                    subject:
                      - This field is required.
                Unknown category:
                  value:
                    event_category:
                      - '"login" is not a valid choice.'
                occurred_at too old:
                  value:
                    occurred_at:
                      - >-
                        occurred_at is more than 7 days in the past. Use the
                        batch import lane for backfills.
                occurred_at in the future:
                  value:
                    occurred_at:
                      - occurred_at is more than 5 minutes in the future.
                Missing subject vendor_data:
                  value:
                    subject:
                      vendor_data:
                        - This field is required.
                Missing required payload keys:
                  value:
                    payload:
                      - >-
                        payment.deposit_completed requires: payment_method,
                        status.
                Missing one-of payload key:
                  value:
                    payload:
                      - >-
                        dispute.chargeback_opened requires one of: dispute_id,
                        chargeback_id.
                Security change without changed_field:
                  value:
                    payload:
                      - security.*_changed requires 'changed_field'.
                Payload too large:
                  value:
                    payload:
                      - >-
                        payload exceeds 16384 bytes. Summarise telemetry
                        client-side.
                Too many custom_values:
                  value:
                    custom_values:
                      - custom_values accepts at most 100 keys.
                Nested custom value:
                  value:
                    custom_values:
                      - >-
                        custom_values['limits'] must be a scalar - rule
                        conditions cannot address nested values.
        '401':
          description: >-
            Der API-Schlüssel mit eingeschränktem Geltungsbereich ist
            abgelaufen. Nur ein abgelaufener Schlüssel erhält `401`; ein
            fehlender oder ungültiger Schlüssel erhält `403`.
          content:
            application/json:
              examples:
                Expired key:
                  value:
                    detail: This API key has expired.
        '403':
          description: >-
            Ein fehlender `x-api-key` (ein falscher, widerrufener oder
            abgelaufener Schlüssel erhält `401`), ein berechtigungsbeschränkter
            Schlüssel ohne `transactions: write`, ein auf bestimmte Workflows
            oder genehmigte Sitzungen beschränkter Schlüssel (ein solcher
            Schlüssel erreicht Transaktionsüberwachungsdaten nie) oder eine
            Anfrage von außerhalb der IP-Allowlist des Schlüssels. Wird auch mit
            `code: event_monitoring_disabled` zurückgegeben, solange die
            Ereigniserfassung für die Anwendung deaktiviert ist; in diesem Fall
            wird nichts gespeichert, und die Prüfung erfolgt vor der Validierung
            des Bodys.
          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.
        '409':
          description: >-
            `event_id` wurde bereits für ein Ereignis mit anderem Inhalt
            verwendet (Kategorie, Aktionstyp, `occurred_at`, `vendor_data` des
            Subjekts oder Payload). Senden Sie das Ereignis unter einer neuen
            `event_id`.
          content:
            application/json:
              examples:
                event_id reused:
                  value:
                    event_id: >-
                      event_id 'login-2026-10-17-000001' already exists with a
                      different payload.
        '429':
          description: >-
            Rate-Limit überschritten: Transaktionserstellungen und
            Ereignis-Ingestion (`POST /v3/transactions/`, `POST /v3/events/`,
            `POST /v3/events/batch/`) teilen sich ein Kontingent von 600
            Anfragen pro Minute pro API-Schlüssel, getrennt von den 300, die
            sich alle anderen Schreibanfragen teilen. Warten Sie `Retry-After`
            Sekunden und versuchen Sie es dann erneut.
          headers:
            Retry-After:
              description: >-
                Anzahl der Sekunden, die vor einem Wiederholungsversuch gewartet
                werden muss, aufgerundet, damit der Wiederholungsversuch im
                nächsten Zeitfenster liegt.
              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/' \
              -H 'x-api-key: YOUR_API_KEY' \
              -H 'Content-Type: application/json' \
              -d '{
                "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", "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"}
              }'
        - lang: python
          label: Python
          source: |-
            from didit import Didit

            # Reads DIDIT_API_KEY.
            client = Didit()

            result = client.monitoring_events.create(
                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"},
            )
            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.create({
              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" },
            });
            console.log(result);
        - lang: go
          label: Go
          source: "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.MonitoringEvents.Create(ctx, didit.MonitoringEventCreateRequest{\n\tEventID:       \"login-2026-10-17-000001\",\n\tEventCategory: \"auth\",\n\tActionType:    \"login\",\n\tOccurredAt:    time.Date(2026, 10, 17, 9, 15, 2, 0, time.UTC),\n\tTimeZone:      didit.String(\"Europe/Madrid\"),\n\tSubject: didit.MonitoringEventCreateRequestSubject{\n\t\tVendorData: \"user-42\",\n\t\tEntityType: didit.String(\"individual\"),\n\t},\n\tSession: didit.Some(didit.MonitoringEventCreateRequestSession{\n\t\tSessionID: didit.String(\"web-session-abc\"),\n\t\tSequence:  didit.Int(142),\n\t}),\n\tDeviceContext: didit.Some(didit.MonitoringEventCreateRequestDeviceContext{\n\t\tFingerprint: didit.String(\"fp-a8c1\"),\n\t\tNetworkContext: didit.Some(didit.MonitoringEventCreateRequestDeviceContextNetworkContext{\n\t\t\tIPAddress: didit.String(\"203.0.113.42\"),\n\t\t}),\n\t}),\n\tPayload:      didit.Some(map[string]any{\"method\": \"password\"}),\n\tCustomValues: didit.Some(map[string]any{\"vip_tier\": \"gold\"}),\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.Map;

            import me.didit.Didit;

            import me.didit.types.MonitoringEventCreateRequest;


            // Reads DIDIT_API_KEY.

            Didit client = new Didit();


            var result =
            client.monitoringEvents().create(MonitoringEventCreateRequest.builder()
                    .eventId("login-2026-10-17-000001")
                    .eventCategory(MonitoringEventCreateRequest.EventCategory.of("auth"))
                    .actionType("login")
                    .occurredAt(OffsetDateTime.parse("2026-10-17T09:15:02.481Z"))
                    .timeZone("Europe/Madrid")
                    .subject(MonitoringEventCreateRequest.Subject.builder()
                            .vendorData("user-42")
                            .entityType("individual")
                            .build())
                    .session(MonitoringEventCreateRequest.Session.builder()
                            .sessionId("web-session-abc")
                            .sequence(142L)
                            .build())
                    .deviceContext(MonitoringEventCreateRequest.DeviceContext.builder()
                            .fingerprint("fp-a8c1")
                            .networkContext(MonitoringEventCreateRequest.DeviceContext.NetworkContext.builder()
                                    .ipAddress("203.0.113.42")
                                    .build())
                            .build())
                    .payload(Map.of("method", "password"))
                    .customValues(Map.of("vip_tier", MonitoringEventCreateRequest.CustomValuesValue.ofString("gold")))
                    .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->create([
                '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'],
            ]);
            print_r($result->toArray());
        - lang: ruby
          label: Ruby
          source: |-
            require "didit"

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

            result = didit.monitoring_events.create(
              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" }
            )
            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.CreateAsync(new
            MonitoringEventCreateRequest

            {
                EventId = "login-2026-10-17-000001",
                EventCategory = "auth",
                ActionType = "login",
                OccurredAt = DateTimeOffset.Parse("2026-10-17T09:15:02.481Z"),
                TimeZone = "Europe/Madrid",
                Subject = new()
                {
                    VendorData = "user-42",
                    EntityType = "individual",
                },
                Session = new MonitoringEventCreateRequestSession
                {
                    SessionId = "web-session-abc",
                    Sequence = 142,
                },
                DeviceContext = new MonitoringEventCreateRequestDeviceContext
                {
                    Fingerprint = "fp-a8c1",
                    NetworkContext = new MonitoringEventCreateRequestDeviceContextNetworkContext
                    {
                        IpAddress = "203.0.113.42",
                    },
                },
                Payload = new Dictionary<string, object> { ["method"] = "password" },
                CustomValues = new Dictionary<string, object> { ["vip_tier"] = "gold" },
            });

            Console.WriteLine(JsonSerializer.Serialize(result));
components:
  schemas:
    MonitoringEventCreateRequest:
      type: object
      description: >-
        Der Event-Envelope, identisch für jede Kategorie. camelCase-Aliase
        werden akzeptiert: `eventId`, `eventCategory` (oder `category`),
        `actionType`, `occurredAt`, `timeZone` (oder `zoneId`), `deviceContext`
        (oder `device`), `transactionContext`, `customValues` (oder `props`);
        innerhalb von `subject`: `vendorData`, `entityType`, `fullName`;
        innerhalb von `session`: `sessionId`, `pageUrl`; innerhalb von
        `transaction_context`: `paymentReferenceId`.
      required:
        - event_id
        - event_category
        - action_type
        - occurred_at
        - subject
      properties:
        event_id:
          type: string
          maxLength: 128
          description: >-
            Ihre Kennung für das Ereignis, eindeutig pro Anwendung. Sie ist der
            Idempotenzschlüssel: Das erneute Senden derselben Werte für
            `event_category`, `action_type`, `occurred_at`,
            `subject.vendor_data` und `payload` unter dieser Kennung ist eine
            Wiederholung, jede Abweichung ist ein Konflikt.
          example: login-2026-10-17-000001
        event_category:
          type: string
          enum:
            - auth
            - session
            - gameplay
            - bonus
            - affiliate
            - payment
            - dispute
            - security
            - responsible_gambling
            - custom
          description: Ereigniskategorie.
          example: auth
        action_type:
          type: string
          minLength: 1
          maxLength: 128
          description: >-
            Was innerhalb der Kategorie passiert ist. Offenes Vokabular; die in
            [Ereigniserfassung](https://docs.didit.me/de/transaction-monitoring/events)
            aufgeführten verwalteten Aktionen (beispielsweise `login`,
            `deposit_completed`, `chargeback_opened`) schalten eine typisierte
            Validierung und verwaltete Regelfelder frei. Führende und
            nachfolgende Leerzeichen werden gekürzt.
          example: login
        occurred_at:
          type: string
          format: date-time
          description: >-
            Wann das Ereignis auf Ihrer Seite stattgefunden hat, ISO 8601 (ein
            Wert ohne Offset wird als UTC interpretiert). Darf nicht mehr als 7
            Tage in der Vergangenheit und nicht mehr als 5 Minuten in der
            Zukunft liegen.
          example: '2026-10-17T09:15:02.481Z'
        time_zone:
          type: string
          nullable: true
          maxLength: 64
          description: >-
            Zeitzone des Ereignisses auf Ihrer Seite, zum Beispiel
            `Europe/Madrid`. Wird mit dem Ereignis gespeichert; wird von den
            Lese-Endpoints nicht zurückgegeben.
        subject:
          type: object
          description: >-
            Der Benutzer oder das Unternehmen, zu dem das Ereignis gehört. Es
            verweist auf den Benutzer (oder das Unternehmen) mit diesen
            `vendor_data` in Ihrer Anwendung; falls keines vorhanden ist, wird
            eines erstellt.
          required:
            - vendor_data
          properties:
            vendor_data:
              type: string
              minLength: 1
              maxLength: 255
              description: Ihre ID für das Subjekt.
              example: user-42
            entity_type:
              type: string
              maxLength: 32
              default: individual
              description: >-
                `company` löst das Subjekt zu einem Unternehmen auf; jeder
                andere Wert (Standard `individual`) löst es zu einer
                Einzelperson auf. Dasselbe `vendor_data` kann jeweils ein
                Unternehmen und eine Einzelperson benennen.
              example: individual
            full_name:
              type: string
              nullable: true
              maxLength: 512
              description: >-
                Anzeigename, der nur verwendet wird, wenn dieses Ereignis den
                Benutzer oder das Unternehmen erstellt.
            email:
              type: string
              format: email
              nullable: true
              description: >-
                Als E-Mail-Adresse validiert; wird nicht im Ereignis
                gespeichert.
            phone:
              type: string
              nullable: true
              maxLength: 32
              description: Validiert; wird nicht im Ereignis gespeichert.
            country:
              type: string
              nullable: true
              maxLength: 3
              description: Validiert; wird nicht im Ereignis gespeichert.
        business:
          type: object
          description: >-
            Das Unternehmen, zu dem das Ereignis gehört, sofern es sich vom
            Subjekt unterscheidet. Es wird nur `vendor_data` gelesen.
          additionalProperties: true
          properties:
            vendor_data:
              type: string
              maxLength: 255
              description: >-
                Ihre ID für das Unternehmen. Filterbar als
                `business_vendor_data`.
              example: merchant-7
        session:
          type: object
          description: Ihr Sitzungskontext für das Ereignis.
          properties:
            session_id:
              type: string
              nullable: true
              maxLength: 255
              description: >-
                Ihre Sitzungskennung. Filterbar und als `session_id`
                zurückgegeben.
            sequence:
              type: integer
              nullable: true
              description: >-
                Position des Ereignisses innerhalb der Sitzung. Wird als
                `session_sequence` zurückgegeben.
            page_url:
              type: string
              nullable: true
              maxLength: 2048
              description: Validiert; wird nicht im Ereignis gespeichert.
            referrer:
              type: string
              nullable: true
              maxLength: 2048
              description: Validiert; wird nicht im Ereignis gespeichert.
        device_context:
          type: object
          additionalProperties: true
          description: >-
            Geräte- und Netzwerkkontext, wird so gespeichert, wie er gesendet
            wird, und von `GET /v3/events/{event_uuid}/` zurückgegeben. Auf
            dieser Serverstrecke sieht Didit die Verbindung des Endbenutzers
            nicht, daher ist die IP, die angereichert und von Regeln verwendet
            wird, `network_context.ip_address`, wie Sie sie übermitteln.
          properties:
            fingerprint:
              type: string
              maxLength: 255
              description: Geräte-Fingerprint. Filterbar als `device_fingerprint`.
            persistent_device_id:
              type: string
              maxLength: 255
              description: Ihre persistente Gerätekennung.
            bot_score:
              type: integer
              description: Bot-Score aus Ihrer eigenen Erkennung als Ganzzahl.
            network_context:
              type: object
              additionalProperties: true
              properties:
                ip_address:
                  type: string
                  maxLength: 64
                  description: >-
                    Adresse des Endbenutzers. Öffentliche Adressen werden einmal
                    pro eindeutiger Adresse angereichert.
                  example: 203.0.113.42
        transaction_context:
          type: object
          description: >-
            Finanzkontext. Nicht leere Werte hier erfüllen auch die
            erforderlichen Payload-Schlüssel der Aktion.
          properties:
            amount:
              type: string
              nullable: true
              description: Betrag als Dezimal-String (eine Zahl wird ebenfalls akzeptiert).
              example: '1000.00'
            currency:
              type: string
              nullable: true
              maxLength: 10
              description: Währungscode.
            direction:
              type: string
              nullable: true
              maxLength: 16
              description: >-
                Richtung der Geldbewegung, zum Beispiel `inbound` oder
                `outbound`.
            payment_reference_id:
              type: string
              nullable: true
              maxLength: 255
              description: Ihre Zahlungsreferenz. Filterbar als `payment_reference_id`.
        payload:
          type: object
          additionalProperties: true
          description: >-
            Die Domänenfelder der Kategorie, nach der JSON-Codierung maximal
            16384 Bytes groß. Einige Aktionen erfordern Schlüssel (in `payload`
            oder `transaction_context`): `gameplay.p2p_settlement` erfordert
            `game_id`, `counterparty_vendor_data`, `stake_amount`,
            `net_result_amount`, `role` und eines von `hand_id`, `round_id`,
            `match_id`; `gameplay.bet_placed` und `gameplay.bet_settled`
            erfordern `game_id`; `payment.deposit_initiated`,
            `payment.deposit_completed`, `payment.withdrawal_requested` und
            `payment.withdrawal_completed` erfordern `payment_reference_id`,
            `amount`, `currency`, `payment_method`, `status`;
            `payment.withdrawal_address_changed` erfordert
            `withdrawal_address_hash`; `dispute.chargeback_opened`,
            `dispute.chargeback_won` und `dispute.chargeback_lost` erfordern
            `payment_reference_id` und eines von `dispute_id`, `chargeback_id`;
            `session.bot_signal_observed` erfordert `telemetry_schema_version`
            und eines von `bot_score`, `actions_per_minute`,
            `timing_variance_ms`, `pointer_entropy`, `keystroke_entropy`,
            `reaction_time_ms_p50`; `responsible_gambling.self_exclusion_match`
            erfordert `registry_source`, `exclusion_status`,
            `identity_match_ref`. Jede `security`-Aktion, die auf `_changed`
            endet, erfordert `changed_field` sowie `previous_reference_hash`
            oder `new_reference_hash`, wenn das Feld `password`, `mfa_method`,
            `mfa`, `email`, `phone`, `withdrawal_address`, `payout_method` oder
            `api_key` ist. Senden Sie Hashes und Referenzen, niemals eine
            Kartennummer, eine vollständige Auszahlungsadresse, einen
            Passwort-Hash oder ein MFA-Geheimnis.
        custom_values:
          type: object
          description: >-
            Bis zu 100 eigene Schlüssel, die aus Regeln als
            `custom_values.<key>` adressierbar sind. Werte müssen Skalare sein
            (Zeichenfolge, Zahl, boolescher Wert oder null); verschachtelte
            Objekte und Arrays werden abgelehnt.
          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
    MonitoringEventIngestResult:
      type: object
      description: >-
        Ergebnis der Erfassung eines Ereignisses. Für ein neues Ereignis und
        eine idempotente Wiederholung wird dieselbe Struktur zurückgegeben.
      required:
        - event_uuid
        - event_id
        - status
        - score
        - rules_evaluated_count
        - rules_matched_count
        - correlation_pending
        - retention_class
        - expires_at
        - idempotent_replay
        - rule_matches
      properties:
        event_uuid:
          type: string
          format: uuid
          description: Didit-Kennung des gespeicherten Ereignisses.
        event_id:
          type: string
          description: Ihre `event_id`.
        status:
          type: string
          enum:
            - ACCEPTED
            - APPROVED
            - IN_REVIEW
            - DECLINED
          description: >-
            Status nach Ausführung der Echtzeitregeln. Siehe
            `MonitoringEvent.status`.
        score:
          type: integer
          description: Score nach Ausführung der Echtzeitregeln.
        rules_evaluated_count:
          type: integer
          minimum: 0
          description: >-
            Anzahl der in der Anfrage ausgewerteten Ereignisregeln. 0 in einer
            Sandbox-Anwendung, in der keine Regeln ausgeführt werden.
        rules_matched_count:
          type: integer
          minimum: 0
          description: >-
            Anzahl der zutreffenden Regeln, einschließlich Regeln im
            `TEST`-Modus.
        correlation_pending:
          type: boolean
          description: >-
            `true`, wenn eine asynchrone Regel noch ausgeführt werden muss.
            Rufen Sie einige Minuten später `GET /v3/events/{event_uuid}/` auf,
            um den endgültigen `status` und `score` zu erhalten.
        retention_class:
          type: string
          enum:
            - low_value
            - standard
            - risk_relevant
            - monetary_or_compliance
          description: >-
            Aufbewahrungsklasse nach einer Hochstufung durch eine zutreffende
            Regel.
        expires_at:
          type: string
          format: date-time
          nullable: true
          description: >-
            Wann das Ereignis gemäß seiner Aufbewahrungsklasse abläuft und
            gelöscht wird. Null für `monetary_or_compliance`-Ereignisse
            (Zahlungen und Streitfälle).
        idempotent_replay:
          type: boolean
          description: >-
            `true`, wenn ein Ereignis mit dieser `event_id` und demselben Inhalt
            bereits gespeichert war; die Werte entsprechen denen des
            gespeicherten Ereignisses und es wurde keine Regel erneut
            ausgeführt.
        rule_matches:
          type: array
          description: Regeln, die auf das Ereignis zutrafen.
          items:
            type: object
            required:
              - rule_id
              - library_key
              - mode
              - is_async
            properties:
              rule_id:
                type: string
                format: uuid
                description: UUID der Regel.
              library_key:
                type: string
                nullable: true
                description: >-
                  Bibliotheksschlüssel, wenn die Regel aus der Regelbibliothek
                  installiert wurde, andernfalls null.
              mode:
                type: string
                enum:
                  - ACTIVE
                  - TEST
                description: >-
                  `TEST`-Regeln erfassen die Übereinstimmung, wenden aber keine
                  Aktionen an.
              is_async:
                type: boolean
                description: >-
                  `true`, wenn die Übereinstimmung aus dem asynchronen Durchlauf
                  stammt.
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: x-api-key
      description: >-
        Der API-Schlüssel Ihrer Anwendung, aus Entwickler -> API-Schlüssel in
        der Business Console. Der Primärschlüssel hat Vollzugriff. Ein benannter
        Schlüssel kann im Geltungsbereich eingeschränkt werden: keine, Lese-
        oder Schreibberechtigung pro Ressource, beschränkt auf bestimmte
        Workflows oder genehmigte Sitzungen, auf eine Liste von IP-Adressen und
        auf ein Ablaufdatum. 401 bedeutet, dass der Schlüssel falsch, widerrufen
        oder abgelaufen ist; 403 bedeutet, dass kein Schlüssel gesendet wurde,
        der Schlüssel keinen Zugriff auf diese Ressource oder Aktion hat oder
        die Anfrage von einer Adresse außerhalb seiner IP-Liste stammte; 404 bei
        einer Sitzungsroute bedeutet, dass die Sitzung außerhalb der Workflows
        oder Status des Schlüssels liegt. Ein Schlüssel ohne Medienzugriff
        erhält Bild-, Video- und PDF-URLs als null, und ein Schlüssel ohne
        Schreibberechtigung für Sitzungen erhält Sitzungslinks und Token als
        null. Siehe https://docs.didit.me/console/api-keys.

````

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