Every account has one deposit wallet - a USDC address on Base. Funds enter here and route to any enabled venue via POST /transfers. This replaces per-venue deposits for everything except Hyperliquid.
import requestsHEADERS = {"x-api-key": "YOUR_API_KEY"}BASE = "https://trade.predexon.com"info = requests.get( f"{BASE}/api/accounts/{account_id}/deposit-info", headers=HEADERS,).json()print(f"Send USDC on Base to: {info['address']}")print(f"Current balance: {info['balance']} USDC")
The response includes a live balance field - use it to confirm an inbound deposit landed without checking a block explorer.
POST /transfers is the single verb for every fund movement. Identify the source with from and the destination with to - <venue> is one of polymarket, predict, opinion, limitless:
from
to
What it does
deposit
<venue>
Fund a venue from the deposit wallet
<venue>
deposit
Drain a venue back to the deposit wallet
deposit
external
Withdraw USDC to any supported chain
external
deposit
Inbound from another chain - see Inbound deposits (uses POST /transfers/quote, not /transfers)
Rejected routes return 400 synchronously with the unified error envelope ({ error, message, requestId } — see Error Handling). The error field carries the code below:
Route
error
Why
<venue> → <venue>
unsupported_route_v1
Drain to deposit first, then fund the other venue.
Send native USDC on Base (0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913) directly to the deposit wallet address. No further API call needed - it lands on-chain immediately.
For Ethereum, Arbitrum, Polygon, BSC, or Optimism, get a quote first. The response carries a signed transactionRequest your end user submits from their own wallet:
quote = requests.post( f"{BASE}/api/accounts/{account_id}/transfers/quote", headers={**HEADERS, "Content-Type": "application/json"}, json={ "from": "external", "to": "deposit", "amount": "100", "source": { "address": "0xUserExternalWallet", "chain": "ethereum", "token": "USDC", }, },).json()# Hand quote.inbound.approvalTarget + quote.inbound.transactionRequest# to the partner UI for signing. Track via quote.inbound.explorerLinkTemplate.
clientReferenceId makes retries safe - the second request with the same key returns the existing transfer instead of starting a duplicate.Most transfers complete synchronously. Cross-token routes (e.g. deposit → predict, which involves a USDC → USDT swap) can return status: "pending" - poll Get Transfer until terminal.If a transient on-chain step fails, the transfer enters status: "pending" with substatus: "recoveryInProgress". Funds are not lost - automated recovery retries the failing step. The transfer reaches completed or, after exhausted recovery, failed with substatus: "escalated" (contact support).
Bridge USDC to your Hyperliquid wallet using Across.
Open the Across app and select Hyperliquid (HyperCore) as the destination chain.
Enter your Hyperliquid wallet address (from venues.hyperliquid.address on Get Account) as the recipient.
Bridge any amount of USDC from Arbitrum (or any supported source chain). The funds arrive in your trading balance in ~1-2 minutes as USDH (HL’s USDC-pegged stablecoin).
Send to the Hyperliquid wallet address from venues.hyperliquid.address - sending to the same EOA on a different chain will not credit your trading balance.
Cancel resting limit orders before draining a venue - those venues lock collateral against open buys. If the deposit wallet alone is short for the requested amount, the second call returns 400.
List Transfers returns every fund movement on the account in one paginated list. Filter with ?status=pending|completed|failed, ?from=<wallet>, ?to=<wallet>, or ?direction=in|out|internal.