Skip to main content

Overview

Monei allows you to send Naira from your wallet to Nigerian bank accounts and other Monei users. This guide covers all payout methods, verification, and best practices. What you’ll learn:
  • Bank transfer payouts
  • Peer-to-peer transfers
  • Bank account verification
  • Transaction PIN setup
  • Payout limits and fees
  • Troubleshooting failed payouts

Payout Methods

Bank Transfer

Send Naira to any Nigerian bank account

Peer Transfer (P2P)

Send Naira to another Monei user instantly

Bank Transfer Payout

Send Naira to any Nigerian bank account.

Get Supported Banks

import MoneiSDK from 'monei-sdk';

const monei = new MoneiSDK({
  apiKey: process.env.MONEI_API_KEY,
});

// Get list of supported banks
const banks = await monei.walletUtility.getBanks();

banks.forEach(bank => {
  console.log(`${bank.name} - ${bank.code}`);
});
Response:
{
  "statusCode": 200,
  "message": "Banks retrieved successfully",
  "data": [
    {
      "id": "1",
      "code": "058",
      "name": "Guaranty Trust Bank"
    },
    {
      "id": "2",
      "code": "044",
      "name": "Access Bank"
    }
  ]
}

Verify Bank Account

Always verify the recipient’s bank account before sending money.
// Verify bank account
const verification = await monei.walletUtility.verifyBankAccount({
  accountNumber: '0123456789',
  bank: '058' // GTBank code
});

console.log('Account Name:', verification.accountName);
console.log('Account Number:', verification.accountNumber);
console.log('Bank:', verification.bankName);
Response:
{
  "statusCode": 200,
  "message": "Account verified successfully",
  "data": {
    "accountName": "JOHN DOE",
    "accountNumber": "0123456789",
    "bankCode": "058",
    "bankName": "Guaranty Trust Bank"
  }
}
Always verify the account name matches your intended recipient before proceeding with the transfer.

Send Money to Bank Account

// Send money to bank account
const payout = await monei.payout.bankTransfer({
  amount: 50000,
  bank: '058',
  accountNumber: '0123456789',
  transactionPin: '1234',
  narration: 'Payment for services',
  reference: 'PAY-' + Date.now() // Optional
});

console.log('Transaction Reference:', payout.reference);
console.log('Status:', payout.status);
console.log('Amount:', payout.amount);
Response:
{
  "statusCode": 200,
  "message": "Transfer initiated successfully",
  "data": {
    "reference": "PAY-1234567890",
    "status": "SUCCESS",
    "amount": 50000
  }
}
Required Fields:
  • amount - Amount to send in Naira
  • bank - Bank code (e.g., “058”)
  • accountNumber - Recipient account number
  • transactionPin - Your 4-digit transaction PIN
Optional Fields:
  • reference - Custom reference (auto-generated if not provided)
  • narration - Transaction description
  • currency - Currency (defaults to “NGN”)
  • meta - Additional metadata

Peer-to-Peer Transfer

Send money instantly to another Monei user using their email or phone number.
// Send money to another Monei user
const transfer = await monei.payout.peerTransfer({
  receiver: 'user@example.com', // or phone: '+2348012345678'
  amount: 10000,
  transactionPin: '1234',
  currency: 'NGN'
});

console.log('Reference:', transfer.reference);
console.log('Status:', transfer.status);
console.log('Recipient:', transfer.recipient);
Benefits:
  • Instant transfer
  • No transaction fees
  • Works with email or phone number
  • Real-time confirmation
Use Cases:
  • Split bills
  • Send money to friends/family
  • Pay freelancers
  • Internal transfers

Payout Limits

Payout limits are determined by your KYC verification tier.

KYC Tier Limits

KYC TierSingle PayoutDaily LimitMonthly Limit
Tier 1₦200,000₦200,000₦2,000,000
Tier 2₦500,000₦500,000₦5,000,000
Tier 3₦2,000,000₦2,000,000₦20,000,000

Check Your Limits

// Get current limits and usage
const limits = await monei.user.getKycLimits();

console.log('KYC Tier:', limits.tier);
console.log('Daily Limit:', limits.dailyLimit);
console.log('Used Today:', limits.dailyUsed);
console.log('Remaining Today:', limits.dailyRemaining);
console.log('Monthly Limit:', limits.monthlyLimit);
console.log('Used This Month:', limits.monthlyUsed);

// Check if payout is within limits
const amount = 100000;
if (amount > limits.dailyRemaining) {
  console.log('Amount exceeds daily limit');
  console.log('Maximum you can send today:', limits.dailyRemaining);
}
Upgrade your KYC tier to increase payout limits. Learn more →

Payout Fees

Standard Transfer:
  • Free for amounts under ₦5,000
  • ₦10 for amounts ₦5,000 - ₦50,000
  • ₦25 for amounts above ₦50,000
Processing Time:
  • Instant to 5 minutes (most banks)
  • Up to 30 minutes during peak hours

Processing Time

Expected Processing Times

ScenarioProcessing Time
Peer TransferInstant
Standard Bank TransferInstant - 2 minutes
Peak Hours (8am-10am, 4pm-6pm)instant - 5 minutes
Weekend/Holidayinstant - 5 minutes
Large Amounts (>₦500K)instant - 5 minutes
First-time Recipientinstant - 5 minutes
Most bank transfers are completed within 5 minutes. Delays beyond 30 minutes are rare.

Troubleshooting

Problem: Transfer shows as failedCommon causes:
  • Insufficient balance
  • Incorrect transaction PIN
  • Daily/monthly limit exceeded
  • Invalid account number
  • Recipient bank issues
Solutions:
  1. Check wallet balance
  2. Verify transaction PIN
  3. Check KYC limits
  4. Verify recipient account details
  5. Retry after a few minutes
  6. Contact support with transaction reference
Problem: Transfer stuck in pending stateSteps to resolve:
  1. Wait 5-10 minutes - Most transfers complete within this time
  2. Check transaction status:
    const status = await monei.transactions.getStatus(transactionId);
    console.log('Status:', status.state);
    
  3. Verify with recipient - Ask them to check their account
  4. Contact support - If pending over 30 minutes
Problem: Sent wrong amount to recipientImportant:
  • Naira transfers are irreversible
  • Cannot be cancelled once processed
Action:
  • Contact recipient to request refund
  • For disputes, contact support with:
    • Transaction reference
    • Recipient details
    • Proof of error
Problem: Cannot remember transaction PINSolution:
// Request PIN reset
await monei.user.requestTransactionPinReset({
  email: 'your-email@example.com'
});

// Check email for reset code
// Reset PIN with new 4-digit code
await monei.user.resetTransactionPin({
  transactionPin: '5678',
  confirmPin: '5678'
});
Problem: Payout rejected due to complianceReasons:
  • KYC verification required
  • Suspicious activity pattern
  • Compliance review
  • Account restriction
Resolution:
  • Complete KYC verification
  • Contact support for clarification
  • Provide source of funds documentation
  • Wait for compliance review

Best Practices

Verify Before Sending

Always verify bank account details before sending money

Start Small

Send a small test amount to new recipients first

Double-Check Amount

Verify the amount before confirming - transfers are irreversible

Save Beneficiaries

Save frequent recipients for faster future transfers

Monitor Limits

Track daily and monthly usage to stay within KYC tier limits

Keep PIN Safe

Never share your transaction PIN with anyone

Payout Status

Track your payout progress:
// Get payout status by transaction ID
const transaction = await monei.transactions.getStatus(transactionId);

console.log('Status:', transaction.state);
console.log('Amount:', transaction.amount);
console.log('Recipient:', transaction.metadata.recipientName);
console.log('Bank:', transaction.metadata.bankName);
console.log('Created:', transaction.createdAt);

if (transaction.state === 'completed') {
  console.log('Payout successful!');
} else if (transaction.state === 'failed') {
  console.log('Payout failed:', transaction.errorMessage);
}
Payout States:
StateDescription
initiatedPayout created
processingBeing sent to bank
completedSuccessfully delivered
failedPayout failed

Webhooks

Receive real-time notifications when payouts complete:
app.post('/webhooks/monei', (req, res) => {
  const event = req.body;
  
  // Verify webhook signature
  const signature = req.headers['x-monei-signature'];
  if (!verifySignature(event, signature)) {
    return res.status(401).send('Invalid signature');
  }
  
  // Handle payout events
  if (event.type === 'payout.completed') {
    console.log('Payout completed!');
    console.log('Reference:', event.data.reference);
    console.log('Amount:', event.data.amount);
    console.log('Recipient:', event.data.recipient);
    
    // Update your records
    // Notify recipient
  }
  
  if (event.type === 'payout.failed') {
    console.log('Payout failed!');
    console.log('Reference:', event.data.reference);
    console.log('Reason:', event.data.failureReason);
    
    // Handle failure
    // Notify user
  }
  
  res.status(200).send('OK');
});
Learn more about webhooks →

Next Steps

Deposits

Learn how to fund your Naira wallet

Payment Methods

Manage saved payment methods

Transactions

View and manage all transactions

KYC Verification

Upgrade limits with KYC verification