Verify External Bank Accounts
How do I create a bank account identity verification?
Overview
Verify external bank account ownership against a customer's KYC information. For general identity verification concepts, states, and return codes, see Identity Verification.
What is a bank account identity verification?
To process transfers on the Cybrid Platform, the customer connecting the external bank account must own that account and have completed KYC. The bank account identity verification confirms that the name on the external bank account matches the name provided during KYC.
RequiredBank account identity verifications are required before creating transfers on the Cybrid Platform.
ScopeBank account verifications are currently only required for individual customers, not business customers.
Creating a bank account identity verification
Prerequisites:
- The individual customer
stateisverified(the customer has completed KYC). - The external bank account
stateisunverified(created but not yet verified).
With these prerequisites met, create a bank account identity verification via POST /api/identity_verifications (API reference). The verification method depends on which Plaid integration you used to link the account (see Add Customer External Bank Accounts):
| Option | Plaid account owner | Verification | Required account_kind |
|---|---|---|---|
| Option 1: Plaid Link verification | Cybrid | method: account_ownership | plaid |
| Option 2: Plaid Processor Token verification | Partner | method: attested_ownership | plaid_processor_token |
Wait forunverifiedstateDo not attempt to create a bank account identity verification while the external bank account is in the
storingstate. PollGET /api/external_bank_accounts/{external_bank_account_guid}and wait until the state transitions tounverifiedbefore proceeding. Attempting verification while instoringreturns a422 Invalid bank account to verifyerror. If the account remains instoringfor an extended period, contact support with the latest response details.
Option 1: Plaid Link verification (account_ownership)
account_ownership)When the external bank account was created with Cybrid's Plaid integration (account_kind: plaid), create the identity
verification with type: bank_account and method: account_ownership.
The account_ownership method does not require additional customer details because the information is verified against
the Plaid-connected bank account.
{
"type": "bank_account",
"method": "account_ownership",
"customer_guid": "customer_guid",
"external_bank_account_guid": "external_bank_account_guid"
}Option 2: Plaid Processor Token verification (attested_ownership)
attested_ownership)When the external bank account was created with your own Plaid integration (account_kind: plaid_processor_token),
create the identity verification with type: bank_account and method: attested_ownership.
The attested_ownership method requires you to provide the customer's name. You can retrieve this from the
Plaid Identity API.
{
"type": "bank_account",
"method": "attested_ownership",
"name": {
"first": "John",
"last": "Doe",
"full": "John Doe"
},
"customer_guid": "customer_guid",
"external_bank_account_guid": "external_bank_account_guid"
}
Optional address fieldsThe
addressobject is optional forattested_ownership. When provided, onlystreet,city, andcountry_codeare required by the API. Thesubdivisionandpostal_codefields are always optional; includepostal_codeonly for countries that use postal, zip, or post codes.
If you choose to include the address, pass it alongside the name block:
{
"type": "bank_account",
"method": "attested_ownership",
"name": {
"first": "John",
"last": "Doe",
"full": "John Doe"
},
"address": {
"street": "123 Main St",
"city": "New York",
"subdivision": "NY",
"postal_code": "10001",
"country_code": "US"
},
"customer_guid": "customer_guid",
"external_bank_account_guid": "external_bank_account_guid"
}Checking verification state
After creating a bank account identity verification, check the state and outcome using GET /api/identity_verifications/{identity_verification_guid} (API reference).
Waiting state
All bank account identity verifications progress immediately from storing to waiting.
When auto-approved or auto-rejected:
- The verification progresses from
waitingtocompleted(see Completed state below).
When neither auto-approved nor auto-rejected:
- The verification remains in
waiting. - A Persona document submission inquiry is automatically created for the customer to provide a supplementary document.
- Use
GET /api/identity_verifications/{identity_verification_guid}(API reference) to retrieve thepersona_inquiry_id. - Share the Persona URL with the
persona_inquiry_iddirectly with the customer (e.g.,https://withpersona.com/verify?inquiry-id=<persona_inquiry_id>).- Alternatively, use the
persona_inquiry_idand the Persona SDK to integrate the supplementary document upload into your application. See Verify with Persona SDK. - The Cybrid web SDK does not support bank account identity verifications.
- Alternatively, use the
- The customer must upload a bank statement with the following information:
- Date of the statement (must be within the last 90 days)
- Customer name
- Customer address
- Bank account number
- Bank name and logo
- If the customer takes no action, the verification remains in
waitingfor up to 24 hours before expiring.
Bank statement requirementsOnly the first page of the bank statement is required. Transactional data may be redacted or blurred.
Pending state
When the customer browses to the Persona URL:
- The verification progresses from
waitingtopending. - If the customer takes no further action, the verification remains in
pendingfor up to 24 hours before expiring.
Reviewing state
When the customer uploads the supplementary document via the Persona URL:
- The verification progresses from
pendingtoreviewing. - The Cybrid team is notified that the document has been uploaded.
- The verification remains in
reviewinguntil the Cybrid team determines the outcome (passedorfailed).
Completed state
When auto-approved or auto-rejected, the verification progresses immediately from waiting to completed.
Passed outcome
When auto-approved, or approved by the Cybrid team while in reviewing:
- The verification progresses to
completedwith apassedoutcome.
SuccessWhen
outcomeispassed, the verification is complete and the external bank account progresses tostate:verified.
Failed outcome
When auto-rejected, or rejected by the Cybrid team while in reviewing, the verification progresses to completed
with a failed outcome. The failure_codes array returns one of:
name_check_failure-- The KYC name does not match the name on the bank account.address_check_failure-- The KYC address does not match the address on the bank account.phone_number_check_failure-- The KYC phone number does not match. This does not prevent passing.email_address_check_failure-- The KYC email address does not match. This does not prevent passing.decision_timeout-- The verification timed out.
The external bank account remains unverified until a successful verification completes.
FailureWhen
outcomeisfailed, create a new bank account identity verification to retry.
Expired state
When the verification remains in waiting for 24 hours:
- The Persona document submission inquiry link expires and can no longer accept uploads.
- The verification progresses to
expired.
The external bank account remains unverified until a successful verification completes.
ExpirationWhen
stateisexpired, the verification did not complete. Create a new bank account identity verification to retry.
Sandbox testing with expected_behaviours
In the sandbox environment, include the expected_behaviours field in the POST /api/identity_verifications request
body to control the outcome of bank account verification without completing the full verification flow.
Test the natural verification flowTo exercise the
account_ownershippath in sandbox withoutexpected_behaviours, match the customer's Persona-verified name to Plaid's default sandbox identity (Alberta Charleson). See Verify an Individual Customer and Plaid: Testing identity.
| Value | Description |
|---|---|
passed_immediately | The verification completes immediately with a passed outcome. |
failed_immediately | The verification completes immediately with a failed outcome. |
tax_id_not_checked | The tax ID check is skipped during verification. |
Example POST /api/identity_verifications request body using expected_behaviours:
{
"type": "bank_account",
"method": "account_ownership",
"customer_guid": "customer_guid",
"external_bank_account_guid": "external_bank_account_guid",
"expected_behaviours": ["passed_immediately"]
}
Sandbox onlyThe
expected_behavioursfield is not permitted in production. Submitting it in a production request returns a400error:Parameter expected_behaviours not permitted in production.
Troubleshooting 422 errors
A 422 response with Invalid bank account to verify indicates the external bank account is not eligible for
verification, not a payload formatting issue. Common causes:
- The external bank account
stateis notunverified(most common). - The
account_kinddoes not match the verification method:account_ownershiprequiresaccount_kind: plaid.attested_ownershiprequiresaccount_kind: plaid_processor_token.
- The external bank account does not belong to the provided
customer_guid. - The Plaid account does not return identity data (for example, missing or mismatched name).
Eligibility checksThe
expected_behaviours: ["passed_immediately"]value does not bypass eligibility checks. It only controls the outcome of an otherwise valid verification.
Diagnostic steps
- Fetch the account using
GET /api/external_bank_accounts/{external_bank_account_guid}. - Confirm
stateisunverified,customer_guidmatches, andaccount_kindisplaidorplaid_processor_tokenas expected. - If all checks pass, review the Plaid identity data on the account for completeness.
Updated 3 days ago
