Skip to main content

Overview

The Transfer class provides methods for interacting with Paystack’s Transfer API. This module allows you to initiate single and bulk transfers, finalize transfers with OTP, list transfers, and verify transfer status.

Methods

initiate

Initiates a transfer to a recipient.
async initiate(input: TransferInitiateInput): Promise<TransferInitiateSuccess | TransferError>
input
TransferInitiateInput
required
The transfer details.
data
object
Example Usage:
const { data, error } = await paystack.transfer.initiate({
  source: "balance",
  amount: 50000,
  recipient: "RCP_recipient123",
  reason: "Payment for services",
  reference: "unique-transfer-ref-123",
});

if (error) {
  // Check if OTP is required
  if (error.meta?.nextStep === "send_otp") {
    console.log("OTP required. Check your phone for OTP.");
  } else {
    console.error("Transfer failed:", error);
  }
} else {
  console.log("Transfer initiated:", data.transfer_code);
}

finalize

Finalizes a transfer with an OTP.
async finalize(input: TransferFinalizeInput): Promise<TransferFinalizeSuccess | GenericError>
input
TransferFinalizeInput
required
The transfer finalization details.
data
object
Example Usage:
const { data, error } = await paystack.transfer.finalize({
  transfer_code: "TRF_code123",
  otp: "123456",
});

if (error) {
  console.error("Finalization failed:", error);
} else {
  console.log("Transfer finalized:", data.status);
}

initiateBulk

Initiates a bulk transfer to multiple recipients.
async initiateBulk(input: TransferBulkInitiateInput): Promise<TransferBulkInitiateSuccess | TransferError>
input
TransferBulkInitiateInput
required
The bulk transfer details.
data
array
Array of transfer result objects
Example Usage:
const { data, error } = await paystack.transfer.initiateBulk({
  source: "balance",
  transfers: [
    {
      amount: 50000,
      recipient: "RCP_recipient1",
      reference: "bulk-transfer-ref-1",
      reason: "Payment 1",
    },
    {
      amount: 75000,
      recipient: "RCP_recipient2",
      reference: "bulk-transfer-ref-2",
      reason: "Payment 2",
    },
  ],
});

if (error) {
  console.error("Bulk transfer failed:", error);
} else {
  console.log(`Initiated ${data.length} transfers`);
}

list

Lists transfers made on your integration.
async list(input: TransferListInput): Promise<TransferListSuccess | GenericError>
input
TransferListInput
required
Query parameters for listing transfers.
data
array
Array of transfer objects
Example Usage:
const { data, error } = await paystack.transfer.list({
  perPage: 50,
  page: 1,
});

if (error) {
  console.error("Failed to list transfers:", error);
} else {
  console.log(`Found ${data.length} transfers`);
}

getTransferById

Retrieves a single transfer by ID or code.
async getTransferById(id_or_code: string): Promise<TransferSingleSuccess | GenericError>
id_or_code
string
required
The ID or code of the transfer
data
object
Example Usage:
const { data, error } = await paystack.transfer.getTransferById("TRF_code123");

if (error) {
  console.error("Failed to fetch transfer:", error);
} else {
  console.log("Transfer details:", data);
}

verify

Verifies the status of a transfer using its reference.
async verify(reference: string): Promise<TransferSingleSuccess | GenericError>
reference
string
required
The reference of the transfer to verify
data
object
Complete transfer object with all details (same structure as getTransferById response)
Example Usage:
const { data, error } = await paystack.transfer.verify("transfer-ref-123");

if (error) {
  console.error("Verification failed:", error);
} else if (data.status === "success") {
  console.log("Transfer completed successfully");
} else {
  console.log(`Transfer status: ${data.status}`);
}

Transfer Flow

Here’s a typical flow for initiating and completing a transfer:
// Step 1: Initiate the transfer
const { data: initData, error: initError } = await paystack.transfer.initiate({
  source: "balance",
  amount: 50000,
  recipient: "RCP_recipient123",
  reason: "Payment for services",
  reference: `transfer-${Date.now()}`,
});

if (initError) {
  // Check if OTP is required
  if (initError.meta?.nextStep === "send_otp") {
    console.log("OTP has been sent to your phone");
    
    // Step 2: Get OTP from user (e.g., from input field)
    const otp = await getUserOTP(); // Your implementation
    
    // Step 3: Finalize with OTP
    const { data: finalData, error: finalError } = await paystack.transfer.finalize({
      transfer_code: initData.transfer_code,
      otp: otp,
    });
    
    if (finalError) {
      console.error("Transfer finalization failed:", finalError);
    } else {
      console.log("Transfer completed:", finalData);
    }
  } else {
    console.error("Transfer failed:", initError);
  }
} else {
  // Transfer completed without OTP requirement
  console.log("Transfer successful:", initData);
}