Skip to main content
POST
/
api
/
v1
/
virtual-accounts
/
{id}
/
close
Close Virtual Account
curl --request POST \
  --url https://api.usezentra.com/api/v1/virtual-accounts/{id}/close \
  --header 'Authorization: Bearer <token>' \
  --header 'Content-Type: application/json' \
  --data '
{
  "reason": "<string>"
}
'
{
  "error": {
    "code": "NOT_FOUND",
    "message": "Account not found",
    "details": null
  },
  "meta": {
    "path": "/api/v1/virtual-accounts/va_missing/close",
    "method": "POST"
  }
}

Close Virtual Account

Close a virtual account for the authenticated tenant.

Endpoint

POST /api/v1/virtual-accounts/{id}/close

Path Parameters

id
string
required
Virtual account ID.

Request Body

reason
string
Optional closure reason. It is forwarded to the internal service path, but it is not currently echoed back in the response body.

Response

Returns the updated virtual account object with status set to closed.

Example Request

const closedAccount = await client.virtualAccounts.close('va_abc123xyz', {
  reason: 'customer_request'
});

console.log(`Account ${closedAccount.accountNumber} closed`);
console.log(`Status: ${closedAccount.status}`);

Example Response

{
  "data": {
    "id": "va_abc123xyz",
    "tenant_id": "tenant_123",
    "customer_id": "cus_1234567890",
    "account_number": "0123456789",
    "account_name": "John Doe",
    "bank_code": "wema-bank",
    "bank_name": "Wema Bank",
    "provider": "paystack_dva",
    "status": "closed",
    "account_type": "standard",
    "total_received_minor": 500000,
    "transaction_count": 5,
    "metadata": {
      "purpose": "collections"
    },
    "expires_at": null,
    "created_at": "2026-03-07T10:30:00Z",
    "updated_at": "2026-03-07T16:00:00Z"
  },
  "meta": {
    "timestamp": "2026-03-07T16:00:00Z",
    "requestId": "req_123"
  }
}

Error Responses

{
  "error": {
    "code": "NOT_FOUND",
    "message": "Account not found",
    "details": null
  },
  "meta": {
    "path": "/api/v1/virtual-accounts/va_missing/close",
    "method": "POST"
  }
}

Important Notes

Treat account closure as irreversible in your integration. Do not assume the account can be reopened later.
The current BaaS response returns the updated account record. Fields like closure_reason and closed_at are not part of the current response contract.

Next Steps

Create New Account

Generate another account

List Accounts

Review existing accounts