SIL Transactions — Overview
All financial commands flow through ISITPostingService.PostAsync, which:
- Validates the account against the Active rule.
- Validates the counterparty for transfers.
- Checks idempotency by
(tenant, transactionReference). - Routes to approval if the SIL debit/credit limit is breached, otherwise applies the balance impact.
- Writes a balanced double-entry (
SITTransactionEntry). - Enqueues a
SITSyncQueuerow for the hosted worker to replay to core.
Commands
| Command | Purpose |
|---|---|
SITDepositToTillCommand | Cash / cheque deposit into a till |
SITWithdrawFromTillCommand | Cash withdrawal from a till |
SITWithdrawFromTillForClosureCommand | Withdrawal as part of an account-closure flow |
SITLoanRepaymentCommand | Loan repayment received over the till |
SITTransferCommand | Account-to-account transfer (no till impact) |
SITReverseTransactionCommand | Reverse an unsynced SIL transaction |
SITCancelTransactionCommand | Initiating teller cancels a pending-approval transaction |
GetSITTransactionListQuery | Filterable / exportable list of SIL transactions |
GetSITTransactionDetailQuery | Full details of a single SIL transaction |
Enums & Status Codes
All status fields in SIL responses are returned as string names. See the SIL Enums Reference for the full list of values for:
SITTransactionStatusEnum— business lifecycle (Pending, Posted, Reversed, Rejected, Cancelled)SITCoreSyncStatusEnum— replay-to-core state (NotQueued, Queued, SyncedToCore, FailedToSync, DeadLettered)SITApprovalStatusEnum— approval workflow stateSITTransactionTypeEnum— Deposit, Withdrawal, Transfer, etc. |SITDownloadTransactionReceiptCommand| Generate a PDF receipt for a SIL transaction (Base64) |
Common request fields
Every financial command shares this base payload:
| Field | Required | Notes |
|---|---|---|
transactionReference | yes | Unique per tenant. Used as the idempotency key. |
accountNumber | yes | Primary SIL account |
amount | yes | Must be > 0 |
currency | no | Defaults to "NGN" |
narration | no | Free-text description |
tellerUserId / initiatorUserId | no | Stamped on the transaction for audit |
tillId | yes for till-based commands | Linked till |
cashOrCheque | no | Cash (default) or Cheque. Cheque does not move the till. |
chequeNumber | conditional | Required when cashOrCheque = Cheque |
idempotencyKey | no | Defaults to transactionReference |
Common response
All commands return the platform CommandExecutionResponse wrapping a
SITPostingResult:
{
"isSuccessful": true,
"message": "Posted to SIT.",
"data": {
"sitTransactionId": "<guid>",
"transactionReference": "M226E1M2269165431",
"status": "Posted",
"approvalStatus": "NotRequired",
"amount": 40.00,
"currency": "NGN",
"newAvailableBalance": 154300.00,
"newLedgerBalance": 154300.00,
"wasDuplicate": false
}
}
When the limit is breached, status = "Pending" and
approvalStatus = "PendingApproval". No balance is applied until the
transaction is approved.
Status & error codes
| HTTP / status | Meaning |
|---|---|
200 / 00 | Posted, or held for approval |
400 | Bad payload (missing reference, amount ≤ 0, idempotency mismatch) |
409 | State conflict — account frozen, closed, dormant, PND/PNC, insufficient funds |