DocsAPI ReferenceWheelPlayground Trading

Playground Trading

Paper-trade options against your Manual Journal account. Fills are instant and flow into the journal and wheel views like real trades.

Place a simulated order

POST/playground/orders

Orders fill instantly at the price you provide (up to 4 legs) and are recorded as journal activities and lots. A wheel started here behaves like a real one: it shows up in /v1/wheels, the journal, and the dashboard.

Requires a Manual Journal account - create it once in the dashboard (Journal → Manual Journal). Without one this endpoint returns 404 not_found.
curl -X POST "https://quantwheel.com/api/v1/playground/orders" \
  -H "Authorization: Bearer qw_live_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "legs": [{
      "symbol": "AMD",
      "strike": 165,
      "expiration": "2026-08-28",
      "optionType": "PUT",
      "action": "SELL_TO_OPEN",
      "quantity": 1,
      "price": 3.05
    }]
  }'
201 Created
{
  "status": "filled",
  "accountId": "MANUAL_JOURNAL_...",
  "activityIds": ["act_71bd3"],
  "filledAt": "2026-07-30T14:38:11.000Z"
}

List positions

GET/playground/positions

Open playground positions derived from journal lots and priced live - shorts have negative units, option prices are per contract.

200 OK
{
  "account": { "id": "MANUAL_JOURNAL_...", "name": "Manual Journal" },
  "stockPositions": [],
  "optionPositions": [
    {
      "ticker": "AMD",
      "optionSymbol": "AMD 2026-08-28 165P",
      "strike": 165,
      "expiration": "2026-08-28",
      "optionType": "PUT",
      "units": -1,
      "currentPrice": 261.0,
      "averageCost": 305.0,
      "marketValue": -261.0,
      "costBasis": -305.0,
      "unrealizedPnl": 44.0,
      "unrealizedPnlPct": 14.4
    }
  ],
  "asOf": "2026-07-30T14:40:00.000Z"
}