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

# Virtual Accounts

> Issue bank details a customer can transfer into

Create a virtual account, show `details` to the customer, listen for deposits.

## Requirements

Check which documents a currency needs before you create the account. `required` must all be verified. If `any_of` is non-empty, one of those types is enough. Live issuance is `ngn` only.

```bash theme={"theme":{"light":"min-light","dark":"poimandres"}}
curl "https://api.puplar.com/virtual-accounts/requirements?currency=ngn" \
  -H "Authorization: Bearer sk_live_your_key"
```

```json theme={"theme":{"light":"min-light","dark":"poimandres"}}
{
  "items": [
    {
      "currency": "ngn",
      "available": true,
      "kyc": {
        "required": ["bvn"],
        "any_of": []
      }
    }
  ]
}
```

Pass `customer_id` to include `eligible` and `missing` on each item. Omit `currency` to get every supported currency.

See [Identity Verification](/guides/kyc).

## Create a virtual account

The customer must already exist and be verified. Live is `ngn` only. Test also allows `usd`. Recreating the same customer + currency returns the existing account.

```bash theme={"theme":{"light":"min-light","dark":"poimandres"}}
curl -X POST https://api.puplar.com/virtual-accounts \
  -H "Authorization: Bearer sk_live_your_key" \
  -H "Content-Type: application/json" \
  -d '{
    "customer_id": "64f1a2b3c4d5e6f7a8b9c0d1",
    "currency": "ngn"
  }'
```

## Retrieve

```bash theme={"theme":{"light":"min-light","dark":"poimandres"}}
curl "https://api.puplar.com/virtual-accounts?customer=64f1a2b3c4d5e6f7a8b9c0d1&currency=ngn" \
  -H "Authorization: Bearer sk_live_your_key"
```

```bash theme={"theme":{"light":"min-light","dark":"poimandres"}}
curl "https://api.puplar.com/virtual-accounts/64f9b3c4d5e6f7a8b9c0d1e2" \
  -H "Authorization: Bearer sk_live_your_key"
```

## Simulate a deposit (test)

Test key only. `amount` is minor units, `100`–`1000000`.

```bash theme={"theme":{"light":"min-light","dark":"poimandres"}}
curl -X POST https://api.puplar.com/virtual-accounts/64f9b3c4d5e6f7a8b9c0d1e2/simulate-deposit \
  -H "Authorization: Bearer sk_test_your_key" \
  -H "Content-Type: application/json" \
  -d '{ "amount": 10000 }'
```

Listen for `virtual_account.deposit`. Confirm with `GET /transactions/{id}/verify` before fulfilling. See [Webhooks](/guides/webhooks).

```json theme={"theme":{"light":"min-light","dark":"poimandres"}}
{
  "id": "64f1a2b3c4d5e6f7a8b9c0d1",
  "type": "virtual_account.deposit",
  "timestamp": "2026-07-26T12:00:00.000Z",
  "payload": {
    "id": "64f9b3c4d5e6f7a8b9c0d1e2",
    "status": "completed",
    "method": "bank_transfer",
    "amount": 10000,
    "livemode": false,
    "direction": "credit",
    "currency": "ngn",
    "metadata": {},
    "source": {
      "account_name": "Jane Doe",
      "account_number": "0123456789",
      "bank_name": "Access Bank"
    },
    "customer": "64aa11b2c3d4e5f6a7b8c9d0"
  }
}
```
