Overview
UsePOST /v1/transfers to move an asset between accounts in your program. Use
POST /v1/accounts/{account_id}/transfers/derivatives to move funds between one account’s spot and futures balances.
Transfer between accounts
The source and destination must be distinct accounts. They may belong to the same user or to different users, but both must be in the authenticated caller’s program. Email, username-tag, and other recipient types are not supported.Prerequisites
- A source account with a sufficient available balance
- A destination account in the same program
curl examples read these environment variables:
PWS_BASE_URL: the API base URL. Set it to the sandbox or production base URL, listed in Environments.PWS_API_KEY: your API key.PWS_API_TIMESTAMPandPWS_API_SIGN: the timestamp and signature of each request. To compute them, see Authentication.- Compute
PWS_API_SIGNover the exact-dstring, including its line breaks and indentation, and over the exact path and query in the URL. Each request needs a newPWS_API_TIMESTAMPandPWS_API_SIGN.
Create a transfer
SendPOST /v1/transfers with the source account, destination account, asset symbol, and decimal amount.
Make retries idempotent
Generate one UUIDv4 for each intended transfer. Reuse that same key only when retrying the identical request.- The same key and request prevent a second transfer execution. The retry returns the transfer’s current recorded outcome.
- The same key with different, otherwise valid transfer parameters returns
409 Conflictwith codeidempotency_conflict. - A keyed retry does not replay the original HTTP status and body. The response does not include
Idempotent-Replayed. - A request rejected before it is recorded may leave the key available for another request.
- A recorded key remains reserved beyond 24 hours. Never reuse it for a new transfer.
Response
A successful request returns HTTP201:
transfer_id is an opaque originating reference. It is distinct from the Portfolio transaction ID.
Reconcile through Portfolio
Transfer creation and Portfolio visibility are asynchronous. A create response withstatus: complete does not
guarantee that the Portfolio transaction is visible yet.
Poll GET /v1/accounts/{account_id}/portfolio/transactions using:
- the request’s
fromaccount asaccount_id types=transfer- a time range that includes the create request
- no
statusesfilter, or a filter that includesin_progress
from account response contains spend, while the to account
response contains receive. The example below queries the from account, so it shows only spend.
When the transaction appears, its reference links it to the create response:
types and other filters using AND semantics.
Keep these identifiers distinct:
Error handling
Transfer between spot and futures
Prerequisites
- An eligible futures wallet and balance for the account owner
- An asset supported by the account’s futures balance
- Enough funds available in the source balance after holds and collateral requirements
Create a transfer
SendPOST /v1/accounts/{account_id}/transfers/derivatives with a positive decimal amount.
Set from and to to move funds from spot to futures or from futures to spot within the same account:
from and to to move funds back to spot.
Response
A successful request returns HTTP200:
accepted means your transfer has been accepted for processing.
Check the destination balance to confirm the funds have arrived.
Track the transfer
Keep the returnedtransfer_id with the account, asset, amount, direction, and request time.
Use it to identify the transfer when contacting Payward Services support.
To look for a corresponding Portfolio entry, query GET /v1/accounts/{account_id}/portfolio/transactions
with the same account_id used to create the transfer and a time range around the request:
reference.id matching your transfer_id, keep its Portfolio id and
the returned reference.kind for later lookups.
For later lookups, pass that pair as references[0][kind] and references[0][id].
Portfolio entries can appear asynchronously and may first have status in_progress.
A missing entry does not prove the transfer failed. Check both balances or contact support if the outcome is unclear.
See the Portfolio guide for transaction filters.
Retry guidance
If you aren’t sure whether a transfer went through, check both balances or contact Payward Services support before
trying again.
Error handling
For a validation error, use
error.causes to identify the affected field.
For a timeout or another unknown outcome, follow the retry guidance above before submitting another transfer.