---
title: "List Activity"
method: GET
path: "/api/v1/activity"
tags: ["Basics"]
---

# List Activity

`GET /api/v1/activity`

## Request

- Base URL: `https://api.athenahq.ai`
- URL: `https://api.athenahq.ai/api/v1/activity`
- Auth: API key in header `x-api-key`

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. Changes made in the app carry the person's id and email in `actor.user`. Keys scoped to specific websites see the identity of members of those websites only; other people appear with `user: null`. 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.

## Query parameters

- `since` string, date-time
- `until` string, date-time
- `order` 'desc' | 'asc'
- `website_id` string, uuid
- `entity_type` string[]
- `change_type` string[]
- `page_num` integer
- `page_size` integer

## Response `200`

Successful response with the page of changes.

- ActivityListResponse
  - `activity` ActivityEntry[], required
    - `id` string, uuid, required: Stable, unique id of the change.
    - `occurred_at` string, date-time, required: When the change happened.
    - `website_id` string, uuid, required: Website the change belongs to.
    - `entity_type` 'prompt' | 'topic' | 'prompt_tag', required
    - `change_type` 'created' | 'updated' | 'deleted' | 'restored' | 'paused' | 'unpaused', required
    - `entity_ids` string[], nullable, required: Ids of the affected entities. `null` means the affected set is unknown: re-list the website.
    - `actor` ActivityActor, required: Who made the change. A person is identified by id and email in `user`; an API key is identified by id and name so integrations can skip their own writes.
      - `type` 'user' | 'api_key' | 'system', required: `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` string, uuid, nullable, required: Id of the API key that made the change, when `type` is `api_key`.
      - `api_key_name` string, nullable, required: Name of that API key.
      - `user` object, nullable, required: The person who made the change, when `type` is `user`. `null` for API-key and system changes, and for a person outside the websites a scoped key can access.
        - `id` string, uuid, required: User id.
        - `email` string, email, required: User email.
  - `pagination` Pagination, required: 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).
    - `page_num` integer, required: Zero-indexed page number returned.
    - `page_size` integer, required: Maximum items per page.
    - `has_more` boolean, required: `true` if another page is available.

## Other responses

- `400`: Bad request, invalid parameters.
- `401`: Unauthorized, invalid or missing API key.
- `403`: Forbidden. The key's organization is not a partner, or the requested website is outside the key's scope or organization.
- `429`: Rate limit exceeded.
- `500`: Internal server error.

## Changes

- **2026-11-03** `2d1d86d5e067`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/athenahq/apis/athenahq-api/changes/api/v1/activity/get.md)

---

[API](https://skmtc.dev/athenahq/apis/athenahq-api.md) - [All operations](https://skmtc.dev/athenahq/apis/athenahq-api/llms.txt) - [OpenAPI document](https://skmtc.dev/athenahq/apis/athenahq-api/revisions/6cf9ca58edf6?raw)
