Skip to main content
External Account is v3’s bank-account resource — the destination for an Offramp payout or the source for an ACH-pull Onramp. Its v2 predecessor is POST /users/:userId/accounts. There are two big changes: identity moved out into a separate Counter Party resource — this page only covers the bank-detail fields that stayed behind — and the type field v2 used to identify a bank account’s country/rail (us, brazilGlobalNetwork, italyGlobalNetwork, and dozens of other per-country *GlobalNetwork values) is gone. v3 has no type field at all: HIFI derives the rail automatically from currency + bankAddress.country + transferType, combined with the counterparty’s KYC/KYB profile. See the platform-wide changes for ID format, pagination, error shape, and idempotency.

Endpoints

Request changes: create an external account

v2 nested bank details under a key named after the country/rail type, alongside the embedded accountHolder:
v3 references a pre-created Counter Party instead of embedding identity, and uses one flat schema selected by country + currency + transfer type rather than a dynamic type-named key:
See Account Information for the exact field requirements per (bankAddress.country, currency, transferType) combination.

Response changes

v2 (GET /v2/users/:userId/accounts/:accountId) — fields returned in the clear, and identity/bank details duplicated three ways: top-level beneficiary*/accountOwner* fields, an embedded accountHolder object, and again inside a rail-specific sub-object (us here):
v3 (GET /v3/external-accounts/:externalAccountId), consistent shape across every country/rail, with sensitive fields masked by default:
List (GET /external-accounts): v2 returned { count, banks: [...], nextCursor } where nextCursor was a raw timestamp. v3 returns the standard { data, pagination } envelope — see platform-wide changes.

Status

ACTIVE / INACTIVE on both sides — same two-state model, just formalized as an explicit enum in v3.

ID format

Raw UUID in v2 → extacct_... prefixed public ID in v3.