Skip to content

Transfer Recipients API

The Transfer Recipients API allows you to create and manage beneficiaries for transfers. Storing recipients makes it easier to send repeat transfers.

Methods

create()

Create a new transfer recipient.

typescript
async create(
  data: ITransferRecipientCreateForm,
  traceId?: string
): Promise<ITransferRecipient>

Parameters

  • data - Recipient information
  • traceId - Optional trace ID for request tracking

Example: Bank Recipient (NGN)

typescript
const recipient = await flutterwave.api.transferRecipients.create(
  {
    type: 'bank_ngn',
    name: {
      first: 'John',
      last: 'Doe',
    },
    bank: {
      code: '044',
      account_number: '0690000031',
    },
  },
  'trace-id',
);

console.log('Recipient ID:', recipient.id);
console.log('Name:', `${recipient.name.first} ${recipient.name.last}`);
console.log('Currency:', recipient.currency);

list()

List all transfer recipients with pagination.

typescript
async list(
  query?: {
    page?: number;
    size?: number;
  },
  traceId?: string
): Promise<{
  data: ITransferRecipient[];
  cursor: PageCursor;
}>

Example

typescript
const result = await flutterwave.api.transferRecipients.list(
  {
    page: 1,
    size: 20,
  },
  'trace-id',
);

console.log(`Found ${result.data.length} recipients`);
result.data.forEach((recipient) => {
  console.log(
    `${recipient.name.first} ${recipient.name.last} - ${recipient.currency}`,
  );
});

retrieve()

Get details of a specific recipient.

typescript
async retrieve(
  id: string,
  traceId?: string
): Promise<ITransferRecipient>

Example

typescript
const recipient = await flutterwave.api.transferRecipients.retrieve(
  'recipient_id',
  'trace-id',
);

console.log('Recipient:', recipient.name);

delete()

Delete a transfer recipient.

typescript
async delete(
  id: string,
  traceId?: string
): Promise<void>

Example

typescript
await flutterwave.api.transferRecipients.delete('recipient_id', 'trace-id');

console.log('Recipient deleted successfully');

Type Definitions

ITransferRecipientCreateForm

The form structure varies by recipient type:

typescript
type ITransferRecipientCreateForm =
  | {
      type: 'bank_ngn';
      name: { first: string; last: string };
      bank: { code: string; account_number: string };
    }
  | {
      type: 'bank_usd';
      name: { first: string; last: string };
      bank: {
        code: string;
        account_number: string;
        country: string;
      };
    }
  | {
      type: 'mobile_money_kes';
      name: { first: string; last: string };
      mobile_money: { network: string; msisdn: string };
    };
// ... other types

ITransferRecipient

typescript
interface ITransferRecipient {
  id: string;
  name: {
    first: string;
    last: string;
  };
  currency: string;
  created_datetime: string;
  // Additional fields based on type
}

Use Cases

Create Bank Recipient

typescript
async function createBankRecipient(
  firstName: string,
  lastName: string,
  bankCode: string,
  accountNumber: string,
) {
  const recipient = await flutterwave.api.transferRecipients.create({
    type: 'bank_ngn',
    name: {
      first: firstName,
      last: lastName,
    },
    bank: {
      code: bankCode,
      account_number: accountNumber,
    },
  });

  return recipient.id;
}

Create and Store Multiple Recipients

typescript
async function importRecipients(recipientList: any[]) {
  const created = [];

  for (const recipientData of recipientList) {
    const recipient = await flutterwave.api.transferRecipients.create({
      type: 'bank_ngn',
      name: recipientData.name,
      bank: recipientData.bank,
    });

    created.push(recipient);
  }

  return created;
}

Search Recipients

typescript
async function findRecipient(searchTerm: string) {
  const result = await flutterwave.api.transferRecipients.list({
    page: 1,
    size: 100,
  });

  return result.data.filter((recipient) => {
    const fullName =
      `${recipient.name.first} ${recipient.name.last}`.toLowerCase();
    return fullName.includes(searchTerm.toLowerCase());
  });
}

Remove Inactive Recipients

typescript
async function cleanupRecipients() {
  const result = await flutterwave.api.transferRecipients.list({
    page: 1,
    size: 100,
  });

  // Logic to determine inactive recipients
  const inactiveRecipients = result.data.filter((recipient) => {
    // Your business logic here
    return false;
  });

  for (const recipient of inactiveRecipients) {
    await flutterwave.api.transferRecipients.delete(recipient.id);
  }

  return inactiveRecipients.length;
}

Best Practices

1. Validate Before Creating

typescript
async function validateAndCreateRecipient(recipientData: any) {
  // Validate account details first
  const validAccount = await flutterwave.api.banks.resolve({
    account: {
      code: recipientData.bankCode,
      number: recipientData.accountNumber,
    },
    currency: 'NGN',
  });

  console.log(`Creating recipient: ${validAccount.account_name}`);

  // Create recipient
  const recipient = await flutterwave.api.transferRecipients.create({
    type: 'bank_ngn',
    name: recipientData.name,
    bank: {
      code: recipientData.bankCode,
      account_number: recipientData.accountNumber,
    },
  });

  return recipient;
}

2. Check for Duplicates

typescript
async function createUniqueRecipient(
  accountNumber: string,
  bankCode: string,
  name: any,
) {
  const existing = await flutterwave.api.transferRecipients.list({
    page: 1,
    size: 100,
  });

  const duplicate = existing.data.find((r) => {
    if (r.type === 'bank') {
      return (
        r.bank?.account_number === accountNumber && r.bank?.code === bankCode
      );
    }
    return false;
  });

  if (duplicate) {
    console.log('Recipient already exists:', duplicate.id);
    return duplicate;
  }

  return await flutterwave.api.transferRecipients.create({
    type: 'bank_ngn',
    name,
    bank: { code: bankCode, account_number: accountNumber },
  });
}

3. Store Recipient IDs

typescript
async function createAndStoreRecipient(recipientData: any) {
  const recipient = await flutterwave.api.transferRecipients.create({
    type: 'bank_ngn',
    name: recipientData.name,
    bank: recipientData.bank,
  });

  // Store in your database
  await db.recipients.create({
    flutterwave_recipient_id: recipient.id,
    user_id: recipientData.userId,
    account_number: recipientData.bank.account_number,
    bank_code: recipientData.bank.code,
  });

  return recipient;
}

Error Handling

typescript
try {
  const recipient = await flutterwave.api.transferRecipients.create({
    type: 'bank_ngn',
    name: { first: 'John', last: 'Doe' },
    bank: { code: '044', account_number: '0690000031' },
  });

  console.log('Recipient created:', recipient.id);
} catch (error) {
  if (error instanceof BadRequestException) {
    console.error('Invalid recipient data:', error.message);
  } else {
    console.error('Failed to create recipient:', error);
  }
}

Recipient Types

The API supports various recipient types:

  • bank_ngn - Nigerian bank accounts
  • bank_usd - USD bank accounts
  • bank_gbp - GBP bank accounts
  • bank_eur - EUR bank accounts
  • mobile_money_* - Mobile money accounts (KES, GHS, UGX, etc.)
  • wallet_* - Digital wallet accounts

Each type has specific required fields based on the currency and payment method.

Released under the MIT License.