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

# List activity

> Lists activity events for the current organization.



## OpenAPI

````yaml /openapi.yaml get /v1/activity
openapi: 3.0.3
info:
  title: TalkToHumans Public API
  version: 1.0.0
  license:
    name: Proprietary
  description: >
    Read and organize the LinkedIn organization data your team already manages
    in TalkToHumans: accounts, contacts, tags, notes, sequence state,
    conversations, and views.
servers:
  - url: https://api.talktohumans.app
    description: TalkToHumans API
security:
  - bearerAuth: []
tags:
  - name: Organization
    description: Organization details for the current API key.
  - name: LinkedIn
    description: LinkedIn accounts, contacts, companies, and conversations.
  - name: Activity
    description: Activity for organization reporting.
  - name: Enrich
    description: Profile enrichment for LinkedIn contacts and companies.
  - name: Views
    description: Saved TalkToHumans views.
paths:
  /v1/activity:
    get:
      tags:
        - Activity
      summary: List activity
      description: Lists activity events for the current organization.
      operationId: listActivity
      parameters:
        - $ref: '#/components/parameters/ActivityFrom'
        - $ref: '#/components/parameters/ActivityTo'
        - $ref: '#/components/parameters/ActivityTimezone'
        - $ref: '#/components/parameters/ActivityAccountId'
        - $ref: '#/components/parameters/ActivityUserId'
        - $ref: '#/components/parameters/ActivityEventType'
        - $ref: '#/components/parameters/ActivityChannel'
        - $ref: '#/components/parameters/ActivitySource'
        - $ref: '#/components/parameters/ActivityTag'
        - $ref: '#/components/parameters/ActivityLimit'
        - $ref: '#/components/parameters/ActivityCursor'
      responses:
        '200':
          description: Activity rows.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ListActivityEnvelope'
              example:
                data:
                  generated_at: '2026-07-09T12:00:00Z'
                  timezone: America/Los_Angeles
                  filters:
                    from: '2026-07-01T07:00:00Z'
                    to: '2026-07-10T07:00:00Z'
                    to_exclusive: true
                    account_ids:
                      - '42'
                    event_types:
                      - message_sent
                      - outbound_reply_received
                    channels:
                      - linkedin_message
                    sources:
                      - canonical_messages
                    tag_attribution: unavailable
                  activity:
                    - id: '987'
                      occurred_at: '2026-07-09T10:30:00Z'
                      recorded_at: '2026-07-09T10:30:04Z'
                      event_type: message_sent
                      source: canonical_messages
                      channel: linkedin_message
                      user_id: '7'
                      account_id: '42'
                      subject_key: linkedin:participant:linkedin:urn:li:fsd_profile:abc
                      attribution_method: user_and_account
                      metadata:
                        provider_message_id: urn:li:msg:abc
                        provider_chat_id: urn:li:msg_conversation:def
                        message_source: linkedin_message
                  pagination:
                    limit: 50
                    has_more: false
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/ReportingForbidden'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/InternalServerError'
components:
  parameters:
    ActivityFrom:
      name: from
      in: query
      description: |
        Inclusive activity window start. Use RFC3339 or `YYYY-MM-DD`.
        Date-only values are interpreted in the requested `timezone`.
      schema:
        type: string
      example: '2026-07-01'
    ActivityTo:
      name: to
      in: query
      description: >
        Exclusive activity window end. Use RFC3339 or `YYYY-MM-DD`.

        Date-only values are interpreted in the requested `timezone` and advance
        to the start of the following local day.

        The response repeats the normalized instant in `filters.to` with
        `to_exclusive: true`.
      schema:
        type: string
      example: '2026-07-10'
    ActivityTimezone:
      name: timezone
      in: query
      description: >-
        IANA timezone used for date-only `from` and `to` filters. Defaults to
        `UTC`.
      schema:
        type: string
        default: UTC
      example: America/Los_Angeles
    ActivityAccountId:
      name: account_id
      in: query
      description: >
        Filter by TalkToHumans LinkedIn account ID in activity facts.

        Repeat the query parameter for multiple accounts. The backend also
        accepts comma-separated values.
      schema:
        type: array
        items:
          type: string
          pattern: ^[1-9][0-9]*$
      style: form
      explode: true
    ActivityUserId:
      name: user_id
      in: query
      description: >
        Filter by TalkToHumans user ID in activity facts.

        Repeat the query parameter for multiple users. The backend also accepts
        comma-separated values.
      schema:
        type: array
        items:
          type: string
          pattern: ^[1-9][0-9]*$
      style: form
      explode: true
    ActivityEventType:
      name: event_type
      in: query
      description: >
        Filter by activity event type.

        Repeat the query parameter for multiple event types. The backend also
        accepts comma-separated values.
      schema:
        type: array
        items:
          $ref: '#/components/schemas/ActivityEventType'
      style: form
      explode: true
    ActivityChannel:
      name: channel
      in: query
      description: >
        Filter by activity channel, such as `linkedin_message`,
        `linkedin_inmail`, or `linkedin_connection`.

        Repeat the query parameter for multiple channels. The backend also
        accepts comma-separated values.
      schema:
        type: array
        items:
          type: string
      style: form
      explode: true
    ActivitySource:
      name: source
      in: query
      description: >
        Filter by activity emitter source, such as `canonical_messages`,
        `canonical_chats`,

        `canonical_sequence_steps`, `sequence_runner_report`, or
        `canonical_account_participants`.

        Repeat the query parameter for multiple sources. The backend also
        accepts comma-separated values.
      schema:
        type: array
        items:
          type: string
      style: form
      explode: true
    ActivityTag:
      name: tag
      in: query
      description: >-
        Reserved for future tag-attributed reporting. Passing this parameter
        currently returns `400 bad_request`.
      schema:
        type: string
    ActivityLimit:
      name: limit
      in: query
      description: >-
        Page size for `GET /v1/activity`. Defaults to 50 and must be between 1
        and 200.
      schema:
        type: integer
        minimum: 1
        maximum: 200
        default: 50
    ActivityCursor:
      name: cursor
      in: query
      description: >-
        Opaque cursor from the previous `GET /v1/activity` response's
        `pagination.next_cursor`.
      schema:
        type: string
  schemas:
    ListActivityEnvelope:
      type: object
      additionalProperties: false
      required:
        - data
      properties:
        data:
          $ref: '#/components/schemas/ActivityListResponse'
    ActivityEventType:
      type: string
      enum:
        - connection_request_sent
        - connection_request_accepted
        - incoming_connection_request_accepted
        - message_scheduled
        - message_sent
        - follow_up_sent
        - message_received
        - outbound_reply_received
        - template_run_started
        - template_run_replied
    ActivityListResponse:
      type: object
      additionalProperties: false
      required:
        - generated_at
        - timezone
        - filters
        - activity
        - pagination
      properties:
        generated_at:
          type: string
          format: date-time
        timezone:
          type: string
          description: IANA timezone used to interpret date-only request filters.
        filters:
          $ref: '#/components/schemas/ActivityFilters'
        activity:
          type: array
          items:
            $ref: '#/components/schemas/ActivityEvent'
        pagination:
          $ref: '#/components/schemas/ActivityPagination'
    Error:
      type: object
      additionalProperties: false
      required:
        - code
        - message
      properties:
        code:
          type: string
          description: Machine-readable error code.
          enum:
            - unauthorized
            - forbidden
            - not_found
            - bad_request
            - internal_error
            - conflict
            - rate_limit_exceeded
            - account_shared_access_required
            - billing_payment_failed
            - billing_subscription_incomplete
            - billing_subscription_expired
            - billing_grace_period
            - billing_feature_not_available
            - billing_insufficient_credits
            - billing_invalid
            - upstream_error
        message:
          type: string
          description: Human-readable error message.
        debug:
          type: string
          description: Development-only debug details.
    ActivityFilters:
      type: object
      additionalProperties: false
      required:
        - to_exclusive
        - tag_attribution
      properties:
        from:
          type: string
          format: date-time
          description: Normalized inclusive lower bound in UTC, when supplied.
        to:
          type: string
          format: date-time
          description: Normalized exclusive upper bound in UTC, when supplied.
        to_exclusive:
          type: boolean
          description: >-
            Always true. Activity queries include events where `occurred_at <
            to`.
        account_ids:
          type: array
          items:
            type: string
        user_ids:
          type: array
          items:
            type: string
        event_types:
          type: array
          items:
            $ref: '#/components/schemas/ActivityEventType'
        channels:
          type: array
          items:
            type: string
        sources:
          type: array
          items:
            type: string
        tag_attribution:
          type: string
          enum:
            - unavailable
          description: >-
            Tag filtering is intentionally unavailable until activity events
            include tag attribution metadata.
    ActivityEvent:
      type: object
      additionalProperties: false
      required:
        - id
        - occurred_at
        - recorded_at
        - event_type
        - source
        - attribution_method
      properties:
        id:
          type: string
          description: TalkToHumans activity event ID.
        occurred_at:
          type: string
          format: date-time
          description: When the activity happened.
        recorded_at:
          type: string
          format: date-time
          description: When TalkToHumans recorded the activity.
        event_type:
          $ref: '#/components/schemas/ActivityEventType'
        source:
          type: string
          description: Backend emitter that recorded the fact.
          example: canonical_messages
        channel:
          type: string
          description: Activity channel when known.
          example: linkedin_message
        user_id:
          type: string
          description: TalkToHumans user ID when the fact can be attributed to a user.
        account_id:
          type: string
          description: >-
            TalkToHumans LinkedIn account ID when the fact can be attributed to
            an account.
        subject_key:
          type: string
          description: >-
            Stable content-free contact identity used to deduplicate reporting
            metrics.
        template_run_public_id:
          type: string
          description: >-
            Template-run identity when the activity belongs to attributed
            outreach.
        template_key:
          type: string
          description: >-
            Stable opaque template identity snapshotted when the activity was
            recorded.
        template_public_id:
          type: string
        template_type:
          type: string
          enum:
            - normal
            - sequence
        attribution_method:
          type: string
          enum:
            - user_and_account
            - user
            - account
            - unattributed
        metadata:
          $ref: '#/components/schemas/ActivityMetadata'
    ActivityPagination:
      type: object
      additionalProperties: false
      required:
        - limit
        - has_more
      properties:
        limit:
          type: integer
          format: int32
          example: 50
        has_more:
          type: boolean
        next_cursor:
          type: string
          description: >-
            Cursor for the next activity page. Omitted when there are no more
            results.
    ActivityMetadata:
      type: object
      additionalProperties:
        type: string
      description: >
        Small machine-readable metadata allowlist. Possible keys include
        `chat_provider`, `invite_entity_urn`,

        `invite_id`, `invitation_id`, `invitation_urn`, `message_mode`,
        `message_public_id`,

        `message_source`, `occurred_at_basis`, `outcome`,
        `participant_provider`, `position`,

        `previous_invite_type`, `provider_chat_id`, `provider_message_id`,
        `provider_participant_id`,

        `reason`, `relationship_source`, `reply_basis`, `scheduled_for`,
        `sequence_step_public_id`,

        `task_type`, `template_run_public_id`, and `template_status`.

        Message text, attachments, notes, drafts, and generated message bodies
        are never returned here.
  responses:
    BadRequest:
      description: Invalid request parameters.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            code: bad_request
            message: Invalid request parameters
    Unauthorized:
      description: Missing, malformed, invalid, or retired local API key.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          examples:
            missingAuthorization:
              value:
                code: unauthorized
                message: Authorization header is required
            invalidAuthorizationFormat:
              value:
                code: unauthorized
                message: Authorization header must use Bearer scheme
            invalidAPIKey:
              value:
                code: unauthorized
                message: Invalid API key
    ReportingForbidden:
      description: >-
        API access is not enabled for the organization, the API key cannot
        resolve to an active organization user, or the credential's user is not
        an organization admin.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          examples:
            adminRequired:
              summary: Reporting requires an admin API-key principal
              value:
                code: forbidden
                message: Only organization admins can perform this action.
            forbidden:
              value:
                code: forbidden
                message: you don't have access to this organization
            featureUnavailable:
              value:
                code: billing_feature_not_available
                message: >-
                  Feature 'TalkToHumansAPI' is not available in your current
                  plan
            insufficientCredits:
              value:
                code: billing_insufficient_credits
                message: Insufficient credits
            apiKeyPrincipalInvalid:
              value:
                code: forbidden
                message: >-
                  This API key is no longer linked to an active organization
                  user. Ask an organization admin to regenerate it
    RateLimited:
      description: >-
        Rate limit exceeded. Public routes allow 50 requests per 10 seconds per
        IP and endpoint.
      headers:
        Retry-After:
          description: Seconds to wait before retrying the request.
          schema:
            type: integer
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            code: rate_limit_exceeded
            message: Rate limit exceeded
    InternalServerError:
      description: Unexpected server error.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            code: internal_error
            message: An internal error occurred
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      description: 'Pass API key as `Authorization: Bearer <api_key>`.'

````