Core Workflow¶
Note
Core Workflows are different from triggers: they control the ticket create/edit form while someone fills it out, for example by restricting which values are selectable in another field. The form sends its current values to Zammad, which evaluates the workflows and returns the resulting field changes. Unlike triggers, they don’t act on existing tickets in the background.
See the Core Workflows admin documentation
for the conceptual/UI-side picture of this feature, and
Core Workflows limitations
for how they can restrict attributes/values you see elsewhere in the API.
Compare to Report Profile, whose condition
field, unlike Core Workflow, does validate that referenced fields are real.
List¶
Required permission: admin.core_workflow
GET-Request sent: /api/v1/core_workflows
Response:
# HTTP-Code 200 Ok
[
{
"id": 11,
"name": "Restrict priority for incidents",
"object": "Ticket",
"preferences": {},
"condition_saved": {},
"condition_selected": {
"ticket.type": {
"operator": "is",
"value": ["Incident"]
}
},
"perform": {
"ticket.state_id": {
"operator": "set_fixed_to",
"set_fixed_to": ["new", "open"]
}
},
"active": true,
"stop_after_match": false,
"changeable": true,
"priority": 100,
"updated_by_id": 3,
"created_by_id": 3,
"created_at": "2026-09-24T12:32:01.736Z",
"updated_at": "2026-09-24T12:32:01.736Z"
}
]
Note
This endpoint only returns workflows with changeable: true.
Zammad’s built-in system workflows are not changeable and are not
included, so the response on a fresh instance is an empty array.
Show, Update and Delete also only operate on changeable workflows.
Show¶
Required permission: admin.core_workflow
GET-Request sent: /api/v1/core_workflows/{id}
Response:
# HTTP-Code 200 Ok
{
"id": 11,
"name": "Restrict priority for incidents",
"object": "Ticket",
"preferences": {},
"condition_saved": {},
"condition_selected": {
"ticket.type": {
"operator": "is",
"value": ["Incident"]
}
},
"perform": {
"ticket.state_id": {
"operator": "set_fixed_to",
"set_fixed_to": ["new", "open"]
}
},
"active": true,
"stop_after_match": false,
"changeable": true,
"priority": 100,
"updated_by_id": 3,
"created_by_id": 3,
"created_at": "2026-09-24T12:32:01.736Z",
"updated_at": "2026-09-24T12:32:01.736Z"
}
Create¶
Required permission: admin.core_workflow
POST-Request sent: /api/v1/core_workflows
{
"name": "Restrict priority for incidents",
"object": "Ticket",
"condition_saved": {},
"condition_selected": {
"ticket.type": {
"operator": "is",
"value": ["Incident"]
}
},
"perform": {
"ticket.state_id": {
"operator": "set_fixed_to",
"set_fixed_to": ["new", "open"]
}
},
"active": true,
"stop_after_match": false,
"changeable": true,
"priority": 100
}
Response:
# HTTP-Code 201 Created
{
"id": 11,
"name": "Restrict priority for incidents",
"object": "Ticket",
"preferences": {},
"condition_saved": {},
"condition_selected": {
"ticket.type": {
"operator": "is",
"value": ["Incident"]
}
},
"perform": {
"ticket.state_id": {
"operator": "set_fixed_to",
"set_fixed_to": ["new", "open"]
}
},
"active": true,
"stop_after_match": false,
"changeable": true,
"priority": 100,
"updated_by_id": 3,
"created_by_id": 3,
"created_at": "2026-09-24T12:32:01.736Z",
"updated_at": "2026-09-24T12:32:01.736Z"
}
Note
Core Workflow does not validate that fields referenced in
condition_selected or perform exist. A workflow that references
a field that doesn’t exist yet is saved without error. It has no
visible effect in the ticket form until the referenced field exists.
Update¶
Required permission: admin.core_workflow
PUT-Request sent: /api/v1/core_workflows/{id}
Same payload shape as Create above. Response is the updated record, same shape as Show/Create.
Note
Sending the full Create payload to an existing workflow’s id
updates that record in place. It doesn’t create a duplicate.
Delete¶
Required permission: admin.core_workflow
Danger
This is a permanent removal
Please note that removing core workflows cannot be undone.
DELETE-Request sent: /api/v1/core_workflows/{id}
Response:
# HTTP-Code 200 Ok
{}