Docs menu

place_order

Place a 2-strike vertical that expresses a view on one rung. The order is checked against the user's and this agent's limits, then submitted once to Tradier (the sandbox in paper mode). A limit that fires returns an order with state rejected and the reason; orders are never silently resized. Repeating a call with the same idempotency_key returns the original order.

Scope: orders:write

Input

NameTypeRequiredDescription
symbolstringRequiredUnderlying ticker, uppercase.pattern ^[A-Z]{1,6}$
expirystring (date)RequiredExpiry as YYYY-MM-DD.
strikenumberRequiredLower strike of the vertical: the rung you selected.> 0
sidestringRequiredabove: long K call, short K+width call. below: long K put, short K-width put.one of "above", "below"
widthnumberRequiredDistance between the two strikes, in points.one of 1, 2, 5
qtyintegerRequiredNumber of spreads. Positive buys the view, negative sells it.not 0
limitnumberRequiredPer-spread net limit price in dollars per share, between 0 and width.> 0
idempotency_keystringOptionalClient key for safe retries. Generated by the server when omitted.length 1–64
close_onlybooleanOptionalOnly reduce an existing position. Allowed in the last minutes of a 0DTE session when the agent's allow_close_only limit is on.default false
JSON Schema
input_schema
{
  "type": "object",
  "properties": {
    "symbol": {
      "type": "string",
      "pattern": "^[A-Z]{1,6}$",
      "description": "Underlying ticker, uppercase."
    },
    "expiry": {
      "type": "string",
      "format": "date",
      "description": "Expiry as YYYY-MM-DD."
    },
    "strike": {
      "type": "number",
      "exclusiveMinimum": 0,
      "description": "Lower strike of the vertical: the rung you selected."
    },
    "side": {
      "type": "string",
      "enum": [
        "above",
        "below"
      ],
      "description": "above: long K call, short K+width call. below: long K put, short K-width put."
    },
    "width": {
      "type": "number",
      "enum": [
        1,
        2,
        5
      ],
      "description": "Distance between the two strikes, in points."
    },
    "qty": {
      "type": "integer",
      "not": {
        "const": 0
      },
      "description": "Number of spreads. Positive buys the view, negative sells it."
    },
    "limit": {
      "type": "number",
      "exclusiveMinimum": 0,
      "description": "Per-spread net limit price in dollars per share, between 0 and width."
    },
    "idempotency_key": {
      "type": "string",
      "minLength": 1,
      "maxLength": 64,
      "description": "Client key for safe retries. Generated by the server when omitted."
    },
    "close_only": {
      "type": "boolean",
      "default": false,
      "description": "Only reduce an existing position. Allowed in the last minutes of a 0DTE session when the agent's allow_close_only limit is on."
    }
  },
  "required": [
    "symbol",
    "expiry",
    "strike",
    "side",
    "width",
    "qty",
    "limit"
  ],
  "additionalProperties": false
}

Example

Request
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "place_order",
    "arguments": {
      "symbol": "SPY",
      "expiry": "2026-10-23",
      "strike": 582,
      "side": "above",
      "width": 1,
      "qty": 2,
      "limit": 0.52,
      "idempotency_key": "plan-42-leg-1"
    }
  }
}
Result
{
  "id": "0b6f3c2e-6a8f-4f7e-9d0e-2a51c4b7e913",
  "user_id": "c3a8e2f1-19d4-4b7a-a6e5-0f2d8c71b5a3",
  "agent_id": "7d1c9a40-3b2e-4c61-8f15-6e0a9b2d4c88",
  "idempotency_key": "plan-42-leg-1",
  "intent": {
    "symbol": "SPY",
    "expiry": "2026-10-23",
    "strike": 582,
    "side": "above",
    "width": 1,
    "qty": 2,
    "limit": 0.52,
    "idempotency_key": "plan-42-leg-1"
  },
  "legs": [
    {
      "option_symbol": "SPY261023C00582000",
      "action": "buy_to_open",
      "qty": 2
    },
    {
      "option_symbol": "SPY261023C00583000",
      "action": "sell_to_open",
      "qty": 2
    }
  ],
  "net_price": 0.52,
  "max_loss": 104,
  "max_gain": 96,
  "buying_power_effect": -104,
  "tradier_order_id": "84512937",
  "state": "open",
  "paper": true,
  "created_at": "2026-10-16T19:21:04Z",
  "updated_at": "2026-10-16T19:21:04Z"
}

A limit that fires returns the same shape with state "rejected" and a rejection, for example { "code": "max_contracts", "limit": "max_contracts_per_order=10", "message": "12 contracts exceeds this agent's limit of 10" }.