Virtual accounts
Named accounts in USD, EUR, GBP and NGN for every customer
Give each verified customer deposit details under their own name: an IBAN, a sort code, a routing number or an NGN account number. Anyone who can pay a local bank account can pay your customer, and every deposit converts and settles as USDC in a wallet only they control.
From KYC to a funded balance
Verify the customer once
POST /v1/customers/{id}/kyc_session returns a hosted verification URL, or an SDK token for verification embedded in your own app. Documents and decisions stay with licensed partners; you never store a document. customer.kyc.approved arrives on your webhook when the customer is active.
Provision the account
POST /v1/customers/{id}/accounts with a currency returns 202 and provisions asynchronously. account.activated delivers the full deposit details, typically within seconds. One account per currency per customer.
Share the details
EUR issues an IBAN and BIC on SEPA, GBP an account number and sort code on Faster Payments, USD an account and routing number on ACH, and NGN a local account number. The details carry the customer's own name, so payroll, invoices and marketplace payouts address them like any bank account.
Deposits settle as USDC
account.deposit.received fires when inbound fiat is detected, account.deposit.settled when converted proceeds land at the customer's own wallet. Payouts draw from that USDC balance; there is no separate on-ramp step to build.
FAQ
The customer, always. Deposits settle as USDC to a wallet only the customer controls: an external wallet or the embedded wallet of your app. Moneva is a software company over licensed, regulated partners; it never takes deposits, never commingles funds and never has access to keys.
No. Verification runs in a hosted flow, or embedded in your app with an SDK token, and the outcome comes back as customer.kyc.approved or customer.kyc.rejected. Documents never reach your systems, and sensitive identifiers are stored masked.
Provisioning is asynchronous: creation returns 202, and account.activated delivers the deposit details, typically within seconds. Consume the event rather than polling; it is the same pattern every state change on the platform follows.
Account creation is rejected with 422 kyc_not_passed until the customer is active. Which currencies a customer can open follows their verified residency and is enforced automatically at onboarding, so you never maintain your own country rules.
Yes. DELETE /v1/customers/{id}/accounts/{acct_id} marks it closed: new deposits are rejected, history stays queryable for audit, and account.closed fires so your records stay in sync.
More of the platform