ActivityRecord
Transaction-level avenue that produced this record's batch: restore / import / clone. null for ordinary saves. All records sharing a transaction_id share the same action_kind. The schema's third *_kind column (entity_kind / kind / action_kind), at transaction scope.
Possible values: [clone, import, restore, null]
changed_by objectnullable
User who produced the change, or null when the saving user no longer exists in ab_user.
True iff the source entity is hard-deleted (no live row by entity_id). False for live and soft-deleted entities.
Present when the source entity has non-null deleted_at Absent or null otherwise.
Possible values: [soft_deleted, null]
User-facing kind of the source entity: one of "dashboard" / "chart" / "dataset".
Possible values: [dashboard, chart, dataset]
Name of the source entity at the time of the change — denormalized from the validity-strategy shadow row. Survives entity rename / delete.
UUID of the source entity; null only when entity_deleted: true (the entity has been hard-deleted since the change was recorded).
True when this record's transaction is the entity's FIRST tracked save (first UPDATE after the retroactive baseline). Such transactions can carry dozens of params-normalization records for entities that predate versioning; clients use the marker to collapse them rather than render each delta as a user edit. Matched against the LIVE row's (id, uuid), so it is always false for hard-deleted entities (no live row) and for shadow rows predating the entity's current uuid.
Prior value; null = didn't exist.
impact objectnullable
Optional dependent-count for source: "related" records — e.g., {"charts": 4} for a dataset edit that affected 4 charts on the path dashboard at the change's transaction. Absent for source: "self" records and for related records without dependents.
Number of sibling charts on the path entity affected by the same related-record change at this transaction.
UTC timestamp; primary ordering key (DESC).
Content category — what kind of thing changed. field is the fallback for scalar changes without a more specific category. Per-record.
Possible values: [filter, metric, dimension, column, chart, row, tab, tabs, header, markdown, divider, time_range, color_palette, field, __meta__]
Per-record verb: add / remove / move / edit. Explicit instead of inferred from from_value / to_value null-tests. move only fires for layout records.
Possible values: [add, remove, move, edit, update, announce]
Pure navigation address — no verb or kind embedded. Examples: ['slice_name'], ['params', 'adhoc_filters', 'country'], ['CHART-x'] for a layout add/remove/move, ['HEADER-y', 'text'] for a layout edit leaf. The verb lives in operation, the element type in kind.
"self" if (entity_kind, entity_id) matches the path entity; else "related". Drives the frontend's no-group-under-save rendering rule.
Possible values: [self, related]
Synthesized headline for source: "related" records — e.g., "Dataset updated: Sales Transactions". Empty string for source: "self" records, except __meta__ self records (e.g. restore announcements), which carry their own headline.
New value; null = removed.
Stable secondary ordering key; never reused.
Stable UUIDv5 identifier for the source version (derive_version_uuid(entity_uuid, transaction_id)). Identical to what /versions/<version_uuid>/ would return for the same change.
{
"action_kind": "clone",
"changed_by": {
"first_name": "string",
"id": 0,
"last_name": "string"
},
"entity_deleted": true,
"entity_deletion_state": "soft_deleted",
"entity_kind": "dashboard",
"entity_name": "string",
"entity_uuid": "string",
"first_tracked_save": true,
"impact": {
"charts": 0
},
"issued_at": "2024-07-29T15:51:28.071Z",
"kind": "filter",
"operation": "add",
"path": [
"string"
],
"source": "self",
"summary": "string",
"transaction_id": 0,
"version_uuid": "string"
}