Workflow REST API

The Workflow REST API allows you to create, modify, and execute Workflows and Workflow actions via standard REST API calls.

Endpoint Summary#


MethodEndpointDescription
GET/schemesFind workflow schemes
GET/schemes/{schemeId}/stepsFind steps by workflow scheme
GET/schemes/{schemeId}/actionsFind actions by workflow scheme
GET/schemes/{schemeId}/system/actionsFind system actions by workflow scheme
GET/schemes/schemescontenttypes/{contentTypeId}Find schemes by content type
GET/schemes/{schemeIdOrVariable}/exportExport a workflow scheme
POST/schemes/importImport a workflow scheme
POST/schemesCreate a workflow scheme
POST/schemes/{schemeId}/copyCopy a workflow scheme
PUT/schemes/{schemeId}Update a workflow scheme
DELETE/schemes/{schemeId}Delete a workflow scheme
GET/steps/{stepId}Find a workflow step by ID
GET/steps/{stepId}/actionsFind actions by workflow step
GET/steps/{stepId}/actions/{actionId}Find action by step and action ID
POST/stepsCreate a workflow step
POST/steps/{stepId}/actionsAdd action to a workflow step
PUT/steps/{stepId}Update a workflow step
DELETE/steps/{stepId}Delete a workflow step
DELETE/steps/{stepId}/actions/{actionId}Remove action from step
PUT/reorder/step/{stepId}/order/{order}Reorder steps in scheme
PUT/reorder/steps/{stepId}/actions/{actionId}Reorder actions in step
GET/actions/{actionId}Find action by ID
GET/actions/{actionId}/conditionEvaluate action condition
GET/actions/{actionId}/actionletsFind actionlets by action
POST/actionsCreate a workflow action
POST/actions/separatorAdd separator action
PUT/actions/{actionId}Update a workflow action
DELETE/actions/{actionId}Delete a workflow action
POST/actions/{actionId}/actionletsAdd actionlet to action
DELETE/actionlets/{actionletId}Remove actionlet from action
GET/actionletsFind all actionlets
GET/contentlet/{inode}/actionsFind available actions for contentlet
PUT/actions/{actionId}/fireFire workflow action by ID
PUT/actions/fireFire workflow action by name
PUT/actions/default/fire/{systemAction}Fire default system action
POST/actions/default/fire/{systemAction}Fire system action on multiple contentlets
PATCH/actions/default/fire/{systemAction}Merge and fire system action
POST/contentlet/actions/bulkGet bulk actions for contentlets
PUT/contentlet/actions/bulk/fireFire bulk actions
POST/contentlet/actions/_bulkfireFire bulk actions (streaming)
POST/actions/default/fire/{systemAction}Fire actions by schemes and system action
GET/contenttypes/{contentTypeVarOrId}/system/actionsFind system actions by content type
GET/system/actions/{workflowActionId}Find system actions by action ID
PUT/system/actionsSave system action mapping
DELETE/system/actions/{identifier}Delete system action mapping
GET/defaultactions/contenttype/{contentTypeId}Find default actions by content type
GET/defaultactions/schemesFind default actions by schemes
GET/initialactions/contenttype/{contentTypeId}Find initial actions by content type
GET/status/{contentletInode}Get workflow status for contentlet
POST/tasksGet workflow tasks with filters
GET/tasks/history/comments/{contentletIdentifier}Get workflow history and comments
POST/{contentletId}/commentsCreate a workflow comment

Endpoint Details#


Workflow Schemes#

GET /schemes#

Initializing...

Find workflow schemes, optionally filtered by content type and archive status.

Query Parameters:

  • contentTypeId (optional): Filter by content type identifier
  • showArchived (optional, default: true): Include archived schemes

Example Request:

curl -X GET "http://localhost:8080/api/v1/workflow/schemes?showArchived=false" \
  -H "Authorization: Bearer YOUR_TOKEN"

Example Response:

{
  "entity": [
    {
      "id": "d61a59e1-a49c-46f2-a929-db2b4bfa88b2",
      "name": "System Workflow",
      "description": "Default system workflow",
      "archived": false,
      "mandatory": false,
      "defaultScheme": true,
      "modDate": 1234567890
    }
  ]
}

POST /schemes#

Initializing...

Create a new workflow scheme.

Request Body:

{
  "schemeName": "My Workflow",
  "schemeDescription": "Custom workflow for content approval",
  "schemeArchived": false
}

Example Request:

curl -X POST "http://localhost:8080/api/v1/workflow/schemes" \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "schemeName": "My Workflow",
    "schemeDescription": "Custom workflow for content approval",
    "schemeArchived": false
  }'

PUT /schemes/{schemeId}#

Initializing...

Update an existing workflow scheme.

Path Parameters:

  • schemeId: Identifier of the workflow scheme

Request Body:

{
  "schemeName": "Updated Workflow Name",
  "schemeDescription": "Updated description",
  "schemeArchived": false
}

DELETE /schemes/{schemeId}#

Initializing...

Delete a workflow scheme. The scheme must be archived first.

Note: The response is asynchronous. The endpoint returns immediately, but scheme deletion happens in the background. Verify completion by checking that the scheme no longer appears in GET /schemes.

Path Parameters:

  • schemeId: Identifier of the workflow scheme

Example Request:

curl -X DELETE "http://localhost:8080/api/v1/workflow/schemes/d61a59e1-a49c-46f2-a929-db2b4bfa88b2" \
  -H "Authorization: Bearer YOUR_TOKEN"

Workflow Steps#

GET /schemes/{schemeId}/steps#

Initializing...

Find all steps in a workflow scheme.

Path Parameters:

  • schemeId: Identifier of the workflow scheme

Example Request:

curl -X GET "http://localhost:8080/api/v1/workflow/schemes/d61a59e1-a49c-46f2-a929-db2b4bfa88b2/steps" \
  -H "Authorization: Bearer YOUR_TOKEN"

Example Response:

{
  "entity": [
    {
      "id": "ee24a4cb-2d15-4c98-b1bd-6327126451f3",
      "name": "Draft",
      "schemeId": "d61a59e1-a49c-46f2-a929-db2b4bfa88b2",
      "myOrder": 0,
      "resolved": false,
      "enableEscalation": false
    }
  ]
}

GET /steps/{stepId}/actions#

Initializing...

Find all actions associated with a workflow step.

Path Parameters:

  • stepId: Identifier of the workflow step

Example Request:

curl -X GET "http://localhost:8080/api/v1/workflow/steps/ee24a4cb-2d15-4c98-b1bd-6327126451f3/actions" \
  -H "Authorization: Bearer YOUR_TOKEN"

GET /steps/{stepId}/actions/{actionId}#

Initializing...

Find a specific workflow action by step and action ID.

Path Parameters:

  • stepId: Identifier of the workflow step
  • actionId: Identifier of the workflow action

Example Request:

curl -X GET "http://localhost:8080/api/v1/workflow/steps/ee24a4cb-2d15-4c98-b1bd-6327126451f3/actions/b9d89c80-3d88-4311-8365-187323c96436" \
  -H "Authorization: Bearer YOUR_TOKEN"

POST /steps#

Initializing...

Create a new workflow step.

Request Body:

{
  "schemeId": "d61a59e1-a49c-46f2-a929-db2b4bfa88b2",
  "stepName": "Review",
  "stepResolved": false,
  "enableEscalation": false,
  "escalationTime": "0",
  "escalationAction": null
}

PUT /steps/{stepId}#

Initializing...

Update an existing workflow step.

Path Parameters:

  • stepId: Identifier of the workflow step

Request Body:

{
  "stepName": "Final Review",
  "stepOrder": 1,
  "stepResolved": false,
  "enableEscalation": true,
  "escalationTime": "86400",
  "escalationAction": "action-id-here"
}

Workflow Actions#

GET /actions/{actionId}#

Initializing...

Find a workflow action by ID.

Path Parameters:

  • actionId: Identifier of the workflow action

Example Request:

curl -X GET "http://localhost:8080/api/v1/workflow/actions/b9d89c80-3d88-4311-8365-187323c96436" \
  -H "Authorization: Bearer YOUR_TOKEN"

GET /contentlet/{inode}/actions#

Initializing...

Find available workflow actions for a specific contentlet.

Path Parameters:

  • inode: Inode of the contentlet

Query Parameters:

  • renderMode (optional): EDITING or LISTING (default: EDITING)

Example Request:

curl -X GET "http://localhost:8080/api/v1/workflow/contentlet/abc123def456/actions?renderMode=EDITING" \
  -H "Authorization: Bearer YOUR_TOKEN"

Example Response:

{
  "entity": [
    {
      "id": "b9d89c80-3d88-4311-8365-187323c96436",
      "name": "Publish",
      "schemeId": "d61a59e1-a49c-46f2-a929-db2b4bfa88b2",
      "icon": "publishIcon",
      "assignable": false,
      "commentable": true,
      "showOn": ["LOCKED", "UNLOCKED"]
    }
  ]
}

POST /actions#

Initializing...

Create a new workflow action.

Request Body:

{
  "schemeId": "d61a59e1-a49c-46f2-a929-db2b4bfa88b2",
  "stepId": "ee24a4cb-2d15-4c98-b1bd-6327126451f3",
  "actionName": "Submit for Review",
  "whoCanUse": ["reviewer-role-id"],
  "actionIcon": "submitIcon",
  "actionCommentable": true,
  "showOn": ["UNLOCKED", "NEW"],
  "actionNextStep": "next-step-id",
  "actionNextAssign": "role-id",
  "actionAssignable": true,
  "actionRoleHierarchyForAssign": false,
  "actionCondition": ""
}

showOn valid values: NEW, LOCKED, UNLOCKED, PUBLISHED, UNPUBLISHED, ARCHIVED

actionCondition: An optional Velocity expression evaluated at runtime. The action is only shown if the expression evaluates to true. Leave empty to always show the action.


PUT /actions/{actionId}#

Initializing...

Update an existing workflow action.

Path Parameters:

  • actionId: Identifier of the workflow action

Request Body:

{
  "schemeId": "d61a59e1-a49c-46f2-a929-db2b4bfa88b2",
  "stepId": "ee24a4cb-2d15-4c98-b1bd-6327126451f3",
  "actionName": "Submit for Review",
  "whoCanUse": ["reviewer-role-id"],
  "actionIcon": "submitIcon",
  "actionCommentable": true,
  "showOn": ["UNLOCKED", "NEW"],
  "actionNextStep": "next-step-id",
  "actionNextAssign": "role-id",
  "actionAssignable": true,
  "actionRoleHierarchyForAssign": false,
  "actionCondition": ""
}

showOn valid values: NEW, LOCKED, UNLOCKED, PUBLISHED, UNPUBLISHED, ARCHIVED


POST /steps/{stepId}/actions#

Initializing...

Add an existing action to a workflow step.

Path Parameters:

  • stepId: Identifier of the workflow step

Request Body:

{
  "actionId": "b9d89c80-3d88-4311-8365-187323c96436"
}

Firing Workflow Actions#

PUT /actions/{actionId}/fire#

Initializing...

Fire a workflow action on a contentlet by action ID.

Path Parameters:

  • actionId: Identifier of the workflow action

Query Parameters:

  • inode (optional): Inode of the contentlet
  • identifier (optional): Identifier of the contentlet
  • language (optional, default: -1): Language ID
  • indexPolicy (optional): DEFER, WAIT_FOR, or FORCE

Request Body:

{
  "comments": "Approving this content",
  "assign": "user-id-or-role",
  "contentlet": {
    "stInode": "content-type-inode",
    "name": "My Content",
    "title": "Updated Title"
  }
}

Note: stInode is the content type inode — required when creating new content. name is used to identify the content in workflow history.

Example Request:

curl -X PUT "http://localhost:8080/api/v1/workflow/actions/b9d89c80-3d88-4311-8365-187323c96436/fire?identifier=abc123" \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "comments": "Publishing this content",
    "assign": "reviewer-role"
  }'

PUT /actions/fire#

Initializing...

Fire a workflow action by name.

Query Parameters:

  • inode (optional): Inode of the contentlet
  • identifier (optional): Identifier of the contentlet
  • language (optional, default: -1): Language ID
  • indexPolicy (optional): Index policy

Request Body:

{
  "actionName": "Publish",
  "comments": "Ready for publication",
  "contentlet": {
    "stInode": "content-type-inode",
    "name": "My Content",
    "identifier": "abc123",
    "title": "My Content"
  }
}

Note: stInode is the content type inode — required when creating new content via this endpoint. name appears in workflow history to identify the item.


PUT /actions/default/fire/{systemAction}#

Initializing...

Fire a default system action on a contentlet.

Path Parameters:

  • systemAction: One of NEW, EDIT, PUBLISH, UNPUBLISH, ARCHIVE, UNARCHIVE, DELETE, DESTROY

Query Parameters:

  • inode (optional): Inode of the contentlet
  • identifier (optional): Identifier of the contentlet
  • language (optional, default: -1): Language ID
  • indexPolicy (optional): Index policy

Request Body:

{
  "comments": "Publishing via system action",
  "contentlet": {
    "identifier": "abc123"
  }
}

Example Request:

curl -X PUT "http://localhost:8080/api/v1/workflow/actions/default/fire/PUBLISH?identifier=abc123" \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "comments": "Auto-publishing"
  }'

Bulk Operations#

POST /contentlet/actions/bulk#

Initializing...

Get available bulk actions for multiple contentlets.

Request Body:

{
  "contentletIds": [
    "651a4dc8-2124-45d8-8bd2-d8e68ad358a8",
    "f8d60f79-e006-42e0-894f-5d3488b796f6"
  ]
}

or

{
  "query": "+contentType:Blog"
}

PUT /contentlet/actions/bulk/fire#

Initializing...

Fire a workflow action on multiple contentlets.

Request Body:

{
  "query": "+contentType:Blog +working:true",
  "workflowActionId": "b9d89c80-3d88-4311-8365-187323c96436",
  "additionalParams": {
    "comments": "Bulk publishing blogs",
    "assign": "editor-role"
  }
}

Example Request:

curl -X PUT "http://localhost:8080/api/v1/workflow/contentlet/actions/bulk/fire" \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "contentletIds": ["id1", "id2", "id3"],
    "workflowActionId": "b9d89c80-3d88-4311-8365-187323c96436",
    "additionalParams": {
      "comments": "Bulk approval"
    }
  }'

System Actions#

GET /system/actions/{workflowActionId}#

Initializing...

Find system actions associated with a workflow action.

Path Parameters:

  • workflowActionId: Identifier of the workflow action

PUT /system/actions#

Initializing...

Save a system action mapping.

Request Body:

{
  "systemAction": "PUBLISH",
  "actionId": "b9d89c80-3d88-4311-8365-187323c96436",
  "schemeId": "d61a59e1-a49c-46f2-a929-db2b4bfa88b2"
}

or for content type mapping:

{
  "systemAction": "NEW",
  "actionId": "action-id-here",
  "contentTypeVariable": "Blog"
}

DELETE /system/actions/{identifier}#

Initializing...

Delete a system action mapping.

Path Parameters:

  • identifier: Identifier of the system action mapping

Workflow Status and Tasks#

GET /status/{contentletInode}#

Initializing...

Get the current workflow status of a contentlet.

Path Parameters:

  • contentletInode: Inode of the contentlet

Example Request:

curl -X GET "http://localhost:8080/api/v1/workflow/status/abc123def456" \
  -H "Authorization: Bearer YOUR_TOKEN"

Example Response:

{
  "entity": {
    "scheme": {
      "id": "d61a59e1-a49c-46f2-a929-db2b4bfa88b2",
      "name": "System Workflow"
    },
    "step": {
      "id": "ee24a4cb-2d15-4c98-b1bd-6327126451f3",
      "name": "Draft"
    },
    "task": {
      "id": "task-id",
      "assignedTo": "user-id",
      "createdBy": "creator-id",
      "status": "open"
    }
  }
}

POST /tasks#

Initializing...

Search for workflow tasks with filters.

Request Body:

{
  "assignedTo": "user-id",
  "keywords": "review",
  "showCompleted": false,
  "page": 0,
  "perPage": 20,
  "orderBy": "modDate desc"
}

GET /tasks/history/comments/{contentletIdentifier}#

Initializing...

Get workflow history and comments for a contentlet.

Path Parameters:

  • contentletIdentifier: Identifier of the contentlet

Query Parameters:

  • language (optional, default: -1): Language ID

Example Request:

curl -X GET "http://localhost:8080/api/v1/workflow/tasks/history/comments/abc123?language=1" \
  -H "Authorization: Bearer YOUR_TOKEN"

POST /{contentletId}/comments#

Initializing...

Add a comment to a contentlet's workflow task.

Path Parameters:

  • contentletId: Identifier of the contentlet

Query Parameters:

  • language (optional, default: -1): Language ID

Request Body:

{
  "comment": "This looks good, approved for publication"
}

Import/Export#

GET /schemes/{schemeIdOrVariable}/export#

Initializing...

Export a workflow scheme with all dependencies.

Path Parameters:

  • schemeIdOrVariable: ID or variable name of the scheme

Example Request:

curl -X GET "http://localhost:8080/api/v1/workflow/schemes/d61a59e1-a49c-46f2-a929-db2b4bfa88b2/export" \
  -H "Authorization: Bearer YOUR_TOKEN" > workflow-export.json

POST /schemes/import#

Initializing...

Import a workflow scheme.

Request Body: The full entity object from an export, containing workflowObject and permissions properties.

Example Request:

curl -X POST "http://localhost:8080/api/v1/workflow/schemes/import" \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d @workflow-export.json

Common Patterns#


Working with Multipart Forms#

Some endpoints support multipart form data for uploading binary files with content:

curl -X PUT "http://localhost:8080/api/v1/workflow/actions/fire?identifier=abc123" \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -F "actionName=Publish" \
  -F "comments=Publishing with image" \
  -F "contentlet={\"title\":\"My Page\"};type=application/json" \
  -F "binary1=@/path/to/image.jpg"

Index Policies#

Control how content is indexed after workflow operations:

  • DEFER (default): Async indexing, operation completes before content appears in search
  • WAIT_FOR: Operation waits for content to be indexed
  • FORCE: Immediate indexing (not recommended for production)

Push Publishing Parameters#

When using push publishing actionlets, include these parameters:

{
  "whereToSend": "environment-id",
  "iWantTo": "publish",
  "publishDate": "2024-12-31",
  "publishTime": "23:59",
  "timezoneId": "America/New_York",
  "filterKey": "filter-key-here"
}

Error Handling#


All endpoints return errors in a consistent format:

{
  "errors": [
    {
      "errorCode": "ERROR_CODE",
      "message": "Human readable error message",
      "fieldName": "fieldName"
    }
  ]
}

Common error scenarios:

  • 401: User not authenticated
  • 403: User lacks permissions for the operation
  • 404: Workflow scheme, step, action, or contentlet not found
  • 400: Invalid request parameters or body