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 embeddedaccountHolder:
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):
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.