Create an external account
Changed onCreate an external account for bank transfers or proxy-based payments.
Deduplication
Create is find-or-create. Matching differs for bank vs proxy accounts:
Bank accounts match by customer plus the exact set of normalized bank identifiers you supply (any of swiftBic, iban, routingNumber, accountNumber that are present) — not by paymentRails. All supplied identifiers must match; adding or omitting one (e.g. SEPA with only iban, then SWIFT with the same iban plus swiftBic) produces a different identity and a new account. Reusing the same identifier set with a different rail (e.g. ACH after WIRE) returns the existing account and does not add that rail.
Proxy accounts match by customer + normalized alias + payment rail. The same alias on another proxy rail creates a separate account.
On a bank-account reuse (created: false):
- Existing paymentRails stay unchanged.
- Missing create-only fields (branch, beneficiary document, correspondent details) may be backfilled when supplied; conflicting values return 400.
- A closed account (closed via the API) is reopened with the same ID; fixed routes disabled when it was closed stay disabled and must be re-enabled separately.
To add compatible bank rails to an existing account (e.g. ACH onto a WIRE-only US account), use PATCH /v1/external-bank-accounts/{id} with the full resulting paymentRails list. Do not rely on a second create.
On every create response, check created. For bank accounts also check paymentRails; for proxy accounts check paymentRail (proxies do not return paymentRails). HTTP 201 with created: false means identity reuse, not a new rail set.
Field Mapping
We use generic field names that adapt to country-specific identifiers:
| Field | US | UK | EU | India | Mexico | Australia |
|---|---|---|---|---|---|---|
| routingNumber | ABA (9 digits) | Sort code (6 digits) | - | IFSC (11 chars) | - | BSB (6 digits) |
| accountNumber | Account number | Account (8 digits) | - | Account number | CLABE (18 digits) | Account number |
| iban | - | - | IBAN | - | - | - |
Bank Account Requirements by Rail
| Rail | Required Fields |
|---|---|
| ACH/Wire (US) | routingNumber + accountNumber |
| SWIFT (IBAN countries) | swiftBic + iban |
| SWIFT (US) | swiftBic + accountNumber (routingNumber optional) |
| SWIFT (AU) | swiftBic + routingNumber (BSB) + accountNumber |
| SEPA | iban (swiftBic optional) |
| Faster Payments (UK) | routingNumber (sort code) + accountNumber |
| IMPS/NEFT (India) | routingNumber (IFSC) + accountNumber |
| SPEI (Mexico) | accountNumber (18-digit CLABE) |
Proxy Accounts
For instant payment rails (PIX, UPI, PromptPay), provide alias details instead of bank details:
- aliasType: phone, email, tax_id, national_id, or random
- aliasValue: The identifier value
The payment network resolves the alias to the recipient's account.
Request
- Base URLhttps://sandbox.api.infinite.dev
- AuthHTTP bearer
- TypeScriptA function with typed inputs. Its response is checked against the schema.
Headers
API key
When set, replays with the same key and body return the current state of the created external account (serialized from the live account row). A different body with the same key returns 422.
Request body
Example request
{
"correspondentBankName": "Bank of America",
"correspondentBankSwiftCode": "IRVTUS3NXXX",
"correspondentAccountNumber": "9876543210",
"customerId": "cust_abc123",
"counterpartyId": "cp_abc123",
"beneficiaryName": "John Smith",
"paymentRails": [
"ACH",
"WIRE"
],
"beneficiaryType": "INDIVIDUAL",
"metadata": {
"nickname": "Main Checking Account",
"purpose": "Business operations",
"tags": [
"primary",
"operations"
]
},
"aliasType": "TAX_ID",
"aliasValue": "12345678901",
"beneficiaryAddress": {
"addressLine1": "123 Main Street",
"addressLine2": "Apt 4B",
"city": "San Francisco",
"state": "CA",
"postalCode": "94102",
"country": "US",
"transliterated": {
"addressLine1": "123 Main Street",
"addressLine2": "Apt 4B",
"city": "Beijing",
"state": "Hebei"
}
},
"beneficiaryPhone": "+14155551234",
"beneficiaryDateOfBirth": "1990-01-31",
"bankName": "JPMorgan Chase Bank",
"bankAddress": {
"addressLine1": "123 Main Street",
"addressLine2": "Apt 4B",
"city": "San Francisco",
"state": "CA",
"postalCode": "94102",
"country": "US"
},
"swiftBic": "CHASUS33",
"iban": "DE89370400440532013000",
"accountNumber": "1234567890",
"routingNumber": "021000021",
"branchCode": "001",
"beneficiaryDocumentType": "CC",
"beneficiaryDocumentNumber": "12345678901",
"beneficiaryStateProvince": "LIMA",
"bankAccountType": "checking",
"currencyCodes": [
"USD"
]
}Response
External account created, reused, or reopened successfully. Bank reuse preserves existing paymentRails (other create-only fields may backfill). Proxy reuse matches alias+rail. Check created on the body; bank responses also include paymentRails, proxy responses include paymentRail.
Example response
{
"id": "eba_1234567890abcdef",
"customerId": "cust_abc123",
"counterpartyId": "cp_abc123",
"type": "EXTERNAL_BANK",
"status": "IN_REVIEW",
"beneficiaryType": "INDIVIDUAL",
"beneficiaryName": "John Smith",
"metadata": {
"nickname": "Main Checking Account",
"purpose": "Business operations",
"tags": [
"primary",
"operations"
]
},
"paymentRail": "SWIFT",
"paymentRails": [
"ACH",
"ACH_SAME_DAY",
"WIRE"
],
"beneficiaryAddress": {
"addressLine1": "123 Main Street",
"addressLine2": "Suite 100",
"city": "New York",
"state": "NY",
"postalCode": "10001",
"country": "US"
},
"beneficiaryPhone": "+12125551234",
"beneficiaryDateOfBirth": "1990-01-31",
"bankName": "JPMorgan Chase Bank",
"bankAddress": {
"addressLine1": "270 Park Avenue",
"addressLine2": "Floor 10",
"city": "New York",
"state": "NY",
"postalCode": "10017",
"country": "US"
},
"swiftBic": "CHASUS33",
"iban": "GB82WEST12345698765432",
"accountNumber": "1234567890",
"routingNumber": "021000021",
"branchCode": "001",
"beneficiaryDocumentType": "CC",
"beneficiaryDocumentNumber": "12345678901",
"beneficiaryStateProvince": "LIMA",
"correspondentBankName": "Bank of America",
"correspondentBankSwiftCode": "IRVTUS3NXXX",
"correspondentAccountNumber": "9876543210",
"bankAccountType": "checking",
"currencyCodes": [
"USD",
"EUR"
],
"aliasType": "TAX_ID",
"aliasValue": "12345678901",
"createdAt": "2026-01-15T10:00:00Z",
"updatedAt": "2026-01-15T10:00:00Z",
"created": true
}Changes
- warning
added the new
CNAPSenum value to theresponse property for the response status - warning
added the new
CNAPSenum value to the/response property for the response status - info
added the new
CNAPSenum value to the request property/
- warning
- info
added the new optional
headerrequest parameterIdempotency-Key - info
added the non-success response with the status
- info
added the non-success response with the status
- info
added the non-success response with the status
- info