Skip to navigation

Submit Internal Transfer

View as Markdown

Transfer funds between a master account and a linked subaccount.

Available to: Traders (the master account owner); organization administrators (any account in their organization)

Environments: Live

Rate Limit: 600 requests per hour, 30-second back-off, counts all requests

Move funds between a master account and one of its linked subaccounts. Set fromAccountId to the source account and toAccountId to the destination, then specify the fundAmount and fundCurrencyId. The response returns an internalTransferId and a transaction leg for each side of the transfer.

The two accounts must be a linked master account and subaccount, and you must own the master account or be an administrator of its organization.

Field Details

You can look up account IDs using the Query Builder in the Admin Dashboard or the /account/list endpoint.

The fundAmount must be greater than zero. The fundCurrencyId must correspond to either USD or EUR. Currency IDs are environment-specific, so use the /currency/list endpoint to retrieve valid IDs.

The reason field is optional and records a note describing the transfer.

The optional idempotencyKey is accepted on the request and is intended to support safely retrying a transfer. It is not yet used to deduplicate retries, so resubmitting a transfer can move funds more than once.

Response

The response returns two transaction legs, fromFundTransaction and toFundTransaction, one for each side of the transfer, and an internalTransferId that identifies the transfer. Each leg describes the fund transaction on its account: payment type, amount, currency, status, and timestamp.

If the transfer is rejected, the response includes an errorCode and errorText describing the problem.

Response Codes

The FundTransactionErrorCode enum defines two outcome codes for an internal transfer that is accepted but does not complete:

CodeMeaning
IatFailedNoCashMovedThe transfer failed and no funds were moved.
IatPendingThe transfer is incomplete and needs manual intervention.

These codes are not yet returned by the endpoint. Today, a transfer that is accepted but does not complete returns Unknown in errorCode, with an errorText of “Internal transfer is pending; do not resubmit” (incomplete) or “Internal transfer could not be completed” (failed). In either case, do not resubmit the transfer.

Error Messages

A rejected transfer returns HTTP 200 with an errorText message, not an error HTTP status. Check errorText to determine whether the request succeeded or failed.
MessageResponseTrigger
"Access is denied"401The API key lacks the required Funds access
"This endpoint is not enabled"501Internal transfers are not enabled for your organization (the feature is gated and off by default)
"Account not found"200 (in errorText)The accounts are not a linked master and subaccount, or the caller does not own or administer the master account
"Source account <name> is <state>" / "Destination account <name> is <state>"200 (in errorText)The source or destination account is archived, closed, or restricted
"Source and destination accounts must differ"200 (in errorText)fromAccountId and toAccountId are the same account
"Only USD and EUR can be transferred between accounts"200 (in errorText)fundCurrencyId is a currency other than USD or EUR
"Transfer amount must be greater than zero"200 (in errorText)fundAmount is not greater than zero
"Not enough funds available to transfer"200 (in errorText)The source account’s transferable balance is less than fundAmount

Authentication

AuthorizationBearer

Bearer authentication of the form Bearer <token>, where token is your auth token.

Request

This endpoint expects an object.
fromAccountIdlongRequired
toAccountIdlongRequired
fundAmountdoubleRequired
fundCurrencyIdlongRequired
reasonstringOptional<=512 characters
idempotencyKeystringOptional<=64 characters

Response

InternalTransferResponse
errorTextstringOptional<=8192 characters

Non-empty if the request failed

errorHeaderstringOptional<=8192 characters

Non-empty if the request failed

fromFundTransactionobjectOptional
toFundTransactionobjectOptional
internalTransferIdstringOptional<=64 characters
errorCodeenumOptional
AccountLockFailed, AchDepositAboveMaximum, AchDepositAmountExceeded, AchDepositBelowMinimum, AchDepositExpected, AchDepositFrequencyExceeded, AchDepositHoldPeriod, AchDisclosureNotAccepted, AchNoApprovedApplications, AchPendingDepositExists, AchWithdrawalFrequencyExceeded, ApprovalStatusLocked, BankAccountNSF, ConcurrentRequestRejected, DuplicateAchReturn, DuplicateShadowTransaction, FullBalanceRequestPending, FullBalanceWithAchHolds, FullBalanceWithOpenPositions, FullBalanceWithPendingAch, IatFailedNoCashMoved, IatPending, InsufficientFunds, TransactionAlreadyApproved, TransactionAlreadyDeclined, TransactionNotApplicable, TransactionNotFound, Unknown, WireDepositHoldPeriod