Bank Account Verification

Bank account verification confirms that an account holder owns and controls the bank account they're linking for ACH payments or payouts. frameOS connects the account holder to their bank through a secure hosted flow, retrieving account details and identity signals to verify ownership instantly.

How it works

During the onboarding session, the account holder is prompted to log in to their bank directly within the hosted flow. frameOS connects to their institution, retrieves the necessary account details, and returns identity signals and account data used to confirm ownership.

This process is instant — there are no micro-deposits or multi-day waiting periods. Once the account holder successfully authenticates with their bank, the verification is complete and the bank_account_verification capability is activated.

The retrieved data may include account and routing numbers, account holder name, and additional signals used for fraud evaluation. This information is stored against the payment method and used in downstream compliance and risk checks.

Integrate with onboarding

Bank account verification is designed to be part of onboarding. We recommend requesting the bank_account_verification capability alongside your other capabilities so account holders link and verify their bank account while they're already in the sign-up flow.

Create an account with bank account verification

Parameters
typestring

Must be individual. Bank account verification is only supported for individual accounts.

capabilitiesarray

Include bank_account_verification to enable bank account verification. Combine with kyc to cross-reference the verified bank identity data against the account holder's KYC information.

profile.individual.emailstringoptional

The account holder's email address.

profile.individual.name.first_namestringoptional

The account holder's first name.

profile.individual.name.last_namestringoptional

The account holder's last name.

profile.individual.phoneobjectoptional

Object containing number and country_code for the account holder's phone.

POST/v1/accounts
curl --request POST \
  --url https://api.framepayments.com/v1/accounts \
  --header 'Authorization: Bearer API_KEY' \
  --header 'Content-Type: application/json' \
  --data '{
  "type": "individual",
  "capabilities": ["kyc", "bank_account_verification"],
  "profile": {
    "individual": {
      "email": "marcia@example.com",
      "name": {
        "first_name": "Marcia",
        "last_name": "Longo"
      },
      "phone": {
        "number": "3107484186",
        "country_code": "1"
      }
    }
  }
}'
RESPONSE
{
  "id": "e5f6a7b8-c9d0-1234-efab-345678901234",
  "object": "account",
  "type": "individual",
  "status": "pending",
  "external_id": null,
  "capabilities": [
    {
      "id": "a1b2c3d4-e5f6-7890-abcd-ef1234567891",
      "object": "capability",
      "name": "bank_account_verification",
      "status": "pending",
      "disabled_reason": null,
      "currently_due": [],
      "disabled": null
    },
    {
      "id": "a1b2c3d4-e5f6-7890-abcd-ef1234567892",
      "object": "capability",
      "name": "kyc",
      "status": "pending",
      "disabled_reason": null,
      "currently_due": [],
      "disabled": null
    }
  ],
  "profile": {
    "individual": {
      "email": "marcia@example.com",
      "ssn_last_four": null,
      "name": {
        "first_name": "Marcia",
        "middle_name": null,
        "last_name": "Longo",
        "suffix": null
      },
      "phone": {
        "number": "3107484186",
        "country_code": "1"
      },
      "birthdate": null,
      "address": null
    }
  },
  "terms_of_service": null,
  "metadata": {},
  "livemode": false,
  "created": 1721010605
}

Complete onboarding

Create an onboarding session to launch the bank account verification flow. frameOS presents the account holder with a secure bank login experience within the hosted session — no redirects or third-party windows. Once they authenticate with their bank, frameOS retrieves and validates their account details automatically.

REQUEST
curl --request POST \
  --url https://api.framepayments.com/v1/onboarding_sessions \
  --header 'Authorization: Bearer API_KEY' \
  --header 'Content-Type: application/json' \
  --data '{
  "account_id": "e5f6a7b8-c9d0-1234-efab-345678901234",
  "return_url": "https://example.com/onboarding/complete"
}'

After the session completes, retrieve the account to confirm the bank_account_verification capability status has transitioned to active.