---
title: "Create virtual account"
method: POST
path: "/v1/wallets"
tags: ["Virtual Accounts"]
---

# Create virtual account

`POST /v1/wallets`

## Request

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

Creates bank account details for a customer to transfer into. When feeBearer is CUSTOMER, show the returned payableAmount rather than requestedAmount: it includes fees and is rounded to a figure the customer can transfer.

## Request body

- CreateWalletDto
  - `customer` object, required
  - `currency` 'NGN' | 'KES' | 'ZAR' | 'GHS' | 'XOF' | 'USD', required
  - `accountType` 'INDIVIDUAL' | 'COOPERATE', required
  - `accountCategory` 'DEDICATED_VIRTUAL_ACCOUNT' | 'VIRTUAL_ACCOUNT', required
  - `bank` 'PROVIDUS_BANK' | 'STERLING' | 'VFD' | 'CHOICE' | 'ASSET_MFB'
  - `reference` string
  - `expiresAt` string, required: Expiry duration in minutes for temporary virtual accounts.
  - `amount` number, required
  - `feeBearer` 'MERCHANT' | 'CUSTOMER'

## 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
    - `accountName` string, required
    - `accountNumber` string, required
    - `bankName` string, required
    - `bankCode` string
    - `currency` string, required
    - `provider` 'PROVIDUS_BANK' | 'STERLING' | 'VFD' | 'PAYSTACK' | 'FLUTTERWAVE' | 'CHOICE' | 'STITCH' | 'PAGA' | 'STRIPE' | 'ASSET_MFB' | 'MOMENTPAY' | 'PAWAPAY'
    - `mode` 'test' | 'live'
    - `isActive` boolean
    - `createdAt` string

## 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`: 2 breaking, 4 warning, 11 info
  - the request property `amount` became required
  - the request property `expiresAt` became required
  - removed the request property `customer/email`
  - removed the request property `customer/firstName`
  - …13 more

[Operation history](https://skmtc.dev/kyshi/apis/kyshi-mor-public-api/changes/v1/wallets/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)
