Skip to navigation

Payouts

Send money to bank accounts
View as Markdown

Pay out funds from your SenjaroPay merchant wallet to a beneficiary bank account.

Look up the account name first, confirm it with your beneficiary, then create the transfer. Bank payouts are available in TZS today. Always send currency explicitly — additional currencies (for example USD) and mobile money payouts will be documented when they go live.

All calls are POST to https://api.senjaropay.com and require x-api-key and x-api-secret. Transfer also requires x-idempotency-key.

How it works

1

Look up the account

Call account-name lookup with the bank code and account number. Show account_name to the user for confirmation.

2

Create the payout

Send amount, currency, bank, account, and the confirmed name. Include a new UUID in x-idempotency-key. Store withdrawal_id and transaction_reference.

3

Track the result

A successful create often returns status: PROCESSING while the bank settles the transfer. Treat that as accepted, not final completion, until your reconciliation flow confirms it.

Authentication

HeaderLookupTransferDescription
Content-TypeYesYesapplication/json
x-api-keyYesYesDashboard Public Key (Authentication)
x-api-secretYesYesSecret key. Server-side only.
x-idempotency-keyNoYesA new UUID for each payout transfer
import { randomUUID } from "node:crypto";
const idempotencyKey = randomUUID();
import uuid
idempotency_key = str(uuid.uuid4())

Reuse an idempotency key only when retrying the same transfer (same amount, currency, bank, account, and name).

Currency

CurrencyChannelStatus
TZSBank accountAvailable
USD—Coming soon
Mobile money (MNO)—Coming soon

Always pass currency on transfer. Do not assume the wallet default.

Bank short codes

Pass the bank shortcode in the bank field for account-name lookup and transfer. Prefer the same value for both calls.

BankShortcode
ABSA BankABSA
Akiba Commercial BankAKIBA
Amana BankAMANABANK
Azania Bancorp BankAZANIA
Access Bank TanzaniaBANCABC
Bank of Africa (Tanzania) LtdBOA
Bank of Baroda (T) LtdBANKOFBARODA
Bank of India (T) LtdBANKOFINDIA
China Dasheng Bank LtdCHINADASHENG
Citibank Tanzania LimitedCITIBANK
CRDB Bank LimitedCRDBBANK
DCB Commercial BankDCBBANK
Diamond Trust BankDTB
Ecobank Tanzania LtdECOBANK
Equity Bank (T) LtdEQUITYBANK
Exim BankEXIMBANK
FINCA Microfinance BankFINCA
Guaranty Trust Bank Tanzania LtdGTBANK
Habib African BankHABIBBANK
I&M Bank (T) LtdIMBANK
International Commercial Bank (T)ICB
KCB Bank Tanzania LimitedKCB
Coop Bank TanzaniaKILIMANJARO
Letshego Bank Tanzania LtdLETSHEGO
Maendeleo BankMAENDELEO
Mkombozi Commercial Bank Public LtdMKOMBOZI
Mwalimu Commercial Bank of TanzaniaMWALIMU
Mwanga Hakika Microfinance BankMWANGA
National Microfinance BankNMB
NBC LimitedNBC
NCBA Bank Tanzania LtdNCBA
People’s Bank of ZanzibarPBZ
Stanbic Bank TanzaniaSTANBIC
Tanzania Commercial Bank PLCTCB
Uchumi Commercial BankUCHUMI
United Bank for AfricaUBA

1. Look up account name

POST https://api.senjaropay.com/senjaropay/merchant/fundtransfer/api/account-name-lookup

Validates the bank account and returns the registered name. Do not create a payout until the name matches what your beneficiary expects.

Request

{
"bank": "ABSA",
"account": "0001234567"
}
FieldTypeRequiredDescription
bankstringYesBank shortcode from Bank short codes (for example ABSA, CRDBBANK, NMB)
accountstringYesBeneficiary account number

Response

{
"status": "success",
"code": 200,
"data": {
"resultcode": "000",
"result": "SUCCESS",
"message": "Success",
"reference": "20261029141001953",
"transid": "LOOKUP-MOCK-7f3a91c2",
"bank": "ABSA",
"account": "0001234567",
"account_name": "Test Customer",
"data": {
"name": "Test Customer"
}
}
}
FieldDescription
account_nameConfirmed beneficiary name. Pass this as name on transfer
result / resultcodeLookup outcome. SUCCESS / 000 means the account is valid
curl -sS -X POST "https://api.senjaropay.com/senjaropay/merchant/fundtransfer/api/account-name-lookup" \
-H "Content-Type: application/json" \
-H "x-api-key: ${SENJARO_API_KEY}" \
-H "x-api-secret: ${SENJARO_API_SECRET}" \
-d '{"bank":"ABSA","account":"0001234567"}'

2. Create a bank payout

POST https://api.senjaropay.com/senjaropay/merchant/cashout/api/transfer

Debits your merchant wallet and sends the funds to the beneficiary bank account. x-idempotency-key is required.

Request

{
"amount": 10000,
"currency": "TZS",
"bank": "ABSA",
"account": "0001234567",
"name": "Test Customer"
}
FieldTypeRequiredDescription
amountintegerYesGross amount to debit, in major units
currencystringYesMust be TZS for bank payouts today
bankstringYesBank shortcode from Bank short codes. Prefer the same value used at lookup
accountstringYesBeneficiary account number
namestringYesBeneficiary name from account-name lookup

Response

{
"status": "success",
"code": 200,
"data": {
"success": true,
"withdrawal_id": "c4fbdacb-6ac4-4159-ad23-50286a001ba4",
"transaction_reference": "WDMVTEJ1P9VXJ8",
"amount": 10000,
"fee": 500,
"net_amount": 9500,
"currency": "TZS",
"payout_amount": 9500,
"payout_currency": "TZS",
"fx_rate": null,
"balance": {
"currency": "TZS",
"collections": 50000,
"bill_payments": 5000,
"withdrawals": 20000,
"international_transfers": 10000,
"available": 15000
},
"status": "PROCESSING",
"account_name": "Test Customer",
"account": "0001234567",
"bank": "ABSA"
}
}
FieldDescription
withdrawal_idSenjaroPay payout ID. Store for reconciliation
transaction_referenceProvider / ledger reference
amountRequested debit
feeFee charged for this payout
net_amount / payout_amountAmount the beneficiary receives
currency / payout_currencyWallet and payout currencies. Same for TZS bank payouts
fx_rateFX rate when currencies differ. null for same-currency TZS
statusPROCESSING means the transfer was accepted and is settling
balance.availableRemaining available wallet balance after acceptance
curl -sS -X POST "https://api.senjaropay.com/senjaropay/merchant/cashout/api/transfer" \
-H "Content-Type: application/json" \
-H "x-api-key: ${SENJARO_API_KEY}" \
-H "x-api-secret: ${SENJARO_API_SECRET}" \
-H "x-idempotency-key: $(uuidgen)" \
-d '{
"amount": 10000,
"currency": "TZS",
"bank": "ABSA",
"account": "0001234567",
"name": "Test Customer"
}'

Errors

HTTP statusTypical error_codeWhen
400validation_errorMissing field, invalid bank/account, or unsupported currency
401unauthorizedMissing or invalid x-api-key or x-api-secret
{
"status": "error",
"code": 400,
"error_code": "validation_error",
"message": "currency is required"
}

Examples on this page are mock values. Keep API keys in server-side secrets.