Skip to main content
The account check confirms that a bank account belongs to the person your workflow already verified, from the account details they type. There is no bank sign-in and no consent screen: the person enters their account the way their country writes it, and the bank confirms the name on it against the name an earlier step verified. It is one of the two Bank Verification methods, next to bank sign-in, and its method value is account_lookup. Micro-deposits and the statement upload stay fallbacks after both. To check an account from your backend with no session, for example before a payout, use the Account check API.
Bank Verification confirms who owns an account against an identity another step established, so it is not identity proof on its own. Put ID Verification, Database Validation, a questionnaire or expected_details before the step. The person never types a name for the check: Didit always compares the name the session already verified.

How it works

1

The person picks their country

In the Bank Verification step, the person picks a country the step offers. Where the account check comes first there, the step opens a short form in that country’s account format. Where bank sign-in comes first, the person picks Enter your account details to reach the form.
2

The person types their account

For example an IBAN, a sort code and an account number, or a CLABE. The verification flow builds the form from what the API returns for that country, so a country Didit adds later needs no change on your side.
3

Didit checks the format first

Before anything is billed, Didit checks each value: its length, its characters, its check digits and, for an IBAN, that it belongs to the selected country. A value that fails is refused with the field to fix. The person corrects it in place, and no attempt is spent.
4

The bank checks the name on the account

Didit runs one check against the name the session verified. Whatever else the client sends is ignored.
5

The step decides

The answer becomes an ownership result, and the step’s actions turn it into the verdict exactly as they do for bank sign-in.

Where the check is offered

Coverage is per country. Didit turns the check on country by country, once it has a priced route there; a country without one does not offer it. Countries are added over time, and the step always reads the current list, so you never need to change your integration when one is added. Within a covered country, the step’s methods decide whether the person sees it:
  • The step order. bank_method_order sets which methods every country offers and which comes first. The default, ["open_banking", "account_lookup"], starts on bank sign-in and offers the account check as its backup.
  • A country’s own order. methods on a country in bank_countries overrides the step order there, for example ["account_lookup"] for the account check only, or ["account_lookup", "open_banking"] to start on it.
  • A bank that is down. Where a country offers the account check, it also backs up a bank that bank sign-in has degraded or down: the step moves to the account form before any consent is asked, while the person has account checks left.
  • The check runs on Didit’s own routes. A step that runs on your own marketplace provider (provider_key) offers it only with fallback_to_native on.
  • Business accounts. In a business verification session, the check compares a business account with the verified business, in the countries where Didit checks business accounts.
See Choose the methods per country for the rules a save follows.

What the person types

These are the account formats the form understands. They are not a coverage list: whether the check runs in a country depends on where it is offered, and the step always shows the exact fields for that country. In some countries the form also asks for a registration number: for business accounts, and in a few countries for every account. Spaces, dashes and dots are removed and letters are upper-cased before a value is checked, so the person can type an account the way their bank prints it.

Turn it on

A new step offers the account check by default, as the backup to bank sign-in. To start on it, or to offer it alone, put account_lookup first in the order:
These settings shape the check:

Results

Checks that return an answer

Each of these is billed once and spends one of the person’s account checks (bank_account_check_max_attempts). Until the step completes, the person can try again with another account while checks remain. The result is in ownership.result, except for an account that does not exist, which is in connection.reason_code. With bank_account_check_accept_close_match off, both close matches are a no_match instead, with the reason code OWNER_NAME_MISMATCH: the person is never asked to confirm the name, and bank_no_match_action decides. Bank sign-in keeps its close matches either way. Once the person has spent every account check, and every bank sign-in attempt where the country also offers bank sign-in, without a successful connection, the step ends on bank_attempts_exhausted_action (DECLINE by default).

Outcomes that are never billed

None of these spends a check. Each is shown in connection.reason_code.

In the decision

The session decision lists the step under bank_verifications[]. Once an account has been evaluated, method reads account_lookup. While no account has been evaluated, method and ownership are null, and connection.reason_code says why, for example ACCOUNT_NOT_FOUND, PROVIDER_UNAVAILABLE or REFERENCE_IDENTITY_MISSING. No bank is picked for the check, so connection.institution_id, connection.institution_name and connection.oauth are null, and connection.institution_country is the country the person picked. Didit keeps no access to the account once the step completes, so a check that ended on a match reads connection.status: revoked with reason_code: VERIFICATION_COMPLETED. The result itself stays on the session. An account check reads no balances, transactions or income. When the step asks for them, financial_data.not_collected lists them; see Financial data needs bank sign-in.
The example shows only the fields this page discusses. Once an account has been evaluated, read method to tell an account check apart from bank sign-in: it is the one field meant for that.

In workflow rules and reports

  • Branches and status rules: bank.method is account_lookup (Account Check in the rule builder), and bank.reason_code can be ACCOUNT_NOT_FOUND.
  • Session PDF report: the Verification method row reads Account check.

Pricing

Each check that returns an answer is one Bank Verification charge: a match, a close match, a no match, an account it could not verify and an account it did not find are all billed. A value refused before the check, a check that is unavailable and a session with no verified name to compare are never billed. The price is set per country. The account check is a paid method of its own, never a fallback: bank_fallback_used_action does not fire for it. After a billed check, micro-deposits and the statement upload are included at no extra charge in the same session, where the step turns them on and the country offers them.

Test it in sandbox

In a sandbox application, the check runs on a simulated service and nothing is billed. Sandbox offers both methods in every country, in the order the step sets: with the default order, pick Enter your account details to run the check, or set bank_method_order to ["account_lookup", "open_banking"] to start on it. The last four characters of the account the person types (the IBAN, else the account number) choose the answer. Any other ending matches the verified name. Sandbox records each answered check as usage at no cost, so you can see which checks a live session would bill. An IBAN, a CLABE and a CBU carry check digits, so you cannot simply change their last four characters. Use these values, which pass every format check:
The Account check API answers a sandbox key from the same endings, with no session. See Sandbox testing for how sandbox applications work in general.