> ## Documentation Index
> Fetch the complete documentation index at: https://dev-docs.pagoramp.com/llms.txt
> Use this file to discover all available pages before exploring further.

# GHS virtual accounts (Ghana)

> Issue GHS bank details for your customers and receive payments by Bank transfer.

| | |
| - | - |
| Country | Ghana |
| Payment rail | Bank transfer |
| Account types | dedicated |
| Customers | Individuals and businesses |
| When it is ready | Ready immediately. The create call returns the account number. |

## 1. Check availability

Ask what GHS needs for your account. The answer lists the required fields per customer type and account type.

```bash theme={null}
curl "https://pay-api.pagoramp.com/api/v1/virtual-accounts/availability?currency=GHS" \
  -H "x-api-key: YOUR_API_KEY"
```

## 2. Create the customer

Required for an individual: `firstname`, `lastname`, `email`. See [Virtual account requirements](https://dev-docs.pagoramp.com/virtual-accounts-requirements#ghs) for every combination.

```bash theme={null}
curl -X POST https://pay-api.pagoramp.com/api/v1/customers \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"firstname":"Ada","lastname":"Okafor","email":"ada@example.com"}'
```

The customer is created with `kycStatus` `incomplete` or `pending`. Anything missing for GHS can be added later with `PATCH /customers/{uuid}` before you request the account.

## 3. Request the account

```bash theme={null}
curl -X POST https://pay-api.pagoramp.com/api/v1/virtual-accounts \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"customerId":"224ca5c5-f2a6-419b-bf36-73997434d945","currency":"GHS","type":"dedicated","reference":"va_1001"}'
```

You must have a webhook secret set up first, or the request returns `400` with `webhook_secret_required`.

The response depends on the currency. For GHS, expect `active`:

**`active`**: Ready. Show the bank details to your payer.

```json theme={null}
{
  "status": "success",
  "message": "Virtual account created successfully",
  "data": {
    "uuid": "9a1c1c52-7b8e-4a52-9f0e-3e6b0a8d6c11",
    "reference": "va_1001",
    "status": "active",
    "currency": "GHS",
    "type": "dedicated",
    "bankDetails": {
      "rail": "bank_transfer",
      "accountName": "Ada Okafor",
      "accountNumber": "2033796008646265",
      "bankName": "United Bank for Africa",
      "extra": {}
    },
    "customer": {
      "uuid": "224ca5c5-f2a6-419b-bf36-73997434d945",
      "email": "ada@example.com"
    },
    "expectedAmount": null,
    "expiresAt": null,
    "nextStep": null,
    "statusReason": null,
    "metadata": {
      "orderId": "12345"
    },
    "createdAt": "2026-10-16T09:31:00.000Z"
  }
}
```

If the request is rejected straight away you get `422` with the reason in `errors[0].reason` and no account is created. If it is rejected later you receive `virtual_account.failed` with a `reason`. See [Webhooks](https://dev-docs.pagoramp.com/webhooks#account-status-events).

## 4. Show the details to your payer

Show these fields from `bankDetails`:

| Label | Field |
| - | - |
| Account name | `accountName` |
| Account number | `accountNumber` |
| Bank | `bankName` |

How your payer sends the money:

1. Make a bank transfer to the account number shown, in Ghana cedis.

## 5. Receive the payment

When the payment arrives you receive `virtual_account.payment.received`. Amounts are decimal strings in GHS; `destinationAmount` is in USD, after any fees.

```json theme={null}
{
  "event": "virtual_account.payment.received",
  "data": {
    "transaction": {
      "reference": "va-17912345678901234",
      "status": "Success",
      "sourceAmount": "800.00",
      "sourceCurrency": "GHS",
      "destinationAmount": "65.04",
      "destinationCurrency": "USD",
      "fees": {
        "sourceTotalFee": "0.00"
      }
    },
    "virtualAccount": {
      "uuid": "9a1c1c52-7b8e-4a52-9f0e-3e6b0a8d6c11",
      "reference": "va_1001",
      "currency": "GHS",
      "type": "dedicated"
    },
    "customer": {
      "uuid": "224ca5c5-f2a6-419b-bf36-73997434d945",
      "email": "ada@example.com",
      "externalReference": null
    },
    "sender": {
      "name": "ADA OKAFOR",
      "bank": "GCB Bank",
      "accountNumber": "******6789"
    },
    "occurredAt": "2026-10-16T10:02:00.000Z"
  }
}
```

Verify the signature before you trust it, and use `data.transaction.reference` to ignore repeats. See [Webhooks](https://dev-docs.pagoramp.com/webhooks).

## Things to handle

* GHS accounts are dedicated only. Dynamic GHS accounts are not available.
* The account name is the customer's name.
* A payment can be held for review. You receive `virtual_account.payment.manual_review` with a `review.reason`, then `received` or `rejected` after a decision.
* `GET /virtual-accounts/{uuid}` returns the current status at any time, and `POST /virtual-accounts/{uuid}/deactivate` stops the account accepting payments.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.