---
updatedAt: 2025-12-18T14:29:12.000Z
agentTools:
  projectIndex: https://docs.checkhq.com/llms.txt
---

# Bank Account Validation

In order to ensure the highest possible payment success rates, Check validates bank accounts that are created in our system. This applies to Company bank accounts as well as Employee and Contractor bank accounts.

## How validation works

There are two ways a Company, Employee, or Contractor can connect their bank accounts to Check:

1. by using Plaid — this is called a [plaid\_bank\_account](https://docs.checkhq.com/reference/the-bank-account-object)
2. by providing routing and account numbers — this is called a [raw\_bank\_account](https://docs.checkhq.com/reference/the-bank-account-object)

### Plaid bank accounts

Plaid bank accounts are automatically validated by Plaid. They can be created by employers and employees directly within [Check Components](https://docs.checkhq.com/docs/check-components), or they can be created programmatically by passing Check a [Plaid processor token](https://plaid.com/docs/auth/partnerships/check/) that you have obtained for an account linked through your Plaid integration.

Check does not need to do any further validation of these types of accounts, and for this reason it's the most seamless way of creating a bank account in Check.

### Raw bank accounts

Raw bank accounts are created in Check by simply passing us the account and routing numbers of the account. Validation for raw bank accounts differs between Company raw bank accounts and Employee / Contractor raw bank accounts.

For Company raw bank accounts, Check will initiate validation as soon as they are created by sending an ACH prenote, or a $0 test payment, which is **not visible** to the account holder. While Check waits to hear back about the result of a prenote, the bank account will be in a status of `validation_pending`. Once the prenote succeeds, the bank account will enter a status of `validated`.

If the payment fails (which typically happens within 3 banking days), then the bank account moves into a `disabled_irrecoverable` status. This status indicates that the bank account is not able to be used on active payrolls. Check assumes that the account is valid unless this $0 transaction fails.

For Employee and Contractor raw bank accounts, Check will not perform any upfront validation. The bank account will immediately go into a `validation_pending` status, and will become `validated` once it is successfully used for a payroll direct deposit (or `disabled_irrecoverable` if the payment attempt to the bank account fails).

## Validations in the API

The `status` and `disabled_reason` fields in the [bank\_account object](https://docs.checkhq.com/reference/the-bank-account-object) and [bank\_account webhook](https://docs.checkhq.com/docs/webhook-event-types#bank-account-events) can be used to determine the validation state of a bank account.

Bank accounts can be used to process payroll as long as they are not in a `disabled` state. This means that

* Bank accounts cannot be used in payroll if status is `disabled_recoverable` or `disabled_irrecoverable`
* Bank accounts can be used for payroll if status is `validation_pending`, `validated` or `ownership_verified`

### Company bank accounts

Company bank accounts start off in a `disabled_recoverable` state, then move to a `validation_pending` state. The bank account will move to an `ownership_verified` state if validation succeeds or `disabled_irrecoverable` if validation fails.

<Image align="center" alt={1608} border={false} caption="Company bank verification flow" title="untitled@2x.png" src="https://files.readme.io/cc3744f-untitled2x.png" width="100%" />

### Employee and contractor bank accounts

Employee bank accounts start off in a `validation_pending` state and can move to `validated` once successfully used for a payroll direct deposit, or `disabled_irrecoverable` if a payment attempt fails.

<Image align="center" alt={1530} border={false} caption="Employee and contractor bank verification flow" title="ee-bank-verification.png" src="https://files.readme.io/58a6203-ee-bank-verification.png" width="100%" />

### Failure reasons

When bank accounts are disabled, you can tell users the reason the account is disabled by looking at the value of the `disabled_reason` parameter. Possible values here include:

* `validation_failed`: the bank account failed our validation process and a new bank account must be provided
* `failed_payment`: an attempted payment to this bank account has failed and a new bank account must be provided

Documentation around the values these fields can contain can be seen in our API reference [here](https://docs.checkhq.com/reference/the-bank-account-object).

## Recovering from failed validations

Bank account validation failures happen when incorrect bank account information is provided. When bank account validation fails, the bank account is moved to a `disabled_irrecoverable` state and any attempt to move money in or out of the account will result in the payment being rejected by the bank.

In order to recover from this status, the account must be replaced with a new bank account provided by the user. This new bank account will be validated as soon as it is created in our system.

## Notifications of Change

Sometimes, when Check sends ACH payments on behalf of partners and employers, the Receiving Depository Financial Institution (RDFI) may return a Notification of Change (NOC). A NOC is a courtesy notice provided by the RDFI, which means that the payment was processed successfully, but some piece of account information needs to be corrected before the next payment to avoid future delays or returns. Check automatically handles NOCs and updates bank accounts in our system automatically. For more information on this, please see [Notifications of Change (NOCs)](https://docs.checkhq.com/docs/notifications-of-change-nocs).

## Testing in Sandbox

In sandbox, company bank accounts are automatically set to `ownership_verified` and employee bank accounts are automatically set to `validated`. You can test different statuses by:

* Setting the routing number to `000000000` :
  * If it is a company bank account it stays in a `disabled_recoverable` status with `verification_pending` as the reason.
  * If it is an employee bank account it stays in a `disabled_irrecoverable` status with `validation_failed` as the reason.
* Setting the routing number to `111111111`:
  * If it is a company bank account it goes into a `disabled_irrecoverable` status with `validation_failed` as the reason.
  * The same thing goes for employee bank accounts.
* Setting the routing number to any other value in the correct 9-digit format, will automatically set the accounts to either `ownership_verified` or `validated` depending on whether they are a company's or an employee's account.