PagorampBeta
Sign in
Virtual Accounts

A bank account for every customer.

Give each customer their own local account number in 11 currencies. They pay by bank transfer, we match every payment to the right customer, and you settle in stablecoin or pay out to your local bank account.

Individuals and businessesDedicated or one-time accountsSigned webhooks
Account issued
Account nameACME PAY / ADA OKAFOR
Account number4372970272
Routing number101019644
BankLead Bank
CurrencyUSD
TypeDedicated
Payment received: $2,500.00 from ADA OKAFOR
Currencies

Eleven currencies, one integration.

Each account is issued in the customer's local currency and uses the rail people already use there.

USD
US dollar
ACH and wire
EUR
Euro
SEPA
GBP
British pound
Faster Payments
CAD
Canadian dollar
Interac e-Transfer
NGN
Nigerian naira
Local bank transfer
GHS
Ghanaian cedi
Local bank transfer
KES
Kenyan shilling
Local bank transfer
TZS
Tanzanian shilling
TIPS, TISS and mobile money
MXN
Mexican peso
SPEI
BRL
Brazilian real
Pix
COP
Colombian peso
Bre-B
+
More on the way
Ask us about your market

Some currencies need identity checks before the account is issued, and pound accounts are for business customers. Peso and real accounts are switched on per merchant. Our API lists what each currency needs, so your form never goes out of date.

Account types

Permanent for regulars, one-time for invoices.

Which type is available depends on the currency. You see that before you issue an account.

Dedicated account

A permanent account number that belongs to one customer.

Accepts any amount, any number of times
Every payment is matched to the customer
Good for wallets, subscriptions and repeat payers

One-time account

A temporary account for a single payment, with an expected amount and an expiry.

Tied to one invoice or order
Wrong amounts are caught and reviewed
Expires on its own when the window closes
How it works

From customer to payment in four steps.

01

Create a customer

Add an individual or a business. An email and a name are enough to start; add identity details when a currency needs them.

02

Issue an account

Pick the currency and the type. You get the account details back to show your customer, or a verification link if the provider needs one first.

03

Your customer pays

They send a bank transfer to the account, the same way they pay any other bank account.

04

You get a signed webhook

We confirm the payment with the bank, match it to the customer, and notify your system. Funds settle to your balance.

When something is off

Wrong amounts and third-party payments are handled, not ignored.

Paid too little or too much

On one-time accounts we compare what arrived with what you asked for. A difference is flagged and reviewed before it settles, and you get a manual review webhook with the expected and received amounts.

Paid by someone else

For dollar, euro and pound accounts, a payment from a sender who is not your customer can be held for review. The rule depends on your risk tier, so low and medium risk merchants are not slowed down.

Confirmed with the bank

We never credit from a webhook alone. Every payment is checked against the provider before it counts, so a spoofed notification cannot create a payment.

For developers

One request. The same shape in every currency.

Account details come back in one normalized object, whether the rail is a US routing number, an IBAN, a sort code or a local account number, so adding a country never changes your code.

virtual_account.payment.received
A payment arrived and settled.
virtual_account.payment.manual_review
A payment is held for review, with the reason.
virtual_account.created
An account is ready after verification.

Every webhook is signed, so you can verify it came from us.

POST /api/v1/virtual-accounts
{
  "customerId": "224ca5c5-f2a6-419b-bf36-73997434d945",
  "currency": "USD",
  "type": "dedicated",
  "reference": "va_1001"
}

// The 201 first returns requires_action with a verification link. Once the customer verifies:
{
  "status": "success",
  "data": {
    "uuid": "9a1c1c52-7b8e-4a52-9f0e-3e6b0a8d6c11",
    "status": "active",
    "currency": "USD",
    "type": "dedicated",
    "bankDetails": {
      "rail": "ach",
      "accountName": "ACME PAY / ADA OKAFOR",
      "accountNumber": "4372970272",
      "routingNumber": "101019644",
      "bankName": "Lead Bank"
    }
  }
}
FAQ

Questions about Virtual Accounts.

Get started

Issue your first virtual account.

Create an account, add a customer and issue a bank account in the currency you need.