Skip to main content

Webhook Configuration APIs

Complete API reference for BankLingo's Webhook Configuration System.

Overview

Webhooks allow external systems to trigger actions in BankLingo. Configure webhook endpoints that can execute commands, run code, or start BPMN processes.

Base Endpoint

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

Webhook Endpoint

Once configured, webhooks are accessible at:

POST /api/webhook/{path}
Content-Type: application/json
X-Forwarded-For: {client-ip} (optional)

Create Webhook

Create a new webhook configuration.

CreateWebHookConfigCommand

Request:

{
"cmd": "CreateWebHookConfigCommand",
"data": {
"key": "paystack_callback",
"description": "Paystack payment callback handler",
"path": "paystack/callback",
"action": "POST",
"executionType": 0,
"commandName": "ProcessPaystackWebhookCommand",
"isEnabled": true,
"allowableIPs": "52.31.139.75,52.49.173.169,52.214.14.220"
}
}

Parameters:

FieldTypeRequiredDescription
keystringYesUnique identifier for the webhook
descriptionstringNoDescription of webhook purpose
pathstringYesURL path (accessible at /api/webhook/{path})
actionstringYesHTTP method: POST, GET, PUT, DELETE, PATCH
executionTypenumberYes0=Command, 2=Code, 3=Process
commandNamestringConditionalRequired if executionType=0 (Command)
executionCodestringConditionalRequired if executionType=2 (Code)
processDefinitionIdnumberConditionalRequired if executionType=3 (Process)
isEnabledbooleanNoEnable/disable webhook (default: true)
allowableIPsstringNoComma-separated list of allowed IP addresses

Execution Types:

  • 0 - ExecuteNativeCommand: Execute a command with webhook data
  • 2 - ExecuteCode: Execute JavaScript code expression
  • 3 - StartProcess: Start a BPMN process with webhook data

Response:

{
"isSuccessful": true,
"message": "Webhook created successfully",
"data": {
"id": 1,
"key": "paystack_callback",
"path": "paystack/callback",
"url": "{BaseUrl}/api/webhook/paystack/callback",
"executionType": 0,
"isEnabled": true
}
}

Example 1: Execute Command Webhook

Create Webhook:

{
"cmd": "CreateWebHookConfigCommand",
"data": {
"key": "nibss_notification",
"path": "nibss/notify",
"action": "POST",
"executionType": 0,
"commandName": "ProcessNIBSSNotificationCommand",
"isEnabled": true
}
}

External System Calls Webhook:

curl -X POST https://your-bank.com/api/webhook/nibss/notify \
-H "Content-Type: application/json" \
-d '{
"sessionId": "SID-12345",
"status": "SUCCESS",
"amount": 50000
}'

What Happens:

  1. Webhook receives POST to /api/webhook/nibss/notify
  2. Executes ProcessNIBSSNotificationCommand
  3. Command receives webhook data as parameters
  4. Returns command result to caller

Example 2: Execute Code Webhook

Create Webhook:

{
"cmd": "CreateWebHookConfigCommand",
"data": {
"key": "simple_logger",
"path": "events/log",
"action": "POST",
"executionType": 2,
"executionCode": "doLog('Event received', { data: webhookData, ip: remoteIp }); return { ok: true, timestamp: new Date().toISOString() };",
"isEnabled": true
}
}

External System Calls Webhook:

curl -X POST https://your-bank.com/api/webhook/events/log \
-H "Content-Type: application/json" \
-d '{"event": "user.login", "userId": "12345"}'

Available Context Variables:

  • webhookData - Request body (parsed JSON)
  • webhookPath - URL path (e.g., "events/log")
  • webhookMethod - HTTP method (e.g., "POST")
  • remoteIp - Client IP address

Example 3: Start Process Webhook

Create Webhook:

{
"cmd": "CreateWebHookConfigCommand",
"data": {
"key": "payment_callback",
"path": "payment/callback",
"action": "POST",
"executionType": 3,
"processDefinitionId": 42,
"isEnabled": true
}
}

External System Calls Webhook:

curl -X POST https://your-bank.com/api/webhook/payment/callback \
-H "Content-Type: application/json" \
-d '{
"reference": "PAY-12345",
"status": "success",
"amount": 100000,
"transactionId": "TXN-987654"
}'

What Happens:

  1. Webhook receives POST data
  2. Starts BPMN process (ID=42)
  3. Process variables include webhook data:
    webhookData = { reference: "PAY-12345", status: "success", ... }
    webhookPath = "payment/callback"
    webhookMethod = "POST"
    remoteIp = "52.31.139.75"
  4. Process can extract correlation key and call ReturnCallbackCommand

Example BPMN Process:

<bpmn:process id="PaymentCallbackHandler">
<bpmn:scriptTask id="ExtractKey">
<bpmn:script>
var payload = webhookData;
var correlationKey = payload.reference;
var status = payload.status;
execution.setVariable('correlationKey', correlationKey);
execution.setVariable('isSuccess', status === 'success');
</bpmn:script>
</bpmn:scriptTask>

<bpmn:serviceTask id="ReturnCallback"
bankLingo:commandName="ReturnCallbackCommand">
<bankLingo:inputParameter name="correlationKey">${correlationKey}</bankLingo:inputParameter>
<bankLingo:inputParameter name="callbackData">${webhookData}</bankLingo:inputParameter>
<bankLingo:inputParameter name="isSuccess">${isSuccess}</bankLingo:inputParameter>
</bpmn:serviceTask>
</bpmn:process>

Update Webhook

Update an existing webhook configuration.

UpdateWebHookConfigCommand

Request:

{
"cmd": "UpdateWebHookConfigCommand",
"data": {
"id": 1,
"description": "Updated description",
"executionCode": "doLog('Updated code'); return { ok: true };",
"isEnabled": true
}
}

Response:

{
"isSuccessful": true,
"message": "Webhook updated successfully",
"data": {
"id": 1,
"key": "paystack_callback",
"isEnabled": true
}
}

Get Webhook By ID

Retrieve webhook details including execution code.

GetWebHookConfigByIdQuery

Request:

{
"cmd": "GetWebHookConfigByIdQuery",
"data": {
"id": 1
}
}

Response:

{
"isSuccessful": true,
"message": "Webhook data retrieved successfully",
"data": {
"id": 1,
"key": "paystack_callback",
"description": "Paystack payment callback",
"path": "paystack/callback",
"url": "{BaseUrl}/api/webhook/paystack/callback",
"action": "POST",
"executionType": 0,
"executionTypeDesc": "Execute Native Command",
"commandName": "ProcessPaystackWebhookCommand",
"executionCode": null,
"processDefinitionId": null,
"isEnabled": true,
"allowableIPs": "52.31.139.75,52.49.173.169",
"createdAt": "2026-01-10T10:00:00Z",
"updatedAt": "2026-01-11T09:00:00Z"
}
}

List Webhooks

List all webhook configurations (excludes ExecutionCode for security).

GetWebHookConfigListQuery

Request:

{
"cmd": "GetWebHookConfigListQuery",
"data": {
"pageIndex": 0,
"pageSize": 20,
"isEnabled": true
}
}

Parameters:

FieldTypeRequiredDescription
pageIndexnumberNoPage index (default: 0)
pageSizenumberNoPage size (default: 20)
isEnabledbooleanNoFilter by enabled status
keystringNoFilter by webhook key

Response:

{
"isSuccessful": true,
"message": "20/50 records",
"count": 50,
"pages": 3,
"size": 20,
"hasNext": true,
"data": [
{
"id": 1,
"key": "paystack_callback",
"path": "paystack/callback",
"action": "POST",
"commandName": "ProcessPaystackWebhookCommand",
"executionType": 0,
"executionTypeDesc": "Execute Native Command",
"processDefinitionId": null,
"isEnabled": true,
"description": "Paystack payment callback",
"allowableIPs": "52.31.139.75",
"createdAt": "2026-01-10T10:00:00Z"
},
{
"id": 2,
"key": "nibss_notification",
"path": "nibss/notify",
"action": "POST",
"commandName": null,
"executionType": 3,
"executionTypeDesc": "Start Process",
"processDefinitionId": 42,
"isEnabled": true,
"createdAt": "2026-01-11T08:00:00Z"
}
]
}

Note: executionCode is excluded from list for security.


Delete Webhook

Delete a webhook configuration.

DeleteWebHookConfigCommand

Request:

{
"cmd": "DeleteWebHookConfigCommand",
"data": {
"id": 1
}
}

Response:

{
"isSuccessful": true,
"message": "Webhook deleted successfully"
}

Activate/Deactivate Webhook

Enable or disable a webhook without deleting it.

ActivateWebHookConfigCommand

Request:

{
"cmd": "ActivateWebHookConfigCommand",
"data": {
"id": 1
}
}

DeactivateWebHookConfigCommand

Request:

{
"cmd": "DeactivateWebHookConfigCommand",
"data": {
"id": 1
}
}

Webhook Security

IP Whitelisting

Restrict webhook access to specific IP addresses:

{
"allowableIPs": "52.31.139.75,52.49.173.169,52.214.14.220"
}

Multiple IPs: Separate with commas
IP Ranges: Not currently supported (use individual IPs)

If IP Not Whitelisted:

{
"error": "The IP for the request has not been whitelisted"
}

Signature Verification

For additional security, verify webhook signatures in your command:

// In your webhook command handler
var receivedSignature = request.headers['X-Webhook-Signature'];
var webhookSecret = $.secure.get('PAYSTACK_SECRET');
var expectedSignature = hmacSha256(webhookSecret, requestBody);

if (receivedSignature !== expectedSignature) {
throw new Error('Invalid webhook signature');
}

Error Handling

Webhook Not Found

{
"error": "Webhook not configured.",
"status": 404
}

Webhook Disabled

{
"error": "Webhook is not active.",
"status": 403
}

IP Not Allowed

{
"error": "The IP for the request has not been whitelisted.",
"status": 403
}

Configuration Error (Missing Required Field)

{
"error": "Webhook configuration error: CommandName is required for ExecuteNativeCommand.",
"status": 400
}

Complete Example: Payment Gateway Integration

Step 1: Create Webhook Configuration

{
"cmd": "CreateWebHookConfigCommand",
"data": {
"key": "paystack_webhook",
"description": "Paystack payment callback for loan disbursement",
"path": "paystack/callback",
"action": "POST",
"executionType": 3,
"processDefinitionId": 50,
"isEnabled": true,
"allowableIPs": "52.31.139.75,52.49.173.169,52.214.14.220"
}
}

Step 2: Configure Paystack Webhook

In Paystack dashboard, set webhook URL:

https://your-bank.com/api/webhook/paystack/callback

Step 3: Create BPMN Callback Handler (Process ID=50)

<bpmn:process id="PaystackCallbackHandler">
<bpmn:startEvent id="Start"/>

<bpmn:scriptTask id="ExtractData" name="Extract Callback Data">
<bpmn:script>
var payload = webhookData;
var reference = payload.data.reference;
var status = payload.event === 'charge.success';

execution.setVariable('correlationKey', reference);
execution.setVariable('isSuccess', status);
execution.setVariable('transactionId', payload.data.id);
</bpmn:script>
</bpmn:scriptTask>

<bpmn:serviceTask id="ReturnCallback" name="Resume Parent Process"
bankLingo:commandName="ReturnCallbackCommand">
<bpmn:extensionElements>
<bankLingo:inputParameter name="correlationKey">${correlationKey}</bankLingo:inputParameter>
<bankLingo:inputParameter name="callbackData">${webhookData}</bankLingo:inputParameter>
<bankLingo:inputParameter name="isSuccess">${isSuccess}</bankLingo:inputParameter>
</bpmn:extensionElements>
</bpmn:serviceTask>

<bpmn:endEvent id="End"/>
</bpmn:process>

Step 4: Main Loan Process (Waits for Payment)

<bpmn:process id="LoanDisbursementProcess">
<!-- ... loan approval steps ... -->

<bpmn:serviceTask id="InitiatePayment" name="Initiate Paystack Payment">
<bankLingo:commandName>InitiatePaystackPaymentCommand</bankLingo:commandName>
<bankLingo:inputParameter name="amount">${loanAmount}</bankLingo:inputParameter>
<bankLingo:inputParameter name="reference">${instanceId}-payment</bankLingo:inputParameter>
</bpmn:serviceTask>

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

<!-- Process continues after Paystack webhook calls ReturnCallbackCommand -->
</bpmn:process>

Flow:

  1. Loan process initiates Paystack payment with reference {instanceId}-payment
  2. Loan process pauses at ReceiveTask waiting for correlation key
  3. Customer completes payment on Paystack
  4. Paystack sends webhook to /api/webhook/paystack/callback
  5. Webhook starts PaystackCallbackHandler process (ID=50)
  6. Process extracts reference and calls ReturnCallbackCommand
  7. Loan process resumes with payment confirmation data

Best Practices

1. Use Unique Keys

{
"key": "paystack_loan_disbursement_v2"
}

2. Always Set IP Whitelist

{
"allowableIPs": "52.31.139.75,52.49.173.169"
}

3. Use Process Execution for Complex Logic

Don't put complex logic in ExecuteCode - use StartProcess instead:

  • Process: Error handling, logging, multiple steps
  • Code: Complex transformations, business rules

4. Test with Disabled Webhooks

Create webhooks disabled, test, then activate:

{
"isEnabled": false // Test first
}

5. Document Webhook Purpose

{
"description": "Paystack payment callback for loan disbursement. Resumes LoanDisbursementProcess with payment confirmation."
}


Last Updated: January 11, 2026