Skip to main content
POST
/
api
/
accounts
/
{accountId}
/
transfers
Create Transfer
curl --request POST \
  --url https://trade.predexon.com/api/accounts/{accountId}/transfers \
  --header 'Content-Type: application/json' \
  --header 'x-api-key: <api-key>' \
  --data '
{
  "amount": "<string>",
  "destination": {
    "address": "<string>",
    "token": "<string>"
  },
  "clientReferenceId": "<string>"
}
'
{
  "transferId": "<string>",
  "accountId": "<string>",
  "from": {
    "wallet": "<string>",
    "chain": 123,
    "token": "<string>",
    "address": "<string>"
  },
  "to": {
    "wallet": "<string>",
    "chain": 123,
    "token": "<string>",
    "address": "<string>"
  },
  "amount": "<string>",
  "amountReceived": "<string>",
  "txHashes": {
    "source": "<string>",
    "dest": "<string>",
    "approve": "<string>",
    "unwrap": "<string>",
    "wrap": "<string>",
    "safeExtract": "<string>",
    "safeDeposit": "<string>",
    "swap": "<string>"
  },
  "explorerLink": "<string>",
  "clientReferenceId": "<string>",
  "createdAt": "<string>",
  "completedAt": "<string>",
  "error": "<string>",
  "errorCode": "<string>"
}

Documentation Index

Fetch the complete documentation index at: https://docs.predexon.com/llms.txt

Use this file to discover all available pages before exploring further.

POST /transfers is the single endpoint for every fund-movement direction. <venue> is one of polymarket, predict, opinion, limitless:
fromtoUse case
deposit<venue>Fund a venue from the deposit wallet
<venue>depositDrain a venue back to the deposit wallet
depositexternalWithdraw USDC to a partner-supplied address
Rejected routes return 400 synchronously:
RouteerrorCodeWhy
<venue><venue>unsupported_route_v1Accepted by the schema, rejected at execution in v1. Drain to deposit first, then fund the other venue.
<venue>externalwithdraw_via_depositDrain to deposit first, then withdraw from there.
external → anywhere via POSTinbound_requires_quoteInbound deposits use Quote Transfer; the partner submits the bridge tx themselves.
from === tosame_endpointSource and destination must differ.
hyperliquid on either sidehyperliquid_uses_acrossHyperliquid is funded via Across and withdrawn via the per-venue POST /withdraw — see Funding & Withdrawals.

Status semantics

status is a 3-state partner-facing enum:
ValueMeaning
pendingStill settling. Includes routes in automated recovery — keep polling.
completedFunds landed at the destination. Terminal.
failedDid not deliver. Terminal. See error / errorCode.
substatus adds context:
ValueMeaning
recoveryInProgressA transient on-chain step is being retried. Funds are not lost.
escalatedAutomated recovery exhausted — contact support.
legacyPartialHistorical pre-recovery row; ignore for new integrations.
Same-chain routes (e.g. deposit ↔ limitless) settle synchronously and return status: "completed" on the POST response. Cross-token routes (e.g. deposit → predict) involve a swap and may return pending — poll Get Transfer until terminal.

Idempotency

Pass clientReferenceId to make retries safe. The first request creates the transfer; a retry with the same clientReferenceId returns the existing record rather than starting a duplicate. Use a fresh value per logical operation — reusing one across different routes returns the first transfer regardless of the new body.

Authorizations

x-api-key
string
header
required

Path Parameters

accountId
string
required

Body

application/json

Move funds between the account's deposit wallet, a venue trading wallet, or an external address. Supported routes today: deposit ↔ <venue> (fund / drain a venue), deposit → external (withdraw). See the Transfers guide for the full route matrix.

from
enum<string>
required

Source wallet. deposit is the account's Base USDC deposit wallet; venue values are the account's venue trading wallets.

Available options:
deposit,
polymarket,
predict,
opinion,
limitless
to
enum<string>
required

Destination wallet. external is a partner-supplied address — see destination.

Available options:
deposit,
polymarket,
predict,
opinion,
limitless,
external
amount
string
required

Amount in the source token's natural unit (USDC for deposit source; USDT/pUSD for venue sources). Decimal string, e.g. "100.00".

destination
object

Required when to === "external". Recipient address + delivery chain/token.

clientReferenceId
string

Partner-supplied idempotency key. Retries with the same key return the existing transfer rather than creating a duplicate.

Response

Transfer created. status reaches completed synchronously for most routes; cross-token routes can return pending (poll the detail endpoint).

A single fund-movement operation. Same envelope returned by POST /transfers, GET /transfers, and GET /transfers/{transferId}. status is the partner-facing 3-state enum; substatus carries additional context where useful.

transferId
string

Stable identifier (tfr-...). Use for GET /transfers/{transferId}.

accountId
string
from
object

Source side of the transfer.

to
object

Destination side of the transfer.

amount
string

Source-side amount (echo of the request).

amountReceived
string | null

Destination-side amount actually delivered. Populated once the transfer settles.

status
enum<string>

Partner-facing 3-state status. pending includes routes still in active recovery; failed includes routes that exhausted recovery (see substatus).

Available options:
pending,
completed,
failed
substatus
enum<string> | null

Optional context. recoveryInProgress — a transient on-chain step is being retried (poll until terminal). escalated — automated recovery exhausted; contact support. legacyPartial — historical pre-recovery-worker rows only.

Available options:
recoveryInProgress,
escalated,
legacyPartial
txHashes
object

On-chain transaction hashes for each step that fired. Most routes use only source/dest (sometimes approve); venue-specific routes add wrap/unwrap (Polymarket), safeExtract/safeDeposit (Opinion), or swap (cross-token routes).

Bridge-explorer URL for cross-chain transfers. null for same-chain transfers.

clientReferenceId
string | null
createdAt
string
completedAt
string | null
error
string | null

Human-readable failure message. Present iff status === "failed".

errorCode
string | null

Machine-readable failure code. Present iff status === "failed".