> ## Documentation Index
> Fetch the complete documentation index at: https://docs.brudcast.com/llms.txt
> Use this file to discover all available pages before exploring further.

# List a contact's activity

> Returns the campaigns that targeted the contact and the delivery, engagement and unsubscribe events recorded against them, newest first. Send `meta.nextCursor` back as `before` to read the next page; a null cursor means the timeline is exhausted. `meta.retentionDays` is how long tracking events are kept, so anything older is simply not there. A contact id that does not resolve within the organization yields a 404. Requires the `contacts:read` scope.



## OpenAPI

````yaml /api-reference/openapi.json get /api/v1/user/contacts/{id}/activity
openapi: 3.0.0
info:
  title: Brudcast API
  version: 1.0.0
servers:
  - url: https://core-service.prod.brudcast.com
    description: Production
security: []
tags:
  - name: Analytics
    x-displayName: Analytics
  - name: Campaigns
    x-displayName: Campaigns
  - name: Contacts
    x-displayName: Contacts
  - name: Mailboxes
    x-displayName: Mailboxes
  - name: Messages
    x-displayName: Messages
  - name: Sender Identities
    x-displayName: Sender Identities
  - name: Sending Domains
    x-displayName: Sending Domains
  - name: Templates
    x-displayName: Templates
  - name: Webhooks
    x-displayName: Webhooks
paths:
  /api/v1/user/contacts/{id}/activity:
    get:
      tags:
        - Contacts
      summary: List a contact's activity
      description: >-
        Returns the campaigns that targeted the contact and the delivery,
        engagement and unsubscribe events recorded against them, newest first.
        Send `meta.nextCursor` back as `before` to read the next page; a null
        cursor means the timeline is exhausted. `meta.retentionDays` is how long
        tracking events are kept, so anything older is simply not there. A
        contact id that does not resolve within the organization yields a 404.
        Requires the `contacts:read` scope.
      parameters:
        - in: header
          name: X-Organization-Id
          required: false
          description: >-
            Required when authenticating with an access token. Optional with an
            API key, whose own organization binding is authoritative; a value
            contradicting it is refused with 403.
          schema:
            type: string
            format: uuid
        - in: query
          name: before
          required: false
          schema:
            type: string
        - in: query
          name: limit
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 100
        - in: path
          name: id
          required: true
          schema:
            type: string
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ContactActivityEntryCursorResponse'
        '401':
          description: The credential is missing, malformed, revoked or expired
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '403':
          description: >-
            The key lacks the scope the endpoint requires, or the organization
            does not match the credential
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '404':
          description: No such contact in the organization
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '422':
          description: The payload or query string failed validation
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ValidationErrorResponse'
        '429':
          description: >-
            Rate limit exceeded; retry after the number of seconds in
            `retryAfter`
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RateLimitErrorResponse'
      security:
        - apiKey: []
        - apiKeyBearer: []
components:
  schemas:
    ContactActivityEntryCursorResponse:
      type: object
      properties:
        success:
          type: boolean
          example: true
        message:
          type: string
        data:
          type: array
          items:
            $ref: '#/components/schemas/ContactActivityEntry'
        meta:
          $ref: '#/components/schemas/CursorMeta'
      required:
        - success
        - message
        - data
        - meta
    ErrorResponse:
      type: object
      properties:
        success:
          type: boolean
          example: false
        message:
          type: string
          example: Resource not found
        code:
          type: string
          enum:
            - E_VALIDATION_ERROR
            - E_UNAUTHORIZED_ACCESS
            - E_UNAUTHORIZED
            - E_FORBIDDEN
            - E_INSUFFICIENT_SCOPE
            - E_ROW_NOT_FOUND
            - E_TOO_MANY_REQUESTS
            - E_BUSINESS_RULE_VIOLATION
            - E_CAMPAIGN_NOT_SENDABLE
            - INSUFFICIENT_CREDITS
            - SUBSCRIPTION_REQUIRED
          example: E_ROW_NOT_FOUND
      required:
        - success
        - message
        - code
    ValidationErrorResponse:
      type: object
      properties:
        success:
          type: boolean
          example: false
        message:
          type: string
          example: The payload is invalid
        code:
          type: string
          enum:
            - E_VALIDATION_ERROR
            - E_UNAUTHORIZED_ACCESS
            - E_UNAUTHORIZED
            - E_FORBIDDEN
            - E_INSUFFICIENT_SCOPE
            - E_ROW_NOT_FOUND
            - E_TOO_MANY_REQUESTS
            - E_BUSINESS_RULE_VIOLATION
            - E_CAMPAIGN_NOT_SENDABLE
            - INSUFFICIENT_CREDITS
            - SUBSCRIPTION_REQUIRED
          example: E_VALIDATION_ERROR
        errors:
          type: array
          items:
            $ref: '#/components/schemas/ValidationErrorItem'
      required:
        - success
        - message
        - code
        - errors
    RateLimitErrorResponse:
      type: object
      properties:
        success:
          type: boolean
          example: false
        message:
          type: string
          example: Too many requests
        code:
          type: string
          enum:
            - E_VALIDATION_ERROR
            - E_UNAUTHORIZED_ACCESS
            - E_UNAUTHORIZED
            - E_FORBIDDEN
            - E_INSUFFICIENT_SCOPE
            - E_ROW_NOT_FOUND
            - E_TOO_MANY_REQUESTS
            - E_BUSINESS_RULE_VIOLATION
            - E_CAMPAIGN_NOT_SENDABLE
            - INSUFFICIENT_CREDITS
            - SUBSCRIPTION_REQUIRED
          example: E_TOO_MANY_REQUESTS
        retryAfter:
          type: number
          example: 60
      required:
        - success
        - message
        - code
        - retryAfter
    ContactActivityEntry:
      type: object
      properties:
        type:
          type: string
          enum:
            - targeted
            - delivered
            - opened
            - clicked
            - bounced
            - failed
            - unsubscribed
            - complained
        occurredAt:
          type: string
          format: date-time
          description: >-
            When the event happened, and the value to send back as `before` to
            page on
        campaignId:
          type: string
          format: uuid
          nullable: true
        campaignName:
          type: string
          nullable: true
        channel:
          type: string
          enum:
            - email
            - sms
            - whatsapp
            - push
          nullable: true
          description: The channel the event was recorded on, null on a targeting entry
        channels:
          type: array
          items:
            type: string
            enum:
              - email
              - sms
              - whatsapp
              - push
          description: >-
            The channels a targeting entry covered, empty on every other entry
            type
        linkUrl:
          type: string
          nullable: true
          description: The destination of a click entry, null on every other entry type
      required:
        - type
        - occurredAt
        - campaignId
        - campaignName
        - channel
        - channels
        - linkUrl
    CursorMeta:
      type: object
      properties:
        nextCursor:
          type: string
          nullable: true
          example: MDE5MmY4YzQtNzE5
        hasMore:
          type: boolean
          example: true
          description: >-
            Absent on the endpoints that signal exhaustion with a null
            `nextCursor` alone
        limit:
          type: number
          example: 50
          description: >-
            The page size the cursor was opened with, echoed by the keyset
            endpoints
        retentionDays:
          type: number
          example: 30
          description: >-
            How far back the underlying store retains events. Sent by the
            endpoints reading retention-bounded data, where it explains why
            older rows are absent and bounds how far a date filter may reach
      required:
        - nextCursor
    ValidationErrorItem:
      type: object
      properties:
        field:
          type: string
          example: emailAddress
        rule:
          type: string
          example: email
        message:
          type: string
          example: The emailAddress field must be a valid email address
      required:
        - field
        - rule
        - message
  securitySchemes:
    apiKey:
      type: apiKey
      in: header
      name: X-API-Key
      description: >-
        An organization API key, prefixed `bk_live_`. Takes precedence over
        `Authorization` when both are sent. The key is bound to one
        organization, and the scopes it was issued with are enforced per
        endpoint.
    apiKeyBearer:
      type: http
      scheme: bearer
      bearerFormat: bk_live_...
      description: >-
        The same organization API key sent as `Authorization: Bearer
        bk_live_...`. Accepted only when the value begins with `bk_` and no
        `X-API-Key` header is present.

````