BPMN 2.0 · 5-Minute Setup · No Infrastructure

From zero to running BPMN
in under 5 minutes.

Sign up, upload your BPMN file with one REST call, start your first process. No Kubernetes cluster, no Zeebe to configure, no Operate to install. Just a REST API and your existing BPMN file.

Get your free API key →

Four steps. No infrastructure.

1

Sign up and get your API key

Enter your email below. You'll receive a verification link instantly. Click it - your API key is in the confirmation email. Takes 60 seconds.

2

Save your process as a .bpmn file

Model in Camunda Modeler, bpmn.io or Signavio as you do today, then save or export the process as a .bpmn file. A modeler's own Deploy button cannot reach Priostack: no route serves a modeler's deploy, so the file goes up with the REST call in step 3.

Your BPMN models, including zeebe:taskDefinition, deploy as they are. Existing Zeebe or Camunda workers keep their job logic, but their transport must be rewritten to call the REST endpoints in step 5 with your API key: there is no gRPC endpoint.

3

Deploy your BPMN file

Upload the file to the deploy route. It answers 200 with the deployed bpmnProcessId and version, and costs no credit. Redeploying the same XML returns the existing version; changed XML under the same process id becomes version n+1.

curl -X POST https://priostack.com/api/v1/process-definitions \
-H "Authorization: Bearer YOUR_API_KEY" \
-F "file=@my-process.bpmn"

Raw XML works too: send the file as the body with -H "Content-Type: application/xml" --data-binary @my-process.bpmn. The API reference lists every field of the answer.

4

Start an instance and watch it run

Trigger a process instance by its bpmnProcessId (the id of the <process> element). The call answers 201 Created and costs 1 credit. Open your dashboard at priostack.com/account - every active instance, job queue and incident is visible in real time.

curl -X POST https://priostack.com/api/v1/process-instances \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"bpmnProcessId":"my-process","variables":{}}'

Step 5 - Run a worker

Workers poll for jobs and complete them. Activation answers at once (there is no long polling), so each snippet pauses 2 seconds after an empty poll and checks the status of every call. Job keys are strings. Copy the snippet in your language, swap in your API key, run it. The worker guides add failure reporting and graceful shutdown.

package main import ( "bytes" "encoding/json" "fmt" "io" "log" "net/http" "time" ) const ( baseURL = "https://priostack.com/api/v1" apiKey = "YOUR_API_KEY" ) // Job keys are opaque strings, never numbers. type Job struct { Key string `json:"key"` Variables map[string]interface{} `json:"variables"` Retries int `json:"retries"` } func main() { for { jobs, err := activateJobs("credit-check", 5) if err != nil { log.Println(err) } for _, job := range jobs { result := map[string]interface{}{"creditScore": 720} if err := completeJob(job.Key, result); err != nil { log.Println(err) continue } fmt.Printf("completed job %s\n", job.Key) } if len(jobs) == 0 { time.Sleep(2 * time.Second) // activation answers at once: pause between empty polls } } } func post(path string, body interface{}) ([]byte, error) { b, err := json.Marshal(body) if err != nil { return nil, err } req, err := http.NewRequest("POST", baseURL+path, bytes.NewReader(b)) if err != nil { return nil, err } req.Header.Set("Authorization", "Bearer "+apiKey) req.Header.Set("Content-Type", "application/json") resp, err := http.DefaultClient.Do(req) if err != nil { return nil, err } defer resp.Body.Close() data, err := io.ReadAll(resp.Body) if err != nil { return nil, err } // activate answers 200 and complete answers 204: accept any 2xx if resp.StatusCode/100 != 2 { return nil, fmt.Errorf("%s: status %d: %s", path, resp.StatusCode, data) } return data, nil } func activateJobs(jobType string, max int) ([]Job, error) { data, err := post("/jobs/activate", map[string]interface{}{"type": jobType, "maxJobsToActivate": max}) if err != nil { return nil, err } var result struct { Jobs []Job `json:"jobs"` } err = json.Unmarshal(data, &result) return result.Jobs, err } func completeJob(key string, vars map[string]interface{}) error { _, err := post("/jobs/"+key+"/complete", map[string]interface{}{"variables": vars}) return err }

Start step 1 now

100 free credits at signup and 100 more every day. No credit card. API key in your inbox in 60 seconds.

No credit card · Key sent once you verify your email · Full API docs →