Update an External Account
Update an External Account. Only label and metadata are mutable; any
other JSON key in the body is rejected with 400.
Authorizations
Token from POST /auth/token
Path Parameters
External Account ID (ext_ prefix).
Body
Partial update - only label and metadata are mutable. Financial /
identity fields are immutable (re-pointing a destination is create-new +
re-point). Any other JSON key in the body is rejected with 400.
Response
The request has succeeded.
A saved payment destination registered for a customer or one of their
counterparties. Exactly one of the per-type response detail objects is
populated, selected by type. Write-only secrets (full account number,
full IBAN) are never present on reads - only their last-4 renderings.
External Account ID (ext_ prefix).
^[a-z]+_([0-9a-hjkmnp-tv-z]{26}|[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})$Resource type discriminator. Always "externalAccount".
externalAccount Who owns this account: the customer or one of their counterparties.
- Customer-owned
- Counterparty-owned
Resolved display name of the customer owner, for list/detail rendering
without a follow-up fetch (v0.12 list enrichment, #2520/#2665). Present
only when owner.kind = customer; absent for counterparty-owned
accounts — no counterparty-name resolver is wired for this resource.
Resolved id + display name of the owning customer. Present only when
owner.kind = customer; absent for counterparty-owned accounts.
The instrument type; determines which detail object is populated.
bankUs, bankIban, bankCanada, card, walletExternal High-level grouping: fiatAccount for bank or card accounts, crypto for
wallets. The same value as the instrument category when this account is
referenced in a transaction.
fiatAccount, crypto Current lifecycle status. A transition to invalid always fires the
externalAccount.statusChanged webhook.
active, pending, rejected, invalid, deleted, failed Set when status = failed.
ereborRejected, cardProviderRejected, providerAccountMissing, cardLimitReached, cardInUse, provisioningTimeout, systemError Structured provider rejection detail. Set when status = failed and the failure was a provider terminal rejection; absent for provisioning timeouts and internal failures.
Set when status = rejected (compliance screening).
Set when status = invalid (derived from payout returns).
accountClosed, accountFrozenByBank, routingOrAccountNumberInvalid, accountHolderDeceased, accountDoesNotSupportTransfers, payeeNameMismatch, walletUnreachableOnNetwork, billingAddressMismatch, cardExpired, cardClosedOrLostStolen, pushToCardUnsupported, cardDeclinedByIssuer The provider's own code for the failure behind invalidReason, verbatim. For US bank accounts, this is the NACHA return code from the failed payout (for example, R15). Absent when the provider gave no code or when the account was invalidated by something other than a returned payment. Read invalidReason to decide what to do; read this field only for support or reconciliation.
Optional display label.
Free-form key-value pairs supplied at creation or update.
Populated when type = bankUs.
Populated when type = bankIban.
Populated when type = bankCanada.
Populated when type = walletExternal.
Populated when type = card.
Transaction ids that this registration submitted for sender-attribution
release. Returned ONLY on the POST create response, and only when
registering this walletExternal matched held inbounds. Attribution is async:
each entry is submitted to the provider from
awaitingAction.awaitingSenderAttribution and moves to
processing.fundsPulled once settlement confirms — so an immediate GET of an
id may still show awaitingAction. Omitted on GETs (the create path is the
only writer).
Public TypeID, e.g. txn_01h455vb4pex5vsknk084sn02q; legacy UUID suffixes are accepted until non-v7 rows are retired.
^[a-z]+_([0-9a-hjkmnp-tv-z]{26}|[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})$When the external account was registered.
When the external account was last updated.