Transfer to Another Client
What this page solves
Sending funds from your Partner Reward Wallet to an account of another Exness client with destination_type: another_client.
When to use it
Use it when you are an authorized partner and pay out funds to your clients or to other Exness clients. Transfers to another client are always sent from your Reward Wallet; any other source account is rejected with TRANSFER_SOURCE_NOT_ALLOWED.
Before you start
API key
With the
Partner transfersscope. See Payments scopes.Request signing
Working request signing. See Request signing.
Reward Wallet number
You find it in the Partner Personal Area under Wallet accounts.
Recipient account number
A trading account on the Exness platform or a wallet. Trading account numbers of your direct clients are listed in the Partner Personal Area under Reports → Client accounts, and are available through the Exness Partnership API:
GET /v1/partnership/reports/clients/accounts, fieldclient_account. Account numbers of second-level clients are masked. For any other Exness client, the recipient provides the account number.Supported accounts
MT4 and MT5 accounts are not supported. Client account lists can include them; check the account before sending.
Enough balance
Enough balance on your Reward Wallet. See Read an account balance.
Recommended flow
- 1Confirm the recipient's account number with the recipient or from your client list. The API has no operation to look up or confirm the recipient before the transfer. A created transfer cannot be cancelled or reversed through the API.
- 2Check the balance of your Reward Wallet.
- 3Generate a new idempotency key — a random UUID — for each payout and store it together with the request before sending.
- 4Send
POST /v1/transfers. - 5On
201, track the transfer withGET /v1/transfers/{transfer_id}until it isdoneorrejected. - 6After 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 of your Reward Wallet |
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: 7c9e6679-7425-40de-944b-e07fc1f90ae7
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":"another_client","source_account":"7055707","destination_account":"9484938201111","amount":"100.00"}
The amount is in the currency of your Reward Wallet.
What to expect in return
HTTP 201 with the transfer_id and the amount of the transfer in the currency of your Reward Wallet (source) and in the currency of the recipient account (destination):
{
"transfer_id": "2000000074",
"source": { "amount": "100.00", "currency": "USD" },
"destination": { "amount": "91.80", "currency": "EUR" }
}
201 means the transfer is created, not that the money has been transferred. The transfer can still be processing. 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 Partner transfers scope, or your source IP is not allowed for the key. |
| 403 | 7002 | TRANSFER_SOURCE_NOT_ALLOWED | The source account is not your Reward Wallet. Use your Reward Wallet as the source account. |
| 404 | 2000 | ACCOUNT_NOT_FOUND | The recipient account does not exist, is not available, or is your own account. Check the account number. |
| 409 | 7004 | TRANSFER_INSUFFICIENT_FUNDS | Not enough funds on your Reward Wallet. Fund it or reduce the amount. |
| 422 | 7005, 7006 | TRANSFER_AMOUNT_TOO_SMALL, TRANSFER_AMOUNT_TOO_LARGE | Increase or reduce the amount. |
| 422 | 3001 | REQUEST_INVALID_PARAMETERS | A parameter did not pass validation: 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 payout, generate a new key. |
| 422 | 7000, 7001 | TRANSFER_NOT_SUPPORTED, TRANSFER_DESTINATION_NOT_SUPPORTED | This destination or account combination is not supported. Choose another destination account. |
| 422 | 7009 | TRANSFER_MT_ACCOUNT_NOT_SUPPORTED | The recipient account is an MT4 or MT5 account. Ask the recipient for an account on the Exness platform or a wallet. |
| 422 | 7003 | OPERATION_NOT_ALLOWED | The transfer was declined by eligibility checks. Check account eligibility or contact support. |
| 422 | 7007 | TRANSFER_LIMIT_REACHED | Try again later. Changing the amount does not help. |
| 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 new key can send the money twice. 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.
- When you send many payouts, keep one idempotency key per payout, so each payout can be retried independently.
- 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 between your own accounts