Skip to main content

BPM V2 Commands Reference

Complete developer reference for all BPM V2 commands added to the BankLingo execution engine. These commands handle disbursement processing, NIBSS mandate/collection management, Remita loan lifecycle, and webhook integrations.

Base Endpoint​

All BPM commands are executed via the unified execution endpoint:

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

Request format:

{
"cmd": "CommandName",
"data": { /* command-specific parameters */ }
}

Standard response:

{
"isSuccessful": true,
"message": "Operation completed",
"data": { /* result */ },
"statusCode": "200",
"count": 0,
"pages": 0,
"size": 0
}

1. Disbursement Commands​

Manage batch disbursement processing with maker-checker workflow.

Namespace: App.Commands.BPM.Disbursement
Lifecycle: Initiated → EntriesValidated → PendingReview → ReviewAccepted → Approved → Processed

Enums​

DisbursementBatchStatus​

ValueNameDescription
0InitiatedBatch created, entries can be added/removed
1EntriesValidatedAll destination accounts validated via core banking
2PendingReviewSubmitted for reviewer approval
3ReviewRejectedReviewer rejected the batch
4ReviewAcceptedReviewer accepted — pending final approval
5ApprovedApprover approved — ready for processing
6RejectedApprover rejected the batch
7CancelledBatch cancelled
8ProcessedAll entries processed (disbursements sent)

DisbursementBatchEntryStatus​

ValueNameDescription
0NotValidatedEntry has not been validated yet
1AccountValidationFailedDestination account validation failed
2AccountValidationSuccessfulDestination account validated successfully
3DisbursementFailedDisbursement transaction failed
4DisbursementSuccessfulDisbursement transaction succeeded

TransactionSourceEnum​

ValueNameDescription
1Customer_AccountDisburse from customer account
2MiniCoreBankingDisburse via mini core-banking

InitiateDisbursementBatchCommand​

Creates a new disbursement batch with entries.

{
"cmd": "InitiateDisbursementBatchCommand",
"data": {
"batchDescription": "January payroll disbursement",
"sourceAccount": "1000012345",
"transactionSource": 1,
"entries": [
{
"DestinationAccount": "0012345678",
"Amount": 150000,
"BankCode": "058",
"Narration": "Jan salary - John Doe"
},
{
"DestinationAccount": "2012345678",
"Amount": 200000,
"BankCode": "044",
"Narration": "Jan salary - Jane Smith"
}
]
}
}
FieldTypeRequiredDescription
batchDescriptionstringYesDescription of the batch
sourceAccountstringYesSource account number for debits
transactionSourceintNoTransaction source identifier (default: 1)
entriesarrayYesList of disbursement entries (max 100, total max ₦15M)
entries[].DestinationAccountstringYesDestination account number
entries[].AmountdecimalYesAmount to disburse
entries[].BankCodestringYesDestination bank code
entries[].NarrationstringNoTransaction narration

AddDisbursementBatchEntryCommand​

Adds a single entry to an existing Initiated batch.

{
"cmd": "AddDisbursementBatchEntryCommand",
"data": {
"batchId": 42,
"bankCode": "058",
"destinationAccount": "0012345678",
"amount": 150000,
"narration": "Bonus payment"
}
}

RemoveDisbursementBatchEntryCommand​

Removes an entry from an Initiated batch.

{
"cmd": "RemoveDisbursementBatchEntryCommand",
"data": { "entryId": 101 }
}

ValidateDisbursementBatchCommand​

Validates all destination accounts in a batch via core banking (BankOne account lookup).

{
"cmd": "ValidateDisbursementBatchCommand",
"data": { "batchId": 42 }
}

Response includes: Valid/Invalid entry counts and per-entry validation results.

ConfirmDisbursementBatchCommand​

Moves a validated batch to PendingReview.

{
"cmd": "ConfirmDisbursementBatchCommand",
"data": { "batchId": 42, "comment": "Ready for review" }
}

ReviewDisbursementBatchCommand​

Reviewer accepts the batch (moves to ReviewAccepted).

{
"cmd": "ReviewDisbursementBatchCommand",
"data": { "batchId": 42, "comment": "Reviewed and confirmed" }
}

RejectDisbursementReviewCommand​

Reviewer rejects the batch.

{
"cmd": "RejectDisbursementReviewCommand",
"data": { "batchId": 42, "comment": "Amounts exceed policy limits" }
}

ApproveDisbursementBatchCommand​

Approver approves a reviewed batch (moves to Approved).

{
"cmd": "ApproveDisbursementBatchCommand",
"data": { "batchId": 42, "comment": "Approved for processing" }
}

RejectDisbursementApprovalCommand​

Approver rejects the batch.

{
"cmd": "RejectDisbursementApprovalCommand",
"data": { "batchId": 42, "comment": "Source account has insufficient funds" }
}

CancelDisbursementBatchCommand​

Cancels a batch (not allowed if Processed or Approved).

{
"cmd": "CancelDisbursementBatchCommand",
"data": { "batchId": 42, "comment": "No longer needed" }
}

DeleteDisbursementBatchCommand​

Permanently deletes a batch and its entries (only Initiated or Cancelled).

{
"cmd": "DeleteDisbursementBatchCommand",
"data": { "batchId": 42 }
}

RetrieveDisbursementBatchesQuery​

Lists disbursement batches with pagination and date filtering.

{
"cmd": "RetrieveDisbursementBatchesQuery",
"data": {
"pageNumber": 1,
"pageSize": 10,
"startDate": "2026-01-01",
"endDate": "2026-01-31",
"isExport": false
}
}

RetrieveDisbursementBatchByIdQuery​

Gets full batch details including entries.

{
"cmd": "RetrieveDisbursementBatchByIdQuery",
"data": { "batchId": 42 }
}

RetrieveDisbursementBatchEntriesQuery​

Lists entries for a specific batch.

{
"cmd": "RetrieveDisbursementBatchEntriesQuery",
"data": { "batchId": 42, "pageNumber": 1, "pageSize": 50 }
}

RetrieveDisbursementSourcesQuery​

Lists configured disbursement source accounts.

{
"cmd": "RetrieveDisbursementSourcesQuery",
"data": { "pageNumber": 1, "pageSize": 20 }
}

RetrieveDisbursementsQuery​

Lists individual disbursement transactions.

{
"cmd": "RetrieveDisbursementsQuery",
"data": {
"pageNumber": 1,
"pageSize": 20,
"batchId": 42,
"startDate": "2026-01-01",
"endDate": "2026-01-31"
}
}

2. NIBSS Mandate Commands​

Manage NIBSS direct debit mandates including GSI (Group Standing Instruction).

Namespace: App.Commands.BPM.MandateManagement.Nibss
Lifecycle: Draft → PendingAuthorisation → Authorised → Active → Stopped

Enums​

SelfServiceMandateTypeEnums​

ValueNameDescription
1EMandateElectronic mandate — created and signed digitally
2GSIGroup Standing Instruction — multi-bank mandate
3PaperMandatePaper-based mandate — requires physical signed document

SelfServiceWorkflowStatusEnum​

ValueNameDescription
0DraftNew mandate initiated by biller
1NewMandateInitiatedNew mandate initiated by biller
2MandateAuthorisedByBillerMandate authorised by biller
3MandateRejectedByBillerMandate rejected by biller
4MandateApprovedByBillerMandate approved by biller
5MandateDisApprovedByBillerMandate disapproved by biller
6MandateAuthorisedByBankMandate authorised by bank
7MandateRejectedByBankMandate rejected by bank
8MandateApprovedByBankMandate approved by bank
9MandateDisApprovedByBankMandate disapproved by bank
10NewMandateInitatedByBankNew mandate initiated by bank

SelfServiceMandateStatus​

ValueNameDescription
0DEFAULTNot active — internal status (not a NIBSS status)
1ACTIVEMandate is active and can be debited
2SUSPENDEDMandate is temporarily suspended
3DELETEDMandate is deleted or rejected
4STOPPEDMandate was active but has been stopped

SelfServiceNibssMandateStatus​

These are the NIBSS-side mandate statuses returned from NIBSS API:

ValueNameDescription
1ACTIVEMandate is active on NIBSS
2SUSPENDEDMandate is suspended on NIBSS
3DELETEDMandate is deleted on NIBSS

ServiceProviderEnum​

ValueNameDescription
0NIBSSNigeria Inter-Bank Settlement System
1EAZY_PAYEazyPay payment provider
2INTERSWITCHInterswitch payment provider
3CREDITSWITCHCreditSwitch payment provider
4CRCCredit Reference Company
5FIRST_CENTRALFirst Central Credit Bureau
6REMITTARemita payment provider
7WALLZ_AND_QUEENWallz and Queen payment provider
8MONOMono open banking provider

CreateNibssMandateCommand​

Creates a single NIBSS mandate for one account.

{
"cmd": "CreateNibssMandateCommand",
"data": {
"narration": "Loan repayment mandate",
"mandate": {
"clientCode": "CLI001",
"productCode": "PRD001",
"amount": 500000,
"debitAmount": 50000,
"numberOfInstallments": 12,
"startDate": "2026-02-01",
"endDate": "2027-01-31",
"mobileNumber": "08012345678",
"emailAddress": "customer@email.com",
"payerName": "John Doe",
"payerAddress": "123 Main St, Lagos",
"branchCode": "BR001",
"organisationCode": "ORG001",
"mandateType": 1,
"accountNumber": "0012345678",
"bvn": "22234567890",
"bankCode": "058",
"accountName": "John Doe"
}
}
}
FieldTypeRequiredDescription
mandate.clientCodestringYesClient identifier
mandate.productCodestringYesProduct code
mandate.amountdecimalYesTotal mandate amount
mandate.debitAmountdecimalYesAmount per debit
mandate.numberOfInstallmentsintYesNumber of payments
mandate.startDatestringYesMandate start date
mandate.endDatestringYesMandate end date
mandate.accountNumberstringYesDebit account number
mandate.bvnstringYesBVN
mandate.bankCodestringYesBank code
mandate.mandateTypeintNoSee SelfServiceMandateTypeEnums: 1=EMandate, 2=GSI, 3=PaperMandate
mandate.mandateFileBase64stringNoSigned mandate image (base64)

CreateNibssMandateListCommand​

Batch-creates multiple mandates in one batch.

{
"cmd": "CreateNibssMandateListCommand",
"data": {
"narration": "Batch mandates for Q1",
"productCode": "PRD001",
"branchCode": "BR001",
"organisationCode": "ORG001",
"mandates": [
{
"clientCode": "CLI001",
"amount": 500000,
"debitAmount": 50000,
"numberOfInstallments": 12,
"startDate": "2026-02-01",
"endDate": "2027-01-31",
"accountNumber": "0012345678",
"bvn": "22234567890",
"bankCode": "058",
"accountName": "John Doe"
}
]
}
}

CreateNibssGSIMandateCommand​

Creates GSI (Group Standing Instruction) mandates — one mandate per account, all linked in the same batch.

{
"cmd": "CreateNibssGSIMandateCommand",
"data": {
"narration": "GSI mandate for multi-bank customer",
"productCode": "PRD001",
"branchCode": "BR001",
"organisationCode": "ORG001",
"clientCode": "CLI001",
"payerName": "John Doe",
"amount": 500000,
"debitAmount": 50000,
"numberOfInstallments": 12,
"startDate": "2026-02-01",
"endDate": "2027-01-31",
"accounts": [
{ "accountNumber": "0012345678", "bvn": "22234567890", "bankCode": "058", "accountName": "John Doe - GTB" },
{ "accountNumber": "1012345678", "bvn": "22234567890", "bankCode": "044", "accountName": "John Doe - Access" }
]
}
}
GSI Mandates

GSI creates one mandate per account — all mandates share the same batch and are flagged with IsGroupedGSIMandate = true. During collection, the system attempts each account until the full amount is collected.

UpdateNibssMandateCommand​

Updates a Draft or Rejected mandate.

{
"cmd": "UpdateNibssMandateCommand",
"data": {
"mandateId": 15,
"amount": 600000,
"debitAmount": 60000,
"numberOfInstallments": 10
}
}

AuthoriseNibssMandateCommand​

Authorises a mandate and submits it to NIBSS.

{
"cmd": "AuthoriseNibssMandateCommand",
"data": { "mandateId": 15, "comment": "Verified customer identity" }
}

DisapproveNibssMandateCommand​

Disapproves/rejects a mandate.

{
"cmd": "DisapproveNibssMandateCommand",
"data": { "mandateId": 15, "comment": "Invalid BVN" }
}

StartNibssMandateCommand / StopNibssMandateCommand​

Starts or stops an active mandate.

{
"cmd": "StartNibssMandateCommand",
"data": { "mandateId": 15 }
}
{
"cmd": "StopNibssMandateCommand",
"data": { "mandateId": 15, "reason": "Customer request" }
}

RefreshNibssMandateStatusCommand​

Fetches current mandate status from NIBSS.

{
"cmd": "RefreshNibssMandateStatusCommand",
"data": { "mandateId": 15 }
}

Mandate Queries​

// List mandate batches
{ "cmd": "RetrieveNibssMandateBatchesQuery", "data": { "pageNumber": 1, "pageSize": 20 } }

// List mandates (with filters)
{ "cmd": "RetrieveNibssMandatesQuery", "data": { "batchId": 5, "pageNumber": 1, "pageSize": 50 } }

// Get single mandate
{ "cmd": "RetrieveNibssMandateByIdQuery", "data": { "mandateId": 15 } }

// List mandate products
{ "cmd": "RetrieveNibssMandateProductsQuery", "data": { "pageNumber": 1, "pageSize": 20 } }

3. NIBSS Collection Commands​

Process direct debit collections against active NIBSS mandates.

Namespace: App.Commands.BPM.MandateManagement.Nibss
Lifecycle: Inactive → Active → Queued → Processing → Completed

Enums​

SelfServiceCollectionBatchStatus​

ValueNameDescription
0ActiveBatch is authorized and ready to run
1InactiveBatch is pending authorization
2CancelledCollection batch has been withdrawn/cancelled

SelfServiceCollectionTypeEnum​

ValueNameDescription
0DefaultCollects the exact amount specified. Fails if amount is not available.
1RecoveryPerforms a balance check and recovers whatever amount is available in the account.

CreateNibssCollectionBatchCommand​

Creates an empty collection batch.

{
"cmd": "CreateNibssCollectionBatchCommand",
"data": {
"batchName": "February Collections",
"batchDescription": "Monthly loan repayments",
"organisationId": 1,
"collectionType": 0
}
}

CreateNibssCollectionBatchWithItemsCommand​

Creates a batch pre-populated with collection items.

{
"cmd": "CreateNibssCollectionBatchWithItemsCommand",
"data": {
"batchName": "February Collections",
"batchDescription": "Monthly repayments",
"organisationId": 1,
"collections": [
{ "mandateId": 15, "amount": 50000, "narration": "Feb instalment", "collectionDate": "2026-02-15" },
{ "mandateId": 22, "amount": 75000, "narration": "Feb instalment" }
]
}
}

AddNibssCollectionToBatchCommand​

Adds a single collection to an existing batch.

{
"cmd": "AddNibssCollectionToBatchCommand",
"data": {
"batchId": 10,
"mandateId": 15,
"amount": 50000,
"narration": "Additional collection",
"collectionDate": "2026-02-15"
}
}

ActivateNibssCollectionBatchCommand / DeactivateNibssCollectionBatchCommand​

{ "cmd": "ActivateNibssCollectionBatchCommand", "data": { "batchId": 10 } }
{ "cmd": "DeactivateNibssCollectionBatchCommand", "data": { "batchId": 10 } }

CancelNibssCollectionBatchCommand​

{ "cmd": "CancelNibssCollectionBatchCommand", "data": { "batchId": 10 } }

RunNibssCollectionBatchCommand​

Queues the batch for NIBSS debit processing. Calls NIBSS TransferDirectToNIBSS API for each collection.

{
"cmd": "RunNibssCollectionBatchCommand",
"data": { "batchId": 10 }
}

Collection Queries​

// List collection batches
{ "cmd": "RetrieveNibssCollectionBatchesQuery", "data": { "pageNumber": 1, "pageSize": 20 } }

// List collections
{ "cmd": "RetrieveNibssCollectionsQuery", "data": { "batchId": 10, "pageNumber": 1, "pageSize": 50 } }

// List collection transactions
{ "cmd": "RetrieveNibssCollectionTransactionsQuery", "data": { "batchId": 10, "pageNumber": 1, "pageSize": 50 } }

4. Remita Loan Commands​

Complete Remita loan origination and collection lifecycle.

Enums​

RemitaLoanRequestStatus​

ValueNameDescription
0DraftLoan request created, not yet submitted
1PendingApprovalSubmitted and awaiting approval
2ApprovedLoan request approved
3RejectedLoan request rejected
4DisbursedLoan has been disbursed to customer
5DisbursementFailedLoan disbursement failed
6ActiveLoan is active (disbursed and mandate active)
7ClosedLoan is fully repaid and closed
8CancelledLoan request cancelled

RemitaMandateActivationStatus​

ValueNameDescription
0NotActivatedMandate has not been activated yet
1ActivationPendingMandate activation is in progress
2ActivatedMandate is activated and ready for collection
3ActivationFailedMandate activation failed
4StoppedMandate has been stopped

RemitaDisbursementChannel​

ValueNameDescription
0NIPDisburse via NIP (inter-bank transfer)
1InternalDisburse via internal (intra-bank) transfer

LoanTenorType​

ValueNameDescription
0DAYSDay(s)
1WEEKSWeek(s)
2MONTHSMonth(s) — default
3YEARSYear(s)

RemitaCollectionBatchStatus​

ValueNameDescription
0InitiatedBatch created
1PendingAuthorizationSubmitted for authorization
2AuthorizedBatch authorized
3RejectedBatch rejected
4ProcessingBatch is being processed
5CompletedAll collections in batch completed
6CancelledBatch cancelled

RemitaCollectionStatus​

ValueNameDescription
0PendingCollection pending
1SuccessfulCollection completed successfully
2FailedCollection failed
3ReversedCollection has been reversed

4.1 Loan Request Management​

Namespace: App.Commands.BPM.RemitaManagement
Lifecycle: Draft → PendingApproval → Approved → MandateActivated → Disbursed → Active

CreateRemitaLoanRequestCommand​

Creates a new loan request in Draft status.

{
"cmd": "CreateRemitaLoanRequestCommand",
"data": {
"cif": "CIF001",
"accountNumber": "0012345678",
"accountName": "John Doe",
"bvn": "22234567890",
"phoneNumber": "08012345678",
"email": "john@email.com",
"companyName": "ACME Corp",
"employerRegistrationNumber": "REG123",
"loanAmount": 1000000,
"collectionAmount": 100000,
"tenure": 12,
"tenorType": 2,
"interestRate": 18.5,
"disbursementChannel": 0,
"loanAccount": "0012345678",
"currencyCode": "NGN",
"loanType": "Term Loan",
"organisationId": 1,
"tag": "salary-advance",
"bankCode": "058",
"remitaCustomerId": "REM-CUST-001",
"authorisationCode": "AUTH-CODE-123"
}
}
FieldTypeRequiredDefaultDescription
cifstringYes—Customer Identification
accountNumberstringYes—Loan disbursement account number
accountNamestringNo—Customer account name
bvnstringYes—Bank Verification Number
phoneNumberstringNo—Customer phone number
emailstringNo—Customer email address
companyNamestringNo—Employer company name
employerRegistrationNumberstringNo—Employer registration number
loanAmountdecimalYes—Total loan amount
collectionAmountdecimalYes—Monthly collection/repayment amount
tenureintYes—Loan tenure (number of periods)
tenorTypeintNo2 (Months)Tenor type enum: 0=Days, 1=Weeks, 2=Months, 3=Years
interestRatedecimalNo0Annual interest rate percentage
disbursementChannelintNo0 (NIP)Disbursement channel: 0=NIP, 1=Internal
loanAccountstringNo—Loan tracking account
currencyCodestringNo"NGN"Currency code (ISO 4217)
loanTypestringNo—Loan product type description
organisationIdlongYes—Organisation/branch identifier
tagstringNo—Custom tag for categorisation
bankCodestringNo—Customer's bank code
remitaCustomerIdstringNo—Remita customer ID
authorisationCodestringNo—Remita authorisation code

Response:

{
"id": 5,
"cif": "CIF001",
"accountNumber": "0012345678",
"loanAmount": 1000000,
"collectionAmount": 100000,
"tenure": 12,
"status": 0,
"statusDesc": "Draft"
}

UpdateRemitaLoanRequestCommand​

Updates an existing loan request. Only allowed when status is Draft (0).
Only provided fields are updated — omitted fields retain their current values.

{
"cmd": "UpdateRemitaLoanRequestCommand",
"data": {
"id": 5,
"accountNumber": "0098765432",
"loanAmount": 1500000,
"collectionAmount": 150000,
"tenure": 10,
"disbursementChannel": 1,
"bankCode": "058",
"remitaCustomerId": "REM-CUST-002",
"authorisationCode": "AUTH-CODE-456"
}
}
FieldTypeRequiredDescription
idlongYesLoan request ID
accountNumberstringNoUpdated account number
accountNamestringNoUpdated account name
phoneNumberstringNoUpdated phone number
emailstringNoUpdated email
companyNamestringNoUpdated company name
employerRegistrationNumberstringNoUpdated employer registration
loanAmountdecimalNoUpdated loan amount
collectionAmountdecimalNoUpdated collection amount
tenureintNoUpdated tenure
interestRatedecimalNoUpdated interest rate
disbursementChannelintNoUpdated channel: 0=NIP, 1=Internal
loanAccountstringNoUpdated loan account
tagstringNoUpdated tag
bankCodestringNoUpdated bank code
remitaCustomerIdstringNoUpdated Remita customer ID
authorisationCodestringNoUpdated authorisation code

Response:

{
"id": 5,
"status": 0,
"statusDesc": "Draft"
}

SubmitRemitaLoanForApprovalCommand​

Submits a Draft loan request for approval. Changes status to PendingApproval.

{
"cmd": "SubmitRemitaLoanForApprovalCommand",
"data": { "id": 5 }
}
FieldTypeRequiredDescription
idlongYesLoan request ID

Prerequisites: Loan must be in Draft (0) status.

Response:

{
"id": 5,
"status": 1,
"statusDesc": "PendingApproval"
}

ApproveRemitaLoanRequestCommand​

Approves a loan request that is PendingApproval. Records the approver and timestamp.

{
"cmd": "ApproveRemitaLoanRequestCommand",
"data": { "id": 5, "comment": "Salary history verified" }
}
FieldTypeRequiredDescription
idlongYesLoan request ID
commentstringNoApproval comment

Prerequisites: Loan must be in PendingApproval (1) status.

Response:

{
"id": 5,
"status": 2,
"statusDesc": "Approved",
"approvedBy": "John Admin-(admin@bank.com)",
"approvalDate": "2026-03-15T10:30:00"
}

RejectRemitaLoanRequestCommand​

Rejects a loan request that is PendingApproval.

{
"cmd": "RejectRemitaLoanRequestCommand",
"data": { "id": 5, "comment": "Insufficient salary history" }
}
FieldTypeRequiredDescription
idlongYesLoan request ID
commentstringNoRejection reason

Prerequisites: Loan must be in PendingApproval (1) status.

Response:

{
"id": 5,
"status": 3,
"statusDesc": "Rejected",
"approvalComment": "Insufficient salary history"
}

ActivateRemitaMandateCommand​

Marks claim for mandate activation. Sets mandate status to ActivationPending.

{
"cmd": "ActivateRemitaMandateCommand",
"data": { "id": 5 }
}
FieldTypeRequiredDescription
idlongYesLoan request ID

Prerequisites: Mandate must not already be Activated.

Response:

{
"id": 5,
"mandateActivationStatus": 1,
"mandateActivationStatusDesc": "ActivationPending",
"mandateReference": "MND-REF-001",
"mandateCode": "MND-CODE-001"
}

DisburseRemitaLoanCommand​

Sets loan status to Disbursed and generates a disbursement reference.

{
"cmd": "DisburseRemitaLoanCommand",
"data": { "id": 5 }
}
FieldTypeRequiredDescription
idlongYesLoan request ID

Prerequisites: Loan must be Approved (2) and mandate must be Activated (2).

Response:

{
"id": 5,
"status": 4,
"statusDesc": "Disbursed",
"disbursementReference": "REM-20260315103000-5",
"disbursementDate": "2026-03-15T10:30:00",
"disbursementChannel": 0,
"disbursementChannelDesc": "NIP"
}

CancelRemitaLoanRequestCommand​

Cancels a loan request. Not allowed if already Disbursed or Active.

{
"cmd": "CancelRemitaLoanRequestCommand",
"data": { "id": 5, "comment": "Customer withdrew application" }
}
FieldTypeRequiredDescription
idlongYesLoan request ID
commentstringNoCancellation reason

Prerequisites: Loan must NOT be Disbursed (4) or Active (6).

Response:

{
"id": 5,
"status": 8,
"statusDesc": "Cancelled"
}

RetrieveRemitaLoanRequestsQuery​

Returns a paginated list of loan requests with optional filters. Supports Excel export.

{
"cmd": "RetrieveRemitaLoanRequestsQuery",
"data": {
"pageNumber": 1,
"pageSize": 20,
"organisationId": 1,
"startDate": "2026-01-01",
"endDate": "2026-03-31",
"isExport": false
}
}

Request Parameters:

FieldTypeRequiredDefaultDescription
pageNumberintNo1Page number
pageSizeintNo10Results per page
organisationIdlongNo—Filter by organisation
startDatestringNo—Filter by creation date (from). Format: yyyy-MM-dd
endDatestringNo—Filter by creation date (to). Format: yyyy-MM-dd
isExportboolNofalseIf true, returns Excel file instead of JSON

Also supports dynamic predicate filters via standard DynamicPredicateBuilder (filter by any field: status, cif, accountNumber, etc.).

Response (paginated):

{
"data": [
{
"id": 5,
"cif": "CIF001",
"accountNumber": "0012345678",
"accountName": "John Doe",
"bvn": "22234567890",
"phoneNumber": "08012345678",
"email": "john@email.com",
"companyName": "ACME Corp",
"employerRegistrationNumber": "REG123",
"loanAmount": 1000000,
"collectionAmount": 100000,
"tenure": 12,
"tenorType": 2,
"tenorTypeDesc": "Month(s)",
"interestRate": 18.5,
"currencyCode": "NGN",
"loanType": "Term Loan",
"mandateReference": "MND-REF-001",
"mandateCode": "MND-CODE-001",
"mandateActivationStatus": 2,
"mandateActivationStatusDesc": "Activated",
"status": 6,
"statusDesc": "Active",
"loanAccount": "0012345678",
"disbursementChannel": 0,
"disbursementChannelDesc": "NIP",
"disbursementReference": "REM-20260315103000-5",
"disbursementDate": "2026-03-15T10:30:00",
"initiatedBy": "John Admin-(admin@bank.com)",
"approvedBy": "Jane Approver-(jane@bank.com)",
"approvalDate": "2026-03-14T15:00:00",
"tag": "salary-advance",
"createdAt": "2026-03-10T09:00:00",
"organisationName": "Head Office",
"collectionBatchName": "March Collections"
}
],
"pages": 3,
"hasNext": true,
"hasPrevious": false,
"count": 45,
"size": 20
}

Response Fields:

FieldTypeDescription
idlongLoan request ID
cifstringCustomer Identification
accountNumberstringDisbursement account
accountNamestringAccount holder name
bvnstringBank Verification Number
phoneNumberstringCustomer phone
emailstringCustomer email
companyNamestringEmployer name
employerRegistrationNumberstringEmployer registration
loanAmountdecimalTotal loan amount
collectionAmountdecimalMonthly collection amount
tenureintLoan tenure in periods
tenorTypeintTenor type enum (see LoanTenorType)
tenorTypeDescstringTenor type description — e.g. "Month(s)"
interestRatedecimalAnnual interest rate
currencyCodestringCurrency code (ISO 4217)
loanTypestringLoan product type
mandateReferencestringRemita mandate reference
mandateCodestringRemita mandate code
mandateActivationStatusintMandate activation status: 0=NotActivated, 1=ActivationPending, 2=Activated, 3=ActivationFailed, 4=Stopped
mandateActivationStatusDescstringMandate status description (e.g. "Activated")
statusintLoan request status: 0=Draft, 1=PendingApproval, 2=Approved, 3=Rejected, 4=Disbursed, 5=DisbursementFailed, 6=Active, 7=Closed, 8=Cancelled
statusDescstringLoan status description (e.g. "Active")
loanAccountstringLoan tracking account
disbursementChannelintDisbursement channel: 0=NIP, 1=Internal
disbursementChannelDescstringChannel description (e.g. "NIP")
disbursementReferencestringDisbursement reference
disbursementDatedatetimeWhen loan was disbursed
initiatedBystringWho created the request
approvedBystringWho approved the request
approvalDatedatetimeWhen approved
tagstringCustom tag
createdAtdatetimeRecord creation timestamp
organisationNamestringOrganisation name (from lookup)
collectionBatchNamestringLinked collection batch name (if any)

RetrieveRemitaLoanRequestByIdQuery​

Returns the full detail of a single loan request, including linked collection batch info.

{
"cmd": "RetrieveRemitaLoanRequestByIdQuery",
"data": { "id": 5 }
}
FieldTypeRequiredDescription
idlongYesLoan request ID

Response:

{
"id": 5,
"cif": "CIF001",
"accountNumber": "0012345678",
"accountName": "John Doe",
"bvn": "22234567890",
"phoneNumber": "08012345678",
"email": "john@email.com",
"companyName": "ACME Corp",
"employerRegistrationNumber": "REG123",
"loanAmount": 1000000,
"collectionAmount": 100000,
"tenure": 12,
"tenorType": 2,
"tenorTypeDesc": "Month(s)",
"interestRate": 18.5,
"currencyCode": "NGN",
"loanType": "Term Loan",
"mandateReference": "MND-REF-001",
"mandateCode": "MND-CODE-001",
"mandateActivationStatus": 2,
"mandateActivationStatusDesc": "Activated",
"status": 6,
"statusDesc": "Active",
"loanAccount": "0012345678",
"disbursementChannel": 0,
"disbursementChannelDesc": "NIP",
"disbursementReference": "REM-20260315103000-5",
"disbursementResponseMessage": "Transfer successful",
"disbursementDate": "2026-03-15T10:30:00",
"initiatedBy": "John Admin-(admin@bank.com)",
"initiatedBySelfServiceUserId": 42,
"approvedBy": "Jane Approver-(jane@bank.com)",
"approvalDate": "2026-03-14T15:00:00",
"approvalComment": "Salary history verified",
"tag": "salary-advance",
"createdAt": "2026-03-10T09:00:00",
"organisationName": "Head Office",
"collectionBatch": {
"id": 3,
"batchName": "March Collections",
"batchStatus": 5,
"batchStatusDesc": "Completed"
}
}

Additional fields vs list query:

FieldTypeDescription
disbursementResponseMessagestringResponse message from disbursement attempt
initiatedBySelfServiceUserIdlongUser ID of initiator
approvalCommentstringApproval/rejection comment
collectionBatchobjectLinked collection batch (if any)
collectionBatch.idlongBatch ID
collectionBatch.batchNamestringBatch name
collectionBatch.batchStatusintBatch status: 0=Initiated, 1=PendingAuthorization, 2=Authorized, 3=Rejected, 4=Processing, 5=Completed, 6=Cancelled
collectionBatch.batchStatusDescstringBatch status description (e.g. "Completed")

4.2 Remita Loan Processing (API Integration)​

Commands that interact with the Remita API directly. These are typically called by BPMN process tasks, not directly by UI.

ProcessRemitaActivateMandateCommand​

Activates a mandate via Remita Disbursement Notification API. On success, sets mandate to Activated and loan status to Active.

{
"cmd": "ProcessRemitaActivateMandateCommand",
"data": { "id": 5, "comment": "Activating mandate" }
}
FieldTypeRequiredDescription
idlongYesLoan request ID
commentstringNoComment to append to approval notes

API call: Sends disbursement notification to Remita with customer details, loan amounts, and repayment schedule.

Response:

{
"id": 5,
"mandateReference": "MND-REF-001",
"authorisationCode": "AUTH-UPDATED-789",
"mandateActivationStatus": 2,
"mandateActivationStatusDesc": "Activated",
"status": 6,
"statusDesc": "Active"
}

ProcessRemitaStopMandateCommand​

Stops a mandate via Remita Stop Loan Collection API.

{
"cmd": "ProcessRemitaStopMandateCommand",
"data": { "id": 5, "comment": "Customer request to stop collections" }
}
FieldTypeRequiredDescription
idlongYesLoan request ID
commentstringNoReason for stopping

Response:

{
"id": 5,
"mandateReference": "MND-REF-001",
"mandateActivationStatus": 4,
"mandateActivationStatusDesc": "Stopped"
}

ProcessRemitaDisburseLoanCommand​

Disburses the loan via core banking. Uses Internal transfer for same-bank or NIP for external accounts.

{
"cmd": "ProcessRemitaDisburseLoanCommand",
"data": { "id": 5, "comment": "Disbursing loan" }
}
FieldTypeRequiredDescription
idlongYesLoan request ID
commentstringNoDisbursement comment

Prerequisites: Mandate must be Activated (2). Loan must NOT already be Disbursed.

Response:

{
"id": 5,
"status": 4,
"statusDesc": "Disbursed",
"disbursementReference": "REM-20260315103000-5",
"disbursementDate": "2026-03-15T10:30:00",
"disbursementChannel": 1,
"disbursementChannelDesc": "Internal"
}

On failure, status is set to DisbursementFailed (5) with a disbursementResponseMessage.

ProcessRemitaRejectLoanCommand​

Rejects a loan and sends email notification to the customer.

{
"cmd": "ProcessRemitaRejectLoanCommand",
"data": { "id": 5, "comment": "BVN validation failed" }
}
FieldTypeRequiredDescription
idlongYesLoan request ID
commentstringNoRejection reason

Response:

{
"id": 5,
"status": 3,
"statusDesc": "Rejected",
"approvalComment": "BVN validation failed"
}

GetRemitaSalaryHistoryQuery​

Retrieves customer salary history from the Remita API. Supports three search modes — supply the primary identifier for exactly one mode.

Mode 1 — By Account Number + Bank Code (default)

{
"cmd": "GetRemitaSalaryHistoryQuery",
"data": {
"accountNumber": "0123456789",
"bankCode": "057"
}
}

Mode 2 — By BVN (include name + account details to improve match accuracy)

{
"cmd": "GetRemitaSalaryHistoryQuery",
"data": {
"bvn": "22163699922",
"accountNumber": "0123456789",
"bankCode": "057",
"firstName": "John",
"lastName": "Doe"
}
}

Mode 3 — By Phone Number (useMobileNumberForSearch must be true)

{
"cmd": "GetRemitaSalaryHistoryQuery",
"data": {
"phoneNumber": "08012345678",
"useMobileNumberForSearch": true
}
}
FieldTypeRequiredDefaultDescription
accountNumberstringMode 1—NUBAN account number
bankCodestringMode 1—CBN bank code
bvnstringMode 2—Bank Verification Number — activates Mode 2
firstNamestringNo—Improves BVN match accuracy (Mode 2)
lastNamestringNo—Improves BVN match accuracy (Mode 2)
middleNamestringNo—Improves BVN match accuracy (Mode 2)
phoneNumberstringMode 3—Mobile number
useMobileNumberForSearchboolMode 3falseSet true to activate Mode 3
authorisationChannelstringNo"USSD"Remita authorisation channel
authorisationCodestringNo—Remita authorisation code

Response: All modes return the same shape.

{
"isSuccessful": true,
"statusCode": "success",
"message": "Salary history retrieved.",
"data": {
"customerName": "John A. Doe",
"companyName": "Acme Corporation",
"customerId": "REM-CUST-001",
"salaryPaymentDetails": [ /* salary payment records */ ],
"loanHistoryDetails": [ /* existing loan records */ ]
}
}
FieldTypeDescription
isSuccessfulbooltrue if Remita returned status "success"
statusCodestringRemita response code or status
messagestringRemita response message or default description
data.customerNamestringBorrower's full name from Remita
data.companyNamestringEmployer name
data.customerIdstringRemita customer ID
data.salaryPaymentDetailsarraySalary payment records
data.loanHistoryDetailsarrayExisting loan history from Remita

GetRemitaPaymentHistoryQuery​

Retrieves repayment history from Remita. Supports lookup by loan ID or direct API parameters.

// Mode 1: By loan request ID
{
"cmd": "GetRemitaPaymentHistoryQuery",
"data": { "id": 5 }
}

// Mode 2: Direct Remita API params
{
"cmd": "GetRemitaPaymentHistoryQuery",
"data": {
"authorisationCode": "AUTH-CODE-123",
"customerId": "REM-CUST-001",
"mandateRef": "MND-REF-001"
}
}
FieldTypeRequiredDescription
idlongNoLoan request ID (auto-resolves Remita params)
authorisationCodestringNoDirect Remita authorisation code
customerIdstringNoDirect Remita customer ID
mandateRefstringNoDirect mandate reference

Response: Returns a CommandExecutionResponse wrapping the Remita payment history data.

{
"isSuccessful": true,
"statusCode": "00",
"message": "Payment history retrieved.",
"data": {
/* Raw Remita payment/repayment history payload */
}
}
FieldTypeDescription
isSuccessfulbooltrue if Remita response code is "00"
statusCodestringRemita response code ("00" = success)
messagestringRemita response message
dataobjectRaw Remita repayment history data

SyncRemitaPaymentHistoryCommand​

Syncs payment history from Remita and creates local RemitaCollection records for newly discovered payments. Deduplicates by TransactionReference + MandateReference.

{
"cmd": "SyncRemitaPaymentHistoryCommand",
"data": { "id": 5 }
}
FieldTypeRequiredDescription
idlongYesLoan request ID

Response:

{
"id": 5,
"mandateReference": "MND-REF-001",
"totalPaidRepayments": 8,
"newCollectionsRecorded": 3,
"repayments": [ /* raw Remita repayment data */ ]
}

4.3 Remita Collection Management​

RetrieveRemitaCollectionsQuery​

Returns a paginated list of individual collection records. Supports Excel export.

{
"cmd": "RetrieveRemitaCollectionsQuery",
"data": {
"pageNumber": 1,
"pageSize": 20,
"loanRequestId": 5,
"batchId": 3,
"isPosted": false,
"startDate": "2026-01-01",
"endDate": "2026-03-31",
"isExport": false
}
}

Request Parameters:

FieldTypeRequiredDefaultDescription
pageNumberintNo1Page number
pageSizeintNo10Results per page
batchIdlongNo—Filter by collection batch ID
loanRequestIdlongNo—Filter by loan request ID
isPostedboolNo—Filter by posting status
startDatestringNo—Filter from date. Format: yyyy-MM-dd
endDatestringNo—Filter to date. Format: yyyy-MM-dd
isExportboolNofalseIf true, returns Excel file

Also supports dynamic predicate filters.

Response (paginated):

{
"data": [
{
"id": 101,
"mandateReference": "MND-REF-001",
"mandateCode": "MND-CODE-001",
"transactionAmount": 100000,
"paymentStatus": 1,
"paymentStatusDesc": "Successful",
"paymentStatusMessage": "Payment received",
"transactionReference": "TXN-REF-001",
"providerReference": "PROV-REF-001",
"isPosted": true,
"postingReference": "POST-20260315-101",
"postingDate": "2026-03-16T08:00:00",
"accountNumber": "0012345678",
"accountName": "John Doe",
"bankCode": "058",
"narration": "Loan repayment",
"createdAt": "2026-03-15T10:00:00",
"loanRequest": {
"id": 5,
"cif": "CIF001",
"accountNumber": "0012345678",
"accountName": "John Doe",
"loanAmount": 1000000,
"collectionAmount": 100000,
"status": 6,
"statusDesc": "Active"
},
"collectionBatch": {
"id": 3,
"batchName": "March Collections",
"batchStatus": 5,
"batchStatusDesc": "Completed"
}
}
],
"pages": 1,
"hasNext": false,
"hasPrevious": false,
"count": 8,
"size": 20
}

RetrieveRemitaCollectionByIdQuery​

Returns full detail of a single collection record.

{
"cmd": "RetrieveRemitaCollectionByIdQuery",
"data": { "id": 101 }
}
FieldTypeRequiredDescription
idlongYesCollection ID

Response: Same fields as list query, with additional detail in the loanRequest object:

Additional loanRequest FieldsTypeDescription
bvnstringBVN
tenureintLoan tenure
mandateReferencestringMandate reference
organisationNamestringOrganisation name

PostRemitaCollectionCommand​

Marks a successful collection as posted (e.g., after journal entry).

{
"cmd": "PostRemitaCollectionCommand",
"data": { "id": 101, "postingReference": "JNL-2026-001" }
}
FieldTypeRequiredDescription
idlongYesCollection ID
postingReferencestringNoJournal reference. Auto-generated if omitted: POST-{yyyyMMddHHmmss}-{id}

Prerequisites: Collection paymentStatus must be Successful (1) and not already posted.

Response:

{
"id": 101,
"isPosted": true,
"postingReference": "JNL-2026-001",
"postingDate": "2026-03-16T08:00:00"
}

ReverseRemitaCollectionCommand​

Reverses a successful collection.

{
"cmd": "ReverseRemitaCollectionCommand",
"data": { "id": 101, "reason": "Duplicate debit" }
}
FieldTypeRequiredDescription
idlongYesCollection ID
reasonstringNoReversal reason. Defaults to "Manual reversal"

Prerequisites: Collection paymentStatus must be Successful (1).

Response:

{
"id": 101,
"paymentStatus": 3,
"paymentStatusDesc": "Reversed",
"paymentStatusMessage": "Duplicate debit"
}

4.4 Remita Collection Batch Management​

Lifecycle: Initiated → PendingAuthorization → Authorized → Processing → Completed

CreateRemitaCollectionBatchCommand​

Creates a new collection batch and optionally links loan requests to it.

{
"cmd": "CreateRemitaCollectionBatchCommand",
"data": {
"batchName": "March Collections",
"batchDescription": "Monthly Remita repayments",
"organisationId": 1,
"loanRequestIds": [5, 8, 12]
}
}
FieldTypeRequiredDescription
batchNamestringYesBatch name
batchDescriptionstringNoBatch description
organisationIdlongYesOrganisation ID
loanRequestIdslong[]NoLoan request IDs to link to this batch

Response:

{
"id": 3,
"batchName": "March Collections",
"batchStatus": 0,
"batchStatusDesc": "Initiated",
"totalCount": 3,
"totalAmount": 350000,
"linkedLoanRequests": 3
}

AuthorizeRemitaCollectionBatchCommand​

Authorizes a collection batch for processing.

{
"cmd": "AuthorizeRemitaCollectionBatchCommand",
"data": { "id": 3, "comment": "Verified amounts" }
}
FieldTypeRequiredDescription
idlongYesBatch ID
commentstringNoAuthorisation comment

Prerequisites: Batch must be in Initiated (0) or PendingAuthorization (1).

Response:

{
"id": 3,
"batchStatus": 2,
"batchStatusDesc": "Authorized",
"authorizedBy": "Jane Approver-(jane@bank.com)",
"authorizationDate": "2026-03-15T14:00:00"
}

RejectRemitaCollectionBatchCommand​

Rejects a collection batch.

{
"cmd": "RejectRemitaCollectionBatchCommand",
"data": { "id": 3, "comment": "Amounts incorrect" }
}
FieldTypeRequiredDescription
idlongYesBatch ID
commentstringNoRejection reason

Prerequisites: Batch must be in PendingAuthorization (1) or Initiated (0).

Response:

{
"id": 3,
"batchStatus": 3,
"batchStatusDesc": "Rejected",
"authorizationComment": "Amounts incorrect"
}

RunRemitaCollectionBatchCommand​

Runs an authorized batch — creates RemitaCollection records for each linked loan with an activated mandate and sets batch to Processing.

{
"cmd": "RunRemitaCollectionBatchCommand",
"data": { "id": 3 }
}
FieldTypeRequiredDescription
idlongYesBatch ID

Prerequisites: Batch must be Authorized (2) and not already Processing.

Response:

{
"id": 3,
"batchStatus": 4,
"batchStatusDesc": "Processing",
"totalCount": 3,
"totalAmount": 350000
}

CancelRemitaCollectionBatchCommand​

Cancels a collection batch. Not allowed if already Processing or Completed.

{
"cmd": "CancelRemitaCollectionBatchCommand",
"data": { "id": 3 }
}
FieldTypeRequiredDescription
idlongYesBatch ID

Response:

{
"id": 3,
"batchStatus": 6,
"batchStatusDesc": "Cancelled"
}

RetrieveRemitaCollectionBatchesQuery​

Returns a paginated list of collection batches. Supports Excel export.

{
"cmd": "RetrieveRemitaCollectionBatchesQuery",
"data": {
"pageNumber": 1,
"pageSize": 20,
"organisationId": 1,
"startDate": "2026-01-01",
"endDate": "2026-03-31"
}
}

Request Parameters:

FieldTypeRequiredDefaultDescription
pageNumberintNo1Page number
pageSizeintNo10Results per page
organisationIdlongNo—Filter by organisation
startDatestringNo—Filter from date
endDatestringNo—Filter to date
isExportboolNofalseIf true, returns Excel file

Response (paginated):

{
"data": [
{
"id": 3,
"batchName": "March Collections",
"batchDescription": "Monthly Remita repayments",
"dateCreated": "2026-03-01T09:00:00",
"batchStatus": 5,
"batchStatusDesc": "Completed",
"initiatedBy": "John Admin-(admin@bank.com)",
"authorizedBy": "Jane Approver-(jane@bank.com)",
"authorizationDate": "2026-03-01T10:00:00",
"totalCount": 3,
"totalAmount": 350000,
"successCount": 3,
"failureCount": 0,
"createdAt": "2026-03-01T09:00:00",
"organisationName": "Head Office"
}
],
"pages": 1,
"hasNext": false,
"hasPrevious": false,
"count": 5,
"size": 20
}

RetrieveRemitaCollectionBatchByIdQuery​

Returns full detail of a single batch, including linked loan requests and collection records.

{
"cmd": "RetrieveRemitaCollectionBatchByIdQuery",
"data": { "id": 3 }
}
FieldTypeRequiredDescription
idlongYesBatch ID

Response:

{
"id": 3,
"batchName": "March Collections",
"batchDescription": "Monthly Remita repayments",
"dateCreated": "2026-03-01T09:00:00",
"batchStatus": 5,
"batchStatusDesc": "Completed",
"initiatedBy": "John Admin-(admin@bank.com)",
"initiatedBySelfServiceUserId": 42,
"authorizedBy": "Jane Approver-(jane@bank.com)",
"authorizationDate": "2026-03-01T10:00:00",
"authorizationComment": "Verified amounts",
"totalCount": 3,
"totalAmount": 350000,
"successCount": 3,
"failureCount": 0,
"createdAt": "2026-03-01T09:00:00",
"organisationName": "Head Office",
"loanRequests": [
{
"id": 5,
"cif": "CIF001",
"accountNumber": "0012345678",
"accountName": "John Doe",
"loanAmount": 1000000,
"collectionAmount": 100000,
"mandateReference": "MND-REF-001",
"status": 6,
"statusDesc": "Active",
"mandateActivationStatus": 2,
"mandateActivationStatusDesc": "Activated"
}
],
"collections": [
{
"id": 101,
"mandateReference": "MND-REF-001",
"transactionAmount": 100000,
"paymentStatus": 1,
"paymentStatusDesc": "Successful",
"transactionReference": "TXN-REF-001",
"isPosted": true,
"accountNumber": "0012345678",
"createdAt": "2026-03-15T10:00:00"
}
]
}

5. Webhook Endpoints​

5.1 Fixed Webhook Endpoints​

These endpoints receive callbacks from external providers.

NIBSS Mono Callback​

POST /api/bpm/webhooks/mono_callback
Authorization: Bearer {token}

Handles Mono direct debit mandate lifecycle events:

  • events.mandates.created — Mandate created
  • events.mandates.approved — Mandate approved
  • events.mandates.rejected — Mandate rejected
  • events.mandates.ready — Mandate ready for debit
  • events.mandate.action.pause — Mandate paused
  • events.mandate.action.cancel — Mandate cancelled
  • events.mandate.action.reinstate — Mandate reinstated
  • events.mandates.debit.processing — Debit being processed
  • events.mandates.debit.success — Debit successful
  • events.mandates.debit.failed — Debit failed

Remita Webhook​

POST /api/bpm/webhooks/remita_webhook
Authorization: None (AllowAnonymous)

Handles Remita mandate lifecycle events:

  • mandate_activation_success — Mandate activated
  • mandate_activation_failed — Mandate activation failed
  • mandate_stopped — Mandate stopped
  • collection_success — Collection succeeded
  • collection_failed — Collection failed

Remita Collection Notification​

POST /api/bpm/webhooks/remita_collection
Authorization: None (AllowAnonymous)

Receives Remita repayment/collection notifications. Creates RemitaCollection records and triggers payment history sync.

Payload:

{
"mandateRef": "MAND-REF-001",
"customer_id": "CUST-001",
"request_id": "REQ-001",
"amount": 100000,
"payment_date": "2026-02-15",
"payment_status": "01",
"payment_ref": "PAY-REF-001",
"status_reason": "Successful"
}

5.2 Dynamic Webhook Router​

POST|GET|PUT|DELETE|PATCH /api/webhook/{*path}

A configurable webhook router that matches incoming requests against WebHookConfig records. Supports IP filtering and three execution modes:

ModeValueDescription
ExecuteNativeCommand0Runs a named BPM command
ExecuteCode2Runs inline script via formula engine
StartProcess3Starts a BPMN process instance

Webhook Config Commands​

// Create webhook config
{
"cmd": "CreateWebHookConfigCommand",
"data": {
"key": "paystack_callback",
"description": "Paystack payment callback",
"isEnabled": true,
"path": "paystack/callback",
"action": "POST",
"executionType": 0,
"commandName": "ProcessPaystackPaymentCommand",
"allowableIPs": "52.31.139.75,52.49.173.169"
}
}

// Toggle webhook
{ "cmd": "ActivateWebHookConfigCommand", "data": { "id": 1 } }
{ "cmd": "DeactivateWebHookConfigCommand", "data": { "id": 1 } }

// Query webhooks
{ "cmd": "GetWebHookConfigListQuery", "data": { "pageNumber": 1, "pageSize": 20 } }
{ "cmd": "GetWebHookConfigByIdQuery", "data": { "id": 1 } }
{ "cmd": "LookupWebHookByKeyCommand", "data": { "key": "paystack_callback" } }

6. Configuration​

Remita API Configuration​

The Remita API integration requires these tenant configuration keys:

KeyDescription
REMITTA:API_KEYRemita API key
REMITTA:API_TOKENRemita API token (for HMAC signing)
REMITTA:MERCHANT_IDRemita merchant identifier
REMITTA:BASE_ENDPOINTRemita API base URL

Authentication uses SHA-512 HMAC: hash = SHA512(apiKey + requestId + apiToken)

Channel Configuration (CC Config) — YAML​

The Channel Configuration (ConfigDefinition with code CC) is a YAML-based configuration that defines transaction channels, sales channels, services, mandate products, and disbursement sources. It is stored in the ConfigDefinition table and deserialized into ChannelsConfig.

Full YAML Schema​

# ── Transaction Channels ──────────────────────────────────────────────
transactionChannels:
- code: MOBILE
name: Mobile Banking
accountNumber: '1000001'
allowedOperations:
- deposit
- withdraw
- transfer
- code: TELLER
name: Teller
accountNumber: '1000002'
allowedOperations:
- deposit
- withdraw
- transfer
- code: WEB
name: Web Banking
accountNumber: '1000001'
allowedOperations:
- deposit
- withdraw
- transfer

# ── Mandate Products ──────────────────────────────────────────────────
# Used by: CreateNibssMandateCommand, RetrieveNibssMandateProductsQuery
# Each mandate must reference a valid productCode from this list.
mandateProducts:
- productCode: PROD-LN-001
productName: Loan Repayment
productDescription: Direct debit mandate for loan repayment collections
isActive: true
- productCode: PROD-INS-001
productName: Insurance Premium
productDescription: Recurring insurance premium collection via direct debit
isActive: true
- productCode: PROD-SAV-001
productName: Savings Plan
productDescription: Automated savings collection via NIBSS direct debit
isActive: true
- productCode: PROD-SUB-001
productName: Subscription
productDescription: Recurring subscription payment collection
isActive: false

# ── Disbursement Sources ──────────────────────────────────────────────
# Used by: RetrieveDisbursementSourcesQuery, InitiateDisbursementBatchCommand
# Defines the source accounts from which disbursements are funded.
disbursementSources:
- accountNumber: '0011234567'
sourceAccountName: Main Disbursement Account
sourceAccountCIF: CIF001
sourceChannel: INTERNAL
disbursementSourceAccountGroup: 1
sourceGroupDescription: Primary Disbursement Pool
isEnabled: true
- accountNumber: '0019876543'
sourceAccountName: Payroll Disbursement Account
sourceAccountCIF: CIF002
sourceChannel: INTERNAL
disbursementSourceAccountGroup: 2
sourceGroupDescription: Payroll Pool
isEnabled: true
- accountNumber: '0015556789'
sourceAccountName: Vendor Payment Account
sourceAccountCIF: CIF003
sourceChannel: NIBSS
disbursementSourceAccountGroup: 3
sourceGroupDescription: Vendor Payments
isEnabled: false

Mandate Products Schema​

FieldTypeRequiredDescription
productCodestringYesUnique product identifier (referenced in CreateNibssMandateCommand)
productNamestringYesDisplay name for the product
productDescriptionstringNoDetailed product description
isActiveboolNoWhether the product is available for new mandates (default: true)

Disbursement Sources Schema​

FieldTypeRequiredDescription
accountNumberstringYesSource account number
sourceAccountNamestringYesDisplay name for the source account
sourceAccountCIFstringNoCore banking CIF for the source account
sourceChannelstringNoChannel identifier (e.g. INTERNAL, NIBSS)
disbursementSourceAccountGroupintNoGroup number for categorising sources (default: 1)
sourceGroupDescriptionstringNoDescription of the source group
isEnabledboolNoWhether the source is available for new batches (default: true)
Configuration Management

The CC config is managed via the Config Definition screen in the admin portal. Use CreateConfigDefinitionCommand with code CC to create or update the configuration programmatically. The YAML is validated on save using ChannelYamlConfigValidation.

NIBSS Configuration​

NIBSS integration uses the ITransferProviderWrapper with provider key Nibss. Connection strings are configured per-tenant via:

  • ConnectionStrings:NibssConnection — Direct NIBSS database
  • ConnectionStrings:NibssExternalConnection — External NIBSS access

Auto-Migration​

Both Administration.Api and Nibss.Api support automatic database migration on startup:

{
"AutoMigrate": {
"Enabled": true
}
}

When enabled:

  • Administration.Api: Iterates all active tenants from MasterDb and applies pending AdministrationDbContext migrations for each
  • Nibss.Api: Applies pending NibssDbContext migrations (or creates schema if no migrations exist)
Production

Set AutoMigrate:Enabled to false in production unless you want migrations to auto-apply. Recommended: enable only during deployment, then disable.


7. Process Entity Types & Trigger Events​

These enums are used when configuring BPMN process definitions to bind a process to a specific entity type and trigger event.

ProcessEntityType​

Used in process definition YAML as the entityType field. Determines which entity a process instance is associated with.

ValueYAML AliasDescription
0noneNot associated with any entity
1entityGeneric entity
2contactCore Banking — Contact
3loanCore Banking — Loan
4depositCore Banking — Deposit
5insurancePolicyCore Insurance — Policy
6insuranceClaimCore Insurance — Claims
11transactionCore Banking — Transaction
13tellerCore Banking — Teller Transaction
14inwardTransactionIntegrations — Inward Transaction
15scheduledProcessScheduled Process
16employeeRecordHR — Employee Record
100customerRegistrationChannel — Customer Registration
101loanRequestChannel — Loan Request
102transferRequestChannel — Transfer Request
103billsPaymentRequestChannel — Bills Payment Request
104airtimeRechargeRequestChannel — Airtime Recharge Request
105dataRechargeRequestChannel — Data Recharge Request
106selfServiceUserChannel — User (Corporate or Individual)
200reconciliationJobReconciliation Job
250transactionMonitoringDataTransaction Monitoring Data
300disbursementBatchOperations — Disbursement Batch
301disbursementOperations — Disbursement
310nibssMandateBatchNIBSS — Mandate Batch
311nibssMandateNIBSS — Mandate
320nibssCollectionBatchNIBSS — Collection Batch
321nibssCollectionNIBSS — Collection
330remitaLoanRequestRemita — Loan Request
331remitaCollectionBatchRemita — Collection Batch
332remitaCollectionRemita — Collection

ProcessDefinitionTriggerEventsEnum​

Used in process definition YAML as the triggerEvent field. Determines which event automatically starts a process instance.

Customer / Contact Events (1–99)​

ValueYAML AliasDescription
1onCustomerCreationNew customer created
2onCustomerUpdatedCustomer info updated
3onNewRegistrationNew customer registration completed

Loan Events (100–199)​

ValueYAML AliasDescription
100onLoanCreationNew loan created
101onLoanDisbursedLoan disbursed
102onLoanRescheduledLoan rescheduled
103onLoanRefinancedLoan refinanced
104onLoanUpdatedLoan details updated

Deposit / Account Events (200–299)​

ValueYAML AliasDescription
200onAccountCreationNew account created
201onDepositCreationNew deposit created
202onDepositAccountUpdatedDeposit account updated

Transaction Events (300–399)​

ValueYAML AliasDescription
300onTransactionCreationNew transaction created
301onTransactionIngestionTransaction ingested for monitoring
302onTransactionEvaluationTransaction evaluated by rules

Transfer Events (400–499)​

ValueYAML AliasDescription
400onTransferReceivedTransfer received
401onTransferInitiatedTransfer initiated
402onTransferCompletedTransfer completed

Inward Transaction / NIBSS Events (500–599)​

ValueYAML AliasDescription
500onInwardTransactionReceivedInward transaction received from NIBSS
501onInwardTransactionProcessedInward transaction processed
502onInwardTransactionFailedInward transaction failed
503onInwardTransactionReversedInward transaction reversed

Bills Payment Events (600–699)​

ValueYAML AliasDescription
600onBillsPaymentTransactionInitiatedBills payment initiated
601onBillsPaymentTransactionCompletedBills payment completed
602onBillsPaymentTransactionFailedBills payment failed
603onBillsPaymentTransactionReversedBills payment reversed

Airtime Recharge Events (700–799)​

ValueYAML AliasDescription
700onAirtimeRechargeTransactionInitiatedAirtime recharge initiated
701onAirtimeRechargeTransactionCompletedAirtime recharge completed
702onAirtimeRechargeTransactionFailedAirtime recharge failed
703onAirtimeRechargeTransactionReversedAirtime recharge reversed

Data Recharge Events (800–899)​

ValueYAML AliasDescription
800onDataRechargeTransactionInitiatedData recharge initiated
801onDataRechargeTransactionCompletedData recharge completed
802onDataRechargeTransactionFailedData recharge failed
803onDataRechargeTransactionReversedData recharge reversed

Teller Events (900–999)​

ValueYAML AliasDescription
900onCashDepositCash deposit at teller
901onCashWithdrawalCash withdrawal at teller
902onTellerBalanceCheckTeller balance check
903onTellerEndOfDayTeller end-of-day closing
904onTellerTransactionReversalTeller transaction reversed

Insurance Events (1000–1099)​

ValueYAML AliasDescription
1000onInsurancePolicyCreationNew insurance policy created

Reconciliation Events (1100–1199)​

ValueYAML AliasDescription
1100onReconciliationJobStartReconciliation job started
1101onReconciliationJobCompletionReconciliation job completed
1102onReconciliationDataUpdateReconciliation data updated
1103onReconciliationErrorReconciliation error occurred

Monitoring / Alert Events (1200–1299)​

ValueYAML AliasDescription
1200onMonitoringAlertRaisedMonitoring alert raised
1201onMonitoringAlertAcknowledgedMonitoring alert acknowledged
1202onMonitoringAlertResolvedMonitoring alert resolved

Channel / Self-Service User Events (1300–1399)​

ValueYAML AliasDescription
1300onChannelCustomerRegistrationCustomer registered via self-service
1301onLoanOriginationRequestCreatedLoan origination request created
1302onChannelDocumentUploadedDocument uploaded via channel
1303onChannelIdentityDocumentUploadedIdentity document uploaded
1304onCorporateUserCreatedCorporate self-service user created
1305onBackOfficeUserCreatedBack-office user created
1306onUserLoginCompletedSelf-service user login completed

Loan Request Events (1400–1499)​

ValueYAML AliasDescription
1400onChannelLoanRequestCreatedChannel loan request created
1401onChannelLoanRequestCreditSearchMadeCredit search made for loan request
1402onChannelLoanRequestStatementRequestMadeStatement request made for loan request

Employee Record Events (1500–1599)​

ValueYAML AliasDescription
1500onEmployeeRecordCreatedNew employee record created
1501onEmployeeRecordUpdatedEmployee record updated
1502onEmployeeRecordDeactivatedEmployee record deactivated

Disbursement Batch Events (1600–1699)​

ValueYAML AliasDescription
1600onDisbursementBatchCreatedNew disbursement batch created
1601onDisbursementBatchApprovedDisbursement batch approved
1602onDisbursementBatchProcessedDisbursement batch fully processed
1603onDisbursementBatchFailedDisbursement batch failed

Disbursement Events (1700–1799)​

ValueYAML AliasDescription
1700onDisbursementCreatedNew disbursement created
1701onDisbursementCompletedDisbursement completed successfully
1702onDisbursementFailedDisbursement failed
1703onDisbursementReversedDisbursement reversed

NIBSS Mandate Batch Events (1800–1899)​

ValueYAML AliasDescription
1800onNibssMandateBatchCreatedNew NIBSS mandate batch created
1801onNibssMandateBatchSubmittedNIBSS mandate batch submitted
1802onNibssMandateBatchCompletedNIBSS mandate batch fully processed
1803onNibssMandateBatchFailedNIBSS mandate batch failed

NIBSS Mandate Events (1900–1999)​

ValueYAML AliasDescription
1900onNibssMandateCreatedNew NIBSS mandate created
1901onNibssMandateActivatedNIBSS mandate activated
1902onNibssMandateSuspendedNIBSS mandate suspended
1903onNibssMandateCancelledNIBSS mandate cancelled

NIBSS Collection Batch Events (2000–2099)​

ValueYAML AliasDescription
2000onNibssCollectionBatchCreatedNew NIBSS collection batch created
2001onNibssCollectionBatchSubmittedNIBSS collection batch submitted
2002onNibssCollectionBatchCompletedNIBSS collection batch fully processed
2003onNibssCollectionBatchFailedNIBSS collection batch failed

NIBSS Collection Events (2100–2199)​

ValueYAML AliasDescription
2100onNibssCollectionCreatedNew NIBSS collection created
2101onNibssCollectionCompletedNIBSS collection completed successfully
2102onNibssCollectionFailedNIBSS collection failed
2103onNibssCollectionReversedNIBSS collection reversed

Remita Loan Request Events (2200–2299)​

ValueYAML AliasDescription
2200onRemitaLoanRequestCreatedNew Remita loan request created
2201onRemitaLoanRequestApprovedRemita loan request approved
2202onRemitaLoanRequestRejectedRemita loan request rejected
2203onRemitaLoanMandateActivatedRemita loan mandate activated
2204onRemitaLoanDisbursedRemita loan disbursed

Remita Collection Batch Events (2300–2399)​

ValueYAML AliasDescription
2300onRemitaCollectionBatchCreatedNew Remita collection batch created
2301onRemitaCollectionBatchAuthorizedRemita collection batch authorized
2302onRemitaCollectionBatchCompletedRemita collection batch completed
2303onRemitaCollectionBatchFailedRemita collection batch failed

Remita Collection Events (2400–2499)​

ValueYAML AliasDescription
2400onRemitaCollectionCreatedNew Remita collection created
2401onRemitaCollectionCompletedRemita collection completed successfully
2402onRemitaCollectionFailedRemita collection failed
2403onRemitaCollectionReversedRemita collection reversed

Scheduled Execution​

ValueYAML AliasDescription
9999onScheduledExecutionTriggered by Hangfire scheduled process