Build the flow that gives each neobank user a routing and account number in their own name: KYC, virtual account statuses, the details screen, and costs.
To give every neobank customer US bank account details, issue each verified user a virtual account: a US account in their own name with its own routing and account number. With BlindPay, each deposit to that account becomes a payin that settles to the user's wallet as USDC or USDT, and your app shows it as a dollar balance.
This page is the product build: who qualifies, the order of API calls, what the account details screen shows in each status, and what it costs per user. For where this sits in the whole product, start with how to build a neobank.
Key takeaways
approved before you can request an account.It means the user can hand out real US account details and get paid in dollars. They don't open an account at a branch, and you don't run a bank.
A virtual account is a set of bank account numbers issued by a banking partner through a provider, assigned to one customer, whose incoming transfers are tracked to that customer. On BlindPay, a US virtual account has its own routing and account number, accepts ACH, wire, and SWIFT, and settles every deposit as USDC or USDT to the wallet linked at creation.
For a neobank user, the result looks like this: a freelancer in Brazil gives a US client a routing number and account number, the client pays by ACH, and the freelancer's app shows the dollars a few days later. The stablecoin layer sits behind the balance. Stablecoin neobank vs traditional neobank covers that trade in full.
Any customer who has accepted BlindPay's terms of service, passed KYC, and has the account compliance fields filled in. The order is fixed.
tos_id, and a tos.accept webhook fires.kyc_status must be approved. You can't request an account while KYC is still in review. Neobank KYC and KYB onboarding covers the screens.account_purpose and source_of_wealth. Businesses also need business type, description, industry (a NAICS code), estimated annual revenue, and at least one owner with ownership percentage and title. Sole proprietors attach a supporting document, such as a bank statement.The account review can ask for more, including source of funds documents. The virtual account requirements page lists what the bank reviews.
| Account type | Deposit methods | Senders | Issuance SLA | Price |
|---|---|---|---|---|
| US, individuals and businesses | ACH, Wire, SWIFT | US and foreign | 24 hours | $1.50/month |
| US, businesses with foreign senders | ACH, RTP, Wire, SWIFT | Foreign only | 3 to 5 business days | $1.50/month |
| US, businesses with US senders | ACH, Wire, SWIFT | US only | 3 to 5 business days | $1.50/month |
A consumer neobank serving freelancers and remote workers usually starts with the first type. A business neobank picks by who pays its customers.
Seven steps, and most of the waiting happens in steps 2 and 5.
tos_id.customer.update with an approved KYC status. BlindPay's automated KYC Standard typically finishes in about 60 seconds.va_... ID against your user ID.virtualAccount.complete. The payload carries the routing and account numbers, plus SWIFT and receiving bank details once approved.Create step 5 with an Idempotency-Key header, so a retried request after a timeout can't create a second account for the same user. A customer can hold more than one account on purpose; your retry logic should never create one by accident.
Four states, mapped to BlindPay's account statuses. Users who see "Pending" with no explanation open support tickets.
| Status | What the user sees | What your backend does |
|---|---|---|
pending_review | "We're reviewing your account. Most reviews finish within a day." | Waits. Shows the SLA for the account type. |
verifying | "Approved by compliance. Waiting for the bank." | Waits for virtualAccount.complete. |
approved | Routing number, account number, account holder name, bank name and address, copy buttons | Stores the numbers, enables deposit notifications |
rejected | "We couldn't open a US account for you." Plus the next step you offer | Logs the rejection, routes to support |
On the approved screen, show the account holder as the user's legal name, exactly as KYC captured it. Payers type that name into their bank, and a mismatch is a common reason for a held wire. Show SWIFT details on a separate tab labeled "Receiving from outside the US", so domestic payers don't pick the wrong one.
Your app speaks banking. The API speaks payments. Keep a map in your codebase so product and engineering use the same words.
| What the user sees | BlindPay term | Notes |
|---|---|---|
| My US account | Virtual account (va_...) | One customer, one settlement wallet |
| Deposit received | Payin (pi_...) | One payin per incoming transfer |
| Send money to a bank | Payout | Quote first, then execute |
| Account holder | Customer (re_...) | Must be KYC approved |
| Balance | Wallet balance, mirrored in your ledger | Stablecoin behind the screen |
| Transfer fee | Fee fields on the payin or quote | Never hardcode a number |
Banking terms vs blockchain terms has the longer translation table.
$1.50 per account per month on BlindPay, plus a fee per deposit. Where the deposit fee lands depends on size.
| Deposit amount | Where the BlindPay fee lands | Payin field |
|---|---|---|
| Below $100.00 | Your monthly invoice | billing_fee_amount |
| $100.00 or more | Deducted at the time of the transaction | transaction_fee_amount |
Illustrative example. A neobank issues accounts to 2,000 users. Account cost is 2,000 × $1.50 = $3,000 a month, before deposit fees. If 1,200 of those users are active, the cost per active account is $3,000 ÷ 1,200 = $2.50. That ratio is why many teams issue the account at a moment of intent (first invoice, first employer) rather than at sign-up. US virtual accounts are part of BlindPay's Business plan, listed on pricing. Virtual account fees covers what the payer's bank may charge.
kyc_status.missing_required_fields. Ask the questions in onboarding.110000000 is fake.BlindPay issues US virtual accounts in each customer's own name, with individual routing and account numbers that accept ACH, wire, and SWIFT. Every deposit creates a payin that BlindPay converts and sends as USDC or USDT to the wallet you linked, so your app credits a dollar balance without building a bank integration.
KYC, KYB, and sanctions screening run in the same API before an account is requested. A two-stage review (compliance, then the bank) sets the account to approved, and the virtualAccount.complete webhook hands you the numbers to display. Payouts that originate from an account issued to an end user go out under that user's name.
Accounts cost $1.50 per month each, and deposit fees show up on the payin itself. On a development instance, accounts are approved instantly with test numbers, so you can build the whole screen flow before production. See what is a virtual account for the basics.
Create a development instance and run the seven steps above for one test user, ending on the approved account details screen. The virtual accounts docs show each status, and create a virtual account lists the required fields.
Always cheaper? No intermediaries? Recipient needs a wallet? 10 common claims about cross-border stablecoin payments, checked against the Fed and the BIS.
Seven places blockchain payments beat bank rails: contractor payroll, remittances, B2B suppliers, marketplaces, 24/7 treasury, bill pay, and PSP payouts.
The dates that turned stablecoins from a trading tool into cross-border payment rails: USDC, Pix, MiCA, the GENIUS Act, ISO 20022, and Visa settlement.