---
title: "This dashboard's activity feed."
method: GET
path: "/v1/dashboards/{id}/activity"
tags: ["dashboards"]
---

# This dashboard's activity feed.

`GET /v1/dashboards/{id}/activity`

## Request

- Base URL: `http://localhost:8080`
- URL: `http://localhost:8080/v1/dashboards/{id}/activity`
- Auth: one of:
  - API key in cookie `dvt_session`
  - HTTP bearer

Returns a page of this dashboard's own activity — edits (with detail chips and
author-provided change notes), shares, exports, comments, and restores — newest
first. Requires dashboard read access on this dashboard (a non-reader gets 404,
same as GET /v1/dashboards/{id}). Unlike GET /v1/orgs/{orgId}/activity (the
org-wide feed, admin/owner-only and capped at 20 rows), this endpoint is scoped
to one dashboard, open to any reader, and fully paginated via `limit` + `cursor`
(DVT-775 keyset convention) — when more events exist beyond this page,
`meta.nextCursor` carries the token for the next page.

Includes page/element-level events that belong to this dashboard (resolved via
the same parent-dashboard walk-up GET /v1/orgs/{orgId}/activity uses), plus
restore events and comment-thread activity — both excluded from the org-wide
feed's narrower allowlist. The synthetic grouped dashboard-view digest rows
("view.group", DVT-1419) are intentionally excluded here; they remain org-feed-only.

No MCP tool derives from this endpoint (ADR-0007) — agents use
`dvt_revisions` / `dvt_restore` / `dvt_dashboard_diffs` instead.

## Query parameters

- `limit` integer
- `cursor` string

## Response `200`

A page of this dashboard's activity events, newest first.

- object
  - `data` ActivityEvent[], required
    - `id` string, required: A UUID for a real audit_logs-derived event; for a synthetic 'view.group' entry (DVT-1419), the deterministic composite id `view-group:{dashboardId}:{YYYY-MM-DD}`.
    - `actorId` string, uuid, nullable
    - `actorName` string, required: Display name, else email, else 'system'.
    - `actorType` 'user' | 'agent' | 'system' | 'render', required: 'render' = a headless render/export session (ADR-0024); appears on connection.credential.decrypt events. Every dvt_live_ API-key and MCP OAuth JWT request is 'agent' (DVT-1196), never masqueraded as the owning human's 'user'.
    - `actorLabel` string, nullable: API key name or MCP client id that performed the action, present when actorType is 'agent'.
    - `action` string, required
    - `resourceType` string, required
    - `resourceId` string, uuid, nullable
    - `resourceLabel` string, nullable: Title of the linked resource — the dashboard itself for dashboard events, its parent dashboard for page/element events, or the sheet/skill name for sheet/skill events; null when unresolvable (folder, deleted).
    - `dashboardId` string, uuid, nullable: Dashboard this event links to — the resource itself for dashboard events, the parent dashboard for page/element events; null for non-dashboard resources (folder, sheet, skill) and deleted dashboards. Sheet/skill events link via resourceType + resourceId instead.
    - `revisionFrom` integer, nullable: The version before this event, for a dashboard/sheet/skill 'update' event with a spec/content change, or a dashboard/page/element/sheet/skill 'delete' event (the version the deleted resource was at). Null on 'create' (nothing existed before) and every other event.
    - `revisionTo` integer, nullable: The version after this event, for a dashboard/page/element/sheet/skill 'create' event (the resource's first version), a dashboard/sheet/skill 'update' event with a spec/content change, or a dashboard 'restore' event (the version restored to). Null on 'delete' (nothing exists after) and every other event.
    - `panelsChanged` integer, nullable: For a dashboard 'update' event with a spec change: count of panels added, removed, or modified.
    - `panelsAdded` integer, nullable: For a dashboard 'update' event with a spec change (DVT-1419): count of panels present in the new spec but not the old, alongside panelsChanged's bare total.
    - `panelsRemoved` integer, nullable: For a dashboard 'update' event with a spec change (DVT-1419): count of panels present in the old spec but not the new.
    - `visibilityFrom` string, nullable: For a dashboard 'update' event whose request changed visibility (DVT-1419): the value before the edit.
    - `visibilityTo` string, nullable: For a dashboard 'update' event whose request changed visibility (DVT-1419): the value after the edit.
    - `exportFormat` string, nullable: For an 'export.deliver' event: the delivered artifact format ('png' or 'pdf').
    - `recipientCount` integer, nullable: For an 'export.deliver' event (DVT-1419): count of delivery recipients/destinations stamped at write time.
    - `exportSizeBytes` integer, nullable: For an 'export.deliver' event (DVT-1419): the delivered artifact's byte length, sourced from the render that produced it. Null when the render predates size reporting.
    - `exportScheduleId` string, uuid, nullable: For an 'export.deliver' event (DVT-1419): the id of the export schedule that produced this delivery — deterministic provenance only, no name lookup/join. Null on every other event.
    - `shareTarget` string, nullable: For an 'acl.grant'/'acl.revoke' event on a dashboard, folder, sheet, or skill (DVT-1419): the principal's display name, else email, resolved at read time from the actor id stamped on the grant/revoke. Null on every other event.
    - `shareRole` string, nullable: For an 'acl.grant' event on a dashboard, folder, sheet, or skill (DVT-1419): the granted role ('viewer'|'editor'|'admin'). Null on 'acl.revoke' and every other event.
    - `shareRoleFrom` string, nullable: For an 'acl.grant' event on a dashboard, folder, sheet, or skill that changed an existing principal's role (DVT-1419): the role before this write. Null for a brand-new share, 'acl.revoke', and every other event.
    - `changeSummary` string, nullable: For a dashboard 'create'/'update' event whose request carried one (DVT-1426): the note verbatim, e.g. 'Swapped revenue bar for cohort heatmap per Maria's request' — human-authored, agent-authored, or, via dvt web's Save-confirmation modal on 'update' (DVT-2686, PATCH-only — no such modal exists on create), prefixed by a client-generated summary of the spec diff against the prior revision with the author's typed note appended after ' — ' when one was supplied — truncated, or dropped entirely in favor of the note alone, when a long note leaves too little room for it — or server-generated for actions the server summarises itself (a restore stamps 'Restored dashboard to vN'). Null when neither the request nor the server supplied one.
    - `viewCount` integer, nullable: For a synthetic 'view.group' entry (DVT-1419): total dashboard_views rows in this (dashboard, day) bucket. Null on every real audit event.
    - `otherViewerCount` integer, nullable: For a synthetic 'view.group' entry (DVT-1419): distinct viewers in the bucket other than the one named in actorName. Null on every real audit event.
    - `beforeThumbUrl` string, nullable: For a dashboard 'update' event with a spec change (DVT-1466 stage 3): a same-origin URL (GET /v1/dashboards/{id}/thumbnail?revision=N) resolving to the revision-pinned render artifact nearest to revisionFrom, at or before it. Null when no such artifact exists (never re-rendered — dvt never re-renders history against today's warehouse, ADR-0011).
    - `afterThumbUrl` string, nullable: For a dashboard 'update' event with a spec change (DVT-1466 stage 3): a same-origin URL (GET /v1/dashboards/{id}/thumbnail?revision=N) resolving to the revision-pinned render artifact nearest to revisionTo, at or before it. Null when no such artifact exists.
    - `beforeThumbRevision` integer, nullable: The revision actually resolved for beforeThumbUrl — may be OLDER than revisionFrom when that exact revision was never rendered (nearest-older fallback). Null when beforeThumbUrl is null.
    - `afterThumbRevision` integer, nullable: The revision actually resolved for afterThumbUrl — may be OLDER than revisionTo when that exact revision was never rendered (nearest-older fallback). Null when afterThumbUrl is null.
    - `beforeThumbPage` integer, nullable: The 0-based page actually resolved for beforeThumbUrl (DVT-1483) — the edited page's position when a page-scoped render qualified, else 0 (dashboard-level-scope events, or a page-scoped lookup that fell back to the sweeper's page-0 render). Null when beforeThumbUrl is null.
    - `afterThumbPage` integer, nullable: The 0-based page actually resolved for afterThumbUrl (DVT-1483); same fallback rules as beforeThumbPage. Null when afterThumbUrl is null.
    - `commentThreadId` string, uuid, nullable: For a comment.* event on the per-dashboard feed (DVT-1791): the root thread id the comment belongs to (COALESCE(parent_comment_id, id)), so a reply resolves to its parent thread — the web pane deep-links the row to this thread. Null on every non-comment event and on the org-wide feed (which excludes comment events).
    - `commentResolved` boolean, nullable: For a comment.* event (DVT-1791): the thread's current resolved state, live-resolved at read time. Null on every non-comment event.
    - `commentSnippet` string, nullable: For a comment.* event (DVT-1791): the comment body truncated server-side to 140 chars (full bodies never ship to the feed; rendered as plain text). Null/empty for a since-deleted comment and every non-comment event.
    - `commentReplyCount` integer, nullable: For a comment.* event (DVT-1791): the number of live replies on the thread (its size minus the root). Null on every non-comment event.
    - `commentDeleted` boolean, nullable: For a comment.* event (DVT-1791): true when the comment has since been soft-deleted — the web row then renders a non-clickable 'comment deleted' line. False/null on every non-comment event.
    - `createdAt` string, date-time, required
  - `meta` Meta, required: Response metadata.
    - `requestId` string, required: Correlates with the X-Request-Id header.
    - `total` integer: Item count, present on collection responses.
    - `nextCursor` string, nullable: Opaque keyset-pagination cursor, present on paginated responses (e.g. GET /v1/dashboards) when more rows exist beyond this page. Pass it back as the `cursor` query param to fetch the next page; absent or null on the last page.
    - `roleResolveDegraded` boolean: Snowflake mode only (DVT-2260), on GET /v1/dashboards: present and true when the caller's live Snowflake role resolution failed or was unavailable — role-shared dashboards may be missing from this page. Omitted (not merely false) whenever resolution succeeded or the role-share arm does not apply (off snowflake mode, an org admin/owner, or off the ingress listener).

## Other responses

- `400`: Malformed request.
- `401`: Missing, invalid, or expired session.
- `404`: Resource does not exist.

---

[API](https://skmtc.dev/dvt/apis/dvt-rest-api.md) · [All operations](https://skmtc.dev/dvt/apis/dvt-rest-api/llms.txt) · [OpenAPI document](https://skmtc.dev/dvt/apis/dvt-rest-api/revisions/00016f504165?raw)
