Pay
Verification
Bank Account Verification

Bank Account Verification

Verify bank account details and ownership when linking accounts for payments or payouts.


Every new bank account linked to Payload is verified through either an external verification service, like Plaid, or through Payload's built-in verification API. In situations where a bank doesn't support Plaid or Plaid doesn't make sense for the use-case, you can link and verify a bank account using Payload's built-in verification.

Understanding Verification Results

A linked bank account payment method has a verification_status field with the resulting status of the verification. There are three values that can result from the verification attempt:

StatusDescription
not_verifiedVerification was not performed or not available
verifiedVerification was successful
owner_verifiedVerification and owner match was successful

not_verified

An account with verification status not_verified indicates that verification could not be performed. This is usually due to the bank or financial institution not supporting account verification. Transactions against an unverified account can be rejected if the account details were miskeyed or incorrect.

verified

An account with verification status verified indicates the account details were confirmed with the bank or financial institution. It also means that an ownership match on the account was either unsuccessful or not able to be performed.

owner_verified

An account with verification status owner_verified indicates the account details were confirmed with the bank or financial institution and there was an ownership match found. An ownership match can only be performed if the bank account is tied to a customer, or if the account_holder field is provided.

Bank Account Fields

The following fields are used when linking a bank account for verification.

FieldDescription
account_numberThe bank account number
routing_numberThe ACH routing number for the account
account_typeEither checking or savings
account_class(optional) Either personal or business
account_holder(optional) Name of business or individual owner of the account
transfer_type(optional) Either send_only, receive_only, or two_way. For a bank account used only to receive payouts (no debits), use receive_only; two_way also allows incoming funds.

Testing Verification

Use the following values with a test API key to try out the different response conditions.

FieldValueResult
routing_number011111111Returns a verification_status of not_verified
account_number0009906Validation error on bank_account.account_number (test / loopback)
account_holderValid OwnerReturns a verification_status of owner_verified

Verifying via the API

When you create a bank account payment method with account_holder provided, Payload automatically performs verification. The verification_status field on the response indicates the result.

import payload
pl = payload.Session('secret_key_3bW9...', api_version='v2')
 
payment_method = pl.PaymentMethod.create(
    type='bank_account',
    account_holder='John Doe',
    bank_account={
        'account_number': '123456789',
        'routing_number': '110000000',
        'account_type': 'checking'
    },
    account_id='acct_customer123'
)
 
print(f"Payment Method ID: {payment_method.id}")
print(f"Verification Status: {payment_method.verification_status}")