Skip to main content
POST
/
api
/
v1
/
transfers
Create Transfer
curl --request POST \
  --url https://api.usezentra.com/api/v1/transfers \
  --header 'Authorization: Bearer <token>' \
  --header 'Content-Type: application/json' \
  --data '
{
  "amount_minor": 123,
  "recipient_account": "<string>",
  "recipient_bank_code": "<string>",
  "narration": "<string>",
  "reference": "<string>",
  "currency": "<string>",
  "metadata": {}
}
'
{
  "success": false,
  "error": {
    "code": "insufficient_balance",
    "message": "Wallet balance insufficient",
    "status": 422,
    "details": {
      "required": 50050,
      "available": 30000
    }
  }
}

Create Transfer

Initiate a money transfer to any Nigerian bank account.

Endpoint

POST /api/v1/transfers

Request Body

amount_minor
number
required
Amount in kobo (e.g., 10000 = ₦100.00)
recipient_account
string
required
Recipient account number (10 digits)
recipient_bank_code
string
required
Recipient bank code (e.g., 058 for GTBank)
narration
string
required
Transfer description (max 100 characters)
reference
string
Unique reference for this transfer (auto-generated if not provided)
currency
string
default:"NGN"
Currency code (currently only NGN supported)
metadata
object
Additional data to store with the transfer

Response

id
string
Unique transfer ID
amount_minor
number
Transfer amount in kobo
fee_minor
number
Transaction fee in kobo
total_minor
number
Total amount debited (amount + fee)
recipient_account
string
Recipient account number
recipient_name
string
Recipient account name
recipient_bank
string
Recipient bank name
status
string
Transfer status (pending, processing, completed, failed)
reference
string
Unique reference
narration
string
Transfer description
session_id
string
Provider session ID
created_at
string
ISO 8601 timestamp

Example Request

const transfer = await client.transfers.create({
  amountMinor: 50000, // ₦500.00
  recipient_account: '0123456789',
  recipient_bank_code: '058',
  narration: 'Payment for services',
  reference: 'TRF_' + Date.now(),
  metadata: {
    customer_id: 'cus_123',
    invoice_id: 'INV_456'
  }
});

console.log(`Transfer ID: ${transfer.id}`);
console.log(`Status: ${transfer.status}`);

Example Response

{
  "success": true,
  "data": {
    "id": "trn_abc123xyz",
    "amount_minor": 50000,
    "fee_minor": 50,
    "total_minor": 50050,
    "recipient_account": "0123456789",
    "recipient_name": "John Doe",
    "recipient_bank": "Guaranty Trust Bank",
    "recipient_bank_code": "058",
    "status": "pending",
    "reference": "TRF_1234567890",
    "narration": "Payment for services",
    "session_id": "SES_xyz789",
    "currency": "NGN",
    "metadata": {
      "customer_id": "cus_123",
      "invoice_id": "INV_456"
    },
    "created_at": "2024-01-15T10:30:00Z"
  }
}

Transfer Fees

Amount RangeFee
₦0 - ₦5,000₦10
₦5,001 - ₦50,000₦25
Above ₦50,000₦50
Fees are automatically deducted from your wallet balance.

Processing Time

  • Instant: Most transfers complete within seconds
  • Same Day: Some banks may take up to 24 hours
  • Webhook: You’ll receive a webhook when the transfer completes

Error Responses

{
  "success": false,
  "error": {
    "code": "insufficient_balance",
    "message": "Wallet balance insufficient",
    "status": 422,
    "details": {
      "required": 50050,
      "available": 30000
    }
  }
}

Idempotency

Use the reference parameter to prevent duplicate transfers:
// This will only create one transfer, even if called multiple times
const transfer = await client.transfers.create({
  amountMinor: 50000,
  destinationAccountNumber: '0123456789',
  destinationBankCode: '058',
  narration: 'Payment',
  reference: 'UNIQUE_REF_123' // Use same reference
});

Next Steps

Get Transfer

Check transfer status

List Transfers

View all transfers

Resolve Account

Verify account before sending

Webhooks

Handle transfer events