Skip to main content

Process Engine APIs

Complete API reference for BankLingo's Process Engine (BPMN workflow execution).

Overview

The Process Engine enables workflow automation through BPMN 2.0 processes. These APIs allow you to create, start, control, and monitor process instances.

Base Endpoint

POST /api/v1/execute
Content-Type: application/json
Authorization: Bearer {token}

Start Process

Start a new BPMN process instance.

StartProcessInstanceCommand

Request:

{
"cmd": "StartProcessInstanceCommand",
"data": {
"processDefinitionId": 15,
"variables": {
"customerId": "12345",
"amount": 50000,
"loanType": "PERSONAL"
},
"executionMode": "Supervised"
}
}

Parameters:

FieldTypeRequiredDescription
processDefinitionIdnumberYesID of the process definition to start
variablesobjectNoInitial process variables (key-value pairs)
executionModestringNoExecution mode: "Supervised" (default) or "FireAndForget"

Execution Modes:

  • Supervised (Default): Synchronous execution, waits for completion or user task
  • FireAndForget: Asynchronous execution, returns immediately with job ID

Response (Supervised Mode):

{
"isSuccessful": true,
"message": "Process completed successfully",
"data": {
"instanceId": "abc123-def456",
"status": "COMPLETED",
"variables": {
"customerId": "12345",
"loanId": "LOAN-9876",
"approvalStatus": "APPROVED"
},
"currentTaskId": null,
"currentTaskName": null
}
}

Response (FireAndForget Mode):

{
"isSuccessful": true,
"message": "Process started in background",
"data": {
"jobId": "job-xyz-789",
"instanceId": "abc123-def456",
"status": "RUNNING"
}
}

Process Status Values:

  • RUNNING - Process is executing
  • WAITING - Process paused at user task or receive task
  • COMPLETED - Process finished successfully
  • ERROR - Process encountered an error
  • CANCELLED - Process was cancelled

Signal Process (Resume)

Resume a waiting process instance (user task or receive task).

SignalProcessInstanceCommand

Request:

{
"cmd": "SignalProcessInstanceCommand",
"data": {
"instanceId": "abc123-def456",
"taskId": "UserTask_Approval",
"variables": {
"approvalDecision": "APPROVED",
"approverComments": "Loan approved with standard terms"
}
}
}

Parameters:

FieldTypeRequiredDescription
instanceIdstringYesProcess instance ID (from StartProcessInstanceCommand)
taskIdstringYesID of the waiting task to signal
variablesobjectNoVariables to merge into process context

Response:

{
"isSuccessful": true,
"message": "Process resumed successfully",
"data": {
"instanceId": "abc123-def456",
"status": "COMPLETED",
"variables": {
"customerId": "12345",
"loanId": "LOAN-9876",
"approvalDecision": "APPROVED",
"approverComments": "Loan approved with standard terms"
}
}
}

Return Callback

Resume a process waiting on a callback (ReceiveTask or CallActivity).

ReturnCallbackCommand

Request:

{
"cmd": "ReturnCallbackCommand",
"data": {
"correlationKey": "PAYMENT-REF-12345",
"callbackData": {
"transactionId": "TXN-987654",
"status": "SUCCESS",
"amount": 50000,
"timestamp": "2026-01-11T10:30:00Z"
},
"isSuccess": true
}
}

Parameters:

FieldTypeRequiredDescription
correlationKeystringYesCorrelation key set in ReceiveTask/CallActivity
callbackDataobjectYesData to pass back to the waiting process
isSuccessbooleanNoWhether callback represents success (default: true)

How It Works:

  1. Process reaches ReceiveTask/CallActivity and sets correlation key
  2. Process pauses and stores correlation key in CallbackRegistry
  3. External system (webhook, API) calls ReturnCallbackCommand with correlation key
  4. Process resumes with callback data merged into variables

Response:

{
"isSuccessful": true,
"message": "Process resumed successfully",
"data": {
"instanceId": "abc123-def456",
"status": "COMPLETED",
"callbackData": {
"transactionId": "TXN-987654",
"status": "SUCCESS",
"amount": 50000
}
}
}

Use Cases:

  • Payment gateway callbacks (Paystack, Flutterwave)
  • NIBSS transaction responses
  • Third-party API async responses
  • Email approval links
  • Mobile app confirmations

Query Process Instance

Get details of a process instance.

GetProcessInstanceByIdQuery

Request:

{
"cmd": "GetProcessInstanceByIdQuery",
"data": {
"instanceId": "abc123-def456"
}
}

Response:

{
"isSuccessful": true,
"message": "Process instance retrieved successfully",
"data": {
"instanceId": "abc123-def456",
"processDefinitionId": 15,
"processKey": "LoanApplicationProcess",
"status": "WAITING",
"currentTaskId": "UserTask_Approval",
"currentTaskName": "Approve Loan Application",
"currentActivityType": "UserTask",
"variables": {
"customerId": "12345",
"amount": 50000,
"loanType": "PERSONAL"
},
"createdAt": "2026-01-11T09:00:00Z",
"updatedAt": "2026-01-11T09:15:00Z",
"tenantId": 1
}
}

List Process Instances

List process instances with filtering.

GetProcessInstanceListQuery

Request:

{
"cmd": "GetProcessInstanceListQuery",
"data": {
"processDefinitionId": 15,
"status": "WAITING",
"pageIndex": 0,
"pageSize": 20
}
}

Parameters:

FieldTypeRequiredDescription
processDefinitionIdnumberNoFilter by process definition
statusstringNoFilter by status (RUNNING, WAITING, COMPLETED, ERROR)
pageIndexnumberNoPage index (default: 0)
pageSizenumberNoPage size (default: 20)

Response:

{
"isSuccessful": true,
"message": "20/150 records",
"count": 150,
"pages": 8,
"size": 20,
"hasNext": true,
"hasPrevious": false,
"data": [
{
"instanceId": "abc123",
"processKey": "LoanApplicationProcess",
"status": "WAITING",
"currentTaskName": "Approve Loan",
"createdAt": "2026-01-11T09:00:00Z"
}
]
}

Cancel Process

Cancel a running or waiting process instance.

CancelProcessInstanceCommand

Request:

{
"cmd": "CancelProcessInstanceCommand",
"data": {
"instanceId": "abc123-def456",
"reason": "Customer requested cancellation"
}
}

Response:

{
"isSuccessful": true,
"message": "Process instance cancelled successfully",
"data": {
"instanceId": "abc123-def456",
"status": "CANCELLED"
}
}

Error Handling

Common Errors

Process Not Found:

{
"isSuccessful": false,
"message": "Process instance with ID 'abc123' not found"
}

Invalid Task ID:

{
"isSuccessful": false,
"message": "Task 'InvalidTaskId' not found in process instance"
}

Process Already Completed:

{
"isSuccessful": false,
"message": "Cannot signal completed process instance"
}

Correlation Key Not Found:

{
"isSuccessful": false,
"message": "No process found waiting for correlation key 'PAYMENT-REF-12345'"
}

Complete Example: Loan Application Flow

Step 1: Start Loan Process

{
"cmd": "StartProcessInstanceCommand",
"data": {
"processDefinitionId": 15,
"variables": {
"customerId": "12345",
"amount": 100000,
"loanType": "PERSONAL",
"email": "customer@example.com"
},
"executionMode": "Supervised"
}
}

Response:

{
"isSuccessful": true,
"data": {
"instanceId": "loan-abc123",
"status": "WAITING",
"currentTaskId": "UserTask_Approval",
"currentTaskName": "Credit Officer Approval"
}
}

Step 2: Approve Loan

{
"cmd": "SignalProcessInstanceCommand",
"data": {
"instanceId": "loan-abc123",
"taskId": "UserTask_Approval",
"variables": {
"approvalDecision": "APPROVED",
"approverName": "John Doe"
}
}
}

Response:

{
"isSuccessful": true,
"data": {
"instanceId": "loan-abc123",
"status": "WAITING",
"currentTaskId": "ReceiveTask_Payment",
"currentTaskName": "Wait for Paystack Payment"
}
}

Step 3: Payment Callback

{
"cmd": "ReturnCallbackCommand",
"data": {
"correlationKey": "loan-abc123-payment",
"callbackData": {
"transactionId": "TXN-987654",
"status": "success",
"amount": 100000
},
"isSuccess": true
}
}

Response:

{
"isSuccessful": true,
"data": {
"instanceId": "loan-abc123",
"status": "COMPLETED",
"variables": {
"loanId": "LOAN-9876",
"disbursementStatus": "COMPLETED"
}
}
}

Best Practices

1. Use Correlation Keys

Always set unique correlation keys for callbacks:

<bpmn:receiveTask id="WaitForPayment" name="Wait for Payment">
<bpmn:extensionElements>
<bankLingo:correlationKey>${instanceId}-payment</bankLingo:correlationKey>
</bpmn:extensionElements>
</bpmn:receiveTask>

2. Handle Execution Modes

Use appropriate execution mode:

  • Supervised: For user-facing operations (return results immediately)
  • FireAndForget: For background jobs (large datasets, bulk operations)

3. Pass Minimal Variables

Only pass variables needed for the process to reduce payload size.

4. Check Process Status

Always check process status before signaling:

{
"cmd": "GetProcessInstanceByIdQuery",
"data": {
"instanceId": "abc123"
}
}

5. Use Meaningful Variable Names

Use clear, descriptive variable names that match your business domain.



Last Updated: January 11, 2026