Skip to main content
An internal transfer moves funds between accounts that belong to the same customer, for example from a trading account to a cash account. This guide shows the order in which to call the Money API. For the full request and response fields of each endpoint, see the API reference.
  • Account types: trading, options and cash
  • Headers: every call requires a unique x-request-id header.
  • Customer context: the customer is derived from your credentials. You never send a gcid.

The Flow

All paths are relative to https://public-api.etoro.com/api/v1/money.

Step 1: Find the Allowed Transfers

Call GET /transfer-eligibility. It returns, for each of the customer’s source accounts, the destination accounts it can transfer to. Let the user pick from this list, and use the accountType and accountId values exactly as returned in the next steps. A source with no destinationAccounts cannot transfer anywhere.

Step 2: Get the Maximum Amount

Once the user has chosen a source and a destination, call GET /transferable-balance with both accounts. It returns the most the customer can move right now, so you do not need to combine balances and limits yourself. A 404 means the pair is not available.

Step 3: Show Limits and Fees (Optional)

To show the user the policy bounds and the cost before they confirm, call:
  • GET /transfer-limits for the minimum and maximum amount per route
  • GET /transfer-fee-configurations for the fee per route
Both return one row per route, so pick the row that matches the chosen account types.

Step 4: Execute the Transfer

Call POST /transfers with the source account, destination account, amount, currency (the source account currency), and a requestReferenceId of your own.
The response contains transferId and requestReferenceId. A successful response means the transfer was accepted, not that it has completed, so continue to Step 5. requestReferenceId is also your idempotency key. If a request times out, retry with the same value. Never reuse it for a different transfer.

Step 5: Track the Transfer

Read the outcome with one of:
  • GET /transfers/{transferId} when you hold the transferId
  • GET /transfers:lookup?requestReferenceId=... when you only hold your own reference
Poll until status is final. If you receive a value you don’t recognise, treat it as not final and poll again.

Good to Know

  • No demo environment: the transfer endpoints have no demo variants, so test with small real amounts on your own accounts.
  • Trading sub-accounts: this transfer flow is not for trading sub-accounts.