---
title: "Initiate bulk VA transfer"
method: POST
path: "/v1/va/transfer/bulk"
tags: ["VA Transfer"]
---

# Initiate bulk VA transfer

`POST /v1/va/transfer/bulk`

## Request

- Base URL: `https://api.kyshi.co`
- URL: `https://api.kyshi.co/v1/va/transfer/bulk`
- Auth: API key in header `x-api-key`
- TypeScript: <https://skmtc.dev/kyshi/apis/kyshi-mor-public-api/docs/v1/va/transfer/bulk/post.ts> (a function with typed inputs; its response is checked against the schema)

Sends a single payout to one beneficiary, split across multiple provider payouts when the amount exceeds the provider limit. This is not a way to pay many different recipients in one request. The fee is calculated once on the full amount and the total debit is reserved once.

## Headers

- `idempotency-key` string, required

## Request body

- InitiateBulkTransferDto
  - `beneficiary` object
  - `beneficiaryId` string
  - `currency` 'NGN' | 'KES' | 'ZAR' | 'GHS' | 'XOF' | 'USD', required
  - `amount` number, required
  - `narration` string, required
  - `splitCount` number: Optional number of provider payouts to split this transfer into. If omitted, Kyshi auto-splits by provider payout limit.

## Response `201`

Success.

- object
  - `status` boolean, required: `true` on success.
  - `message` string, required
  - `code` number, required: Mirrors the HTTP status code.
  - `data` object, required: The endpoint-specific payload.
    - `id` string, required
    - `reference` string, required
    - `status` 'PENDING' | 'PROCESSING' | 'COMPLETED' | 'PARTIALLY_FAILED' | 'FAILED', required
    - `currency` string, required
    - `amount` number, required
    - `totalFees` number, required
    - `totalDebitAmount` number, required
    - `splitCount` number, required
    - `successfulCount` number, required
    - `failedCount` number, required
    - `pendingCount` number, required
    - `feeBreakDown` PublicTransferFeeBreakdownDto, required
      - `fee` number, required
      - `vat` number, required
      - `processorFee` number, required
      - `allInclusiveKyshiFee` number, required
      - `totalFees` number, required
      - `others` object, required
    - `beneficiary` PublicTransferBeneficiaryDto, required
      - `id` string, required
      - `accountName` string, required
      - `accountNumber` string, required
      - `bankCode` string, required
      - `bankName` string, required
      - `providerId` string
      - `description` string
      - `isActive` boolean, required
      - `mode` 'test' | 'live', required
      - `createdAt` string, required
      - `updatedAt` string, required
    - `provider` 'PROVIDUS_BANK' | 'STERLING' | 'VFD' | 'PAYSTACK' | 'FLUTTERWAVE' | 'CHOICE' | 'STITCH' | 'PAGA' | 'STRIPE' | 'ASSET_MFB' | 'MOMENTPAY' | 'PAWAPAY', required
    - `rail` 'VFD_VA' | 'ASSET_MFB' | 'PAYSTACK' | 'STRIPE' | 'PAWAPAY' | 'MANUAL_OTC', required
    - `mode` 'test' | 'live', required
    - `workflowId` string
    - `startedAt` string
    - `completedAt` string
    - `items` PublicBulkVaTransferItemDto[], required
      - `id` string, required
      - `sequence` number, required
      - `amount` number, required
      - `reference` string, required
      - `status` 'PENDING' | 'SUCCESS' | 'IN_REVIEW' | 'FAILED' | 'REVERSAL' | 'COLLECTED', required
      - `externalReference` string
      - `failureReason` string
      - `transactionId` string
      - `transferId` string
      - `attemptedAt` string
      - `completedAt` string
    - `createdAt` string, required
    - `updatedAt` string, required

## Other responses

- `400`: Missing or invalid request parameter.
- `401`: No valid API key provided.
- `403`: The API key lacks permission for this request.
- `404`: Resource not found. A 404 on an object you just created is usually a test/live mode mismatch.
- `422`: Business rule failure, such as an unsupported currency or insufficient balance.
- `500`: Something went wrong on Kyshi’s end.

## Changes

- **2026-11-03** `4aed77604588`: 16 breaking, 26 warning, 52 info
  - added the new required request property `amount`
  - added the new required request property `currency`
  - added the new required request property `narration`
  - the request's body type changed from no type to `object`
  - …90 more

[Operation history](https://skmtc.dev/kyshi/apis/kyshi-mor-public-api/changes/v1/va/transfer/bulk/post.md)

---

[API](https://skmtc.dev/kyshi/apis/kyshi-mor-public-api.md) - [All operations](https://skmtc.dev/kyshi/apis/kyshi-mor-public-api/llms.txt) - [OpenAPI document](https://skmtc.dev/kyshi/apis/kyshi-mor-public-api/revisions/4aed77604588?raw)
