Migrate from Camunda 7 to Priostack
Last updated: 2026-04-06 · 12 min read
camunda: attributes are ignored; what changes is who does the work (a worker you run, over HTTPS and JSON) and how you deploy. Compatibility is at the model level and in the shape of the REST calls, not on the wire: there is no /engine-rest API, no gRPC and no Zeebe client support.
Concept Mapping
Before migrating, understand how Camunda 7 concepts map to Priostack equivalents.
| Camunda 7 | Priostack | Notes |
|---|---|---|
| Process Engine (embedded/server) | Priostack Engine (hosted) | No local JVM required |
| External Task Pattern | Job Worker (polling) | Same poll-activate-complete cycle |
| Java Delegate / Expression | Service Task + worker | Move logic to a worker process |
| Cockpit (monitoring) | Dashboard / Console | Web UI + REST API |
| Tasklist (user tasks) | /tasklist | Same task claim/complete model |
REST API /engine-rest | /api/v1 | Different paths - see mapping below |
| DMN Engine (decision tables) | Built-in DMN 1.3 evaluation | POST /api/v1/decisions/{decisionId}/evaluate |
| Form Fields (embedded forms) | Variable map in task complete | Pass variables in POST /api/v1/tasks/{id}/complete |
| Tenants (multi-tenancy) | Per-account isolation | Each API key = one tenant namespace |
REST API Endpoint Mapping
| Camunda 7 endpoint | Priostack equivalent |
|---|---|
POST /engine-rest/deployment/create | POST /api/v1/process-definitions (BPMN, free) or POST /api/v1/models (BPMN, DMN, CMMN, ArchiMate; 1 credit) |
POST /engine-rest/process-definition/{id}/start | POST /api/v1/process-instances |
GET /engine-rest/process-instance | GET /api/v1/process-instances |
GET /engine-rest/external-task | POST /api/v1/jobs/activate (poll model) |
POST /engine-rest/external-task/{id}/complete | POST /api/v1/jobs/{key}/complete |
POST /engine-rest/external-task/{id}/failure | POST /api/v1/jobs/{key}/fail |
GET /engine-rest/task | GET /api/v1/tasks |
POST /engine-rest/task/{id}/complete | POST /api/v1/tasks/{id}/complete (1 credit) |
POST /engine-rest/message | No hosted equivalent. A message wait is offered to workers as a job (message:<name> for a receive task, event:message:<elementId> for a catch event), with no correlation-key matching |
POST /engine-rest/decision-definition/{id}/evaluate | POST /api/v1/decisions/{decisionId}/evaluate |
Migration Steps
Step 1 - Export your process definitions
From Camunda 7 Cockpit or the filesystem, collect all .bpmn and .dmn files. Priostack accepts the same XML format.
Step 2 - Remove Java-specific extensions
Camunda 7 uses Java Delegates and expression language that Priostack does not support. Strip or replace these elements:
camunda:class, camunda:expression, camunda:delegateExpression from Service Tasks. Replace with zeebe:taskDefinition type="your-worker-type".Before (Camunda 7):
<serviceTask id="credit-check" name="Credit Check" camunda:class="com.example.CreditCheckDelegate" />
After (Priostack, with zeebe:taskDefinition): a fragment, to paste inside a <definitions> element that declares xmlns:zeebe="http://camunda.org/schema/zeebe/1.0".
<serviceTask id="credit-check" name="Credit Check">
<extensionElements>
<zeebe:taskDefinition type="credit-check" />
</extensionElements>
</serviceTask>
Step 3 - Deploy to Priostack
curl -X POST "https://priostack.com/api/v1/process-definitions?resourceName=loan-approval.bpmn" \ -H "X-API-Key: ps_your_key" \ -H "Content-Type: application/xml" \ --data-binary @loan-approval.bpmn
This route deploys BPMN only and is free. It answers 200 with a deployments array; a model that does not parse answers 422.
Step 4 - Port your External Task workers
Camunda 7 External Task workers poll /engine-rest/external-task/fetchAndLock. In Priostack, poll POST /api/v1/jobs/activate:
Camunda 7 worker (conceptual):
// fetchAndLock
POST /engine-rest/external-task/fetchAndLock
{"workerId":"w1","maxTasks":10,"topics":[{"topicName":"credit-check","lockDuration":30000}]}
Priostack worker:
// activate (answers 200 at once, {"jobs":[]} when nothing waits)
POST /api/v1/jobs/activate
{"type":"credit-check","worker":"w1","maxJobsToActivate":10}
// complete a job (answers 204 No Content)
POST /api/v1/jobs/{jobKey}/complete
{"variables":{"score":720,"approved":true}}
There is no lock duration to port. lockDuration has no equivalent: an activated job stays with the worker until it completes it or fails it, and timeout is accepted and ignored. Job keys are strings. Always send type, and sleep 1 to 5 seconds after an empty poll.
Step 5 - Migrate DMN decision tables
Camunda 7 DMN tables deploy through POST /api/v1/models, which detects the model kind and costs 1 credit (refunded if the deploy fails). Input entries must be unary tests such as "gold", > 500 or [100..500]; see DMN Elements. A table the engine cannot read answers 422.
curl -X POST "https://priostack.com/api/v1/models?resourceName=credit-score.dmn" \ -H "X-API-Key: ps_your_key" \ -H "Content-Type: application/xml" \ --data-binary @credit-score.dmn
Evaluate standalone. The body is a flat JSON object of inputs, and the call costs 1 credit:
curl -X POST https://priostack.com/api/v1/decisions/creditScore/evaluate \
-H "X-API-Key: ps_your_key" \
-H "Content-Type: application/json" \
-d '{"score":720,"employment":"full-time"}'
It answers {"result":{...}} with the outputs of the matched rule, as strings.
Step 6 - Update User Task handling
Camunda 7 task query and claim API maps directly:
# List open tasks (filters: status=open|claimed, definition_key=)
GET /api/v1/tasks?status=open
# Complete a task (equivalent to setVariables + complete; 1 credit on this route)
POST /api/v1/tasks/{taskId}/complete
{"variables":{"approved":true,"comment":"Looks good"}}
Step 7 - Remove Spring / CDI dependencies
If your workers were embedded in a Spring Boot app using camunda-bpm-spring-boot-starter, extract the business logic into standalone worker processes. Your workers can be any language - Priostack workers speak plain HTTP.
Unsupported Features
| Camunda 7 feature | Status in Priostack |
|---|---|
| Embedded subprocess history (full audit trail) | Instance state + events - no fine-grained history DB |
| BPMN compensation events | Supported: a compensation boundary event with an associated handler (isForCompensation="true"), run when the model throws compensation explicitly |
| Script tasks (Groovy, JavaScript) | Not run inline: a script task becomes a worker job of type script:<name or id>, so move the script into a worker |
| Case execution (CMMN 1.0 embedded in Camunda 7) | CMMN 1.1 supported as a separate deployment through POST /api/v1/models |
Message correlation (/engine-rest/message) | Not available on the hosted API |
| Batch operations API | Not yet supported |