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

# Create a Virtual Account

> Provision a persistent, per-customer bank account

`POST /v1/virtual-accounts`

Requests a single provider via the `provider` field (defaults to `paga`). To provision on both networks in one call, see [Multi-Provider Requests](/virtual-accounts/multi-provider) instead.

<ParamField body="customer_name" type="string" required>
  Full name of the customer
</ParamField>

<ParamField body="customer_phone" type="string">
  Customer's phone number, e.g. `+2348012345678`. **Required if `provider` is `paga`.**
</ParamField>

<ParamField body="customer_email" type="string">
  Customer's email address. **Required if `provider` is `paga`.**
</ParamField>

<ParamField body="bvn" type="string">
  Customer's 11-digit BVN (optional — `financial_identification_number` is accepted as a deprecated alias for the same field)
</ParamField>

<ParamField body="funding_limit" type="number">
  Max single transaction in Naira, between 100 and 1,000,000. Defaults to 50,000
</ParamField>

<ParamField body="provider" type="string" default="paga">
  `paga` or `palmpay`
</ParamField>

```bash theme={null}
curl -X POST "https://api.payracle.com/api/v1/virtual-accounts" \
  -H "Authorization: Bearer sk_live_YOUR_SECRET_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "customer_name": "Jane Doe",
    "customer_phone": "+2348012345678",
    "customer_email": "jane@example.com",
    "bvn": "12345678901",
    "funding_limit": 100000
  }'
```

```json Response theme={null}
{
  "message": "Virtual account created successfully.",
  "id": 5,
  "reference": "pva_ca067b8f-...",
  "customer_name": "Jane Doe",
  "accounts": [
    {
      "account_number": "0354650915",
      "account_name": "Jane Doe",
      "bank_name": "Paga",
      "bank_code": null
    }
  ]
}
```

<Note>
  Calling this again for the same customer doesn't create a duplicate — it returns the existing account with `"message": "Virtual account already exists for this customer."`
</Note>
