Skip to main content
Version: 8.8 (unreleased)

Migrate to the Orchestration Cluster API

Migrate from Camunda V1 component REST APIs to the V2 Orchestration Cluster REST API.

About this guide

This guide covers how to migrate to the V2 Orchestration Cluster REST API, and what to consider when migrating. It covers all public endpoints in the component REST APIs and their Orchestration Cluster API counterparts or required migration changes.

  • Camunda is streamlining the developer experience by creating a unified REST API for Zeebe, Operate, Tasklist, and the Identity components with endpoint parity. This is the single Orchestration Cluster REST API.
  • Individual component APIs (starting with the former Operate and Tasklist APIs) are being deprecated over time. These will continue to be in the product in the short-term, but Camunda recommends you begin the adoption of the new API.
  • In addition, several Zeebe gPRC endpoints will begin to be deprecated.
info

To learn more about the unified REST API, see the official blog announcement.

note

The Administration and Web Modeler APIs are not part of the Orchestration Cluster REST API, as these are platform APIs outside the cluster’s scope.

Migration steps

To successfully migrate to the V2 Orchestration Cluster API, perform the following steps:

  1. Identify your current V1 endpoints: Audit your application to catalog all V1 API calls currently in use.
  2. Map V1 endpoints to V2 equivalents: Use the tables in this guide to find the corresponding V2 endpoints for each request.
  3. Update request and response structure: Adapt your code to handle the new formats, renamed attributes, and data type changes as outlined in this guide.
  4. Update pagination logic: Replace old pagination parameters with the new page object structure and cursor-based navigation.

General endpoint changes

  • 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.

Name changes and mappings

The following table shows key attribute name changes from V1 to V2:

V1V2Notes
id[entity]IdKeys now include entity prefix (for example, userTaskKey, processDefinitionId).
key[entity]KeyConverted from int64 to string with entity prefix.
bpmnProcessIdprocessDefinitionIdUnified naming convention.
processNameprocessDefinitionIdUnified naming convention.
decisionKeydecisionDefinitionKeyUnified naming convention.
dmnDecisionKeydecisionDefinitionKeyUnified naming convention.
decisionIddecisionDefinitionIdUnified naming convention.
dmnDecisionIddecisionDefinitionIdUnified naming convention.

General naming conventions:

  • Keys and IDs contain the full entity name as prefix to avoid confusion (for example, processDefinitionKey instead of processKey).
  • Entity attributes have no prefix within their own entity, but use prefixes when referenced from other entities.
  • All key fields are now string type instead of int64.

Tasklist REST API

Form

Get a form

V1V2

GET /v1/forms/{formId}

GET /v2/user-tasks/{userTaskKey}/form
GET /v2/process-definitions/{processDefinitionKey}/form

  • 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.

Task

Save task draft variables

V1V2

POST /v1/tasks/{taskId}/variables

This feature is not supported in V2 anymore. Use setting variables as local to the user task's elementInstanceKey as a replacement.

Search task variables

V1V2

POST /v1/tasks/{taskId}/variables/search

POST /v2/user-tasks/{userTaskKey}/variables/search

Request structure changes as outlined in general changes.

FieldChange TypeNotes
variableNamesRenamedNow name in filter object (plain string or { "$in": [ "xyz", ... ] }).
includeVariablesRemovedEndpoint returns all variables associated with the user task.

Search tasks

V1V2

POST /v1/tasks/search

POST /v2/user-tasks/search

Request structure changes as outlined in general changes.

FieldChange TypeNotes
pageSizeRenamedNow limit in the page object.
searchAfterRenamedNow after in the page object.
searchBeforeRenamedNow before in the page object.
taskDefinitionIdRenamedNow elementId (user-provided identifier of the BPMN element).
assignedRenamedNow assignee with { "$exists": false }.
assigneesRenamedNow assignee with { "$in": [ "xyz", ... ] }.
candidateGroupsRenamedNow candidateGroup with { "$in": [ "xyz", ... ] }.
candidateUsersRenamedNow candidateUser with { "$in": [ "xyz", ... ] }.
tenantIdsRenamedNow tenantId with { "$in": [ "xyz", ... ] }.
followUpDate, dueDateChangedUse $gte and $lte instead of from and to.
priorityChangedFilter keys need $ prefix, supports new comparison options.
taskVariablesSplitNow localVariables and processInstanceVariables.
searchAfterOrEqualRemovedNo longer supported.
searchBeforeOrEqualRemovedNo longer supported.
includeVariablesRemovedUse separate search task variables endpoint.
implementationRemovedV2 API supports only Camunda user tasks.

Unassign a task

V1V2

PATCH /v1/tasks/{taskId}/unassign

DELETE /v2/user-tasks/{userTaskKey}/assignee

  • No input adjustments.

Complete a task

V1V2

PATCH /v1/tasks/{taskId}/complete

POST /v2/user-tasks/{userTaskKey}/completion

  • Adjusted attributes
    • variables - Provide the variables as a proper JSON object instead of an array of objects with a name and a serialized JSON string value.

Assign a task

V1V2

PATCH /v1/tasks/{taskId}/assign

POST /v2/user-tasks/{userTaskKey}/assignment

  • Renamed attributes
    • allowOverrideAssignment - Use allowOverride, this still refers to allowing to override any existing assignee.

Get a task

V1V2

GET /v1/tasks/{taskId}

GET /v2/user-tasks/{userTaskKey}

  • No input adjustments.

Variables

Get a variable

V1V2

GET /v1/variables/{variableId}

GET /v2/variables/{variableKey}

  • variableId - Use variableKey as this refers to the unique system identifier of the variable.

Operate REST API

Decision definition

Search decision definitions

V1V2

POST /v1/decision-definitions/search

POST /v2/decision-definitions/search

Request structure changes as outlined in general changes.

FieldChange TypeNotes
searchAfterRenamedNow after in the page object.
sizeRenamedNow limit in the page object.
idRenamedNow decisionDefinitionKey in filter object.
keyRenamedNow decisionDefinitionKey (changed from int64 to string).
decisionIdRenamedNow decisionDefinitionId in filter object.
decisionRequirementsKeyChangedNow string type instead of int64.
decisionRequirementsNameRemovedCan no longer be used for filtering.
decisionRequirementsVersionRemovedCan no longer be used for filtering.

Get decision definition by key

V1V2

GET /v1/decision-definitions/{key}

GET /v2/decision-definitions/{decisionDefinitionKey}

  • No input adjustments.

Search decision instances

V1V2

POST /v1/decision-instances/search

POST /v2/decision-instances/search

Request structure changes as outlined in general changes.

FieldChange TypeNotes
searchAfterRenamedNow after in the page object.
sizeRenamedNow limit in the page object.
idRenamedNow decisionInstanceId in filter object.
keyRenamedNow decisionInstanceKey (changed from int64 to string).
processDefinitionKeyChangedNow string type instead of int64.
processInstanceKeyChangedNow string type instead of int64.
decisionIdRenamedNow decisionDefinitionId.
decisionNameRenamedNow decisionDefinitionName.
decisionVersionRenamedNow decisionDefinitionVersion.
decisionTypeRenamedNow decisionDefinitionType.
resultRemovedCan no longer be used for filtering.
evaluatedInputsRemovedCan no longer be used for filtering.
evaluatedOutputsRemovedCan no longer be used for filtering.

Get decision instance by id

V1V2

GET /v1/decision-instances/{id}

GET /v2/decision-instances/{decisionInstanceId}

  • No input adjustments.

Search decision requirements

V1V2

POST /v1/drd/search

POST /v2/decision-requirements/search

Request structure changes as outlined in general changes.

FieldChange TypeNotes
searchAfterRenamedNow after in the page object.
sizeRenamedNow limit in the page object.
idRenamedNow decisionRequirementsKey in filter object.
keyRenamedNow decisionRequirementsKey (changed from int64 to string).
nameRenamedNow decisionRequirementsName.

Get decision requirements by key

V1V2

GET /v1/drd/{key}

GET /v2/decision-requirements/{decisionRequirementsKey}

  • No input adjustments.

Get decision requirements as XML by key

V1V2

GET /v1/drd/{key}/xml

GET /v2/decision-requirements/{decisionRequirementsKey}/xml

  • No input adjustments.

Variable

Search variables for process instances

V1V2

POST /v1/variables/search

POST /v2/variables/search

Request structure changes as outlined in general changes.

FieldChange TypeNotes
searchAfterRenamedNow after in the page object.
sizeRenamedNow limit in the page object.
keyRenamedNow variableKey (changed from int64 to string).
processInstanceKeyChangedNow string type instead of int64.
scopeKeyChangedNow string type instead of int64.
truncatedRenamedNow isTruncated.

Get variable by key

V1V2

GET /v1/variables/{key}

GET /v2/variables/{variableKey}

  • No input adjustments.

Process definition

Search process definitions

V1V2

POST /v1/process-definitions/search

POST /v2/process-definitions/search

Request structure changes as outlined in general changes.

FieldChange TypeNotes
searchAfterRenamedNow after in the page object.
sizeRenamedNow limit in the page object.
keyRenamedNow processDefinitionKey (changed from int64 to string).
bpmnProcessIdRenamedNow processDefinitionId.

Get process definition by key

V1V2

GET /v1/process-definitions/{key}

GET /v2/process-definitions/{processDefinitionKey}

  • No input adjustments.

Get process definition as XML by key

V1V2

GET /v1/process-definitions/{key}/xml

GET /v2/process-definitions/{processDefinitionKey}/xml

  • No input adjustments.

Process instance

Search process instances

V1V2

POST /v1/process-instances/search

POST /v2/process-instances/search

Request structure changes as outlined in general changes.

FieldChange TypeNotes
searchAfterRenamedNow after in the page object.
sizeRenamedNow limit in the page object.
keyRenamedNow processInstanceKey (changed from int64 to string).
processVersionRenamedNow processDefinitionVersion.
processVersionTagRenamedNow processDefinitionVersionTag.
bpmnProcessIdRenamedNow processDefinitionId.
parentFlowNodeInstanceKeyRenamedNow parentElementInstanceKey (changed to string).
parentKeyRenamedNow parentProcessInstanceKey (changed to string).
stateChangedUse TERMINATED instead of CANCELED.
incidentRenamedNow hasIncident.
parentProcessInstanceKeyChangedNow string type instead of int64.
processDefinitionKeyChangedNow string type instead of int64.

Get process instance by key

V1V2

GET /v1/process-instances/{key}

GET /v2/process-instances/{processInstanceKey}

  • No input adjustments.

Delete process instance and all dependant data by key

V1V2

DELETE /v1/process-instances/{key}

This feature is not yet available in V2. It will be added in a future version.

Get flow node statistic by process instance key

V1V2

GET /v1/process-instances/{key}/statistics

GET /v2/process-instances/{processInstanceKey}/statistics/element-instances

  • No input adjustments.

Get sequence flows of process instance by key

V1V2

GET /v1/process-instances/{key}/sequence-flows

GET /v2/process-instances/{processInstanceKey}/sequence-flows

  • No input adjustments.

Flownode instances

Search flownode instances

V1V2

POST /v1/flownode-instances/search

POST /v2/element-instances/search

Request structure changes as outlined in general changes.

FieldChange TypeNotes
searchAfterRenamedNow after in the page object.
sizeRenamedNow limit in the page object.
keyRenamedNow elementInstanceKey (changed from int64 to string).
flowNodeIdRenamedNow elementId.
flowNodeNameRenamedNow elementName.
incidentRenamedNow hasIncident.
processInstanceKeyChangedNow string type instead of int64.
processDefinitionKeyChangedNow string type instead of int64.
incidentKeyChangedNow string type instead of int64.
startDateRemovedCan no longer be used for filtering.
endDateRemovedCan no longer be used for filtering.

Get flownode instance by key

V1V2

GET /v1/flownode-instances/{key}

GET /v2/element-instances/{elementInstanceKey}

  • No input adjustments.

Incidents

Search incidents

V1V2

POST /v1/incidents/search

POST /v2/incidents/search

Request structure changes as outlined in general changes.

FieldChange TypeNotes
searchAfterRenamedNow after in the page object.
sizeRenamedNow limit in the page object.
keyRenamedNow incidentKey (changed from int64 to string).
typeRenamedNow errorType.
messageRenamedNow errorMessage.
processInstanceKeyChangedNow string type instead of int64.
processDefinitionKeyChangedNow string type instead of int64.
jobKeyChangedNow string type instead of int64.

Get incident by key

V1V2

GET /v1/incidents/{key}

GET /v2/incidents/{incidentKey}

  • No input adjustments.