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

{}