Skip to main content

Overview

Use POST /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
The 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_TIMESTAMP and PWS_API_SIGN: the timestamp and signature of each request. To compute them, see Authentication.
  • Compute PWS_API_SIGN over the exact -d string, including its line breaks and indentation, and over the exact path and query in the URL. Each request needs a new PWS_API_TIMESTAMP and PWS_API_SIGN.

Create a transfer

Send POST /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 Conflict with code idempotency_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.
If you omit Idempotency-Key, transfer creation is not idempotent. Do not automatically retry a timeout or another unknown outcome. Reconcile the source account through Portfolio or contact Payward Services support first.

Response

A successful request returns HTTP 201:
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 with status: complete does not guarantee that the Portfolio transaction is visible yet. Poll GET /v1/accounts/{account_id}/portfolio/transactions using:
  • the request’s from account as account_id
  • types=transfer
  • a time range that includes the create request
  • no statuses filter, or a filter that includes in_progress
Portfolio transactions are account-relative. The 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:
Use the reference for deterministic later lookups:
Reference entries use OR semantics with each other. They combine with 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

Send POST /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:
Swap from and to to move funds back to spot.

Response

A successful request returns HTTP 200:
A status of accepted means your transfer has been accepted for processing. Check the destination balance to confirm the funds have arrived.

Track the transfer

Keep the returned transfer_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:
If an entry includes a 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.