Skip to main content

Upcoming changes

We are working on exciting new features that will enhance your experience. While we continue to develop these updates, you can keep building!
We recommend regularly checking this changelog for the latest updates and planning your development cycles accordingly. Your feedback is invaluable to us, so feel free to share any suggestions or issues you encounter.

Product updates

New releases and improvements
January 22, 2026

Virtual Accounts API Breaking Changes

Breaking Change: This update is now live. Existing integrations using the Virtual Accounts API should update to the new response format.

Why This Changed

Previously, each wallet or address could only have one virtual account. We’ve heard from businesses that need multiple virtual accounts per wallet—for example, to assign separate accounts to different customers or use cases. This update enables that flexibility while maintaining backwards compatibility for retrieving individual accounts.

What Changed

EndpointPrevious BehaviorNew Behavior
GET /wallets/{walletId}/virtual-accountsReturned a single objectReturns a paginated array
GET /wallets/{walletId}/addresses/{addressId}/virtual-accountsReturned a single objectReturns a paginated array

New Endpoints

To retrieve a specific virtual account (equivalent to the old single-object response), use these new endpoints:
EndpointDescription
GET /wallets/{walletId}/virtual-accounts/{virtualAccountId}Get a specific virtual account
GET /wallets/{walletId}/virtual-accounts/{virtualAccountId}/transactionsGet transactions for a virtual account
POST /wallets/{walletId}/virtual-accounts/{virtualAccountId}/regenerateRegenerate a virtual account
GET /wallets/{walletId}/addresses/{addressId}/virtual-accounts/{virtualAccountId}Get a specific child address virtual account
GET /wallets/{walletId}/addresses/{addressId}/virtual-accounts/{virtualAccountId}/transactionsGet child address virtual account transactions
POST /wallets/{walletId}/addresses/{addressId}/virtual-accounts/{virtualAccountId}/regenerateRegenerate a child address virtual account

Pagination Details

All list endpoints now support pagination with these query parameters:
ParameterTypeDefaultMaxDescription
pageinteger1Page number to retrieve
limitinteger10100Number of records per page

New Features

  • Virtual account labels: Add custom labels to organize accounts (e.g., “Customer A”, “Payroll”)
  • Account regeneration: Generate new account numbers with reason tracking for audit purposes
  • Transaction history: Query transactions linked to specific virtual accounts

Migration Guide

Before — Single object response:
const response = await fetch(`/wallets/${walletId}/virtual-accounts`);
const account = await response.json();

console.log(account.accountNumber);
console.log(account.bankName);
After — Paginated array response:
const response = await fetch(`/wallets/${walletId}/virtual-accounts`);
const { data, meta } = await response.json();

// Handle empty array case
if (data.length === 0) {
  console.log('No virtual accounts found');
  return;
}

// Get the first account (equivalent to old behavior)
const account = data[0];
console.log(account.accountNumber);
console.log(account.bankName);

// Or iterate through all accounts
for (const account of data) {
  console.log(account.accountNumber);
}

// Pagination info available in meta
console.log(`Page ${meta.currentPage} of ${meta.totalPages}`);
To get a specific account by ID (recommended):
const response = await fetch(`/wallets/${walletId}/virtual-accounts/${virtualAccountId}`);

if (!response.ok) {
  console.log('Virtual account not found');
  return;
}

const { data } = await response.json();
console.log(data.accountNumber);

Example API Response

List endpoint GET /wallets/{walletId}/virtual-accounts:
{
  "message": "Virtual accounts retrieved successfully",
  "statusCode": 200,
  "data": [
    {
      "id": "550e8400-e29b-41d4-a716-446655440000",
      "accountNumber": "8012345678",
      "accountName": "Blockradar/John Doe",
      "bankName": "Wema Bank",
      "bankCode": "035",
      "isActive": true,
      "type": "AUTO_FUNDING",
      "label": "Customer Deposits",
      "createdAt": "2026-01-22T10:30:00.000Z",
      "updatedAt": "2026-01-22T10:30:00.000Z"
    }
  ],
  "meta": {
    "itemCount": 1,
    "totalItems": 1,
    "itemsPerPage": 10,
    "totalPages": 1,
    "currentPage": 1
  }
}
Single account endpoint GET /wallets/{walletId}/virtual-accounts/{virtualAccountId}:
{
  "message": "Virtual account retrieved successfully",
  "statusCode": 200,
  "data": {
    "id": "550e8400-e29b-41d4-a716-446655440000",
    "accountNumber": "8012345678",
    "accountName": "Blockradar/John Doe",
    "bankName": "Wema Bank",
    "bankCode": "035",
    "isActive": true,
    "type": "AUTO_FUNDING",
    "label": "Customer Deposits",
    "createdAt": "2026-01-22T10:30:00.000Z",
    "updatedAt": "2026-01-22T10:30:00.000Z"
  }
}

Need Help?

November 7, 2025

Virtual Accounts API

  • New feature: Virtual Accounts API enables businesses to create and manage virtual bank accounts linked to master wallets or child addresses
  • Fiat-to-stablecoin conversion: Customers can receive NGN payments through traditional bank transfers, automatically converted to cNGN stablecoins
  • Auto-funding support: AUTO_FUNDING type accounts automatically mint cNGN when fiat payments are received and transfer to linked wallets
  • Master wallet integration: Create virtual accounts directly linked to master wallets
  • Child address integration: Create virtual accounts linked to specific child addresses for granular control
  • Account management: Activate or deactivate virtual accounts to control auto-funding behavior

What you need to do

  • Enable the feature: Contact [email protected] to enable virtual accounts for your business
  • Ensure cNGN support: Make sure your master wallet supports the cNGN stablecoin asset
  • Mainnet only: Note that virtual accounts are only available in the MAINNET environment
  • Review API endpoints: Check the Virtual Accounts API documentation for implementation details

API Endpoints

Below are the core API endpoints for Virtual Accounts operations:

Master Wallet Endpoints

Child Address Endpoints

Key Features

  • Supported currency: NGN (Nigerian Naira) for fiat payments, cNGN for stablecoin conversion
  • Auto-funding flow: Automatic minting and transfer of cNGN when payments are received (AUTO_FUNDING type)
  • Account activation: Control auto-funding behavior by activating or deactivating accounts
  • Customer management: Create accounts with customer information (firstname, lastname, email, phone)
For more information, see the Virtual Accounts documentation and API Reference.
October 20, 2025

cNGN Testnet Address Updates

  • Updated cNGN testnet addresses: The cNGN team has updated their testnet addresses across multiple networks
  • New asset support: Added support for the updated cNGN stablecoin in the dashboard
  • Asset management: Previous testnet addresses are now labeled as “old” and will be removed in 30 days
  • Tron USDT support: Added updated supported Tron USDT address with previous address labeled as “old”

What you need to do

  • Go to your dashboard and add the new cNGN assets (look for the ones without the “old” label)
  • Update your integrations to use the new testnet addresses
  • The old testnet addresses will be automatically removed after 30 days
  • Note: These changes only apply to testnet environments - mainnet addresses remain unchanged

Updated Testnet Addresses

NetworkNew cNGN Contract Address
ASSETCHAIN0x4c00E85cd0B0307D8ED0b5534Bc678776C4aa7D3
BASE0x929A08903C22440182646Bb450a67178Be402f7f
BNBCHAIN0x20354A3Ad3B67836ab9c6D7D82cF5e5Ddfe104dD
ETHEREUM0xd076ceCB8af5D92F7f6F32bDf24Da708859593d3
POLYGON0xf24B1Cee8cA70341FcefBCa10e7e4Db9A4896486
LISK0x999E3A32eF3F9EAbF133186512b5F29fADB8a816

Updated Tron USDT Address

NetworkNew Tron USDT Contract Address
TRONTXYZopYRdj2D9XRtbG411XZZ3kM5VkAeBf
For more information about the cNGN stablecoin project, visit the official repository.