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#
| Method | Endpoint | Description |
|---|---|---|
| GET | /schemes | Find workflow schemes |
| GET | /schemes/{schemeId}/steps | Find steps by workflow scheme |
| GET | /schemes/{schemeId}/actions | Find actions by workflow scheme |
| GET | /schemes/{schemeId}/system/actions | Find system actions by workflow scheme |
| GET | /schemes/schemescontenttypes/{contentTypeId} | Find schemes by content type |
| GET | /schemes/{schemeIdOrVariable}/export | Export a workflow scheme |
| POST | /schemes/import | Import a workflow scheme |
| POST | /schemes | Create a workflow scheme |
| POST | /schemes/{schemeId}/copy | Copy 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}/actions | Find actions by workflow step |
| GET | /steps/{stepId}/actions/{actionId} | Find action by step and action ID |
| POST | /steps | Create a workflow step |
| POST | /steps/{stepId}/actions | Add 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}/condition | Evaluate action condition |
| GET | /actions/{actionId}/actionlets | Find actionlets by action |
| POST | /actions | Create a workflow action |
| POST | /actions/separator | Add separator action |
| PUT | /actions/{actionId} | Update a workflow action |
| DELETE | /actions/{actionId} | Delete a workflow action |
| POST | /actions/{actionId}/actionlets | Add actionlet to action |
| DELETE | /actionlets/{actionletId} | Remove actionlet from action |
| GET | /actionlets | Find all actionlets |
| GET | /contentlet/{inode}/actions | Find available actions for contentlet |
| PUT | /actions/{actionId}/fire | Fire workflow action by ID |
| PUT | /actions/fire | Fire 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/bulk | Get bulk actions for contentlets |
| PUT | /contentlet/actions/bulk/fire | Fire bulk actions |
| POST | /contentlet/actions/_bulkfire | Fire bulk actions (streaming) |
| POST | /actions/default/fire/{systemAction} | Fire actions by schemes and system action |
| GET | /contenttypes/{contentTypeVarOrId}/system/actions | Find system actions by content type |
| GET | /system/actions/{workflowActionId} | Find system actions by action ID |
| PUT | /system/actions | Save system action mapping |
| DELETE | /system/actions/{identifier} | Delete system action mapping |
| GET | /defaultactions/contenttype/{contentTypeId} | Find default actions by content type |
| GET | /defaultactions/schemes | Find default actions by schemes |
| GET | /initialactions/contenttype/{contentTypeId} | Find initial actions by content type |
| GET | /status/{contentletInode} | Get workflow status for contentlet |
| POST | /tasks | Get workflow tasks with filters |
| GET | /tasks/history/comments/{contentletIdentifier} | Get workflow history and comments |
| POST | /{contentletId}/comments | Create a workflow comment |
Endpoint Details#
Workflow Schemes#
GET /schemes#
Find workflow schemes, optionally filtered by content type and archive status.
Query Parameters:
contentTypeId(optional): Filter by content type identifiershowArchived(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#
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}#
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}#
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#
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#
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}#
Find a specific workflow action by step and action ID.
Path Parameters:
stepId: Identifier of the workflow stepactionId: 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#
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}#
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}#
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#
Find available workflow actions for a specific contentlet.
Path Parameters:
inode: Inode of the contentlet
Query Parameters:
renderMode(optional):EDITINGorLISTING(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#
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}#
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#
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#
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 contentletidentifier(optional): Identifier of the contentletlanguage(optional, default:-1): Language IDindexPolicy(optional):DEFER,WAIT_FOR, orFORCE
Request Body:
{
"comments": "Approving this content",
"assign": "user-id-or-role",
"contentlet": {
"stInode": "content-type-inode",
"name": "My Content",
"title": "Updated Title"
}
}Note:
stInodeis the content type inode — required when creating new content.nameis 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#
Fire a workflow action by name.
Query Parameters:
inode(optional): Inode of the contentletidentifier(optional): Identifier of the contentletlanguage(optional, default:-1): Language IDindexPolicy(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:
stInodeis the content type inode — required when creating new content via this endpoint.nameappears in workflow history to identify the item.
PUT /actions/default/fire/{systemAction}#
Fire a default system action on a contentlet.
Path Parameters:
systemAction: One ofNEW,EDIT,PUBLISH,UNPUBLISH,ARCHIVE,UNARCHIVE,DELETE,DESTROY
Query Parameters:
inode(optional): Inode of the contentletidentifier(optional): Identifier of the contentletlanguage(optional, default:-1): Language IDindexPolicy(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#
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#
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}#
Find system actions associated with a workflow action.
Path Parameters:
workflowActionId: Identifier of the workflow action
PUT /system/actions#
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}#
Delete a system action mapping.
Path Parameters:
identifier: Identifier of the system action mapping
Workflow Status and Tasks#
GET /status/{contentletInode}#
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#
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}#
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#
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#
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.jsonPOST /schemes/import#
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.jsonCommon 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