> ## 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 para Criar Evento de Monitorização

> Envie um evento de login, jogo, bónus, pagamento, disputa ou segurança do seu backend para a Didit armazenar, enriquecer e avaliar com as suas regras.



Prompt da API para criar evento de monitorização
        Copiar o prompt para a área de transferência



      
      

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



      
      

Colar em

> [!NOTE]
>
> A ingestão de eventos é opcional. Ative-a em **Transactions > Settings > Event monitoring** antes de enviar eventos; até lá, este endpoint responde com `403` e `"code": "event_monitoring_disabled"`.[Ingestão de eventos](https://docs.didit.me/pt/transaction-monitoring/events.md) aborda o envelope, as dez categorias, as chaves obrigatórias do payload e as classes de conservação. [Regras sobre eventos](https://docs.didit.me/pt/transaction-monitoring/event-rules.md) explica quais as regras executadas no pedido e quais as executadas de forma assíncrona. Para enviar eventos a partir de um navegador ou de uma aplicação, em vez do seu sistema de back-end, use o [envio de eventos pelo SDK](https://docs.didit.me/pt/transaction-monitoring/sdk-event-submission.md).


## OpenAPI

````yaml pt/openapi-25.json POST /v3/events/
openapi: 3.0.0
info:
  version: 3.0.0
  title: Didit Verification API
  description: API de Verificação de identidade. Autentique-se com o cabeçalho x-api-key.
servers:
  - url: https://verification.didit.me
security: []
tags: []
paths:
  /v3/events/:
    post:
      tags:
        - Monitoring Events
      summary: Criar evento de monitorização
      description: >-
        Envie um evento não monetário (início de sessão, sessão, jogabilidade,
        bónus, afiliado, pagamento, litígio, segurança, jogo responsável ou
        personalizado) a partir do seu backend. O evento é validado contra o
        contrato da sua categoria, armazenado, enriquecido com dados de IP uma
        vez por endereço público exclusivo e avaliado pelas suas regras de
        eventos em tempo real antes de a resposta ser devolvida; regras entre
        sujeitos e com janelas temporais alargadas são executadas de forma
        assíncrona (`correlation_pending: true`), e numa aplicação de sandbox
        nenhuma regra é executada. `event_id` é a chave de idempotência: o mesmo
        `event_id` com o mesmo `event_category`, `action_type`, `occurred_at`,
        `subject.vendor_data` e `payload` devolve `200` com `idempotent_replay:
        true` e o resultado guardado (outros campos do envelope não são
        comparados), enquanto valores diferentes devolvem `409`. A ingestão de
        eventos é opcional por aplicação: até ser ativada, este endpoint devolve
        `403` com `code: event_monitoring_disabled` e não guarda nada. Uma chave
        de API com âmbito necessita de `transactions: write`. Consulte [Ingestão
        de eventos](https://docs.didit.me/pt/transaction-monitoring/events) e
        [Regras sobre
        eventos](https://docs.didit.me/pt/transaction-monitoring/event-rules);
        para enviar eventos a partir de um navegador ou aplicação, utilize
        [Submissão de eventos do
        SDK](https://docs.didit.me/pt/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: >-
            Reexecução idempotente: já se encontra armazenado um evento com este
            `event_id` e o mesmo conteúdo. Nada foi armazenado ou avaliado
            novamente; o corpo descreve o evento armazenado.
          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: O evento foi armazenado e avaliado.
          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: >-
            A validação falhou. O corpo é indexado por campo; os campos
            aninhados são objetos aninhados. Nada é guardado.
          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: >-
            A chave de API com âmbito expirou. Apenas uma chave expirada recebe
            `401`; uma chave em falta ou inválida recebe `403`.
          content:
            application/json:
              examples:
                Expired key:
                  value:
                    detail: This API key has expired.
        '403':
          description: >-
            Um `x-api-key` em falta (uma chave incorreta, revogada ou expirada
            obtém `401`), uma chave com âmbito restrito sem `transactions:
            write`, uma chave limitada a alguns fluxos ou a sessões aprovadas
            (tal chave nunca acede a dados de monitorização de transações), ou
            um pedido fora da lista de permissões de IP da chave. Também
            devolvido com `code: event_monitoring_disabled` enquanto a ingestão
            de eventos estiver desativada para a aplicação; nada é armazenado
            nesse caso, e a verificação é executada antes da validação do corpo.
          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` já foi utilizado para um evento com conteúdo diferente
            (categoria, tipo de ação, `occurred_at`, `vendor_data` do sujeito ou
            payload). Envie o evento com um novo `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: >-
            Limite de pedidos excedido: a criação de transações e a ingestão de
            eventos (`POST /v3/transactions/`, `POST /v3/events/`, `POST
            /v3/events/batch/`) partilham um orçamento de 600 pedidos por minuto
            por chave de API, separado dos 300 partilhados por todos os outros
            pedidos de escrita. Aguarde `Retry-After` segundos e, em seguida,
            tente novamente.
          headers:
            Retry-After:
              description: >-
                Segundos a aguardar antes de tentar novamente, arredondados para
                cima para que a nova tentativa ocorra na janela seguinte.
              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: >-
        O envelope do evento, igual para todas as categorias. São aceites
        aliases em camelCase: `eventId`, `eventCategory` (ou `category`),
        `actionType`, `occurredAt`, `timeZone` (ou `zoneId`), `deviceContext`
        (ou `device`), `transactionContext`, `customValues` (ou `props`); dentro
        de `subject`: `vendorData`, `entityType`, `fullName`; dentro de
        `session`: `sessionId`, `pageUrl`; dentro de `transaction_context`:
        `paymentReferenceId`.
      required:
        - event_id
        - event_category
        - action_type
        - occurred_at
        - subject
      properties:
        event_id:
          type: string
          maxLength: 128
          description: >-
            O seu identificador para o evento, único por aplicação. É a chave de
            idempotência: reenviar os mesmos `event_category`, `action_type`,
            `occurred_at`, `subject.vendor_data` e `payload` sob este
            identificador é uma repetição; qualquer alteração constitui um
            conflito.
          example: login-2026-10-17-000001
        event_category:
          type: string
          enum:
            - auth
            - session
            - gameplay
            - bonus
            - affiliate
            - payment
            - dispute
            - security
            - responsible_gambling
            - custom
          description: Categoria do evento.
          example: auth
        action_type:
          type: string
          minLength: 1
          maxLength: 128
          description: >-
            O que aconteceu dentro da categoria. Vocabulário aberto; as ações
            geridas listadas em [Ingestão de
            eventos](https://docs.didit.me/pt/transaction-monitoring/events)
            (por exemplo `login`, `deposit_completed`, `chargeback_opened`)
            desbloqueiam a validação tipada e campos de regras geridos. Os
            espaços em branco no início e no final são removidos.
          example: login
        occurred_at:
          type: string
          format: date-time
          description: >-
            Quando o evento aconteceu do seu lado, ISO 8601 (um valor sem fuso
            horário é interpretado como UTC). Não deve ter mais de 7 dias no
            passado nem mais de 5 minutos no futuro.
          example: '2026-10-17T09:15:02.481Z'
        time_zone:
          type: string
          nullable: true
          maxLength: 64
          description: >-
            Fuso horário da ocorrência do seu lado, por exemplo `Europe/Madrid`.
            Armazenado com o evento; não é devolvido pelos endpoints de leitura.
        subject:
          type: object
          description: >-
            O utilizador ou empresa a quem o evento pertence. É resolvido para o
            utilizador (ou empresa) com este `vendor_data` na sua aplicação; é
            criado um novo registo se não existir nenhum.
          required:
            - vendor_data
          properties:
            vendor_data:
              type: string
              minLength: 1
              maxLength: 255
              description: O seu id para o sujeito.
              example: user-42
            entity_type:
              type: string
              maxLength: 32
              default: individual
              description: >-
                `company` associa o sujeito a uma empresa; qualquer outro valor
                (por predefinição `individual`) associa-o a um indivíduo. O
                mesmo `vendor_data` pode indicar um de cada.
              example: individual
            full_name:
              type: string
              nullable: true
              maxLength: 512
              description: >-
                Nome de apresentação, utilizado apenas quando este evento cria o
                utilizador ou a empresa.
            email:
              type: string
              format: email
              nullable: true
              description: Validado como um endereço de e-mail; não armazenado no evento.
            phone:
              type: string
              nullable: true
              maxLength: 32
              description: Validado; não armazenado no evento.
            country:
              type: string
              nullable: true
              maxLength: 3
              description: Validado; não armazenado no evento.
        business:
          type: object
          description: >-
            A empresa à qual o evento pertence, quando difere do sujeito. Apenas
            `vendor_data` é lido.
          additionalProperties: true
          properties:
            vendor_data:
              type: string
              maxLength: 255
              description: O seu id para a empresa. Filtrável como `business_vendor_data`.
              example: merchant-7
        session:
          type: object
          description: O seu contexto de sessão para o evento.
          properties:
            session_id:
              type: string
              nullable: true
              maxLength: 255
              description: >-
                O seu identificador de sessão. Filtrável e devolvido como
                `session_id`.
            sequence:
              type: integer
              nullable: true
              description: >-
                Posição do evento dentro da sessão. Devolvida como
                `session_sequence`.
            page_url:
              type: string
              nullable: true
              maxLength: 2048
              description: Validado; não armazenado no evento.
            referrer:
              type: string
              nullable: true
              maxLength: 2048
              description: Validado; não armazenado no evento.
        device_context:
          type: object
          additionalProperties: true
          description: >-
            Contexto de dispositivo e rede, armazenado tal como enviado e
            devolvido por `GET /v3/events/{event_uuid}/`. Nesta camada do
            servidor, a Didit não vê a ligação do utilizador final, pelo que o
            IP enriquecido e utilizado pelas regras é
            `network_context.ip_address` tal como o enviar.
          properties:
            fingerprint:
              type: string
              maxLength: 255
              description: >-
                Impressão digital do dispositivo. Filtrável como
                `device_fingerprint`.
            persistent_device_id:
              type: string
              maxLength: 255
              description: O seu identificador persistente de dispositivo.
            bot_score:
              type: integer
              description: Pontuação de bot da sua própria deteção, como um número inteiro.
            network_context:
              type: object
              additionalProperties: true
              properties:
                ip_address:
                  type: string
                  maxLength: 64
                  description: >-
                    Endereço IP do utilizador final. Os endereços públicos são
                    enriquecidos uma vez por endereço exclusivo.
                  example: 203.0.113.42
        transaction_context:
          type: object
          description: >-
            Contexto monetário. Valores não vazios aqui também satisfazem as
            chaves de payload obrigatórias da ação.
          properties:
            amount:
              type: string
              nullable: true
              description: Montante como uma string decimal (também é aceite um número).
              example: '1000.00'
            currency:
              type: string
              nullable: true
              maxLength: 10
              description: Código de moeda.
            direction:
              type: string
              nullable: true
              maxLength: 16
              description: >-
                Direção do movimento de dinheiro, por exemplo `inbound` ou
                `outbound`.
            payment_reference_id:
              type: string
              nullable: true
              maxLength: 255
              description: >-
                A sua referência de pagamento. Filtrável como
                `payment_reference_id`.
        payload:
          type: object
          additionalProperties: true
          description: >-
            Os campos de domínio da categoria, no máximo 16384 bytes após
            codificação JSON. Algumas ações exigem chaves (em `payload` ou
            `transaction_context`): `gameplay.p2p_settlement` requer `game_id`,
            `counterparty_vendor_data`, `stake_amount`, `net_result_amount`,
            `role` e um de `hand_id`, `round_id`, `match_id`;
            `gameplay.bet_placed` e `gameplay.bet_settled` requerem `game_id`;
            `payment.deposit_initiated`, `payment.deposit_completed`,
            `payment.withdrawal_requested` e `payment.withdrawal_completed`
            requerem `payment_reference_id`, `amount`, `currency`,
            `payment_method`, `status`; `payment.withdrawal_address_changed`
            requer `withdrawal_address_hash`; `dispute.chargeback_opened`,
            `dispute.chargeback_won` e `dispute.chargeback_lost` requerem
            `payment_reference_id` e um de `dispute_id`, `chargeback_id`;
            `session.bot_signal_observed` requer `telemetry_schema_version` e um
            de `bot_score`, `actions_per_minute`, `timing_variance_ms`,
            `pointer_entropy`, `keystroke_entropy`, `reaction_time_ms_p50`;
            `responsible_gambling.self_exclusion_match` requer
            `registry_source`, `exclusion_status`, `identity_match_ref`. Todas
            as ações de `security` que terminam em `_changed` requerem
            `changed_field`, além de `previous_reference_hash` ou
            `new_reference_hash` quando o campo for `password`, `mfa_method`,
            `mfa`, `email`, `phone`, `withdrawal_address`, `payout_method` ou
            `api_key`. Envie hashes e referências, nunca um número de cartão, um
            endereço de levantamento completo, um hash de palavra-passe ou um
            segredo MFA.
        custom_values:
          type: object
          description: >-
            Até 100 chaves suas, acessíveis a partir de regras como
            `custom_values.<key>`. Os valores têm de ser escalares (string,
            número, booleano ou null); objetos e arrays aninhados são
            rejeitados.
          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: >-
        Resultado da ingestão de um evento. A mesma estrutura é devolvida para
        um novo evento e para uma repetição idempotente.
      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: Identificador Didit do evento armazenado.
        event_id:
          type: string
          description: O seu `event_id`.
        status:
          type: string
          enum:
            - ACCEPTED
            - APPROVED
            - IN_REVIEW
            - DECLINED
          description: >-
            Estado após a execução das regras em tempo real. Consulte
            `MonitoringEvent.status`.
        score:
          type: integer
          description: Pontuação após a execução das regras em tempo real.
        rules_evaluated_count:
          type: integer
          minimum: 0
          description: >-
            Número de regras de evento avaliadas no pedido. 0 numa aplicação de
            sandbox, onde não são executadas regras.
        rules_matched_count:
          type: integer
          minimum: 0
          description: Número de regras correspondentes, incluindo regras em modo `TEST`.
        correlation_pending:
          type: boolean
          description: >-
            `true` quando uma regra assíncrona ainda tem de ser executada. Leia
            `GET /v3/events/{event_uuid}/` alguns minutos mais tarde para obter
            o `status` e o `score` finais.
        retention_class:
          type: string
          enum:
            - low_value
            - standard
            - risk_relevant
            - monetary_or_compliance
          description: >-
            Classe de conservação, após qualquer promoção feita por uma regra
            correspondente.
        expires_at:
          type: string
          format: date-time
          nullable: true
          description: >-
            Quando o evento expira de acordo com a sua classe de conservação e é
            eliminado. Nulo para eventos `monetary_or_compliance` (pagamento e
            disputa).
        idempotent_replay:
          type: boolean
          description: >-
            `true` quando um evento com este `event_id` e o mesmo conteúdo já
            tinha sido armazenado; os valores são os do evento armazenado e
            nenhuma regra foi executada novamente.
        rule_matches:
          type: array
          description: Regras que corresponderam ao evento.
          items:
            type: object
            required:
              - rule_id
              - library_key
              - mode
              - is_async
            properties:
              rule_id:
                type: string
                format: uuid
                description: UUID da regra.
              library_key:
                type: string
                nullable: true
                description: >-
                  Chave da biblioteca quando a regra foi instalada a partir da
                  biblioteca de regras; caso contrário, null.
              mode:
                type: string
                enum:
                  - ACTIVE
                  - TEST
                description: >-
                  As regras `TEST` registam a correspondência, mas não aplicam
                  ações.
              is_async:
                type: boolean
                description: >-
                  `true` quando a correspondência resultou da passagem
                  assíncrona.
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: x-api-key
      description: >-
        A chave de API da sua aplicação, a partir de Programadores -> Chaves de
        API na Business Console. A chave principal tem acesso total. Uma chave
        nomeada pode ter o âmbito definido: nenhum, leitura ou escrita por
        recurso, limitada a alguns fluxos ou a sessões aprovadas, a uma lista de
        endereços IP e a uma data de validade. 401 significa que a chave está
        incorreta, revogada ou expirada; 403 significa que nenhuma chave foi
        enviada, que a chave não tem acesso a este recurso ou ação, ou que o
        pedido veio de um endereço fora da sua lista de IP; 404 numa rota de
        sessão significa que a sessão está fora dos fluxos ou estados da chave.
        Uma chave sem acesso a multimédia recebe URLs de imagens, vídeos e PDFs
        como nulos, e uma chave sem permissão de escrita em sessões recebe
        ligações de sessão e tokens como nulos. Consulte
        https://docs.didit.me/console/api-keys.

````

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