Transfer Between Your Own Accounts
What this page solves
Moving funds from one of your accounts to another of your own accounts with destination_type: own_account.
When to use it
Use it when both accounts belong to you, for example to move funds from a wallet to a trading account, or between two trading accounts on the Exness platform.
Before you start
API key
With the
Internal transfersscope. See Payments scopes.Request signing
Working request signing. See Request signing.
Account numbers
The source and destination account numbers. Your wallets are listed in your Personal Area under Payments & wallet, and your trading accounts under Trading → Accounts. Only accounts on the Exness platform are supported, not MT4 or MT5.
Enough balance
Enough balance on the source account. See Read an account balance.
Recommended flow
- 1Check the balance of the source account.
- 2Generate a new idempotency key — a random UUID — and store it together with the request before sending.
- 3Send
POST /v1/transfers. - 4On
201, track the transfer withGET /v1/transfers/{transfer_id}until it isdoneorrejected. - 5After a timeout, no response, a non-API response (an HTML page, or a JSON body from a proxy or load balancer),
TRANSFER_OUTCOME_UNKNOWN,SYSTEM_INTERNAL_ERROR, orSYSTEM_TEMPORARY_UNAVAILABLE, resend the exact same request with the same idempotency key.
Main endpoints
| Operation | Purpose |
|---|---|
POST /v1/transfers | Create the transfer |
GET /v1/transfers/{transfer_id} | Read the transfer status |
GET /v1/accounts/{account_id}/balance | Read the balance available for transfers |
Example request
The example is structural: replace the placeholders in angle brackets with your values. For a runnable implementation, see Code Examples.
POST /v1/transfers HTTP/1.1
EXN-API-KEY: <your API key>
EXN-IDEMPOTENCY-KEY: 0f8fad5b-d9cb-469f-a165-70867728950e
EXN-TIMESTAMP: <current Unix time in milliseconds>
EXN-SIGN-VERSION: 1
EXN-DATA: <base64url-encoded signed payload>
EXN-SIGN: <base64url-encoded signature>
Content-Type: application/json
{"destination_type":"own_account","source_account":"8066808","destination_account":"9484938209348","amount":"100.00"}
Provide only the accounts and the amount, in the currency of the source account. The currency, payment method, and conversion are determined from the accounts.
What to expect in return
HTTP 201:
{
"transfer_id": "2000000074",
"source": { "amount": "100.00", "currency": "USD" },
"destination": { "amount": "91.80", "currency": "EUR" }
}
source— the amount of the transfer in the source account currency.destination— the amount of the transfer in the destination account currency. When the currencies differ, the amount is converted at execution.201means the transfer is created, not that the money has been transferred. The transfer can still beprocessing. Check its final status with Check a transfer status.
Common errors
| HTTP | code | error_message | What to do |
|---|---|---|---|
| 403 | 1002 | AUTH_PERMISSION_DENIED | Your key does not have the Internal transfers scope, or your source IP is not allowed for the key. |
| 404 | 2000 | ACCOUNT_NOT_FOUND | An account does not exist, is not available to your key, or the destination is not your own account. Check the account numbers. |
| 409 | 7004 | TRANSFER_INSUFFICIENT_FUNDS | Not enough funds on the source account. Fund the account or reduce the amount. |
| 422 | 3001 | REQUEST_INVALID_PARAMETERS | A parameter did not pass validation: the source and destination are the same account, the idempotency key is missing or not a UUID, a required field is missing, or a field has a wrong type or format. Fix the request. |
| 409 | 3016 | REQUEST_IDEMPOTENCY_KEY_REUSED | The key was already used with a different request. On a retry, you changed the request: resend the original request unchanged with the same key. For a new transfer, generate a new key. |
| 422 | 7000 | TRANSFER_NOT_SUPPORTED | This account combination is not supported. Choose different accounts. |
| 422 | 7001 | TRANSFER_DESTINATION_NOT_SUPPORTED | Transfers to this destination account are not supported. Choose another destination. |
| 422 | 7009 | TRANSFER_MT_ACCOUNT_NOT_SUPPORTED | MT4 and MT5 accounts are not supported. Choose an account on the Exness platform. |
| 422 | 7005, 7006 | TRANSFER_AMOUNT_TOO_SMALL, TRANSFER_AMOUNT_TOO_LARGE | Increase or reduce the amount. |
| 422 | 7007 | TRANSFER_LIMIT_REACHED | Try again later. Changing the amount does not help. |
| 422 | 7003 | OPERATION_NOT_ALLOWED | The operation is not allowed for your account. Check account eligibility or contact support. |
| 500 | 7008 | TRANSFER_OUTCOME_UNKNOWN | Resend the exact same request with the same idempotency key. See Recovery and idempotency. |
These actions apply while no request sent with the idempotency key has had an unknown outcome:
Auth and rate-limit errors
After
AUTH_INVALID_API_KEY,AUTH_INVALID_SIGNATURE,AUTH_PERMISSION_DENIED, orREQUEST_RATE_LIMIT: fix the cause and resend with the same key.Any other error
Send the fixed request as a new transfer with a new idempotency key, and never send the old key again.
After an unknown outcome — a timeout, no response, a non-API response, TRANSFER_OUTCOME_UNKNOWN, SYSTEM_INTERNAL_ERROR, SYSTEM_TEMPORARY_UNAVAILABLE, or a stop of your system while a request was in flight — an error on a retry leaves the outcome unknown: do not change the request or the key to get past it, and follow Recovery and Idempotency.
All codes are listed in Troubleshooting Your API Requests.
Recovery and reconciliation
After a timeout, no response, a non-API response, TRANSFER_OUTCOME_UNKNOWN, SYSTEM_INTERNAL_ERROR, or SYSTEM_TEMPORARY_UNAVAILABLE, resend the exact same request with the same idempotency key. A transfer that already exists is never executed again. See Recovery and Idempotency.
A created transfer cannot be cancelled or reversed through the API. If a transfer was sent to a wrong account, contact Customer Support.
- If a retry returns an error, the outcome is still unknown. Do not change the request or the key; handle the error as listed in What to expect in return — retry, fix the cause, or check Transaction History.
- You can review your transfers in Transaction History in the Payments & wallet section of your Personal Area.
Related pages
Check a transfer status · Recovery and idempotency · Transfer to another client