Workflow activities overview
A workflow activity is one entry in the audit trail of a project workflow. Each entry records who changed the workflow, what changed, and the old and new values. The feed is read-only.
Entries come from workflow changes made in Plane and from hook writes through this API. Creating, updating, or deleting a workflow hook adds an entry with field set to transition_rule.
The workflow activity object
Attributes
idstring (uuid)Unique identifier for the entry.
workflow_idstring (uuid)The workflow the entry belongs to.
actor_idstring (uuid)The user who made the change.
nullwhen no user is recorded.state_idstring (uuid)The state the entry is about, when the change concerns one state in the workflow, for example a state added to the workflow or a transition out of a state.
nullfor workflow-level changes such as a rename.verbstringWhat happened. Values include
created,added,updated,removed,deleted,enabled, anddisabled.fieldstringThe part of the workflow that changed. The values include
workflow,workflow_name,workflow_description,workflow_is_active,workflow_work_item_type,workflow_state,workflow_default_state,workflow_type,allow_work_item_creation,state_transition,state_approvers,rejected_state,transition_rule,reset, andis_workflow_enabled. This is a partial list.old_valuestringThe value before the change, as text.
nullwhen there was none.new_valuestringThe value after the change, as text. For a
transition_ruleentry, it is the hook'shandler_name.old_identifierstring (uuid)The id of the record the old value refers to, when it refers to one. For an updated or removed
transition_ruleentry, it is the hook id.new_identifierstring (uuid)The id of the record the new value refers to, when it refers to one. For an added or updated
transition_ruleentry, it is the hook id.epochnumberWhen the change happened, in Unix seconds.
created_atstring (date-time)When the entry was recorded. This is the value
created_at__gtfilters on.
{
"id": "a41d7c93-5e28-4b06-9f17-3c8e2b6d0a54",
"workflow_id": "9e3f6a2c-7b14-4d8e-a5c1-2f60b8d4e719",
"actor_id": "16c61a3a-512a-48ac-b0be-b6b46fe6f430",
"state_id": "2c4d16f8-9b3e-4a52-8d71-1f0e6c9a5b48",
"verb": "added",
"field": "transition_rule",
"old_value": null,
"new_value": "send_webhook",
"old_identifier": null,
"new_identifier": "3b7e9a15-6c2d-4f84-9b31-0e5d8c7a2f69",
"epoch": 1768382561.0,
"created_at": "2026-01-14T09:22:41.478363Z"
}Endpoints
| Method | Path | Description |
|---|---|---|
GET | /api/v2/workspaces/{slug}/projects/{project_id}/workflows/{workflow_id}/activities/ | List workflow activities |
GET | /api/v2/workspaces/{slug}/projects/{project_id}/workflows/{workflow_id}/activities/{pk}/ | Get a workflow activity |
Polling for changes
The list sorts oldest first by default. To read only what is new since your last poll, pass the created_at of the newest entry you already hold as ?created_at__gt=. The filter uses a strict greater-than comparison, so the list does not return that entry again.
Governed workspaces
In a workspace with workspace governance turned on, workflows live in the workspace catalog and have no project. These project routes look the workflow up by project, so they return 404 for a catalog workflow, the same as the sibling workflow state and transition routes. Read the feed of a catalog workflow with Workspace workflow activities. Those routes serve the same entries in the same shape and take the same filters.
Response shaping
Every workflow activity read accepts ?fields= for sparse responses. See Sparse fields. Errors follow the shared problem+json contract.

