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:
| Field | Type | Required | Description |
|---|---|---|---|
processDefinitionId | number | Yes | ID of the process definition to start |
variables | object | No | Initial process variables (key-value pairs) |
executionMode | string | No | Execution 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 executingWAITING- Process paused at user task or receive taskCOMPLETED- Process finished successfullyERROR- Process encountered an errorCANCELLED- 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:
| Field | Type | Required | Description |
|---|---|---|---|
instanceId | string | Yes | Process instance ID (from StartProcessInstanceCommand) |
taskId | string | Yes | ID of the waiting task to signal |
variables | object | No | Variables 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:
| Field | Type | Required | Description |
|---|---|---|---|
correlationKey | string | Yes | Correlation key set in ReceiveTask/CallActivity |
callbackData | object | Yes | Data to pass back to the waiting process |
isSuccess | boolean | No | Whether callback represents success (default: true) |
How It Works:
- Process reaches ReceiveTask/CallActivity and sets correlation key
- Process pauses and stores correlation key in CallbackRegistry
- External system (webhook, API) calls ReturnCallbackCommand with correlation key
- 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:
| Field | Type | Required | Description |
|---|---|---|---|
processDefinitionId | number | No | Filter by process definition |
status | string | No | Filter by status (RUNNING, WAITING, COMPLETED, ERROR) |
pageIndex | number | No | Page index (default: 0) |
pageSize | number | No | Page 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.
Related Documentation
Last Updated: January 11, 2026