Bank Account Verification

Bank account verification confirms that an account holder owns and controls the bank account they're linking. Frame handles this through an instant, hosted bank-login flow: the account holder authenticates directly with their bank inside the onboarding session, Frame pulls back account details and identity signals, and ownership is confirmed in seconds.

No micro-deposits. No multi-day waits. No "watch for two small charges and tell us the amounts." The flow is built on real-time bank authentication, so verification settles before the account holder leaves the onboarding session.

When to use it

Request bank_account_verification when:

  • You're enabling ACH payments (bank_account_send) and want confirmed ownership before debiting the account.
  • You're enabling ACH payouts (bank_account_receive) and need to know the bank account belongs to the verified individual before pushing funds.
  • A compliance policy requires demonstrated ownership of any bank account linked to your platform.

For card-only flows, this capability isn't relevant — card ownership is verified through CVV + AVS + 3D Secure on the card rail, not through a separate bank-login step.

How it works

The verification flows entirely inside the hosted onboarding session:

  1. Account is created with bank_account_verification in the capabilities array.
  2. Onboarding session is created for the account. The session URL is what the account holder hits.
  3. Account holder authenticates with their bank inside the hosted flow. Frame embeds the bank-login experience — no redirects, no third-party popups, no leaving the session.
  4. Frame retrieves verified data from the bank: account number, routing number, account holder name on the bank record, and additional identity signals.
  5. The capability activates. The bank account is now a usable payment method on the account.

The retrieved data is stored against the payment method and used in downstream compliance checks (cross-referenced against KYC when that capability is also active).

Pair with KYC for stronger signal

Bank account verification on its own confirms the account holder can authenticate with the bank. Pair it with kyc and Frame cross-references the bank-retrieved identity data against the KYC-verified identity — name match, address consistency, etc. The combined signal is materially stronger than either capability alone.

Recommended capability pairings:

Use caseCapabilities
Charge customer ACH (you debit their bank)bank_account_send + bank_account_verification
Pay out to customer's bankbank_account_receive + bank_account_verification + kyc
Maximum identity confidencekyc + bank_account_verification

bank_account_receive requires KYC anyway; bank_account_verification is the layer on top that confirms the specific bank account ownership.

What gets stored

After verification completes, the linked bank account becomes a payment method on the account with:

  • Account number and routing number (encrypted at rest; only the last 4 of the account number returned via the API).
  • The account holder name on the bank record.
  • Identity signals used for fraud and risk evaluation (not exposed via the public API surface, but factored into downstream checks).

Subsequent ACH transactions against this payment method don't re-run the verification — once bank_account_verification is active, the payment method is trusted for ongoing use. Re-verification only kicks in if the account holder re-links the bank account or if Frame's risk signals trigger a refresh.

What it doesn't do

Bank account verification confirms ownership at the moment of linking. It doesn't:

  • Continuously monitor the bank account for changes (e.g., account closed, name changed).
  • Verify that the bank account has sufficient funds — that's a separate check at debit time.
  • Replace address_verification — bank verification gets you ownership confidence, not billing-address match.
  • Apply to international (non-US) bank accounts in V1.

Gotchas

Symptom: the onboarding session URL launches the bank-login UI but the account holder's bank isn't in the list. Why: Frame's bank verification partner covers most US institutions but not 100%. Fix: if the institution is small/regional and not supported, the account holder will hit a fallback message in the session — Frame doesn't currently offer a manual-entry path in V1. Contact Frame support if you need broader institution coverage.

Symptom: bank_account_verification is active but ACH payouts still fail with payment_method_not_verified. Why: bank_account_verification activates per-account, but each linked bank account is a separate payment method. If the account holder has multiple bank accounts and only one is verified, payouts to the others will fail. Fix: check the specific payment method's verification status, not just the account capability.

Symptom: the account holder authenticated successfully but the capability is still pending an hour later. Why: edge case — Frame's verification partner is processing the bank's response. Most verifications resolve in seconds; a small percentage queue for additional checks. Fix: listen for capability.activated or capability.disabled; if neither fires within a few hours, contact Frame support with the account ID.

Reference

For onboarding session creation (where bank verification flows live), see POST/v1/onboarding_sessions.