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_ordersets 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.
methodson a country inbank_countriesoverrides 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 withfallback_to_nativeon. - 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.
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, putaccount_lookup first in the order:
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 inconnection.reason_code.
In the decision
The session decision lists the step underbank_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.
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.methodisaccount_lookup(Account Check in the rule builder), andbank.reason_codecan beACCOUNT_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 setbank_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:
- Germany (IBAN)
- United Kingdom
- United States
- Mexico (CLABE)
- Argentina (CBU)
- India