Create a transfer
POST/v1/transfers
Creates a transfer from one of your accounts to the destination you
choose with destination_type:
own_account— another of your own accountsanother_client— an account of another Exness client; available to partners whose API key has thePartner transfersscope, and the money is always sent from your Partner Reward Wallet
Provide only the accounts and the amount, in the currency of the source account. You do not need to specify the currency, payment method, or conversion details — the service determines them from the accounts.
destination_type must match the destination account: if you pass
own_account with an account that is not yours, or another_client
with your own account, the API responds with ACCOUNT_NOT_FOUND — the
same answer as for an account that does not exist.
The request is processed synchronously: the response contains either the
created transfer — its transfer_id plus the transfer amount in the
source account currency (source) and in the destination account
currency (destination) — or an error. A created transfer can
still be in the processing status; check its final status with
GET /v1/transfers/{transfer_id}.
A created transfer cannot be cancelled or reversed through the API. Check the destination account before sending. If a transfer was sent to a wrong account, contact Customer Support.
The operation is idempotent. Reuse the same EXN-IDEMPOTENCY-KEY when
retrying the same request.
Recovery rules:
- after
TRANSFER_OUTCOME_UNKNOWN,SYSTEM_INTERNAL_ERROR,SYSTEM_TEMPORARY_UNAVAILABLE, a non-API response, or no response, the outcome is unknown: resend the same request with the same idempotency key. A201returns the existing transfer without executing it again, or the transfer created by the retry - before each request, record durably that it is being sent; if your system stops before it records the answer, the outcome is unknown
- after
AUTH_INVALID_API_KEY,AUTH_INVALID_SIGNATURE,AUTH_PERMISSION_DENIED, orREQUEST_RATE_LIMITon a retry, fix the cause and resend the same request with the same key - any other error on a retry leaves the outcome unknown, because the source account, funds, limits, and eligibility are checked before the key is looked up. Do not change the request or the key
- if you stop resending without a
201, retire the key first: record durably that it is never sent again. Then check Transaction History, and use a new key only after Customer Support confirms that no transfer was created TRANSFER_OUTCOME_UNKNOWNand lost responses do not return atransfer_id;GET /v1/transfers/{transfer_id}shows the status of a transfer whosetransfer_idyou received in a201response- to try again after a transfer is
rejected, send a new request with a new idempotency key; the old key stays bound to the rejected transfer - transfers are also visible in Transaction History in the Payments & wallet section of your Personal Area
Possible public error codes:
REQUEST_INVALID(400)AUTH_INVALID_API_KEY,AUTH_INVALID_SIGNATURE(401)AUTH_PERMISSION_DENIED(403), including adestination_typenot covered by the scopes of your API keyTRANSFER_SOURCE_NOT_ALLOWED(403,destination_type: another_clientonly)ACCOUNT_NOT_FOUND(404)REQUEST_IDEMPOTENCY_KEY_REUSED,TRANSFER_INSUFFICIENT_FUNDS(409)REQUEST_INVALID_PARAMETERS,TRANSFER_NOT_SUPPORTED,TRANSFER_DESTINATION_NOT_SUPPORTED,OPERATION_NOT_ALLOWED,TRANSFER_AMOUNT_TOO_SMALL,TRANSFER_AMOUNT_TOO_LARGE,TRANSFER_LIMIT_REACHED,TRANSFER_MT_ACCOUNT_NOT_SUPPORTED(422)REQUEST_RATE_LIMIT(429)SYSTEM_INTERNAL_ERROR,TRANSFER_OUTCOME_UNKNOWN(500)SYSTEM_TEMPORARY_UNAVAILABLE(503)
Request
Responses
- 201
- 400
- 401
- 403
- 404
- 409
- 422
- 429
- 500
- 503
Transfer created. The transfer can still be processing; get its final
status (done or rejected) with GET /v1/transfers/{transfer_id}.
Request is malformed.
Authentication failed.
The API key is not allowed to perform this operation (scope or source IP), or the source account is not allowed.
The source or destination account does not exist, is not available to
your API key, or does not match the declared destination_type.
The idempotency key was reused with a different request, or the source account lacks funds.
Request parameters or transfer rules validation failed.
Public API endpoint quota exceeded.
Unexpected internal error, or the transfer outcome is unknown.
Service temporarily unavailable.