Skip to main content

Transfers

The platform supports three transfer types: internal (same-bank), external (Nigerian interbank via NIBSS NIP), and international (SWIFT). All transfers go through fraud detection before processing.

Transfer Flow

Client                 Banking API              NIBSS / SWIFT
│ │ │
│ POST /transfers/* │ │
│───────────────────────▶│ │
│ │── fraud check ──▶ │
│ │◀── risk score ── │
│ │ │
│ │── validate recipient ─▶│
│ │◀── name enquiry ──────│
│ │ │
│ │── debit wallet │
│ │── submit transfer ────▶│
│ │◀── confirmation ──────│
│ { reference, status } │ │
│◀───────────────────────│ │

Internal Transfers

Move money between wallets on the same tenant. Settles instantly with zero fees.

POST /api/v1/transfers/internal
curl -X POST https://api.korastratum.com/api/v1/banking/transfers/internal \
-H "Authorization: Bearer $TOKEN" \
-H "X-Tenant-ID: fmfb" \
-H "Content-Type: application/json" \
-d '{
"sourceWalletId": "a1b2c3d4-...",
"recipientAccountNumber": "0000654321",
"amount": 50000.00,
"narration": "Rent payment"
}'

External Transfers (NIBSS NIP)

Send money to any Nigerian bank account via the Nigeria Inter-Bank Settlement System.

Step 1: Validate the Recipient

Before submitting an external transfer, verify the recipient's account:

POST /api/v1/transfers/validate-recipient
{
"accountNumber": "0000654321",
"bankCode": "090575"
}

Response:

{
"success": true,
"data": {
"accountNumber": "0000654321",
"accountName": "JANE SMITH",
"bankCode": "090575",
"bankName": "First Microfinance Bank"
}
}

Step 2: Submit the Transfer

POST /api/v1/transfers/external
{
"sourceWalletId": "a1b2c3d4-...",
"recipientAccountNumber": "0000654321",
"recipientBankCode": "090575",
"recipientName": "JANE SMITH",
"amount": 100000.00,
"narration": "Invoice #12345",
"description": "Payment for consulting",
"saveBeneficiary": true,
"beneficiaryNickname": "Jane Work"
}

Response:

{
"success": true,
"data": {
"id": "f8e7d6c5-...",
"transactionId": "t9a8b7c6-...",
"reference": "FMFB20260227001234",
"status": "processing",
"fromAccountNumber": "0000123456",
"fromAccountName": "John Doe",
"toAccountNumber": "0000654321",
"toAccountName": "JANE SMITH",
"amount": 100000.00,
"fees": 100.00,
"totalAmount": 100100.00,
"narration": "Invoice #12345",
"timestamp": "2026-02-27T14:22:00Z",
"estimatedArrival": "2026-02-27T15:30:00Z"
}
}

External transfers typically settle within minutes. The estimatedArrival field provides the expected completion time.

International Transfers (SWIFT)

note

International transfers require the internationalTransfersEnabled feature flag on your tenant. Contact support to enable this for enterprise-tier tenants.

POST /api/v1/transfers/international
{
"sourceWalletId": "a1b2c3d4-...",
"recipientName": "Acme Corp",
"recipientAccountNumber": "GB82WEST12345698765432",
"recipientBankSwiftCode": "WESTGB2L",
"recipientBankName": "Westminster Bank",
"recipientCountry": "GB",
"amount": 5000.00,
"sourceCurrency": "NGN",
"destinationCurrency": "GBP",
"narration": "Supplier payment"
}

The API automatically converts the amount using the current exchange rate available via:

GET /api/v1/fx-rates?from=NGN&to=GBP

Fraud Detection

Every transfer is automatically screened. You can also call the fraud check endpoint independently:

POST /api/v1/transfers/fraud-check
{
"amount": 100000.00,
"recipientAccountNumber": "0000654321",
"recipientBankCode": "090575",
"description": "Payment",
"location": { "lat": 6.5244, "lng": 3.3792 }
}

Response:

{
"success": true,
"data": {
"riskScore": 35,
"riskLevel": "low",
"decision": "approve",
"confidence": 0.95,
"flags": [],
"recommendations": []
}
}
Risk LevelScore RangeAction
low0–30Auto-approve
medium31–60Proceed with monitoring
high61–80Require additional verification
critical81–100Block and flag for review

Transfer Status

Poll for transfer status:

GET /api/v1/transfers/status/:id
StatusDescription
pendingCreated, awaiting processing
processingSubmitted to NIBSS/SWIFT
completedFunds delivered
failedTransfer failed (see error field)

Beneficiaries

Save frequently used recipients:

POST /api/v1/transfers/beneficiaries
{
"accountNumber": "0000654321",
"bankCode": "090575",
"accountName": "JANE SMITH",
"nickname": "Jane Work"
}
GET /api/v1/transfers/beneficiaries
DELETE /api/v1/transfers/beneficiaries/:id

Provider Failover

The platform uses a circuit breaker pattern for external transfers:

  • Primary provider: Interswitch (configurable)
  • Fallback provider: NIBSS (configurable)
  • Failover trigger: 5 consecutive failures
  • Timeout: 30 seconds per request
  • Retries: Up to 2 retries per attempt

Next Steps