SMART_BANK_TRANSFER enables real-time or delayed account-to-account (A2A) payments via domestic or international bank rails. Commonly used for:
- Push payments and invoice settlements
- Bank reference-based vouchers
- Online banking integrations (e.g., iDEAL, POLi, FPX)
The system dynamically routes requests to supported providers based on the user's region, account info, and merchant configuration.
| Method | Markets Supported | Notes |
|---|
| iDEAL | Netherlands | Real-time, EUR only |
| Sofort / Klarna Pay Now | Germany, Austria, Switzerland, EU-wide | Redirect with near-instant transfer |
| giropay | Germany | Bank login via ELV debit |
| EPS | Austria | Austrian e-banking integration |
| Bancontact / MisterCash | Belgium | Local Belgian banking rails |
| MyBank | Italy | Push transfer with Italian banks |
| Trustly | EU & Nordics (SE, FI, etc.) | Instant A2A across Europe |
| SEPA Direct Debit | EU-wide | Debits user accounts with consent |
| Latvian, Estonian, Lithuanian Banks | Baltics | Luminor, SEB, Revolut, Citadele |
| MULTIBANCO | Portugal | Reference code + ATM or online banking |
| FPX | Malaysia | Real-time bank payments |
| POLi | Australia, New Zealand | Redirect with bank login |
| PSE | Colombia | Bank-linked checkout |
| SPEI | Mexico | Real-time local bank transfers |
| PayU / Przelewy24 / BLIK | Poland | BLIK supports instant mobile codes |
| Qiwi | Russia / CIS | Can include bank transfer + wallet mode |
| Bradesco / Santander / Itaú | Brazil | Local Brazilian bank rails |
| Interac / EFT (Canada) | Canada | Bank transfer with confirmation + vaulting |
| ACH / RTP / FedNow (US) | United States | Real-time and batch bank networks |
| UK Open Banking (AmEx / Nuvei) | United Kingdom | Open banking-based routing; requires session token |
| Field | Type | Required? | Description |
|---|
paymentMethod | ApmMethod | Yes (default) | Always SMART_BANK_TRANSFER |
paymentType | ApmFlowType | Yes (default) | Always BANK_TRANSFER |
accountHolderName | String? | ✅ | Name of the account owner |
personalId | String? | ❌ | National ID or tax number (if required) |
bankAccountType | String? | ❌ | e.g., "checking", "savings" |
accountNumber | String? | ✅/❌ | Domestic account number (varies by region) |
accountHolderPhoneNumber | String? | ❌ | Optional contact number |
iban | String? | ✅ (EU) | Required in SEPA/EU |
bic | String? | ✅ (EU/SEPA) | Often required with IBAN |
swiftCode | String? | ❌ | Used for international routing |
routingNumber | String? | ✅/❌ | US/CA/UK domestic routing (e.g., ABA) |
sortCode | String? | ✅ (UK) | 6-digit UK routing code |
institutionNumber | String? | ❌ | Canadian institution code |
transitNumber | String? | ❌ | Canadian transit branch code |
bankCode | String? | ❌ | Generic bank identifier (varies) |
branchCode | String? | ❌ | Branch-specific routing info |
bankCleaningSystemId | String? | ❌ | Specific to some domestic schemes |
bankName | String? | ❌ | Human-readable bank name |
bankCity | String? | ❌ | City of bank branch |
| Field | Type | Required? | Description |
|---|
paymentMethod | ApmMethod | Yes | Always SMART_BANK_TRANSFER |
paymentType | ApmFlowType | Yes | Always BANK_TRANSFER |
redirectUrl | String? | Optional | Redirect user to bank login or confirmation page |
iframeUrl | String? | Optional | If iframe integration is available |
providerTransactionId | String | ✅ | Transaction reference from provider |
accountHolderName | String? | Optional | Name of the user making the transfer |
maskedAccountNumber | String? | Optional | Partially masked account number |
branchCode | String? | Optional | Bank branch code |
bankCode | String? | Optional | Provider-specific bank identifier |
iban | String? | Optional | Returned IBAN (EU) |
bic | String? | Optional | BIC/SWIFT code (EU) |
routingNumber | String? | Optional | ABA/Fedwire routing code |
sortCode | String? | Optional | UK sort code |
swiftCode | String? | Optional | Returned SWIFT code |
accountNumber | String? | Optional | Full or partial returned account number |
institutionNumber | String? | Optional | Canada-specific routing field |
transitNumber | String? | Optional | Transit code (Canada) |
bankName | String? | Optional | Name of the bank |
bankCity | String? | Optional | City of the bank branch |
country | String? | Optional | Country code (e.g., "US", "DE") |
bankAccountType | String? | Optional | "checking", "savings", or provider-specific values |
bankCleaningSystemId | String? | Optional | Domestic clearing system ID |
securityQuestion | String? | Optional | Challenge question, if required (e.g., POLi or Interac) |
securityAnswer | String? | Optional | Provided or stored answer to security challenge |
bankMetadata | Map<String, String>? | Optional | Additional provider-specific metadata |
- 📍 Use regionally appropriate fields (e.g.,
iban+bic in EU, routingNumber+accountNumber in US/CA).
- 🧾 Store
providerTransactionId and bankMetadata for later reconciliation.
- 🧠 Validate input formats before sending upstream (e.g., IBAN check digits, SWIFT length).
- 🛡️ Prompt for
securityQuestion only when required by the scheme (e.g., Interac or POLi).
- 📊 Populate
bankName, bankCity, and country in your UI for user confirmation.