Workspace Activity

Read the activity feed for a workspace or organization with the activityList query, with filtering by user, tag, category, and date.


Use the activityList query to read the activity feed — the chronological audit trail of actions that happened in a workspace or across an organization (records created, comments posted, users invited, lists moved, and so on). Workspaces are Workspace objects and organizations are Organization objects in the API; activity entries are Activity objects.

Activities are generated automatically by the server — there is no mutation to create one. This query is the read side; for a live stream of new activity over WebSocket, use the subscribeToActivity subscription.

Request

The smallest useful call scopes the feed to one workspace and takes the most recent page. The feed is always scoped to the organization in your blue-org-id header — see Permissions.

query WorkspaceActivity {
  activityList(projectId: "project_123", first: 20) {
    activities {
      id
      category
      html
      createdAt
      createdBy {
        id
        fullName
        email
      }
    }
    pageInfo {
      hasNextPage
    }
    totalCount
  }
}

projectId accepts a workspace ID or slug. Omit it to read the organization-wide feed across every workspace you can see.

Parameters

All arguments are optional. With no arguments, activityList returns the most recent 20 entries across your accessible workspaces in the organization bound by your blue-org-id header.

ParameterTypeDescription
projectIdStringScope to a single workspace (ID or slug).
projectIds[String!]Scope to several workspaces by ID.
companyIdStringMust equal the organization in your blue-org-id header, or the call is rejected with FORBIDDEN. The feed is always scoped to the authenticated organization regardless of this value.
userIdStringFilter to a single user (created, affected by, assigned to, or @-mentioned in the activity).
userIds[String!]Filter to several users (same matching rules as userId).
tagIds[String!]Filter to activities whose record carries one of these tags.
categories[ActivityCategory!]Filter to specific activity types. See ActivityCategory.
filterTodoFilterInputRestrict to activities whose record matches a record filter. Only the fields and unassigned parts of the filter are applied here.
startDateDateTimeOnly activities at or after this timestamp (ISO 8601).
endDateDateTimeOnly activities at or before this timestamp (ISO 8601).
firstIntPage size. Defaults to 20.
skipIntOffset: skip this many entries before returning the page.
afterStringReturn entries whose id sorts before this cursor (use the id of the last entry from the previous page).
orderByActivityOrderByInputSort order. Defaults to createdAt_DESC. See ActivityOrderByInput.
Pagination

activityList is id-cursor paginated. Read a page with first, then pass the id of the last entry as after to get the next page; stop when pageInfo.hasNextPage is false. skip works for simple offset paging. The last and before arguments are accepted by the schema but ignored by this query, and the startCursor / endCursor fields on PageInfo are deprecated — page by entry id instead.

ActivityCategory

The category of an activity. The full enum:

ValueMeaning
CREATE_TODOA record was created.
MARK_TODO_AS_COMPLETEA record was marked complete.
MOVE_TODOA record was moved between lists.
COPY_TODOA record was copied.
REPEAT_TODOA recurring record produced a new instance.
REMOVE_TODOA record was deleted.
CREATE_TODO_LISTA list was created.
REMOVE_TODO_LISTA list was deleted.
CREATE_COMMENTA comment was added.
CREATE_DISCUSSIONA discussion was started.
CREATE_STATUS_UPDATEA status update was posted.
CREATE_CUSTOM_FIELDA custom field was created.
RECEIVE_FORMA form submission was received.
CREATE_INVITATIONA user was invited.
ACCEPT_INVITATIONAn invitation was accepted.
REJECT_INVITATIONAn invitation was rejected.
CANCEL_INVITATIONAn invitation was cancelled.
ADD_USER_TO_PROJECTA user was added to a workspace.
REMOVE_USER_FROM_PROJECTA user was removed from a workspace.
LEAVE_PROJECTA user left a workspace.
REMOVE_USER_FROM_COMPANYA user was removed from the organization.
LEAVE_COMPANYA user left the organization.
UPDATE_PROJECT_ACCESS_LEVELA user’s workspace access level changed.
UPDATE_COMPANY_ACCESS_LEVELA user’s organization access level changed.
ARCHIVE_PROJECTA workspace was archived.
UNARCHIVE_PROJECTA workspace was unarchived.
EDIT_NAMEA user changed their display name.
EDIT_JOB_TITLEA user changed their job title.

ActivityOrderByInput

Sort order. createdAt_DESC (newest first) is the default and the usual choice for a feed.

ValueMeaning
createdAt_DESCNewest first (default).
createdAt_ASCOldest first.
updatedAt_DESCMost recently updated first.
updatedAt_ASCLeast recently updated first.
category_ASC / category_DESCBy category, alphabetical / reverse.

The enum also accepts id_*, uid_*, inviteeEmail_*, metadata_*, and userAccessLevel_* (each in _ASC / _DESC), but those are rarely useful for a chronological feed.

Response

{
  "data": {
    "activityList": {
      "activities": [
        {
          "id": "clm4n8qwx000008l0g4oxdqn7",
          "category": "CREATE_TODO",
          "html": "<b>Ada Lovelace</b> created the record <b>Draft Q3 roadmap</b>",
          "createdAt": "2026-05-29T14:22:05.000Z",
          "createdBy": {
            "id": "clm4n8qwx000108l0a1b2c3d4",
            "fullName": "Ada Lovelace",
            "email": "ada@example.com"
          }
        }
      ],
      "pageInfo": { "hasNextPage": true },
      "totalCount": 20
    }
  }
}
totalCount is the page count, not the grand total

totalCount reflects the number of entries in the page just returned (capped by first), not the total number of activities matching your filters. To know whether more pages exist, read pageInfo.hasNextPage.

ActivityList

FieldTypeDescription
activities[Activity!]!The page of activity entries.
pageInfoPageInfo!Pagination info. Read hasNextPage to keep paging.
totalCountInt!Number of entries in this page (see callout above).

Activity

FieldTypeDescription
idID!Unique identifier. Use it as the after cursor for the next page.
uidString!Short human-readable identifier.
categoryActivityCategory!What happened. See ActivityCategory.
htmlString!Rendered description of the activity, as HTML.
textString!Plain-text description. Deprecated — use html.
isSeenBoolean!Whether the signed-in user has seen this activity (drives the unread badge).
isReadBoolean!Whether the signed-in user has marked this activity read.
createdAtDateTime!When the action occurred.
updatedAtDateTime!When the entry was last updated.
createdByUser!The user who performed the action.
affectedByUserThe user the action was performed on (e.g. the invited or removed user).
inviteeEmailStringFor invitation activities, the invited email address.
companyOrganizationThe organization the activity belongs to.
projectWorkspaceThe workspace, when the activity is workspace-scoped.
todoRecordThe record, for record activities.
todoListRecordListThe list, for list activities.
commentCommentThe comment, for CREATE_COMMENT.
discussionDiscussionThe discussion, for CREATE_DISCUSSION.
statusUpdateStatusUpdateThe status update, for CREATE_STATUS_UPDATE.
metadataStringExtra context for the activity, as a JSON string.

Select User subfields by name — the type exposes fullName, firstName, lastName, username, and email; there is no name field.

Full example

Read every record-creation and completion event in one workspace from a single user during March 2026, oldest first, paging in batches of 50.

query WorkspaceActivityFiltered {
  activityList(
    projectId: "project_123"
    userIds: ["user_123"]
    categories: [CREATE_TODO, MARK_TODO_AS_COMPLETE]
    startDate: "2026-03-01T00:00:00Z"
    endDate: "2026-03-31T23:59:59Z"
    first: 50
    orderBy: createdAt_ASC
  ) {
    activities {
      id
      category
      html
      createdAt
      createdBy {
        id
        fullName
      }
      affectedBy {
        id
        fullName
      }
      todo {
        id
        title
      }
      project {
        id
        name
        slug
      }
    }
    pageInfo {
      hasNextPage
    }
    totalCount
  }
}

To fetch the next page, pass the id of the last entry as after: "<last-id>" and keep the other arguments unchanged.

Errors

CodeWhen
UNAUTHENTICATEDThe request has no valid token.
COMPANY_NOT_FOUNDThe blue-org-id header is missing or invalid, or you are not a member of that organization.
FORBIDDENA companyId argument was passed that does not match the organization in your blue-org-id header.
BAD_USER_INPUTAn argument is malformed — for example a startDate or endDate that is not a valid ISO 8601 timestamp.

A workspace you cannot see, an archived workspace, or one with activity tracking disabled does not error — those activities are silently excluded from the feed.

Permissions

The feed is scoped to the organization in your blue-org-id header and to the workspaces you belong to within it; a companyId argument cannot widen that scope.

  • You only see activities from workspaces you are a member of and that have activity tracking enabled. Entries from before you joined the organization are excluded.
  • Activities that reference a custom field your role cannot view are filtered out, unless you are an organization OWNER or ADMIN.
  • Membership-change categories (REMOVE_USER_FROM_PROJECT, LEAVE_PROJECT, REMOVE_USER_FROM_COMPANY, LEAVE_COMPANY) are only visible to workspace or organization admins. In the organization-wide feed, REMOVE_TODO entries are also hidden.