Workspace workflow activities overview
A workspace workflow activity is one entry in the change history of a catalog workflow. Entries record changes such as a new or renamed workflow, an attached state, or a changed transition, approver, or hook. The feed is read-only, and each workflow has its own.
Plane writes entries in the background after each change, so an entry can appear a moment after the write that caused it. Through this API, two writes record no entry: a chain replacement with Update a workspace workflow, and Remove a state from a workspace workflow.
These endpoints work only in a workspace with governance turned on. In an ungoverned workspace, they return 409 states_managed_at_project. Project workflows there have the same feed, with the same object, under workflow activities.
The workspace 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. Nullable.
state_idstring (uuid)The catalog state the change applies to. For transition, approver, and hook changes, it is the transition's source state. For
type, creation, and default changes, it is the state itself. It isnullfor changes to the workflow itself and for states added to the chain. An entry for an added state names the state innew_identifier.verbstringWhat happened:
created,updated,deleted,added,removed,enabled, ordisabled.fieldstringWhat changed. See Field values. Nullable.
old_value,new_valuestringThe value before and after the change, as text. Depending on
field, this is a name, an id, orTrueorFalse. Nullable.old_identifier,new_identifierstring (uuid)The ids of the records before and after the change, when the change involves one, such as a state, an approver, or a hook. Nullable.
epochnumberWhen the change was made, as Unix time in seconds. Nullable.
created_atstring (date-time)When the entry was recorded.
{
"id": "3a8d1f6c-9e2b-4c57-b4a1-6f0e8d2c9b73",
"workflow_id": "9c1f0b3d-6d2e-4c9a-8b41-2f7e5a0d6c88",
"actor_id": "16c61a3a-512a-48ac-b0be-b6b46fe6f430",
"state_id": "b7e42a19-3c5d-4f80-9a26-8d1c0f4e7b53",
"verb": "added",
"field": "state_approvers",
"old_value": "",
"new_value": "priya",
"old_identifier": null,
"new_identifier": "a3f92c71-6e4b-4d08-9b5a-1c7e3d9f2b84",
"epoch": 1768475092.0,
"created_at": "2026-01-15T11:04:52.660219Z"
}Field values
The catalog endpoints record these field and verb pairs. Entries that the Plane app writes use the same values. The app can also record other field values, so treat an unknown field as something to show, not as an error.
field | verb | What changed |
|---|---|---|
workflow | created, deleted | The workflow was created or deleted. On create, new_identifier is the workflow id. On delete, old_value is its name. |
workflow_name | updated | The workflow was renamed. old_value and new_value are the names. |
workflow_description | updated | The description changed. The values aren't recorded. |
workflow_is_active | updated | The workflow was activated or deactivated. The values are True or False. |
workflow_state | added | A catalog state was attached to the chain. new_value is its name, and new_identifier is its id. |
workflow_type | updated | A chain state's type changed. The values are transition or approval. |
allow_work_item_creation | enabled, disabled | A chain state's allow_issue_creation changed. |
workflow_default_state | updated | The default state moved. The values are state names, and the identifiers are catalog state ids. |
state_transition | added, updated, removed | A transition was created, retargeted, or deleted. The values and identifiers are target state ids. |
rejected_state | updated | A transition's rejection state changed. The values and identifiers are state ids. |
state_approvers | added, removed | An approver was added to or removed from a transition. The values are display names, and the identifiers are user ids. |
transition_rule | added, updated, removed | A hook was created, updated, or deleted. On create and update, new_value is the handler name. The identifiers hold the hook id. |
Polling for new entries
The feed sorts oldest first. Keep the created_at of the newest entry you have processed and pass it as created_at__gt on the next request to read only what is new. Filter with verb, field, or actor_id to narrow the feed. See List workspace workflow activities.
Endpoints
| Method | Path | Description |
|---|---|---|
GET | /api/v2/workspaces/{slug}/workflows/{workflow_id}/activities/ | List workspace workflow activities |
GET | /api/v2/workspaces/{slug}/workflows/{workflow_id}/activities/{pk}/ | Get a workspace workflow activity |
Response shaping
Both endpoints accept ?fields= for sparse responses. See Sparse fields. Errors follow the shared problem+json contract.
Changed from v1
- The list is paginated. v1 returns the whole feed as one array.
- v2 adds the
verb,field, andactor_idfilters next tocreated_at__gt, and a route to get one entry. - In an ungoverned workspace, both routes return
409 states_managed_at_project. v1 returns400.
See Migrating from v1 for the full list.

