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
| Name | Type | Required | Description |
|---|---|---|---|
symbol | string | Required | Underlying ticker, uppercase.pattern ^[A-Z]{1,6}$ |
expiry | string (date) | Required | Expiry as YYYY-MM-DD. |
strike | number | Required | Lower strike of the vertical: the rung you selected.> 0 |
side | string | Required | above: long K call, short K+width call. below: long K put, short K-width put.one of "above", "below" |
width | number | Required | Distance between the two strikes, in points.one of 1, 2, 5 |
qty | integer | Required | Number of spreads. Positive buys the view, negative sells it.not 0 |
limit | number | Required | Per-spread net limit price in dollars per share, between 0 and width.> 0 |
idempotency_key | string | Optional | Client key for safe retries. Generated by the server when omitted.length 1–64 |
close_only | boolean | Optional | Only 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" }.