Payout
Transfer funds out of an Aella Wallet to an account. The Payout API allows you to automate your outbound payments to any bank account in Nigeria. You'll get instant webhooks to confirm delivery.
Whether you're running an e-commerce platform paying out vendors, a fintech app processing salary payments, or a marketplace settling earnings to sellers—the Payout API makes it seamless to send money to any Nigerian bank account. No more manual bank transfers, no more waiting for confirmations. Just reliable, automated payouts that your users can count on.
Important: Virtual wallets do not hold a balance so you cannot transfer funds from a virtual wallet.
Get Banks
This endpoint retrieves a list of supported banks and their codes for making transfers.
Why you need this
Before you can send money to someone, you need to know which banks are supported and their unique codes. Think of this as your directory of Nigerian banks—it's the first step in any payout flow.
Common use cases
- Building a bank selection dropdown: When users need to choose their bank during account setup or payout configuration, this endpoint provides the complete list of available banks.
- Validating bank codes: Before processing a transfer, verify that the bank code exists in our supported list to prevent failed transactions.
- Displaying bank information: Show users friendly bank names alongside codes in your UI for better user experience.
- Pre-populating forms: Use this data to auto-complete bank selection fields in your application.
Request
curl https://api.aellaapp.com/transfers/banks \
-H "Authorization: Bearer {token}"
Response
{
"success": true,
"message": "Banks retrieved successfully",
"data": [
{
"bankCode": "00013",
"bankName": "Guaranty Trust Bank"
},
{
"bankCode": "000004",
"bankName": "United Bank for Africa"
}
]
}
Name Enquiry
This endpoint is used to resolve the account name associated with a given bank code and account number. This is useful for verifying account details before initiating a transfer.
Why this matters
Ever sent money to the wrong person because of a typo? This endpoint helps prevent that. It's like asking the bank "Hey, does this account number belong to John Doe?" before you send the money. It's a safety net that saves you from costly mistakes and builds trust with your users.
Common use cases
- Account verification before payout: When a user enters their account details, verify the account name matches what they claim before processing the transfer. This prevents sending money to the wrong account.
- Building trust in your UI: Display the resolved account name to users before they confirm a transfer—"Sending ₦50,000 to ADEYEMI GBOLUWAGA AFOLABI" gives users confidence they're sending to the right person.
- Preventing fraud: Catch mismatches between provided names and actual account holders before funds leave your system.
- Form validation: Validate account details in real-time as users type, providing instant feedback if the account doesn't exist or the name doesn't match.
Query Parameters
- Name
bankCode- Type
- string
- Description
The NIBSS Bank Code of the bank for the account.
- Name
accountNumber- Type
- string
- Description
The account number to be resolved.
Request
curl "https://api.aellaapp.com/transfers/name-enquiry?bankCode=000013&accountNumber=0480819436" \
-H "Authorization: Bearer {token}"
Response
{
"success": true,
"message": "Account resolved successfully",
"data": {
"bankName": "Guaranty Trust Bank",
"accountName": "DAVID IKANJI ADEYEMI"
}
}
Single Transfer
This endpoint processes a single bank transfer by specifying the recipient's bank details, account number, amount, and source wallet.
The workhorse of payouts
This is your go-to endpoint for sending money to a single recipient. Whether it's a one-time payment, a refund, or a scheduled payout—this endpoint handles it all. It's fast, reliable, and gives you instant feedback on the transaction status.
Common use cases
- E-commerce refunds: When a customer returns a product, automatically refund their money to their bank account instead of store credit.
- Freelancer payments: Pay contractors, designers, or consultants directly to their bank accounts after project completion.
- Salary disbursements: For small teams or one-off payments, send salaries directly to employee bank accounts.
- Vendor settlements: Settle payments with suppliers, service providers, or partners after delivery confirmation.
- Customer withdrawals: Allow users to cash out their wallet balance to their bank account.
- One-time payouts: Process individual payments like bonuses, commissions, or rewards.
- Emergency transfers: Handle urgent payments that need immediate processing.
Request Body
- Name
bankCode- Type
- string
- Description
The code of the bank receiving the transfer.
- Name
accountNumber- Type
- string
- Description
The recipient's account number.
- Name
amount- Type
- number
- Description
The amount to transfer.
- Name
currency- Type
- string
- Description
The currency of the transfer (e.g.,
NGNfor Nigerian Naira).
- Name
narration- Type
- string
- Description
A description or reason for the transfer. This appears in the recipient's bank statement, so make it clear and meaningful (e.g., "Salary for January 2024" or "Refund for Order #12345"). Keep it concise—most banks display 20-30 characters.
- Name
reference- Type
- string
- Description
A unique transaction reference for the transfer (optional). Use your own order IDs, invoice numbers, or any identifier that helps you track this transfer in your system. This makes it easy to look up transfers later using the verify endpoint.
- Name
walletId- Type
- string
- Description
Source wallet for the transfer (optional, defaults to main wallet).
Request
curl https://api.aellaapp.com/transfers \
-H "Authorization: Bearer {token}" \
-H "Content-Type: application/json" \
-d '{
"bankCode": "00013",
"accountNumber": "0480813345",
"amount": 100.00,
"currency": "NGN",
"narration": "Payment for order",
"reference": "order-12345",
"walletId": "929ae10c-72b2-4194-8297-1de67daafe91"
}'
Response
{
"success": true,
"message": "Transfer created successfully",
"data": {
"id": "1d3b9482-835c-453e-ae14-07bbaf719e1c",
"narration": "Payment for order",
"status": "Success",
"amount": 100.00,
"reference": "order-12345",
"fee": 0,
"currency": "NGN",
"sessionId": "090614241205122106466545215337",
"senderName": "Aella MFB - Merchant Name",
"senderBank": "Aella MFB",
"senderAccountNumber": "4394378232",
"recieverName": "DAVID IKANJI ADEYEMI",
"recieverBank": "Guaranty Trust Bank",
"recieverAccountNumber": "0480813345",
"createdAt": "2024-12-05 11:21:07",
"updatedAt": "2024-12-05 11:21:07"
}
}
Bulk Transfer
This endpoint allows for processing multiple bank transfers in a single request.
Efficiency at scale
Why send 100 transfers one by one when you can send them all at once? This endpoint is perfect for when you need to pay multiple people simultaneously. It's like having a payment assistant that can handle dozens of transfers while you focus on other things.
Common use cases
- Payroll processing: Pay all your employees at once on payday. No more processing salaries one by one—just upload the list and let the API handle it.
- Marketplace seller payouts: If you run a marketplace, settle earnings to hundreds of sellers at the end of each week or month.
- Affiliate commissions: Distribute commissions to your entire affiliate network in one batch operation.
- Gig economy payouts: Pay multiple freelancers, drivers, or service providers who completed work during a period.
- Reward distributions: Send rewards, bonuses, or incentives to multiple users simultaneously.
- Bulk refunds: Process refunds for multiple orders at once, especially useful during sales events or product recalls.
- Dividend payments: Distribute dividends to shareholders or profit-sharing to partners.
- Vendor batch payments: Settle invoices with multiple suppliers in a single operation.
Why use bulk instead of single transfers?
- Faster processing: All transfers are queued and processed together, reducing overall processing time.
- Simpler code: One API call instead of looping through multiple single transfer calls.
- Better error handling: Get a comprehensive view of which transfers succeeded and which failed in one response.
- Cost efficiency: Reduce API call overhead when processing many transfers.
Request Body
- Name
walletId- Type
- string
- Description
The ID of the wallet funding the transfer.
- Name
transfers- Type
- array
- Description
Array of transfer objects, each containing:
bankCode(string): The NIBSS code of the bank receiving the transfer. Get this from the Get Banks endpoint.accountNumber(string): The recipient's account number. Consider verifying this with Name Enquiry before adding to the bulk transfer.amount(number): The amount to transfer. Make sure your wallet has enough balance to cover all transfers plus fees.currency(string): The currency of the transfer (typically "NGN" for Nigerian Naira).narration(string): A description or reason for the transfer. This appears on the recipient's bank statement.externalReference(string, optional): A unique reference for this specific transfer. Useful for tracking individual transfers within a bulk operation (e.g., "employee-001", "vendor-invoice-123").
Ensure all transfers in the array meet validation rules; invalid entries may cause partial failures.
Request
curl https://api.aellaapp.com/transfers/bulk \
-H "Authorization: Bearer {token}" \
-H "Content-Type: application/json" \
-d '{
"walletId": "929ae10c-72b2-4194-8297-1de67daafe91",
"transfers": [
{
"bankCode": "000004",
"accountNumber": "2156859903",
"amount": 30.00,
"currency": "NGN",
"narration": "Payment 1",
"externalReference": "ref-001"
},
{
"bankCode": "000004",
"accountNumber": "2119347041",
"amount": 10.00,
"currency": "NGN",
"narration": "Payment 2",
"externalReference": "ref-002"
}
]
}'
Response
{
"success": true,
"message": "Bulk transfer initiated successfully",
"data": {
"transfers": [
{
"id": "645500ff-cd5a-414e-91bd-12e724533d3d",
"amount": 30,
"fee": 100,
"reference": "b74d9973-4182-4872-8237-3b46e8e6cb56",
"status": "Pending",
"receiverBankCode": "000004",
"currency": "NGN",
"senderBank": "Aella Microfinance Bank",
"receiverName": "STEPHEN ADEJUWON ILORI",
"receiverBank": "UNITED BANK FOR AFRICA",
"receiverAccountNumber": "2156859903",
"externalReference": "ref-001",
"environment": "LIVE",
"source": "API",
"merchantId": "941d21d4-f15a-4ede-82a3-90642c73017d",
"sourceWallet": "929ae10c-72b2-4194-8297-1de67daafe91",
"senderName": "Merchant Name",
"createdAt": "2025-10-27T02:13:36.438Z",
"updatedAt": "2025-10-27T02:13:36.438Z"
}
]
},
"status": 200
}
Get Transfer Status
This endpoint retrieves the transfer record with the most up-to-date status of the transfer at that time.
Stay in the loop
After initiating a transfer, you'll want to know if it went through. This endpoint gives you the real-time status of any transfer—whether it's pending, successful, or failed. It's like checking your delivery tracking, but for money transfers.
Common use cases
- Status checks in your dashboard: Display the current status of transfers in your admin panel or user dashboard.
- Polling for updates: Periodically check transfer status until it's completed, especially for transfers that might take a few minutes.
- Customer support: When users ask "Where's my money?", quickly look up the transfer status to provide accurate information.
- Reconciliation: Match your internal records with actual transfer statuses for accounting purposes.
- Retry logic: Check if a pending transfer has completed before retrying a failed operation.
- Audit trails: Retrieve transfer details for compliance, reporting, or dispute resolution.
- Webhook verification: After receiving a webhook notification, verify the transfer status to ensure data consistency.
Transfer statuses you might see
- Pending: The transfer is queued and being processed. Give it a moment.
- Success: Money has been successfully sent to the recipient's account. Party time! 🎉
- Failed: Something went wrong. Check the error details to understand what happened.
Path Parameters
- Name
id- Type
- string
- Description
The unique identifier of the transfer.
Request
curl https://api.aellaapp.com/transfers/05c944d6-9522-4c9f-87a6-6c9b561a64fc \
-H "Authorization: Bearer {token}"
Response
{
"success": true,
"message": "Transfer status queried successfully",
"data": {
"id": "05c944d6-9522-4c9f-87a6-6c9b561a64fc",
"narration": "Payment for order",
"status": "Pending",
"amount": "100.00",
"fee": "0.00",
"currency": "NGN",
"sessionId": null,
"senderName": "Merchant Name",
"senderBank": "Aella MFB",
"senderAccountNumber": null,
"receiverName": "ADEYEMI GBOLUWAGA AFOLABI",
"receiverBank": "GTBANK PLC",
"receiverBankCode": "efccb33c-128d-4cc6-a31e-32c0d4f755dc",
"receiverAccountNumber": "0480819436",
"environment": "SANDBOX",
"createdAt": "2025-01-05T21:01:42.299Z"
},
"status": 200
}
Get Transfer Status By Reference
This endpoint retrieves the transfer record with the most up-to-date status using the transfer reference.
Find transfers your way
Sometimes you don't have the transfer ID, but you do have the reference you created when initiating the transfer. This endpoint lets you look up transfers using your own reference system—perfect for when you want to track transfers using your internal order IDs, invoice numbers, or custom identifiers.
Common use cases
- Order-based lookups: When a customer asks about their refund, look it up using your order ID (which you used as the reference).
- Invoice reconciliation: Match payments to invoices using invoice numbers as references.
- Customer support queries: Users often remember their order number or transaction reference, not the transfer ID. This makes it easy to find their transfer.
- Integration with existing systems: If your system already uses reference numbers, you can continue using them and look up transfers the same way.
- Webhook verification: When you receive a webhook with a reference, verify the transfer details using this endpoint.
- Duplicate prevention: Before creating a new transfer, check if a transfer with the same reference already exists.
- Reporting and analytics: Generate reports by looking up transfers using your business-specific reference patterns.
Why use reference instead of ID?
- Human-readable: References like "ORDER-12345" are easier to remember and communicate than UUIDs.
- Business context: Your references can encode business logic (e.g., "REFUND-2024-001" tells you it's a refund from 2024).
- System integration: Works seamlessly with your existing order management, invoicing, or accounting systems.
Query Parameters
- Name
reference- Type
- string
- Description
The unique reference of the transfer.
Request
curl "https://api.aellaapp.com/transfers/verify?reference=order-12345" \
-H "Authorization: Bearer {token}"
Response
{
"success": true,
"message": "Transfer status queried successfully",
"data": {
"id": "e3873bc6-f09d-40df-a425-2f00b4d805e6",
"narration": "Payment for order",
"status": "Pending",
"amount": "100.00",
"externalReference": "order-12345",
"fee": "25.00",
"currency": "NGN",
"sessionId": null,
"senderName": "Merchant Name",
"senderBank": "Aella Microfinance Bank",
"senderAccountNumber": null,
"receiverName": "ADEYEMI GBOLUWAGA AFOLABI",
"receiverBank": "GTBANK PLC",
"receiverAccountNumber": "0480819436",
"receiverBankCode": "000013",
"environment": "SANDBOX",
"createdAt": "2025-08-05T13:08:04.221Z"
},
"status": 200
}
Get Transfer Fee
This endpoint retrieves the transfer fee associated with a specified amount. It is useful for users who want to understand the costs involved before initiating a transfer.
Know the cost upfront
Nobody likes surprises, especially when it comes to fees. This endpoint lets you calculate transfer fees before processing a payment, so you can show users exactly how much they'll receive and how much will be deducted. Transparency builds trust.
Common use cases
- Fee calculator in your UI: Show users the exact fee before they confirm a transfer. "Sending ₦10,000? That'll cost ₦100 in fees, so the recipient gets ₦9,900."
- Pre-transfer validation: Calculate fees before initiating transfers to ensure sufficient wallet balance (amount + fee).
- Cost estimation: Help users understand the total cost of their transaction before committing.
- Budget planning: For businesses processing many transfers, calculate total fees to budget accurately.
- Fee comparison: Display fees for different transfer amounts to help users make informed decisions.
- User education: Show users how fees work and help them understand the cost structure.
- Dynamic fee display: Update fee information in real-time as users enter different amounts in your transfer form.
Why this matters
- Transparency: Users appreciate knowing fees upfront, reducing support queries and building trust.
- Better UX: Displaying fees helps users make informed decisions and prevents failed transfers due to insufficient balance.
- Compliance: Some regulations require fee disclosure before transaction completion.
- Accurate calculations: Ensure your fee calculations match the actual fees charged by the API.
Query Parameters
- Name
amount- Type
- integer
- Description
The amount for which the transfer fee is being calculated.
Request
curl "https://api.aellaapp.com/transfers/fee?amount=22212" \
-H "Authorization: Bearer {token}"
Response
{
"success": true,
"message": "Transfer fee fetched successfully",
"data": {
"fee": 100
},
"status": 200
}