---
title: Static NGN Accounts
description: Permanent Nigerian bank account numbers you issue to your customers. Every transfer is confirmed instantly by webhook and settles on the standard T+1 schedule.
---

# Static NGN Accounts

A Static NGN Account is a permanent bank account number that belongs to one of your customers (or to your business) for as long as you keep it. Customers can pay into it any number of times, from any Nigerian bank. Each transfer is booked the moment it lands, you get a `charge.success` webhook straight away, and the money settles to you on the standard T+1 schedule.

::: info Available on request
Static NGN Accounts are enabled for selected merchants on request. If you do not see **Static Accounts** in your dashboard, or the API returns `STATIC_ACCOUNT_NOT_ENABLED`, contact our business support team to request access.
:::

## Static vs. virtual accounts

| | [Virtual account](/guide/virtual-accounts) | Static NGN Account |
|---|---|---|
| Lifetime | Expires after a set validity window | Permanent until you pause or delete it |
| Account number | New number per request | One number per customer, reused forever |
| Amount | Optional expected amount and validation rule | Any amount, any number of times |
| Identity | None | BVN, NIN or CAC number of the account holder (verified) |
| Where it is offered | API, dashboard, and hosted/inline checkout | API and dashboard only |
| Settlement | T+1 | T+1 |

Static accounts are not a checkout payment method. They do not appear on hosted, inline or invoice checkouts, and they are not part of `payment_methods`. They are for server-side integrations and the dashboard: wallet top-ups, recurring customer funding, dedicated collection accounts per client.

## How it works

1. **Create** an account for a customer via the [API](/api/static-account) or the dashboard, supplying their name, a BVN, NIN or CAC number, and your own unique reference for the customer (so the same customer is never issued two numbers).
2. ZevPay **verifies** that the name matches the identity record, then issues the account number. You get back the number and the bank name to show the customer.
3. The customer **transfers** to that number from any bank, as often as they like.
4. Each transfer is **booked immediately**: it appears in your transactions with `channel: "static_account"`, and your webhook URL receives [`charge.success`](/webhooks/events#charge-success) within seconds.
5. The money **settles T+1** to the settlement destination configured on the API key that owns the account (bank account or ZevPay balance), like every other checkout payment.

The account holds no balance of its own. Everything that lands is owed to you and paid out on the settlement schedule.

## Identity requirements

Every account is tied to a verified identity. Pass one of:

| `identity_type` | `identity_number` | Who it is for |
|---|---|---|
| `bvn` | 11-digit Bank Verification Number | An individual |
| `nin` | 11-digit National Identification Number | An individual |
| `rc` | CAC registration number, prefixed `RC` or `BN` (e.g. `RC1234567`) | A registered business or business name |

The `customer_name` you send must match the name on that record. A mismatch is rejected with `IDENTITY_MISMATCH` and nothing is created. ZevPay never returns the registry record to you; the check is pass/fail only.

For compliance, the details you submit for every account (including rejected attempts) are retained by ZevPay.

## Settlement and the API key

An account belongs to the secret API key you created it with. That key decides two things for every transfer into the account:

- **Where the money settles**: the key's settlement destination (an external bank account or a ZevPay balance), read at the time each payment lands, so changing the key's settlement bank later applies to future payments.
- **Where the webhook goes**: the key's webhook URL and signing secret.

Pick the key deliberately when you create accounts. If you route different products through different keys, create each customer's account under the key for that product.

## Pausing, resuming and deleting

- **Pause** an account to stop accepting transfers temporarily; the bank rejects transfers while it is paused. Resume any time.
- **Delete** an account to retire the number permanently. It cannot be restored, and the number cannot be reused. Payment history is kept.

If ZevPay suspends an account (or your access to the product), transfers are rejected and the account shows as `suspended`. You cannot lift a suspension yourself; contact support.

## Refunds

You can ask for a payment to be returned to the payer as long as it has not yet been settled to you. The request removes the payment from your next settlement while ZevPay returns the money, and you receive `charge.refunded` when it is done. Once a payment has been paid out to you, a refund is handled with support instead. See the [API](/api/static-account#refunds).

## Reliability

Confirmation is webhook-driven from the bank, with a reconciliation sweep behind it that pulls any transfer the notification missed. A transfer that reaches the account number is always booked, even if the account was paused at the time; it is flagged so you can review it.

## Next steps

- [Static NGN Account API](/api/static-account)
- [`charge.success` payload for `channel: "static_account"`](/webhooks/events#static-ngn-account)
