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
cifstringYesCustomer Identification
accountNumberstringYesLoan disbursement account number
accountNamestringNoCustomer account name
bvnstringYesBank Verification Number
phoneNumberstringNoCustomer phone number
emailstringNoCustomer email address
companyNamestringNoEmployer company name
employerRegistrationNumberstringNoEmployer registration number
loanAmountdecimalYesTotal loan amount
collectionAmountdecimalYesMonthly collection/repayment amount
tenureintYesLoan 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
loanAccountstringNoLoan tracking account
currencyCodestringNo"NGN"Currency code (ISO 4217)
loanTypestringNoLoan product type description
organisationIdlongYesOrganisation/branch identifier
tagstringNoCustom tag for categorisation
bankCodestringNoCustomer's bank code
remitaCustomerIdstringNoRemita customer ID
authorisationCodestringNoRemita 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
organisationIdlongNoFilter by organisation
startDatestringNoFilter by creation date (from). Format: yyyy-MM-dd
endDatestringNoFilter 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 directly from Remita API.

{
"cmd": "GetRemitaSalaryHistoryQuery",
"data": {
"firstName": "John",
"lastName": "Doe",
"middleName": "",
"accountNumber": "0012345678",
"bankCode": "058",
"bvn": "22234567890",
"phoneNumber": "08012345678",
"useMobileNumberForSearch": false,
"authorisationChannel": "USSD",
"authorisationCode": "AUTH-CODE-123"
}
}
FieldTypeRequiredDefaultDescription
firstNamestringNoCustomer first name
lastNamestringNoCustomer last name
middleNamestringNoCustomer middle name
accountNumberstringNoBank account number
bankCodestringNoCustomer bank code
bvnstringNoBank Verification Number
phoneNumberstringNoCustomer phone number
useMobileNumberForSearchboolNofalseSearch by mobile number instead of account
authorisationChannelstringNo"USSD"Remita authorisation channel
authorisationCodestringNoRemita authorisation code

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

{
"isSuccessful": true,
"statusCode": "success",
"message": "Salary history retrieved.",
"data": {
/* Raw Remita salary history payload */
}
}
FieldTypeDescription
isSuccessfulbooltrue if Remita returned status "success"
statusCodestringRemita response code or status
messagestringRemita response message or default description
dataobjectRaw Remita salary history data (employer info, salary records, etc.)

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
batchIdlongNoFilter by collection batch ID
loanRequestIdlongNoFilter by loan request ID
isPostedboolNoFilter by posting status
startDatestringNoFilter from date. Format: yyyy-MM-dd
endDatestringNoFilter 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
organisationIdlongNoFilter by organisation
startDatestringNoFilter from date
endDatestringNoFilter 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