Quickstart

Place your first order in five minutes (curl and Python).

  1. Sign in with Google at predarena.org — a portfolio with a starting balance is created for you.
  2. Create an API key in the dashboard. It is shown once; store it as PREDARENA_API_KEY.
  3. Preview an order with dry_run, then place it.

1. Preview an order (dry run)

curl
curl -X POST https://predarena.org/api/v2/portfolio/orders \
  -H "Authorization: Bearer $PREDARENA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "ticker": "KXHIGHNY-26JUN13-B85.5",
    "action": "buy",
    "yes_no": "yes",
    "count": 10,
    "dry_run": true
  }'

The preview returns the exact fill legs, VWAP, fee, total cost, required cash, projected spendable balance, and — for limit orders — how many contracts would execute immediately vs. rest. Previews use the same code path as execution, so what you see is what you would get against the book at that moment.

2. Place the order

curl
curl -X POST https://predarena.org/api/v2/portfolio/orders \
  -H "Authorization: Bearer $PREDARENA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "ticker": "KXHIGHNY-26JUN13-B85.5",
    "action": "buy",
    "yes_no": "yes",
    "count": 10,
    "client_order_id": "my-bot-2026-06-09-001",
    "strategy": "weather-fade"
  }'

3. The same flow in Python

bot.py
import os
import requests

BASE = "https://predarena.org/api/v2"
HEADERS = {"Authorization": f"Bearer {os.environ['PREDARENA_API_KEY']}"}

def place_order(ticker, action, side, count, **kwargs):
    payload = {"ticker": ticker, "action": action, "yes_no": side,
               "count": count, **kwargs}
    r = requests.post(f"{BASE}/portfolio/orders", json=payload,
                      headers=HEADERS, timeout=30)
    r.raise_for_status()
    return r.json()

# Preview first — same math as execution, writes nothing.
preview = place_order("KXHIGHNY-26JUN13-B85.5", "buy", "yes", 10,
                      dry_run=True)
print(preview["preview"]["total_cost"], preview["preview"]["fee_cost"])

# Execute with an idempotency key: retries can never double-fill.
order = place_order("KXHIGHNY-26JUN13-B85.5", "buy", "yes", 10,
                    client_order_id="weather-fade-001",
                    strategy="weather-fade")
print(order["order"]["avg_price"], order["order"]["slippage_per_contract"])

# Portfolio snapshot
portfolio = requests.get(f"{BASE}/portfolio", headers=HEADERS).json()
print(portfolio)

4. Trading Polymarket markets

Pass a Polymarket slug or condition id as ticker (and optionally venue: "polymarket" — 0x condition ids and token ids are auto-detected). Note Polymarket's 5-contract minimum order size.

curl -X POST https://predarena.org/api/v2/portfolio/orders \
  -H "Authorization: Bearer $PREDARENA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "venue": "polymarket",
    "ticker": "new-rhianna-album-before-gta-vi-926",
    "action": "buy",
    "yes_no": "no",
    "count": 5
  }'

Next steps: read Orders for limit/stop/bracket mechanics, Fees for exactly how costs are computed (with sources), and Simulation vs. Reality for what these numbers do and do not tell you.