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

# Get Subject Event Timeline

> List every monitoring event of one user or company, newest first, keeping individuals and companies that share a vendor_data apart.

Get Subject Event Timeline API Prompt
Copy prompt to clipboard

<pre>
  \`Read the monitoring event timeline of one user or company in my Didit application.

  Endpoint:
  GET [https://verification.didit.me/v3/events/subjects/\{vendor\_data}/](https://verification.didit.me/v3/events/subjects/\{vendor_data}/)

  Authentication:
  Use the x-api-key header with my Didit API key. A scoped key needs transactions: read.

  Goal:

  * Show one subject's activity (logins, sessions, gameplay, bonuses, payments, disputes, security changes) on a customer profile or in an investigation.

  Behavior:

  * vendor\_data is my own id for the subject (subject.vendor\_data of its events). URL-encode it; it cannot contain a slash.
  * vendor\_data is unique only within an entity type: the same id can name an individual and a company, and they are two subjects with two timelines.
  * entity\_type selects the subject: individual (default) or company. Without entity\_type=company, a company id returns the individual's timeline, not both. subject\_entity\_type is accepted as an alias.
  * Newest occurred\_at first, paginated with limit (default 50) and offset. count is capped at 100, so follow next until it is null.
  * The list filters of GET /v3/events/ apply on top: event\_category, action\_type, status, retention\_class (repeat for several values), business\_vendor\_data, session\_id, device\_fingerprint, ip\_address, game\_id, round\_id, affiliate\_code, payment\_reference\_id, counterparty\_vendor\_data, matched\_only, occurred\_from, occurred\_to, search. Occurred\_from and occurred\_to (inclusive; ISO 8601 with Z or an offset whose + is sent as %2B, for example 2026-10-17T09:00:00Z, or a date alone, which means 00:00 UTC of that day).
  * A vendor\_data with no events returns an empty page, not 404.

  Example call:
  curl -X GET "[https://verification.didit.me/v3/events/subjects/acct\_9931/?entity\_type=company\&limit=50](https://verification.didit.me/v3/events/subjects/acct_9931/?entity_type=company\&limit=50)" \
  -H "x-api-key: YOUR\_API\_KEY"

  What to read from the response:

  * results\[] - event summaries (event\_uuid, event\_category, action\_type, occurred\_at, status, score, rules\_matched\_count, ip\_country, device\_fingerprint).
  * results\[].subject\_uuid - the user or company the events resolved to.
  * next - URL of the next page, or null.

  Failure modes:

  * 400 - limit or offset larger than 1000000.
  * 401 - the API key has expired.
  * 403 - missing or invalid API key, a scoped key without transactions: read, or a request from outside the key's IP list.
  * 429 - more than 600 reads per minute for this API key; honor Retry-After.

  Side effects: none. This is a pure read.

  For the full integration shape, see /integration/integration-prompt.\`
</pre>

Paste into

See [Reading events back](/transaction-monitoring/events.md#reading-events-back) in the event ingestion guide. To search across subjects, use [List monitoring events](/management-api/monitoring-events/list.md).


## OpenAPI

````yaml GET /v3/events/subjects/{vendor_data}/
openapi: 3.0.0
info:
  version: 3.0.0
  title: Didit Verification API
  description: Identity verification API. Authenticate with x-api-key header.
servers:
  - url: https://verification.didit.me
security: []
tags: []
paths:
  /v3/events/subjects/{vendor_data}/:
    get:
      tags:
        - Monitoring Events
      summary: Get subject event timeline
      description: >-
        List every monitoring event of one subject, newest `occurred_at` first.
        A `vendor_data` is unique only within an entity type, so the same id can
        name an individual and a company: `entity_type` picks which timeline you
        get, and it defaults to `individual`, so a company's events need
        `entity_type=company`. The filters of `GET /v3/events/` apply on top,
        and a `vendor_data` with no events returns an empty page rather than
        `404`. A scoped API key needs `transactions: read`. See [Reading events
        back](https://docs.didit.me/transaction-monitoring/events#reading-events-back).
      operationId: get_monitoring_event_subject_timeline
      parameters:
        - name: vendor_data
          in: path
          required: true
          description: >-
            Your id for the subject (`subject.vendor_data` of its events).
            URL-encode it; a value containing `/` cannot be addressed by this
            endpoint.
          schema:
            type: string
            minLength: 1
            maxLength: 255
          example: user-42
        - name: entity_type
          in: query
          required: false
          description: >-
            `company` returns the company with this `vendor_data`; any other
            value, or none, returns the individual. `subject_entity_type` is
            accepted as an alias when `entity_type` is absent.
          schema:
            type: string
            enum:
              - individual
              - company
            default: individual
          example: individual
        - name: limit
          in: query
          required: false
          description: >-
            Maximum number of events per page. Defaults to 50. Values above
            1000000 return `400`; a non-numeric, zero or negative value falls
            back to 50.
          schema:
            type: integer
            default: 50
            minimum: 1
            maximum: 1000000
          example: 50
        - name: offset
          in: query
          required: false
          description: >-
            Number of events to skip. Defaults to 0. Prefer following the `next`
            URL from the response.
          schema:
            type: integer
            maximum: 1000000
            minimum: 0
            default: 0
          example: 0
        - name: event_category
          in: query
          required: false
          description: >-
            Only events in these categories. Repeat the parameter for several
            values (`?event_category=payment&event_category=dispute`); an event
            matching any of them is returned.
          style: form
          explode: true
          schema:
            type: array
            items:
              type: string
              enum:
                - auth
                - session
                - gameplay
                - bonus
                - affiliate
                - payment
                - dispute
                - security
                - responsible_gambling
                - custom
          example:
            - payment
            - dispute
        - name: action_type
          in: query
          required: false
          description: >-
            Only events with these action types (exact, case-sensitive). Repeat
            for several values.
          style: form
          explode: true
          schema:
            type: array
            items:
              type: string
          example:
            - deposit_completed
            - chargeback_opened
        - name: status
          in: query
          required: false
          description: Only events with these statuses. Repeat for several values.
          style: form
          explode: true
          schema:
            type: array
            items:
              type: string
              enum:
                - ACCEPTED
                - APPROVED
                - IN_REVIEW
                - DECLINED
          example:
            - IN_REVIEW
            - DECLINED
        - name: retention_class
          in: query
          required: false
          description: Only events in these retention classes. Repeat for several values.
          style: form
          explode: true
          schema:
            type: array
            items:
              type: string
              enum:
                - low_value
                - standard
                - risk_relevant
                - monetary_or_compliance
          example:
            - risk_relevant
        - name: business_vendor_data
          in: query
          required: false
          description: Exact match on the `business.vendor_data` sent with the event.
          schema:
            type: string
          example: merchant-7
        - name: session_id
          in: query
          required: false
          description: Exact match on `session.session_id`.
          schema:
            type: string
          example: web-session-abc
        - name: device_fingerprint
          in: query
          required: false
          description: Exact match on `device_context.fingerprint`.
          schema:
            type: string
          example: fp-a8c1
        - name: ip_address
          in: query
          required: false
          description: Exact match on the event's IP address.
          schema:
            type: string
          example: 203.0.113.42
        - name: game_id
          in: query
          required: false
          description: Exact match on the promoted `game_id`.
          schema:
            type: string
          example: poker-holdem-01
        - name: round_id
          in: query
          required: false
          description: Exact match on the promoted `round_id`.
          schema:
            type: string
          example: round-88231
        - name: affiliate_code
          in: query
          required: false
          description: Exact match on the promoted `affiliate_code`.
          schema:
            type: string
          example: aff-summer
        - name: payment_reference_id
          in: query
          required: false
          description: >-
            Exact match on the payment reference (from
            `transaction_context.payment_reference_id` or
            `payload.payment_reference_id`).
          schema:
            type: string
          example: dep_735
        - name: counterparty_vendor_data
          in: query
          required: false
          description: Exact match on the promoted `counterparty_vendor_data`.
          schema:
            type: string
          example: user-77
        - name: matched_only
          in: query
          required: false
          description: >-
            `true` (also `1` or `yes`, case-insensitive) returns only events at
            least one rule matched (`rules_matched_count` above 0). Any other
            value is ignored.
          schema:
            type: boolean
            default: false
          example: true
        - name: occurred_from
          in: query
          required: false
          description: >-
            Only events with `occurred_at` at or after this instant (inclusive).
            Send an ISO 8601 value: `2026-10-01T00:00:00Z`, an explicit offset
            with the `+` percent-encoded (`2026-10-01T02:00:00%2B02:00`; an
            unencoded `+` is decoded as a space and the value no longer parses),
            or a date alone (`2026-10-01`), which means 00:00:00 UTC of that
            day. A value without an offset is read as UTC. Values in any other
            format are not accepted.
          schema:
            type: string
            format: date-time
          example: '2026-10-01T00:00:00Z'
        - name: occurred_to
          in: query
          required: false
          description: >-
            Only events with `occurred_at` at or before this instant
            (inclusive). A date alone means the start of that day, so
            `occurred_to=2026-10-15` excludes the rest of 15 October; send
            `2026-10-15T23:59:59Z` to include it. Send an ISO 8601 value:
            `2026-10-01T00:00:00Z`, an explicit offset with the `+`
            percent-encoded (`2026-10-01T02:00:00%2B02:00`; an unencoded `+` is
            decoded as a space and the value no longer parses), or a date alone
            (`2026-10-01`), which means 00:00:00 UTC of that day. A value
            without an offset is read as UTC. Values in any other format are not
            accepted.
          schema:
            type: string
            format: date-time
          example: '2026-10-17T23:59:59Z'
        - name: search
          in: query
          required: false
          description: >-
            Case-insensitive substring match on `event_id`, `action_type`,
            `subject_vendor_data` or `counterparty_vendor_data`.
          schema:
            type: string
          example: chargeback
      responses:
        '200':
          description: One page of the subject's events.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MonitoringEventPage'
              examples:
                Individual timeline:
                  value:
                    count: 2
                    next: null
                    previous: null
                    results:
                      - event_uuid: 11111111-2222-3333-4444-555555555555
                        event_id: chargeback-2026-10-16-000318
                        event_category: dispute
                        action_type: chargeback_opened
                        occurred_at: '2026-10-16T14:02:11Z'
                        received_at: '2026-10-16T14:02:12.418230Z'
                        status: IN_REVIEW
                        score: 60
                        subject_vendor_data: user-42
                        subject_entity_type: individual
                        subject_uuid: 66666666-7777-8888-9999-000000000000
                        counterparty_vendor_data: null
                        session_id: null
                        device_fingerprint: null
                        ip_address: null
                        ip_country: null
                        amount: '250.000000000000000000'
                        currency: EUR
                        game_id: null
                        round_id: null
                        bonus_id: null
                        affiliate_code: null
                        payment_reference_id: dep_735
                        retention_class: monetary_or_compliance
                        rules_matched_count: 1
                        correlation_pending: false
                        is_droppable: false
                      - event_uuid: 22222222-3333-4444-5555-666666666666
                        event_id: login-2026-10-15-000912
                        event_category: auth
                        action_type: login
                        occurred_at: '2026-10-15T08:30:00.120000Z'
                        received_at: '2026-10-15T08:30:00.734512Z'
                        status: ACCEPTED
                        score: 0
                        subject_vendor_data: user-42
                        subject_entity_type: individual
                        subject_uuid: 66666666-7777-8888-9999-000000000000
                        counterparty_vendor_data: null
                        session_id: web-session-abc
                        device_fingerprint: fp-a8c1
                        ip_address: 203.0.113.42
                        ip_country: ES
                        amount: null
                        currency: null
                        game_id: null
                        round_id: null
                        bonus_id: null
                        affiliate_code: null
                        payment_reference_id: null
                        retention_class: standard
                        rules_matched_count: 0
                        correlation_pending: false
                        is_droppable: true
                No events:
                  value:
                    count: 0
                    next: null
                    previous: null
                    results: []
        '400':
          description: >-
            `limit` or `offset` is larger than 1000000. The body is a JSON array
            with one message. A non-numeric or non-positive `limit` falls back
            to the default of 50 instead of failing.
          content:
            application/json:
              examples:
                limit too large:
                  summary: limit above 1000000
                  value:
                    - limit must not exceed 1000000.
                offset too large:
                  summary: offset above 1000000
                  value:
                    - offset must not exceed 1000000.
        '401':
          description: >-
            The scoped API key has expired. Only an expired key gets `401`; a
            missing or invalid key gets `403`.
          content:
            application/json:
              examples:
                Expired key:
                  value:
                    detail: This API key has expired.
        '403':
          description: >-
            Missing or invalid `x-api-key` (this endpoint answers `403`, never
            `401`, for a missing or invalid key), a scoped key without
            `transactions: read`, a key limited to some workflows or to approved
            sessions (such a key never reaches transaction monitoring data), or
            a request from outside the key's IP allowlist.
          content:
            application/json:
              examples:
                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 read access to transactions.
                Key limited to workflows or approved sessions:
                  value:
                    detail: >-
                      This API key only reaches sessions inside its workflow or
                      status limits, so it can't use this endpoint.
                IP not allowed:
                  value:
                    detail: This API key can't be used from this IP address.
        '429':
          description: >-
            Rate limit exceeded: `GET` requests share a budget of 600 requests
            per minute per API key. Wait `Retry-After` seconds, then retry.
          headers:
            Retry-After:
              description: Seconds to wait before retrying.
              schema:
                type: integer
                minimum: 1
                example: 30
          content:
            application/json:
              examples:
                Throttled:
                  value:
                    detail: >-
                      GET request rate limit exceeded. You can make up to 600
                      requests per minute.
      security:
        - ApiKeyAuth: []
      x-codeSamples:
        - lang: curl
          label: curl
          source: >-
            curl -X GET
            'https://verification.didit.me/v3/events/subjects/user-42/?entity_type=individual&limit=50'
            \
              -H 'x-api-key: YOUR_API_KEY'
        - lang: python
          label: Python
          source: |-
            import os
            from urllib.parse import quote

            import requests

            vendor_data = 'user-42'
            resp = requests.get(
                f'https://verification.didit.me/v3/events/subjects/{quote(vendor_data, safe="")}/',
                headers={'x-api-key': os.environ['DIDIT_API_KEY']},
                params={'entity_type': 'individual', 'limit': 50},
                timeout=10,
            )
            resp.raise_for_status()
            for event in resp.json()['results']:
                print(event['occurred_at'], event['event_category'], event['action_type'], event['status'])
        - lang: javascript
          label: JavaScript
          source: >-
            const vendorData = 'user-42';

            const url =
            `https://verification.didit.me/v3/events/subjects/${encodeURIComponent(vendorData)}/?entity_type=individual&limit=50`;

            const resp = await fetch(url, {
              headers: { 'x-api-key': process.env.DIDIT_API_KEY },
            });

            if (!resp.ok) throw new Error(`Request failed: ${resp.status}`);

            const page = await resp.json();

            for (const event of page.results) console.log(event.occurred_at,
            event.event_category, event.action_type, event.status);
components:
  schemas:
    MonitoringEventPage:
      type: object
      description: One page of monitoring events, newest `occurred_at` first.
      required:
        - count
        - next
        - previous
        - results
      properties:
        count:
          type: integer
          description: >-
            Number of matching events, exact up to 100 and capped at 100 above
            that. Do not compute page counts from it; follow `next` until it is
            null.
        next:
          type: string
          format: uri
          nullable: true
          description: URL of the next page, or null on the last page.
        previous:
          type: string
          format: uri
          nullable: true
          description: URL of the previous page, or null on the first page.
        results:
          type: array
          items:
            $ref: '#/components/schemas/MonitoringEvent'
    MonitoringEvent:
      type: object
      description: >-
        One stored monitoring event as returned by the list and subject-timeline
        endpoints. Restricted evidence (payload, device context, rule evidence)
        is only returned by `GET /v3/events/{event_uuid}/`.
      required:
        - event_uuid
        - event_id
        - event_category
        - action_type
        - occurred_at
        - received_at
        - status
        - score
        - subject_vendor_data
        - subject_entity_type
        - subject_uuid
        - counterparty_vendor_data
        - session_id
        - device_fingerprint
        - ip_address
        - ip_country
        - amount
        - currency
        - game_id
        - round_id
        - bonus_id
        - affiliate_code
        - payment_reference_id
        - retention_class
        - rules_matched_count
        - correlation_pending
        - is_droppable
      properties:
        event_uuid:
          type: string
          format: uuid
          description: >-
            Didit identifier of the event. Use it as `{event_uuid}` in the
            retrieve and delete calls.
        event_id:
          type: string
          maxLength: 128
          description: Your own identifier, the idempotency key you sent.
        event_category:
          type: string
          enum:
            - auth
            - session
            - gameplay
            - bonus
            - affiliate
            - payment
            - dispute
            - security
            - responsible_gambling
            - custom
          description: Event category.
        action_type:
          type: string
          maxLength: 128
          description: What happened within the category, as you sent it.
        occurred_at:
          type: string
          format: date-time
          description: When the event happened on your side.
        received_at:
          type: string
          format: date-time
          description: When Didit accepted the event.
        status:
          type: string
          enum:
            - ACCEPTED
            - APPROVED
            - IN_REVIEW
            - DECLINED
          description: >-
            `ACCEPTED`: stored, no matched rule changed its standing (the normal
            answer for most events, and always the answer in a sandbox
            application, where no rules run). `APPROVED`: a rule matched and the
            score stayed under your review threshold. `IN_REVIEW`: a rule pushed
            the score over the review threshold or set the status. `DECLINED`: a
            rule declined it or the score crossed your decline threshold.
        score:
          type: integer
          description: >-
            Accumulated rule score. Starts at 0; rule `add_score` actions move
            it (negative deltas are allowed).
        subject_vendor_data:
          type: string
          maxLength: 255
          description: '`subject.vendor_data` of the event: your id for the user or company.'
        subject_entity_type:
          type: string
          description: >-
            `individual` or `company`: which kind of subject
            `subject_vendor_data` names.
          example: individual
        subject_uuid:
          type: string
          format: uuid
          nullable: true
          description: >-
            UUID of the user (individual) or company the event resolved to, or
            null when that record no longer exists.
        counterparty_vendor_data:
          type: string
          nullable: true
          description: >-
            The other player of a P2P event (promoted from
            `payload.counterparty_vendor_data`).
          maxLength: 255
        session_id:
          type: string
          nullable: true
          description: '`session.session_id` sent with the event.'
          maxLength: 255
        device_fingerprint:
          type: string
          nullable: true
          description: '`device_context.fingerprint` sent with the event.'
          maxLength: 255
        ip_address:
          type: string
          nullable: true
          description: >-
            IP address of the event. On the server lane this is
            `device_context.network_context.ip_address` as you sent it; on the
            device lane it is the IP of the request.
          maxLength: 64
        ip_country:
          type: string
          nullable: true
          description: >-
            Country code of `ip_address` from IP enrichment, or null when the
            address was not enriched (missing, private, or low-value telemetry
            whose address was not already known).
          example: ES
        amount:
          type: string
          nullable: true
          description: >-
            Amount as a decimal string with 18 decimal places, from
            `transaction_context.amount`, `payload.amount` or
            `payload.stake_amount`, in that order.
          example: '250.000000000000000000'
        currency:
          type: string
          nullable: true
          description: Currency from `transaction_context.currency` or `payload.currency`.
          maxLength: 10
        game_id:
          type: string
          nullable: true
          description: Promoted from `payload.game_id`.
          maxLength: 128
        round_id:
          type: string
          nullable: true
          description: Promoted from `payload.round_id`.
          maxLength: 128
        bonus_id:
          type: string
          nullable: true
          description: Promoted from `payload.bonus_id`.
          maxLength: 128
        affiliate_code:
          type: string
          nullable: true
          description: Promoted from `payload.affiliate_code`.
          maxLength: 128
        payment_reference_id:
          type: string
          nullable: true
          description: >-
            Payment reference from `transaction_context.payment_reference_id` or
            `payload.payment_reference_id`.
          maxLength: 255
        retention_class:
          type: string
          enum:
            - low_value
            - standard
            - risk_relevant
            - monetary_or_compliance
          description: >-
            Retention class. Payment and dispute events are
            `monetary_or_compliance`; security and responsible-gambling events
            are `risk_relevant`; `session.page_view`, `session.sdk_heartbeat`,
            `session.sdk_loaded`, `session.device_seen`,
            `session.bot_signal_observed`, `bonus.promotion_viewed` and
            `affiliate.referral_clicked` are `low_value`; everything else is
            `standard`. An event an active rule matched is promoted to
            `risk_relevant` (never demoted).
        rules_matched_count:
          type: integer
          minimum: 0
          description: >-
            Number of rules that matched the event, including rules in `TEST`
            mode (which record evidence but apply no actions).
        correlation_pending:
          type: boolean
          description: >-
            `true` while an asynchronous rule (cross-subject correlation, or a
            sequence longer than 24 hours) still has to run for this event. It
            resolves within minutes and `status`, `score` and
            `rules_matched_count` update in place.
        is_droppable:
          type: boolean
          description: >-
            Whether an SDK under backpressure may drop events of this kind.
            `false` for every `security`, `payment`, `dispute` and
            `responsible_gambling` event and for `gameplay.bet_placed`,
            `gameplay.bet_settled` and `gameplay.p2p_settlement`.
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: x-api-key
      description: >-
        Your application's API key, from Developers -> API keys in the Business
        Console. The primary key has full access. A named key can be scoped:
        none, read or write per resource, limited to some workflows or to
        approved sessions, to a list of IP addresses, and to an expiry date. 401
        means the key is missing, wrong, revoked or expired; 403 means the key
        has no access to this resource or action, or the request came from an
        address outside its IP list; 404 on a session route means the session is
        outside the key's workflows or statuses. A key without media access
        receives image, video and PDF URLs as null, and a key without sessions
        write receives session links and tokens as null. See
        https://docs.didit.me/console/api-keys.

````

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