Migrate to the Orchestration cluster API
This document offers a comprehensive guide to migrate from Camunda's V1 component REST APIs (the Tasklist REST API, for example) to the V2 Orchestration cluster REST API.
Camunda is streamlining the developer experience by creating a unified REST API for Zeebe, Operate, Tasklist, and the Identity components with endpoint parity. This will be a single REST API for the orchestration cluster for a consistent and intuitive API experience to help your teams develop process automation solutions faster.
The Administration and Web Modeler APIs will not be part of the Orchestration cluster REST API, as these are platform APIs outside the cluster’s scope.
Over time, there will be a deprecation process for the individual component APIs starting with the former Operate and Tasklist APIs. These will continue to be in the product for the short-term, but it is recommended to begin the adoption of the new API. In addition, we will begin to deprecate several Zeebe gPRC endpoints as well. See the official blog announcement.
This guide considers all public endpoints existing in the component REST APIs and the Orchestration cluster API counterparts or required migration changes.
General endpoint changes
- All endpoints
- Endpoints querying for data
- The new API can be found at
<cluster>/v2/…>instead of<cluster>/v1/…>. - All endpoints are no longer separated by component concerns and all endpoints receive similar support. For example, process definitions, user tasks, and user authorizations were previously spread across separate Tasklist, Operate, and Identity APIs.
- Naming, response codes, and type handling have been streamlined for all endpoints to provide a consistent UX.
- Endpoints with similar concerns (variable search, for example) have been consolidated into single endpoints.
- The request and response payload of every new endpoint might contain new attributes that are not necessarily needed for a migration from a V1 endpoint to V2 but might still be useful. Please consult the V2 API guides for access to all new attributes.
- Unified search request structure.
- Attributes
filter,page, andsorton root level. - Endpoint-specific filter attributes in the filter object, not at the root level.
- Pagination information in the
pageobject. For example, the attributesfrom,limit,before, andafter. - Sorting configuration in sort object array, each object containing the field name and order (descending or ascending).
- Attributes
- Unified search response structure.
- Attributes
itemsandpageon root level. - List of endpoint-specific response items in
itemsattribute. - Page information in
pageattribute, for example the attributestotalItems,startCursor, andendCursorto use inbeforeandafterin follow-up requests.
- Attributes
Name changes and mappings
The following conventions apply to all attributes:
keyandidfields contain the entity as a prefix, for example,userTaskKey,processDefinitionId. This applies when referencing other resources likeformKeyin the user task entity, in the respective entities themselves likeuserTaskKeyin the user task entity.- The full entity is the prefix to avoid confusion, for example
processDefinitionKeyinstead ofprocessKey(the latter could be interpreted as process instance or process definition). - Other attributes of entities themselves have no prefix to avoid clutter, for example version in the process definition entity. In other resources, they have to be referenced with a prefix, like
processDefinitionVersionin the process instance entity. - The
bpmnProcessIdandprocessNameare now calledprocessDefinitionIdto be easily relatable to the process definition entity, like theprocessDefinitionKey. - The
decisionKeyanddmnDecisionKeyare now aligned todecisionDefinitionKey, thedecisionIdanddmnDecisionIdtodecisionDefinitionId. Similar to theprocessDefinitionIdbeing related to the process definition, those attributes are now easily relatable to the decision definition entity.
Tasklist API
Form
Get a form
- V1 endpoint:
GET /v1/forms/{formId} - V2 endpoints:
- Input adjustments
- Output adjustments
- You cannot fetch forms directly anymore. Instead, fetch them by user task or process definition to get the respective form data.
- The respective endpoint only takes the key of the resource the form is related to as input parameter.
- Embedded forms are no longer returned as Camunda user tasks don't support them.
- Renamed atttibutes
id- UseformKeyas this refers to the unique system identifier of the form.title- UseformIdas this aligns better with the attribute defined in the form schema.
- Removed attributes
isDeleted- The endpoint does not serve this information anymore.processDefinitionKey- You can identify the related entity from the endpoint resource and the provided key parameter, the form response does not contain it additionally anymore.
Task
Save task draft variables
- V1 endpoint:
POST /v1/tasks/{taskId}/variables - V2 endpoint: This feature is not supported in V2 anymore. Use setting variables as
localto the user task'selementInstanceKeyas a replacement.
Search task variables
- V1 endpoint:
POST /v1/tasks/{taskId}/variables/search - V2 endpoint:
POST /v2/user-tasks/{userTaskKey}/variables/search
- Input adjustments
- Output adjustments
- Request structure changes as outlined in general changes.
- Renamed attributes
variableNames- Use thefilterobject'sname, either with a plain string for one exact match or with{ "$in": [ "xyz", ... ]}.
- Removed attributes
includeVariables- The endpoint returns all variables associated with the user task.
- Response structure changes as outlined in general changes.
- Renamed attributes
id- UsevariableKeyas this refers to the unique system identifier of the variable.previewValue- Usevalueas this always represents the variable value. This can be a truncated value due to size constraints.isValueTruncated- UseisTruncatedas a replacement. If the value ofisTruncatedistrueand you need the full value, please see the get a variable endpoint.
- Removed attributes
draft- Draft variables are not supported in V2 anymore, see also the save draft variables endpoint for further details.
Search tasks
- V1 endpoint:
POST /v1/tasks/search - V2 endpoint:
POST /v2/user-tasks/search
- Input adjustments
- Output adjustments
- Request structure changes as outlined in general changes.
- The
pageSizeis now thelimitin thepageobject. - The
searchAfterandsearchBeforeare in thepageobject asafterandbefore. - The
searchAfterOrEqualandsearchBeforeOrEqualoptions do not exist.
- The
- Renamed attributes
taskDefinitionId- UseelementIdas this refers to the user-provided identifier of the BPMN element that created the user task.followUpDateanddueDatefilter options - Instead offromandto, use$gteand$lte. Additionally, you can use new comparison filter options.priorityfilter options - Filter object keys need a$prefix. Additionally, you can use new comparison filter options like$neq,$exists, and$in.assigned- Useassigneewith{ "$exists": false }. Multiple filters can be combined in one attribute.assignees- Useassigneewith{ "$in": [ "xyz", ... ] }. Multiple filters can be combined in one attribute.candidateGroups- UsecandidateGroupwith{ "$in": [ "xyz", ... ] }.candidateUsers- UsecandidateUserwith{ "$in": [ "xyz", ... ] }.taskVariablessplit up and renamed- You can define
localVariablesandprocessInstanceVariables. - Local variables match the defined
nameandvalueand exist in the local scope of the BPMN element instance that created the user task. - Process instance variables match the defined
nameandvalueand exist anywhere in the process instance that the user task belongs to.
- You can define
tenantIds- UsetenantIdwith{ "$in": [ "xyz", ... ] }.
- Removed attributes
includeVariables- The endpoint does not return variables. Use the search task variables endpoint to retrieve them.implementation- The V2 API supports only Camunda user tasks.
- Response structure changes as outlined in general changes.
sortValuesdo not exist per result item. Instead, thepageobject containsstartCursorandendCursor, referring to thesortValuesof the first and last item of the result set.
- Renamed attributes
id- UseuserTaskKey, this still refers to the unique system identifier of the user task.formKey- This now is a unique system identifier, referencing a linked Camunda form in a specific version. Previously, this encoded an embedded form, a linked Camunda form, or an external form reference.taskDefinitionId- UseelementId, this still refers to the user-provided identifier of the BPMN element that created the user task.taskState- Usestate, this still refers to the user task's current state.processName- UseprocessDefinitionId, this still refers to the user-provided identifier of the process.
- Removed attributes
isFirst- This used to identify if the task was the first in the process.variables- Use the search user task variables endpoint to retrieve variables for a user task.implementation- The V2 API supports only Camunda user tasks.isFormEmbedded- The V2 API does not support embedded forms anymore.formVersion- Use the [get user task form endpoint][] to retrieve form data bound to this user task. TheformKeyreferences the form of a specificformId, linked to this user task in a specific version.formId- Use the [get user task form endpoint][] to retrieve form data bound to this user task. TheformKeyreferences the form of a specificformId, linked to this user task in a specific version.
Unassign a task
- V1 endpoint:
PATCH /v1/tasks/{taskId}/unassign - V2 endpoint:
DELETE /v2/user-tasks/{userTaskKey}/assignee
- Input adjustments
- Output adjustments
- No input adjustments.
- Response object removed - The V2 API returns a 204 status, indicating that the task was unassigned. Fetching the updated data of the user task should be done through the respective API since the data can change concurrently at any time.
Complete a task
- V1 endpoint:
PATCH /v1/tasks/{taskId}/complete - V2 endpoint:
POST /v2/user-tasks/{userTaskKey}/completion
- Input adjustments
- Output adjustments
- Adjusted attributes
variables- Provide the variables as a proper JSON object instead of an array of objects with anameand a serialized JSON stringvalue.
- Response object removed - The V2 API returns a 204 status, indicating that the task was completed. Fetching the updated data of the user task should be done through the respective API since the data can change concurrently at any time.
Assign a task
- V1 endpoint:
PATCH /v1/tasks/{taskId}/assign - V2 endpoint:
POST /v2/user-tasks/{userTaskKey}/assignment
- Input adjustments
- Output adjustments
- Renamed attributes
allowOverrideAssignment- UseallowOverride, this still refers to allowing to override any existing assignee.
- Response object removed - The V2 API returns a 204 status, indicating that the task was assigned. Fetching the updated data of the user task should be done through the respective API since the data can change concurrently at any time.
Get a task
- V1 endpoint:
GET /v1/tasks/{taskId} - V2 endpoint:
GET /v2/user-tasks/{userTaskKey}
- Input adjustments
- Output adjustments
- No input adjustments.
- Except for the response structure changes, all adjustments from search tasks apply.
Variables
Get a variable
- V1 endpoint:
GET /v1/variables/{variableId} - V2 endpoint:
GET /v2/variables/{variableKey}
- Input adjustments
- Output adjustments
variableId- UsevariableKeyas this refers to the unique system identifier of the variable.
- Renamed attributes
id- UsevariableKeyas this refers to the unique system identifier of the variable.
- Removed attributes
draft- Draft variables are not supported in V2 anymore, see also the save draft variables endpoint for further details.
Operate API
Decision definition
Search decision definitions
- V1 endpoint:
POST /v1/decision-definitions/search - V2 endpoint:
POST /v2/decision-definitions/search
- Input adjustments
- Output adjustments
- Request structure changes as outlined in general changes.
searchAfteris now theafterin thepageobject.sizeis now thelimitin thepageobject.
- Renamed attributes in the
filterobjectid- UsedecisionDefinitionKeyinstead.keyof typeint64- UsedecisionDefinitionKeyof typestring.decisionId- UsedecisionDefinitionIdinstead.decisionRequirementsKeyof typeint64- This is now of typestring.
- Removed attributes from the
filterobjectdecisionRequirementsName- Can no longer be used for filtering.decisionRequirementsVersion- Can no longer be used for filtering.
- Response structure changes as outlined in general changes.
totalis moved under thepageobject astotalItems.sortValues- UseendCursorin thepageobject instead.
- Renamed attributes in the objects of the
itemsarrayid- UsedecisionDefinitionKeyinstead.keyof typeint64- UsedecisionDefinitionKeyof typestring.decisionId- UsedecisionDefinitionIdinstead.decisionRequirementsKeyof typeint64- This is now of typestring.
- Removed attributes in the objects of the
itemsarraydecisionRequirementsName- Can be fetched using the get decision requirements endpoint withdecisionRequirementsKey.decisionRequirementsVersion- Can be fetched using the get decision requirements endpoint withdecisionRequirementsKey.
Get decision definition by key
- V1 endpoint:
GET /v1/decision-definitions/{key} - V2 endpoint:
GET /v2/decision-definitions/{decisionDefinitionKey}
- Input adjustments
- Output adjustments
- No input adjustments.
- Except for the response structure changes, all adjustments from search decision definitions apply.
Search decision instances
- V1 endpoint:
POST /v1/decision-instances/search - V2 endpoint:
POST /v2/decision-instances/search
- Input adjustments
- Output adjustments
- Request structure changes as outlined in general changes.
searchAfteris now theafterin thepageobject.sizeis now thelimitin thepageobject.
- Renamed attributes in the
filterobjectid- UsedecisionInstanceIdinstead.keyof typeint64- UsedecisionInstanceKeyof typestring.processDefinitionKeyof typeint64- This is now of typestring.processInstanceKeyof typeint64- This is now of typestring.decisionId- UsedecisionDefinitionIdinstead.decisionName- UsedecisionDefinitionNameinstead.decisionVersion- UsedecisionDefinitionVersioninstead.decisionType- UsedecisionDefinitionTypeinstead.
- Removed attributes in the
filterobjectresult- Can no longer be used for filtering.evaluatedInputs- Can no longer be used for filtering.evaluatedOutputs- Can no longer be used for filtering.
- Response structure changes as outlined in general changes.
totalis moved under thepageobject astotalItems.sortValues- UseendCursorin thepageobject instead.
- Renamed attributes in the objects of the
itemsarrayid- UsedecisionInstanceIdinstead.keyof typeint64- UsedecisionInstanceKeyof typestring.processDefinitionKeyof typeint64- This is now of typestring.processInstanceKeyof typeint64- This is now of typestring.decisionId- UsedecisionDefinitionIdinstead.decisionName- UsedecisionDefinitionNameinstead.decisionVersion- UsedecisionDefinitionVersioninstead.decisionType- UsedecisionDefinitionTypeinstead.
- Removed attributes in the objects of the
itemsarrayevaluatedInputs- The endpoint does not serve this information anymore.evaluatedOutputs- The endpoint does not serve this information anymore.
Get decision instance by id
- V1 endpoint:
GET /v1/decision-instances/{id} - V2 endpoint:
GET /v2/decision-instances/{decisionInstanceId}
- Input adjustments
- Output adjustments
- No input adjustments.
- The adjustments from search decision instances apply, with the following exceptions:
- Response structure changes.
evaluatedInputs- Present in the response payload.evaluatedOutputs- Present in the response payload and moved undermatchedRules.
- Renamed attributes in the
evaluatedInputsobjectid- UseinputIdinstead.name- UseinputNameinstead.value- UseinputValueinstead.
- Renamed attributes in the
evaluatedOutputsobjectid- UseoutputIdinstead.name- UseoutputNameinstead.value- UseoutputValueinstead.ruleId- Moved under the objects of thematchedRulesarray.ruleIndex- Moved under the objects of thematchedRulesarray.
Search decision requirements
- V1 endpoint:
POST /v1/drd/search - V2 endpoint:
POST /v2/decision-requirements/search
- Input adjustments
- Output adjustments
- Request structure changes as outlined in general changes.
searchAfteris now theafterin thepageobject.sizeis now thelimitin thepageobject.
- Renamed attributes in the
filterobjectid- UsedecisionRequirementsKeyinstead.keyof typeint64- UsedecisionRequirementsKeyof typestring.name- UsedecisionRequirementsNameinstead.
- Response structure changes as outlined in general changes.
totalis moved under thepageobject astotalItems.sortValues- UseendCursorin thepageobject instead.
- Renamed attributes in the objects of the
itemsarrayid- UsedecisionRequirementsKeyinstead.keyof typeint64- UsedecisionRequirementsKeyof typestring.name- UsedecisionRequirementsNameinstead.
Get decision requirements by key
- V1 endpoint:
GET /v1/drd/{key} - V2 endpoint:
GET /v2/decision-requirements/{decisionRequirementsKey}
- Input adjustments
- Output adjustments
- No input adjustments.
- Except for the response structure changes, all adjustments from search decision requirements apply.
Get decision requirements as XML by key
- V1 endpoint:
GET /v1/drd/{key}/xml - V2 endpoint:
GET /v2/decision-requirements/{decisionRequirementsKey}/xml
- Input adjustments
- Output adjustments
- No input adjustments.
- No output adjustments.
Variable
Search variables for process instances
- V1 endpoint:
POST /v1/variables/search - V2 endpoint:
POST /v2/variables/search
- Input adjustments
- Output adjustments
- Response structure changes as outlined in general changes.
searchAfteris now theafterin thepageobject.sizeis now thelimitin thepageobject.
- Renamed attributes in the
filterobjectkeyof typeint64- UsevariableKeyof typestring.processInstanceKeyof typeint64- This is now of typestring.scopeKeyof typeint64- This is now of typestring.truncated- UseisTruncatedinstead.
- Response structure changes as outlined in general changes.
totalis moved under thepageobject astotalItems.sortValues- UseendCursorin thepageobject instead.
- Renamed attributes in the objects of the
itemsarraykeyof typeint64- UsevariableKeyof typestring.processInstanceKeyof typeint64- This is now of typestring.scopeKeyof typeint64- This is now of typestring.truncated- UseisTruncatedinstead.
Get variable by key
- V1 endpoint:
GET /v1/variables/{key} - V2 endpoint:
GET /v2/variables/{variableKey}
- Input adjustments
- Output adjustments
- No input adjustments.
- All adjustments from search variables for process instances apply, with the following exceptions:
- Response structure changes.
truncatedis removed because this endpoint always returns the full variable value.
Process definition
Search process definitions
- V1 endpoint:
POST /v1/process-definitions/search - V2 endpoint:
POST /v2/process-definitions/search
- Input adjustments
- Output adjustments
- Request structure changes as outlined in general changes.
searchAfteris now theafterin thepageobject.sizeis now thelimitin thepageobject.
- Renamed attributes in the
filterobjectkeyof typeint64- UseprocessDefinitionKeyof typestringinstead.bpmnProcessId- UseprocessDefinitionIdinstead.
- Response structure changes as outlined in general changes.
totalis moved under thepageobject astotalItems.sortValues- UseendCursorin thepageobject instead.
- Renamed attributes in the objects of the
itemsarraykeyof typeint64- UseprocessDefinitionKeyof typestringinstead.bpmnProcessId- UseprocessDefinitionIdinstead.
Get process definition by key
- V1 endpoint:
GET /v1/process-definitions/{key} - V2 endpoint:
GET /v2/process-definitions/{processDefinitionKey}
- Input adjustments
- Output adjustments
- No input adjustments.
- Except for the response structure changes, all adjustments from search process definitions apply.
Get process definition as XML by key
- V1 endpoint:
GET /v1/process-definitions/{key}/xml - V2 endpoint:
GET /v2/process-definitions/{processDefinitionKey}/xml
- Input adjustments
- Output adjustments
- No input adjustments.
- No output adjustments.
Process instance
Search process instances
- V1 endpoint:
POST /v1/process-instances/search - V2 endpoint:
POST /v2/process-instances/search
- Input adjustments
- Output adjustments
- Request structure changes as outlined in general changes.
searchAfteris now theafterin thepageobject.sizeis now thelimitin thepageobject.
- Renamed attributes in the
filterobjectkeyof typeint64- UseprocessInstanceKeyof typestringinstead.processVersion- UseprocessDefinitionVersioninstead.processVersionTag- UseprocessDefinitionVersionTaginstead.bpmnProcessId- UseprocessDefinitionIdinstead.parentFlowNodeInstanceKey- UseparentElementInstanceKeyof typestringinstead.parentKey- UseparentProcessInstanceKeyof typestringinstead.state- Use valueTERMINATEDinstead of valueCANCELED.incident- UsehasIncidentinstead.
- Adjusted attributes in the
filterobjectparentProcessInstanceKey- Type changed fromint64tostring.processDefinitionKey- Type changed fromint64tostring.
- Response structure changes as outlined in general changes.
totalis moved under thepageobject astotalItems.sortValues- UseendCursorin thepageobject instead.
- Renamed attributes in the objects of the
itemsarraykeyof typeint64- UseprocessInstanceKeyof typestringinstead.processVersion- UseprocessDefinitionVersioninstead.processVersionTag- UseprocessDefinitionVersionTaginstead.bpmnProcessId- UseprocessDefinitionIdinstead.parentFlowNodeInstanceKey- UseparentElementInstanceKeyof typestringinstead.parentKey- UseparentProcessInstanceKeyof typestringinstead.state- Use valueTERMINATEDinstead of valueCANCELED.incident- UsehasIncidentinstead.
- Adjusted attributes in the objects of the
itemsarrayparentProcessInstanceKey- Type changed fromint64tostring.processDefinitionKey- Type changed fromint64tostring.
Get process instance by key
- V1 endpoint:
GET /v1/process-instances/{key} - V2 endpoint:
GET /v2/process-instances/{processInstanceKey}
- Input adjustments
- Output adjustments
- No input adjustments.
- Except for the response structure changes, all adjustments from search process instances apply.
Delete process instance and all dependant data by key
- V1 endpoint:
DELETE /v1/process-instances/{key} - V2 endpoint: This feature is not yet available in V2. It will be added in a future version.
Get flow node statistic by process instance key
- V1 endpoint:
GET /v1/process-instances/{key}/statistics - V2 endpoint:
GET /v2/process-instances/{processInstanceKey}/statistics/element-instances
- Input adjustments
- Output adjustments
- No input adjustments.
- Response structure changes
- response items are moved under the
itemsarray.
- response items are moved under the
- Renamed attributes in the objects of the
itemsarrayactivityId- UseelementIdinstead.
Get sequence flows of process instance by key
- V1 endpoint:
GET /v1/process-instances/{key}/sequence-flows - V2 endpoint:
GET /v2/process-instances/{processInstanceKey}/sequence-flows
- Input adjustments
- Output adjustments
- No input adjustments.
- Response structure changes
- response items are of type
object, instead of typestring. - response items are moved under the
itemsarray.
- response items are of type
- Collect the
sequenceFlowIdof typestringof all objects in the array to recreate the V1 result.
Flownode instances
Search flownode instances
- V1 endpoint:
POST /v1/flownode-instances/search - V2 endpoint:
POST /v2/element-instances/search
- Input adjustments
- Output adjustments
- Request structure changes as outlined in general changes.
searchAfteris now theafterin thepageobject.sizeis now thelimitin thepageobject.
- Renamed attributes in the
filterobjectkeyof typeint64- UseelementInstanceKeyof typestringinstead.flowNodeId- UseelementIdinstead.flowNodeName- UseelementNameinstead.incident- UsehasIncidentinstead.
- Adjusted attributes in the
filterobjectprocessInstanceKey- Type changed fromint64tostring.processDefinitionKey- Type changed fromint64tostring.incidentKey- Type changed fromint64tostring.
- Removed attributes from the
filterobjectstartDate- Can no longer be used for filtering.endDate- Can no longer be used for filtering.
- Response structure changes as outlined in general changes.
totalis moved under thepageobject astotalItems.sortValues- UseendCursorin thepageobject instead.
- Renamed attributes in the objects of the
itemsarraykeyof typeint64- UseelementInstanceKeyof typestringinstead.flowNodeId- UseelementIdinstead.flowNodeName- UseelementNameinstead.incident- UsehasIncidentinstead.
- Adjusted attributes in the objects of the
itemsarrayprocessInstanceKey- Type changed fromint64tostring.processDefinitionKey- Type changed fromint64tostring.incidentKey- Type changed fromint64tostring.
Get flownode instance by key
- V1 endpoint:
GET /v1/flownode-instances/{key} - V2 endpoint:
GET /v2/element-instances/{elementInstanceKey}
- Input adjustments
- Output adjustments
- No input adjustments.
- Except for the response structure changes, all adjustments from search flownode instances apply.
Incidents
Search incidents
- V1 endpoint:
POST /v1/incidents/search - V2 endpoint:
POST /v2/incidents/search
- Input adjustments
- Output adjustments
- Request structure changes as outlined in general changes.
searchAfteris now theafterin thepageobject.sizeis now thelimitin thepageobject.
- Renamed attributes in the
filterobjectkeyof typeint64- UseincidentKeyof typestringinstead.type- UseerrorTypeinstead.message- UseerrorMessageinstead.
- Adjusted attributes in the
filterobjectprocessInstanceKey- Type changed fromint64tostring.processDefinitionKey- Type changed fromint64tostring.jobKey- Type changed fromint64tostring.
- Response structure changes as outlined in general changes.
totalis moved under thepageobject astotalItems.sortValues- UseendCursorin thepageobject instead.
- Renamed attributes in the objects of the
itemsarraykeyof typeint64- UseincidentKeyof typestringinstead.type- UseerrorTypeinstead.message- UseerrorMessageinstead.
- Adjusted attributes in the objects of the
itemsarrayprocessInstanceKey- Type changed fromint64tostring.processDefinitionKey- Type changed fromint64tostring.jobKey- Type changed fromint64tostring.
Get incident by key
- V1 endpoint:
GET /v1/incidents/{key} - V2 endpoint:
GET /v2/incidents/{incidentKey}
- Input adjustments
- Output adjustments
- No input adjustments.
- Except for the response structure changes, all adjustments from search incidents apply.