Overview
Direct bank payments allow you to process bank transactions using raw bank account details instead of linking accounts through Plaid. This is useful when:- You already collected bank account data through your own onboarding flow (for example, micro-deposits or a third-party verification service).
- Your payment processor does not support Plaid’s native token exchange.
- You want to process a payment without requiring the customer to go through the Plaid Link flow.
bank payment method accepts account details directly via the API and routes them to a compatible bank payment connector such as Adyen Bank.
If you use Plaid for bank account linking, the system can also extract raw bank details from Plaid automatically when the target connector requires them. This works for ACH, SEPA, and BACS schemes. See Plaid for details.
Supported schemes
Thebank payment method supports the following schemes:
| Scheme | Region | Description |
|---|---|---|
ach | US | ACH bank account transactions using account number and routing number. |
sepa | EU/EEA | SEPA direct debit transactions using IBAN. |
bacs | UK | BACS direct debit transactions using account number and sort code. |
ACH fields
When creating a transaction or storing a payment method with theach scheme, provide the following fields:
| Field | Type | Required | Description |
|---|---|---|---|
method | string | Yes | Set to bank. |
scheme | string | Yes | Set to ach. |
account_number | string | Yes | The bank account number. |
routing_number | string | Yes | The bank routing number (ABA number). |
account_type | string | Yes | Either checking or savings. |
account_holder | object | Yes | The account holder’s name. Provide either first_name and last_name, or company_name. |
is_tokenized | boolean | No | Set to true if the account number is already tokenized. Defaults to false. |
SEPA fields
When creating a transaction or storing a payment method with thesepa scheme, provide the following fields:
| Field | Type | Required | Description |
|---|---|---|---|
method | string | Yes | Set to bank. |
scheme | string | Yes | Set to sepa. |
account_number | string | Yes | The IBAN (International Bank Account Number), for example DE89370400440532013000. |
routing_number | string | No | The BIC (Bank Identifier Code), also known as the SWIFT code, for example COBADEFFXXX. |
account_holder | object | Yes | The account holder’s name. Provide either first_name and last_name, or company_name. |
BACS fields
When creating a transaction or storing a payment method with thebacs scheme, provide the following fields:
| Field | Type | Required | Description |
|---|---|---|---|
method | string | Yes | Set to bank. |
scheme | string | Yes | Set to bacs. |
account_number | string | Yes | The UK bank account number (8 digits), for example 31926819. |
routing_number | string | Yes | The sort code (6 digits), for example 200000. |
account_holder | object | Yes | The account holder’s name. Provide either first_name and last_name, or company_name. |
Create a transaction
To create a direct bank payment, set themethod to bank and the scheme to the appropriate value (ach, sepa, or bacs). Provide the account details in the payment_method object and set the payment_service_id to the UUID of your bank payment connector (for example, your Adyen bank connection).
The following example uses the ach scheme. For SEPA, replace the scheme with sepa and provide the IBAN as the account_number. For BACS, replace the scheme with bacs and provide the sort code as the routing_number.
See the POST /transactions API endpoint for more details.
method— Set tobankto indicate a direct bank payment.scheme— The bank scheme:ach(US),sepa(EU/EEA), orbacs(UK).account_number— The customer’s bank account number (or IBAN for SEPA).routing_number— The bank’s routing number: ABA number for ACH, routing number for SEPA, or sort code for BACS.account_type— Eithercheckingorsavings. Required for ACH only.account_holder— The name on the account. If available, sendfirst_nameandlast_namefor personal accounts, orcompany_namefor business accounts.payment_service_id— The UUID of your bank payment connector (found in the Gr4vy dashboard).
Vault a bank account
You can store bank account details for future use by settingstore: true on the transaction. The system returns a payment_method.id that you can use for subsequent charges without collecting bank details again.
Vault during a transaction
Setstore: true on the transaction to vault the bank account at the same time as processing the payment.
Vault without a transaction
You can also store bank account details without processing a payment using thePOST /payment-methods endpoint. This creates a stored payment method that you can use for future transactions.
Recurring payments
After vaulting a bank account, use the storedpayment_method.id to charge the account without collecting bank details again. Set payment_source to recurring, and mark the transaction as merchant-initiated and subsequent.
Supported connectors
The following connectors support direct bank payments:- Adyen bank—Process ACH, SEPA, and BACS transactions through Adyen using raw bank account details.
Limitations
- Direct routing only—Flow rules are not supported for direct bank payments. You must specify the
payment_service_idto route the transaction to a specific connector.