> ## Documentation Index
> Fetch the complete documentation index at: https://docs.monei.cc/llms.txt
> Use this file to discover all available pages before exploring further.

# Payouts

> Send Naira from your Monei wallet to bank accounts and other users

## 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

<CardGroup cols={2}>
  <Card title="Bank Transfer" icon="building-columns">
    Send Naira to any Nigerian bank account
  </Card>

  <Card title="Peer Transfer (P2P)" icon="users">
    Send Naira to another Monei user instantly
  </Card>
</CardGroup>

***

## Bank Transfer Payout

Send Naira to any Nigerian bank account.

### Get Supported Banks

<CodeGroup>
  ```javascript Node.js theme={null}
  import MoneiSDK from 'monei-sdk';

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

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

  banks.forEach(bank => {
    console.log(`${bank.name} - ${bank.code}`);
  });
  ```

  ```python Python theme={null}
  from monei import MoneiClient

  monei = MoneiClient(
      api_key=os.getenv('MONEI_API_KEY')
  )

  # Get list of supported banks
  banks = monei.utility.get_banks()

  for bank in banks:
      print(f'{bank.name} - {bank.code}')
  ```

  ```bash cURL theme={null}
  curl https://api.monei.cc/api/v1/wallet/get-banks \
    -H "x-api-key: YOUR_API_KEY"
  ```
</CodeGroup>

**Response:**

```json theme={null}
{
  "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.

<CodeGroup>
  ```javascript Node.js theme={null}
  // Verify bank account
  const verification = await monei.utility.verifyBankAccount({
    accountNumber: '0123456789',
    bank: '058' // GTBank code
  });

  console.log('Account Name:', verification.accountName);
  console.log('Account Number:', verification.accountNumber);
  console.log('Bank:', verification.bankName);
  ```

  ```python Python theme={null}
  # Verify bank account
  verification = monei.utility.verify_bank_account(
      account_number='0123456789',
      bank='058'
  )

  print(f'Account Name: {verification.account_name}')
  print(f'Account Number: {verification.account_number}')
  print(f'Bank: {verification.bank_name}')
  ```

  ```bash cURL theme={null}
  curl -X POST https://api.monei.cc/api/v1/wallet/verify-bank-account \
    -H "x-api-key: YOUR_API_KEY" \
    -H "Content-Type: application/json" \
    -d '{
      "accountNumber": "0123456789",
      "bank": "058"
    }'
  ```
</CodeGroup>

**Response:**

```json theme={null}
{
  "statusCode": 200,
  "message": "Account verified successfully",
  "data": {
    "accountName": "JOHN DOE",
    "accountNumber": "0123456789",
    "bankCode": "058",
    "bankName": "Guaranty Trust Bank"
  }
}
```

<Warning>
  Always verify the account name matches your intended recipient before proceeding with the transfer.
</Warning>

### Send Money to Bank Account

<CodeGroup>
  ```javascript Node.js theme={null}
  // 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);
  ```

  ```python Python theme={null}
  # Send money to bank account
  payout = monei.payout.bank_transfer(
      amount=50000,
      bank='058',
      account_number='0123456789',
      transaction_pin='1234',
      narration='Payment for services',
      reference=f'PAY-{int(time.time())}'
  )

  print(f'Reference: {payout.reference}')
  print(f'Status: {payout.status}')
  print(f'Amount: ₦{payout.amount}')
  ```

  ```bash cURL theme={null}
  curl -X POST https://api.monei.cc/api/v1/wallet/payout/bank-transfer \
    -H "x-api-key: YOUR_API_KEY" \
    -H "Content-Type: application/json" \
    -d '{
      "amount": 50000,
      "bank": "058",
      "accountNumber": "0123456789",
      "transactionPin": "1234",
      "narration": "Payment for services",
      "reference": "PAY-1234567890"
    }'
  ```
</CodeGroup>

**Response:**

```json theme={null}
{
  "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.

<CodeGroup>
  ```javascript Node.js theme={null}
  // 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);
  ```

  ```python Python theme={null}
  # Send money to another Monei user
  transfer = monei.payout.peer_transfer(
      receiver='user@example.com',
      amount=10000,
      transaction_pin='1234',
      currency='NGN'
  )

  print(f'Reference: {transfer.reference}')
  print(f'Status: {transfer.status}')
  print(f'Recipient: {transfer.recipient}')
  ```

  ```bash cURL theme={null}
  curl -X POST https://api.monei.cc/api/v1/wallet/payout/transfer \
    -H "x-api-key: YOUR_API_KEY" \
    -H "Content-Type: application/json" \
    -d '{
      "receiver": "user@example.com",
      "amount": 10000,
      "transactionPin": "1234",
      "currency": "NGN"
    }'
  ```
</CodeGroup>

**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 Tier   | Single Payout | Daily Limit | Monthly 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

<CodeGroup>
  ```javascript Node.js theme={null}
  // Get current limits and usage
  const limits = await monei.user.getDepositLimit();

  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);
  }
  ```

  ```python Python theme={null}
  # Get limits
  limits = monei.user.get_deposit_limit()

  print(f'Tier: {limits.tier}')
  print(f'Daily Limit: ₦{limits.daily_limit}')
  print(f'Used Today: ₦{limits.daily_used}')
  print(f'Remaining: ₦{limits.daily_remaining}')

  # Validate amount
  amount = 100000
  if amount > limits.daily_remaining:
      print(f'Exceeds limit. Max: ₦{limits.daily_remaining}')
  ```
</CodeGroup>

<Info>
  Upgrade your KYC tier to increase payout limits. [Learn more →](/account-management/user-account#kyc-verification)
</Info>

***

## Payout Fees

<Tabs>
  <Tab title="Bank Transfer">
    **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
  </Tab>

  <Tab title="Peer Transfer">
    **Fee:** Free

    **Processing Time:** Instant

    **Notes:**

    * No fees for P2P transfers
    * Real-time settlement
    * Both parties must have Monei accounts
  </Tab>
</Tabs>

***

## Processing Time

### Expected Processing Times

| Scenario                           | Processing Time     |
| ---------------------------------- | ------------------- |
| **Peer Transfer**                  | Instant             |
| **Standard Bank Transfer**         | Instant - 2 minutes |
| **Peak Hours (8am-10am, 4pm-6pm)** | instant - 5 minutes |
| **Weekend/Holiday**                | instant - 5 minutes |
| **Large Amounts (>₦500K)**         | instant - 5 minutes |
| **First-time Recipient**           | instant - 5 minutes |

<Note>
  Most bank transfers are completed within 5 minutes. Delays beyond 30 minutes are rare.
</Note>

***

## Troubleshooting

<AccordionGroup>
  <Accordion icon="circle-xmark" title="Payout Failed">
    **Problem:** Transfer shows as failed

    **Common 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
  </Accordion>

  <Accordion icon="clock" title="Payout Pending">
    **Problem:** Transfer stuck in pending state

    **Steps to resolve:**

    1. **Wait 5-10 minutes** - Most transfers complete within this time
    2. **Check transaction status:**
       ```javascript theme={null}
       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
  </Accordion>

  <Accordion icon="exclamation-triangle" title="Wrong Amount Sent">
    **Problem:** Sent wrong amount to recipient

    **Important:**

    * 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
  </Accordion>

  <Accordion icon="key" title="Forgot Transaction PIN">
    **Problem:** Cannot remember transaction PIN

    **Solution:**

    ```javascript theme={null}
    // 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'
    });
    ```
  </Accordion>

  <Accordion icon="ban" title="Payout Blocked">
    **Problem:** Payout rejected due to compliance

    **Reasons:**

    * 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
  </Accordion>
</AccordionGroup>

***

## Best Practices

<CardGroup cols={2}>
  <Card title="Verify Before Sending" icon="check-double">
    Always verify bank account details before sending money
  </Card>

  <Card title="Start Small" icon="gauge-simple-low">
    Send a small test amount to new recipients first
  </Card>

  <Card title="Double-Check Amount" icon="calculator">
    Verify the amount before confirming - transfers are irreversible
  </Card>

  <Card title="Save Beneficiaries" icon="bookmark">
    Save frequent recipients for faster future transfers
  </Card>

  <Card title="Monitor Limits" icon="chart-line">
    Track daily and monthly usage to stay within KYC tier limits
  </Card>

  <Card title="Keep PIN Safe" icon="lock">
    Never share your transaction PIN with anyone
  </Card>
</CardGroup>

***

## Payout Status

Track your payout progress:

<CodeGroup>
  ```javascript Node.js theme={null}
  // 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);
  }
  ```

  ```python Python theme={null}
  # Get payout status
  transaction = monei.transactions.get_status(transaction_id)

  print(f'Status: {transaction.state}')
  print(f'Amount: ₦{transaction.amount}')
  print(f'Recipient: {transaction.metadata.recipient_name}')

  if transaction.state == 'completed':
      print('Payout successful!')
  elif transaction.state == 'failed':
      print(f'Failed: {transaction.error_message}')
  ```
</CodeGroup>

**Payout States:**

| State        | Description            |
| ------------ | ---------------------- |
| `initiated`  | Payout created         |
| `processing` | Being sent to bank     |
| `completed`  | Successfully delivered |
| `failed`     | Payout failed          |

***

## Webhooks

Receive real-time notifications when payouts complete:

<CodeGroup>
  ```javascript Node.js (Express) theme={null}
  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');
  });
  ```

  ```python Python (Flask) theme={null}
  @app.route('/webhooks/monei', methods=['POST'])
  def monei_webhook():
      event = request.json
      signature = request.headers.get('x-monei-signature')
      
      # Verify signature
      if not verify_signature(event, signature):
          return 'Invalid signature', 401
      
      # Handle events
      if event['type'] == 'payout.completed':
          print(f"Payout completed: {event['data']['reference']}")
          # Update records
      
      if event['type'] == 'payout.failed':
          print(f"Payout failed: {event['data']['failureReason']}")
          # Handle failure
      
      return 'OK', 200
  ```
</CodeGroup>

[Learn more about webhooks →](/security/webhooks)

***

## Next Steps

<CardGroup cols={2}>
  <Card title="Deposits" icon="arrow-down" href="/naira-wallet/deposits">
    Learn how to fund your Naira wallet
  </Card>

  <Card title="Payment Methods" icon="credit-card" href="/naira-wallet/payment-methods">
    Manage saved payment methods
  </Card>

  <Card title="Transactions" icon="list" href="/transactions/management">
    View and manage all transactions
  </Card>

  <Card title="KYC Verification" icon="shield-check" href="/account-management/user-account#kyc-verification">
    Upgrade limits with KYC verification
  </Card>
</CardGroup>
