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

# List Activity

> Returns the changes made to prompts, topics and prompt tags across your organization, newest first by default. Each entry names the website, the entity type, the kind of change (`created`, `updated`, `deleted`, `restored`, `paused`, `unpaused`), the affected entity ids and who made the change. Use it to find out what happened without re-listing every website.

`entity_ids` is `null` when the affected set is not known (for example a bulk import); re-list that website's prompts with `GET /api/v1/prompts`. A `topic` or `prompt_tag` entry means the `topic_name` or `tags` of that website's prompts may have changed, so re-list the website in that case too. Changes made with an API key carry the key's id and name in `actor`, so you can skip your own writes. User emails are never returned. Websites provisioned through `POST /api/v1/websites/provision` do not appear here; list a website once after provisioning it.

To mirror data, pin a window per sync run: set `since` to the previous run's `until`, set `until` to now minus one minute, pass `order=asc`, walk `page_num` until `pagination.has_more` is `false`, then store that `until` for the next run. `since` is exclusive and `until` inclusive, so consecutive windows neither overlap nor skip. With no `since` the walk covers the whole history, so `order=asc` with no bounds is a full export. Pagination uses `page_size + 1` lookahead: there is no total-count field.

Requires a partner API key. Keys scoped to specific websites see only those websites.



## OpenAPI

````yaml /api-reference/openapi.json get /api/v1/activity
openapi: 3.1.0
info:
  title: AthenaHQ API
  description: >-
    AthenaHQ API provides programmatic access to manage your websites and
    prompts for AI-powered content optimization.
  version: 1.0.0
  contact:
    email: support@athenahq.ai
servers:
  - url: https://api.athenahq.ai
    description: Production server
security:
  - apiKey: []
tags:
  - name: Basics
    description: Core API operations for managing websites and prompts
  - name: Metrics
    description: Metrics and analytics endpoints for tracking AI visibility
  - name: Billing
    description: Billing and credits endpoints for managing usage
  - name: Team Management
    description: Endpoints for managing team members and invitations
  - name: Groups
    description: Endpoints for managing groups of websites
  - name: Content
    description: >-
      Endpoints for accessing Content Hub data — tabs, tracked URLs, and per-URL
      prompt breakdowns.
  - name: Pitch Workspace
    description: >-
      Endpoints for accessing pitch workspace reports — org-scoped pitch runs
      with competitors, prompts, attributes, and aggregate metrics.
  - name: Knowledge Base
    description: >-
      Endpoints for reading the brand Knowledge Base — approved brand facts and
      the pillars that organize them.
paths:
  /api/v1/activity:
    get:
      tags:
        - Basics
      summary: List Activity
      description: >-
        Returns the changes made to prompts, topics and prompt tags across your
        organization, newest first by default. Each entry names the website, the
        entity type, the kind of change (`created`, `updated`, `deleted`,
        `restored`, `paused`, `unpaused`), the affected entity ids and who made
        the change. Use it to find out what happened without re-listing every
        website.


        `entity_ids` is `null` when the affected set is not known (for example a
        bulk import); re-list that website's prompts with `GET /api/v1/prompts`.
        A `topic` or `prompt_tag` entry means the `topic_name` or `tags` of that
        website's prompts may have changed, so re-list the website in that case
        too. Changes made with an API key carry the key's id and name in
        `actor`, so you can skip your own writes. User emails are never
        returned. Websites provisioned through `POST /api/v1/websites/provision`
        do not appear here; list a website once after provisioning it.


        To mirror data, pin a window per sync run: set `since` to the previous
        run's `until`, set `until` to now minus one minute, pass `order=asc`,
        walk `page_num` until `pagination.has_more` is `false`, then store that
        `until` for the next run. `since` is exclusive and `until` inclusive, so
        consecutive windows neither overlap nor skip. With no `since` the walk
        covers the whole history, so `order=asc` with no bounds is a full
        export. Pagination uses `page_size + 1` lookahead: there is no
        total-count field.


        Requires a partner API key. Keys scoped to specific websites see only
        those websites.
      operationId: listActivity
      parameters:
        - name: since
          in: query
          description: >-
            ISO 8601 timestamp. Only changes strictly after this instant. Omit
            to start from the beginning of the organization's history.
          required: false
          schema:
            type: string
            format: date-time
        - name: until
          in: query
          description: >-
            ISO 8601 timestamp. Only changes up to and including this instant.
            Pin it per sync run so pages cannot shift while you page.
          required: false
          schema:
            type: string
            format: date-time
        - name: order
          in: query
          description: >-
            `desc` (default) lists the newest changes first. Use `asc` to export
            or sync in the order the changes happened.
          required: false
          schema:
            type: string
            enum:
              - desc
              - asc
            default: desc
        - name: website_id
          in: query
          description: >-
            Restrict to one website. Omit for the whole organization. A website
            outside your key's scope, or outside your organization, returns 403.
          required: false
          schema:
            type: string
            format: uuid
        - name: entity_type
          in: query
          description: Comma-separated list of entity types to include. Omit for all.
          required: false
          style: form
          explode: false
          schema:
            type: array
            items:
              type: string
              enum:
                - prompt
                - topic
                - prompt_tag
        - name: change_type
          in: query
          description: Comma-separated list of change types to include. Omit for all.
          required: false
          style: form
          explode: false
          schema:
            type: array
            items:
              type: string
              enum:
                - created
                - updated
                - deleted
                - restored
                - paused
                - unpaused
        - name: page_num
          in: query
          description: Zero-indexed page number.
          required: false
          schema:
            type: integer
            minimum: 0
            default: 0
        - name: page_size
          in: query
          description: Number of entries per page (1-100).
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 100
            default: 100
      responses:
        '200':
          description: Successful response with the page of changes.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ActivityListResponse'
              example:
                activity:
                  - id: 6f1c2a3e-5b7d-4e8f-9a0b-1c2d3e4f5a6b
                    occurred_at: '2026-09-20T08:14:03.512Z'
                    website_id: 3b9d1e2f-4a5b-4c6d-8e7f-9a0b1c2d3e4f
                    entity_type: prompt
                    change_type: created
                    entity_ids:
                      - a1f0b2c3-d4e5-4f60-8172-839405a6b7c8
                    actor:
                      type: user
                      api_key_id: null
                      api_key_name: null
                  - id: 7a44b5c6-d7e8-4f90-a1b2-c3d4e5f6a7b8
                    occurred_at: '2026-09-20T08:15:41.007Z'
                    website_id: 3b9d1e2f-4a5b-4c6d-8e7f-9a0b1c2d3e4f
                    entity_type: prompt
                    change_type: deleted
                    entity_ids:
                      - c2d1e3f4-a5b6-4c7d-8e9f-0a1b2c3d4e5f
                      - c2d2e3f4-a5b6-4c7d-8e9f-0a1b2c3d4e5f
                    actor:
                      type: user
                      api_key_id: null
                      api_key_name: null
                  - id: 8b90c1d2-e3f4-4a5b-9c6d-7e8f9a0b1c2d
                    occurred_at: '2026-09-20T09:02:10.220Z'
                    website_id: 9e07f1a2-b3c4-4d5e-8f60-718293a4b5c6
                    entity_type: topic
                    change_type: updated
                    entity_ids:
                      - d5510000-0000-4000-8000-000000000001
                    actor:
                      type: user
                      api_key_id: null
                      api_key_name: null
                  - id: 9c12d3e4-f5a6-4b7c-8d9e-0f1a2b3c4d5e
                    occurred_at: '2026-09-20T11:30:00.918Z'
                    website_id: 9e07f1a2-b3c4-4d5e-8f60-718293a4b5c6
                    entity_type: prompt
                    change_type: updated
                    entity_ids: null
                    actor:
                      type: api_key
                      api_key_id: a8f20000-0000-4000-8000-000000000002
                      api_key_name: Production integration
                pagination:
                  page_num: 0
                  page_size: 100
                  has_more: true
        '400':
          description: Bad request, invalid parameters.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              examples:
                page_size_out_of_range:
                  value:
                    error: page_size must be between 1 and 100
                unknown_entity_type:
                  value:
                    error: entity_type must be one of prompt, topic, prompt_tag
        '401':
          description: Unauthorized, invalid or missing API key.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '403':
          description: >-
            Forbidden. The key's organization is not a partner, or the requested
            website is outside the key's scope or organization.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              examples:
                not_a_partner:
                  value:
                    error: 'Forbidden: partner API key required'
                website_out_of_scope:
                  value:
                    error: Unauthorized access to this website
        '429':
          description: Rate limit exceeded.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '500':
          description: Internal server error.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      security:
        - apiKey: []
components:
  schemas:
    ActivityListResponse:
      type: object
      required:
        - activity
        - pagination
      properties:
        activity:
          type: array
          items:
            $ref: '#/components/schemas/ActivityEntry'
        pagination:
          $ref: '#/components/schemas/Pagination'
    Error:
      type: object
      description: Error response object
      required:
        - error
      properties:
        error:
          type: string
          description: Error message describing what went wrong
          example: Unauthorized
    ActivityEntry:
      type: object
      required:
        - id
        - occurred_at
        - website_id
        - entity_type
        - change_type
        - entity_ids
        - actor
      properties:
        id:
          type: string
          format: uuid
          description: Stable, unique id of the change.
        occurred_at:
          type: string
          format: date-time
          description: When the change happened.
        website_id:
          type: string
          format: uuid
          description: Website the change belongs to.
        entity_type:
          type: string
          enum:
            - prompt
            - topic
            - prompt_tag
        change_type:
          type: string
          enum:
            - created
            - updated
            - deleted
            - restored
            - paused
            - unpaused
        entity_ids:
          type: array
          nullable: true
          items:
            type: string
            format: uuid
          description: >-
            Ids of the affected entities. `null` means the affected set is
            unknown: re-list the website.
        actor:
          $ref: '#/components/schemas/ActivityActor'
    Pagination:
      type: object
      description: >-
        Pagination metadata. Uses `page_size + 1` lookahead — `has_more=true`
        means the next page is non-empty. No total-count field, by design
        (avoids the extra `COUNT(*)` round-trip).
      required:
        - page_num
        - page_size
        - has_more
      properties:
        page_num:
          type: integer
          description: Zero-indexed page number returned.
          example: 0
        page_size:
          type: integer
          description: Maximum items per page.
          example: 50
        has_more:
          type: boolean
          description: '`true` if another page is available.'
          example: true
    ActivityActor:
      type: object
      description: >-
        Who made the change. User identities are never exposed; an API key is
        identified so integrations can skip their own writes.
      required:
        - type
        - api_key_id
        - api_key_name
      properties:
        type:
          type: string
          enum:
            - user
            - api_key
            - system
          description: >-
            `user` for a change made in the app, `api_key` for one made through
            the API, `system` for an automated change or one whose API key has
            since been deleted.
        api_key_id:
          type: string
          format: uuid
          nullable: true
          description: Id of the API key that made the change, when `type` is `api_key`.
        api_key_name:
          type: string
          nullable: true
          description: Name of that API key.
  securitySchemes:
    apiKey:
      type: apiKey
      in: header
      name: x-api-key
      description: >-
        API key for authentication. You can create one
        [here](https://app.athenahq.ai/organization?tab=api).

````