Place your first prediction market trade in 5 minutes
Which quickstart should I use? New here? Start with Get Started in 5 minutes for the unified onboarding. This page is the Trading-API-focused quickstart. For market data, see Data API Quickstart.
This guide uses the accounts path (/api/accounts/*) — the canonical path for all integrations.
There is no sandbox or testnet. Predexon trades against the real venues. For testing, place very small orders ($1–5) on illiquid markets — the Trading API is free on every plan, so the only cost is your spread. Best Practices → Testing strategy for the recommended pattern.
Call POST /enable for each venue the account should trade on. Returns status: "provisioning" while the wallet is being set up; poll Get Account until the venue’s status becomes active.
Python
import time# Enable Polymarketrequests.post( f"{BASE}/api/accounts/{account_id}/enable", headers=HEADERS, json={"venue": "polymarket"},)# Poll until ready (terminal states: "active" success, "failed" error)for _ in range(60): info = requests.get(f"{BASE}/api/accounts/{account_id}", headers=HEADERS).json() status = info["venues"].get("polymarket", {}).get("status") if status == "active": wallet = info["venues"]["polymarket"]["address"] print(f"Polymarket wallet ready: {wallet}") break if status == "failed": raise RuntimeError(f"Provisioning failed: {info['venues']['polymarket'].get('error')}") time.sleep(2)
Repeat for predict, opinion, limitless, or hyperliquid as needed.
Every account has one deposit wallet - a USDC address on Base. Send USDC to it, then move funds to any venue you’ve enabled with POST /transfers.
Python
# Get the deposit walletinfo = requests.get( f"{BASE}/api/accounts/{account_id}/deposit-info", headers=HEADERS,).json()deposit_address = info["address"]print(f"Send USDC on Base to: {deposit_address}")print(f"Current balance: {info['balance']} USDC")
To deposit from another chain (Ethereum, Arbitrum, Polygon, BSC, Optimism), call Quote Transfer with from: "external" to get a signed bridge transaction your end user submits from their own wallet.Once the deposit wallet has USDC, fund a venue:
The response uses the account shape: a market bag instead of a flat marketIdentifier, filled in place of sizeMatched, and a normalized status (open | filled | cancelled | expired | pending | failed).
To trade an outcome across venues without picking one, use the Order Router. Find the outcome with List Canonical Markets, inspect its equivalent venue listings with Get Canonical Outcome, then pass the predexon_id as predexonId to the router.
positions = requests.get( f"{BASE}/api/accounts/{account_id}/positions", headers=HEADERS,).json()for p in positions["positions"]: print(f"{p['title']} - {p['outcome']} size={p['size']} pnl={p['pnl']}")
The response includes _meta.venues with per-venue status (ok / timeout / error). Use it to detect partial failures if one venue is temporarily unreachable. Pass ?aggregated=true to collapse equivalent positions across venues into single rows.