Place Strategy Order¶
Use this page to place one leg-based Trading API V3 FNO strategy order through the REST API.
A strategy order sets isMultiLeg: true and sends a non-empty legs list. The strategy is treated as one order object, with one strategy-level intentOrderId in the response.
Strategy orders help users build complex FNO strategies by grouping multiple option or future legs into one strategy order.
With basket-level execution, users can choose strategy-level entry and/or exit configs. Both time-based and price-based entry and exits are possible, along with trailing stop-loss and other trigger configurations.
stratTags
The strategy order can pass exactly one tag inside stratTags. Use hyphen-separated tag names only, such as rest-api-v3-nifty-buy-straddle. Do not use underscores, spaces, colons, plus signs, timestamps, or other special characters.
Scope
Use this page for one strategy order composed from FNO legs. This shape omits top-level refId, requires isMultiLeg: true, sets the strategy-level side, and uses legs[].refId plus signed legs[].unitQty. Set executionMode based on the top-level entry and exit fields. Do not use this page for multiple independent single orders; use Place Multi Order.
Price and quantity format
Trading API V3 examples on this page use rupee prices snapped to the live contract tick_size. For strategy quantities, use qty as the common executable base quantity derived from the leg lot sizes, and use legs[].unitQty as the lot multiplier for each leg. For example, if both legs trade in 65-lot contracts, set qty: 65 for one strategy unit and unitQty: 1 on each leg. If you want to scale the whole strategy to two strategy units, set qty: 130. If you want two lots only on one leg, keep the same base qty and set that leg's unitQty: 2. Use a negative unitQty for short legs.
Endpoint¶
Method: POST
Endpoint: /sentinel/orders/create
Base URLs¶
| Environment | Base URL |
|---|---|
| PROD | https://api.nubra.io |
| UAT | https://uatapi.nubra.io |
Headers¶
Authorization: Bearer <session_token>
x-device-id: <device_id>
Content-Type: application/json
cURL¶
curl --location 'https://api.nubra.io/sentinel/orders/create' \
--header 'Authorization: Bearer <session_token>' \
--header 'x-device-id: <device_id>' \
--header 'Content-Type: application/json' \
--data '{
"orders": [
{
"isMultiLeg": true,
"qty": 65,
"side": "BUY",
"deliveryType": "CNC",
"priceType": "LIMIT",
"validityType": "DAY",
"executionMode": "ENTRY_AND_EXIT",
"entryPrice": 44935,
"legs": [
{ "refId": 1497712, "unitQty": 1 },
{ "refId": 1497713, "unitQty": 1 }
],
"entryConfig": {
"triggers": {
"ltp": {
"atOrAbove": { "value": 44945 }
}
}
},
"exitConfig": {
"stoplossParams": {
"stoplossTriggerPrice": { "value": 44895 },
"stoplossLimitPrice": { "value": 44885 }
},
"targetParams": {
"targetProfitTriggerPrice": { "value": 45015 },
"targetProfitLimitPrice": { "value": 45005 }
}
},
"stratTags": ["rest-api-v3-nifty-buy-straddle"]
}
]
}'
Basic Usage¶
{
"orders": [
{
"isMultiLeg": true,
"qty": 65,
"side": "BUY",
"deliveryType": "CNC",
"priceType": "LIMIT",
"validityType": "DAY",
"executionMode": "ENTRY_AND_EXIT",
"entryPrice": 44935,
"legs": [
{ "refId": 1497712, "unitQty": 1 },
{ "refId": 1497713, "unitQty": 1 }
],
"entryConfig": {
"triggers": {
"ltp": {
"atOrAbove": { "value": 44945 }
}
}
},
"exitConfig": {
"stoplossParams": {
"stoplossTriggerPrice": { "value": 44895 },
"stoplossLimitPrice": { "value": 44885 }
},
"targetParams": {
"targetProfitTriggerPrice": { "value": 45015 },
"targetProfitLimitPrice": { "value": 45005 }
}
},
"stratTags": ["rest-api-v3-nifty-buy-straddle"]
}
]
}
Example Order Patterns¶
These examples show common option strategy orders built with Trading API V3 multi-leg payloads.
- each leg is passed through
legs - strategy-level pricing and controls stay on the top-level order object
- option
refIdvalues should be resolved before order placement - set
isMultiLeg: true, set strategyside: "BUY", omit top-levelrefId, and set the correctexecutionMode - use
qtyas the common executable base quantity for the strategy andlegs[].unitQtyas the signed lot multiplier for each leg - strategy orders can combine
validityType: "GTE",goodTillDate, price and time entry, stop-loss, trailing stop-loss, and target in the same payload - if you use
validityType: "GTE", do not addexitConfig.exitTime - resolve lot size and tick size from instruments instead of hardcoding values such as
65 - there is no separate top-level basket
multiplierfield in this strategy shape
{
"orders": [
{
"isMultiLeg": true,
"qty": 65,
"side": "BUY",
"deliveryType": "CNC",
"priceType": "LIMIT",
"validityType": "DAY",
"executionMode": "ENTRY",
"entryPrice": 44935,
"legs": [
{ "refId": 1497712, "unitQty": 1 },
{ "refId": 1497713, "unitQty": 1 }
],
"stratTags": ["rest-api-v3-nifty-buy-straddle"]
}
]
}
Use this pattern for a two-leg same-strike buy straddle strategy.
{
"orders": [
{
"isMultiLeg": true,
"qty": 65,
"side": "BUY",
"deliveryType": "CNC",
"priceType": "LIMIT",
"validityType": "DAY",
"executionMode": "ENTRY",
"entryPrice": 37250,
"legs": [
{ "refId": 1497720, "unitQty": 1 },
{ "refId": 1497721, "unitQty": 1 }
],
"stratTags": ["rest-api-v3-nifty-buy-strangle"]
}
]
}
Use this pattern for a two-leg buy strangle strategy with different call and put strikes.
{
"orders": [
{
"isMultiLeg": true,
"qty": 65,
"side": "BUY",
"deliveryType": "CNC",
"priceType": "LIMIT",
"validityType": "GTE",
"goodTillDate": "2026-10-16T15:10:00.000Z",
"executionMode": "ENTRY_AND_EXIT",
"entryPrice": 18050,
"legs": [
{ "refId": 1497730, "unitQty": 1 },
{ "refId": 1497731, "unitQty": -1 }
],
"entryConfig": {
"entryTime": "2026-10-16T09:20:00.000Z",
"triggers": {
"ltp": {
"atOrAbove": { "value": 18060 }
}
}
},
"exitConfig": {
"stoplossParams": {
"stoplossTriggerPrice": { "value": 18010 },
"stoplossLimitPrice": { "value": 18000 },
"stoplossTrailJump": 5
},
"targetParams": {
"targetProfitTriggerPrice": { "value": 18130 },
"targetProfitLimitPrice": { "value": 18120 }
}
},
"stratTags": ["rest-api-v3-nifty-bull-call-flexible"]
}
]
}
Use this pattern for a two-leg bull call spread that combines good-till validity, price and time entry, stop-loss, trailing stop-loss, and target controls. Replace the sample entryTime and goodTillDate values before running the payload.
{
"orders": [
{
"isMultiLeg": true,
"qty": 65,
"side": "BUY",
"deliveryType": "CNC",
"priceType": "LIMIT",
"validityType": "DAY",
"executionMode": "ENTRY",
"entryPrice": 21500,
"legs": [
{ "refId": 1497740, "unitQty": 1 },
{ "refId": 1497741, "unitQty": -1 },
{ "refId": 1497742, "unitQty": -1 },
{ "refId": 1497743, "unitQty": 1 }
],
"stratTags": ["rest-api-v3-nifty-iron-condor"]
}
]
}
Use this pattern for a four-leg defined-risk short-volatility strategy with wider protective wings.
{
"orders": [
{
"isMultiLeg": true,
"qty": 65,
"side": "BUY",
"deliveryType": "CNC",
"priceType": "LIMIT",
"validityType": "DAY",
"executionMode": "ENTRY",
"entryPrice": 19800,
"legs": [
{ "refId": 1497750, "unitQty": 1 },
{ "refId": 1497751, "unitQty": -1 },
{ "refId": 1497752, "unitQty": -1 },
{ "refId": 1497753, "unitQty": 1 }
],
"stratTags": ["rest-api-v3-nifty-iron-butterfly"]
}
]
}
Use this pattern for a four-leg strategy with the short call and short put at the same strike.
Multi-Leg Behavior¶
When isMultiLeg is true, Trading API V3 treats the payload as one strategy order made from legs.
| Rule | Meaning |
|---|---|
isMultiLeg: true |
Selects the leg-based validation path. |
no top-level refId |
The instrument lives on each leg through legs[].refId. |
top-level side is required |
Use side: "BUY" for the strategy order. Leg direction still lives on each leg through the sign of legs[].unitQty. |
legs must be non-empty |
Each leg needs its own FNO refId and signed unitQty. |
qty is the common executable base quantity |
Use the base executable quantity derived from the leg lot sizes. For same-lot NIFTY option legs, one strategy unit is typically qty: 65. To scale the full strategy, multiply that base quantity at the top level. |
legs[].unitQty is the signed leg lot multiplier |
Positive values are buy legs and negative values are sell legs. 1 means one lot of that leg, 2 means two lots of that leg, and so on. |
| entry and exit controls are top-level | entryPrice, entryConfig, and exitConfig apply to the strategy order, not to individual legs. |
Execution Modes¶
Use executionMode to match the strategy lifecycle fields in the payload.
| Payload shape | executionMode |
Meaning |
|---|---|---|
The strategy has entryPrice and/or entryConfig, and no exitConfig. |
ENTRY |
Entry-only multi-leg strategy order. |
The strategy has no entryPrice or entryConfig, and has exitConfig. |
EXIT |
Exit-only multi-leg strategy order. |
The strategy has entryPrice and/or entryConfig, and also has exitConfig. |
ENTRY_AND_EXIT |
Entry multi-leg strategy order with attached stop-loss, target, trailing stop-loss, or timed exit. |
Multi-leg execution mode
executionMode is still required for the strategy order. The difference from single order is that isMultiLeg: true moves instrument direction into legs[], while executionMode still describes whether the strategy payload is defining entry, exit, or both.
Strategy side and leg direction
The top-level side is the strategy-level side required by the Trading API V3 strategy order shape. Individual leg direction is controlled by signed legs[].unitQty: positive values are buy legs and negative values are sell legs.
REST Payload Shape¶
Send one strategy object inside the orders array.
{
"orders": [
{
"isMultiLeg": true,
"qty": 65,
"side": "BUY",
"deliveryType": "CNC",
"priceType": "LIMIT",
"validityType": "DAY",
"executionMode": "ENTRY",
"entryPrice": 44935,
"legs": [
{ "refId": 1497712, "unitQty": 1 },
{ "refId": 1497713, "unitQty": -1 }
],
"stratTags": ["rest-api-v3-basic-strategy-order"]
}
]
}
Strategy Order Fields¶
| Field | Type | Required | Allowed values / shape | Meaning |
|---|---|---|---|---|
orders |
array | yes | one strategy object | Request wrapper. For this page, send one strategy order inside the list. |
orders[].isMultiLeg |
boolean | yes | true |
Enables the leg-based order validation path. |
orders[].legs |
array | yes | non-empty list | FNO legs inside this one strategy order. |
orders[].legs[].refId |
int | yes | instrument ref ID | FNO instrument reference ID for that leg. |
orders[].legs[].unitQty |
int | yes | signed leg lot multiplier | Per-leg lot multiplier. Use positive values for buy legs and negative values for sell legs. 1 means one lot of that leg, 2 means two lots, and so on. |
orders[].qty |
int | yes | positive integer | Common executable base quantity for the strategy. For same-lot strategies, this is usually the live instrument lot_size. For mixed-lot strategies, use the common executable quantity derived from the leg lot sizes. To scale the full strategy, multiply this base quantity at the top level. |
orders[].side |
string | yes | BUY |
Strategy-level order side required by the current strategy order placement path. Leg buy/sell direction is still represented by signed unitQty. |
orders[].deliveryType |
string | yes | CNC |
Product or delivery type for the strategy order examples. Current Trading API V3 strategy order placement expects CNC for this strategy shape. |
orders[].priceType |
string | no | LIMIT, MARKET |
Price behavior for the strategy order. |
orders[].validityType |
string | no | DAY, IOC, GTE, AMO |
Order validity. |
orders[].goodTillDate |
string | no | date/time string | Good-till date for supported good-till workflows. |
orders[].executionMode |
string | yes | ENTRY, EXIT, ENTRY_AND_EXIT |
Execution mode for the strategy order. Match this to the entry and exit fields in the payload. |
orders[].entryPrice |
int | conditional | price integer | Strategy entry price or net price, as expected by Trading API V3. Required for price-based ENTRY and ENTRY_AND_EXIT payloads. Omit for EXIT-only payloads. |
orders[].entryConfig |
object | no | see below | Delayed or trigger-based strategy entry conditions. |
orders[].exitConfig |
object | no | see below | Strategy stop-loss, target, trailing stop, or time exit settings. |
orders[].algoId |
string | no | string | Algo identifier when applicable. |
orders[].stratTags |
array | no | one hyphenated string inside list | Strategy or tracking tag. Pass exactly one tag inside the list. Tag names must use hyphen-separated text only, such as abc-def. Do not use underscores, spaces, colons, plus signs, timestamps, or other special characters. |
orders[].echoFields |
string | no | string | Free-form metadata echoed back by Trading API V3. |
orders[].orderId |
int | no | omit for new create requests | Present in some models, but not normally sent for new create requests. |
orders[].refId |
int | no | omit | Must be absent when isMultiLeg: true. |
orders[].icebergInfo |
object | no | omit unless enabled for strategy orders | Iceberg fields exist on the model, but are not part of the normal leg-based strategy shape. |
Condition Fields¶
| Field | Type | Required | Allowed values / shape | Meaning |
|---|---|---|---|---|
orders[].entryConfig.entryTime |
string | no | date/time string | Time at which the strategy entry can activate. |
orders[].entryConfig.triggers.ltp |
object | no | one or more LTP comparisons | Container for LTP trigger comparisons. |
orders[].entryConfig.triggers.ltp.above.value |
int | conditional | price integer | Trigger when the live price moves above the threshold. |
orders[].entryConfig.triggers.ltp.below.value |
int | conditional | price integer | Trigger when the live price moves below the threshold. |
orders[].entryConfig.triggers.ltp.atOrAbove.value |
int | conditional | price integer | Trigger when the live price reaches or exceeds the threshold. |
orders[].entryConfig.triggers.ltp.atOrBelow.value |
int | conditional | price integer | Trigger when the live price reaches or falls below the threshold. |
orders[].exitConfig.stoplossParams.stoplossTriggerPrice |
object | no | {"value": int} or {"disabled": true} |
Stop-loss trigger price wrapper. |
orders[].exitConfig.stoplossParams.stoplossLimitPrice |
object | no | {"value": int} or {"disabled": true} |
Stop-loss limit price wrapper. |
orders[].exitConfig.stoplossParams.stoplossTrailJump |
number | no | number | Trailing stop jump. |
orders[].exitConfig.targetParams.targetProfitTriggerPrice |
object | no | {"value": int} or {"disabled": true} |
Target trigger price wrapper. |
orders[].exitConfig.targetParams.targetProfitLimitPrice |
object | no | {"value": int} or {"disabled": true} |
Target limit price wrapper. |
orders[].exitConfig.exitTime |
string | no | date/time string | Time-based exit. |
Response Shape¶
{
"message": "order creation request pushed successfully",
"orders": [
{
"intentOrderId": 9965,
"exchange": "NSE",
"status": "OPEN",
"isMulti": true,
"legs": [
{
"refId": 1497712,
"unitQty": 1,
"orderQty": 65,
"filledQty": 0,
"filledPrice": 0,
"refData": {
"symbol": "NIFTY26JUN23400CE",
"exchange": "NSE"
}
},
{
"refId": 1497713,
"unitQty": 1,
"orderQty": 65,
"filledQty": 0,
"filledPrice": 0,
"refData": {
"symbol": "NIFTY26JUN23400PE",
"exchange": "NSE"
}
}
],
"filledQty": 0,
"orderQty": 65,
"deliveryType": "CNC",
"priceType": "LIMIT",
"validityType": "DAY",
"executionMode": "ENTRY_AND_EXIT",
"entryConfig": {
"conditions": []
},
"exitConfig": [],
"stratTags": ["rest-api-v3-nifty-buy-straddle"],
"entryPrice": 44935,
"ltp": 44930,
"orderPrice": 44935,
"filledPrice": 0,
"rejectionMsg": "",
"timestamps": {
"intentCreatedAt": 1781600400000
},
"positionId": "",
"intentOrderType": "REGULAR",
"side": "BUY"
}
]
}
Response Fields¶
| Field | Type | Meaning |
|---|---|---|
message |
string | Response message. |
orders |
array | Created Trading API V3 strategy orders. This request normally returns one item. |
orders[].intentOrderId |
int | Trading API V3 strategy order identifier. |
orders[].status |
string | Current order status. |
orders[].isMulti |
boolean | true for leg-based strategy orders. |
orders[].exchange |
string | Exchange. |
orders[].legs |
array | Leg details returned by Trading API V3. |
orders[].legs[].refId |
int | Leg instrument reference ID. |
orders[].legs[].unitQty |
int | Signed leg unit quantity. |
orders[].legs[].orderQty |
int | Expanded leg order quantity. |
orders[].legs[].filledQty |
int | Filled quantity for the leg. |
orders[].legs[].filledPrice |
int | Fill price for the leg. |
orders[].legs[].refData |
object | Leg instrument metadata. |
orders[].orderQty |
int | Strategy quantity. |
orders[].deliveryType |
string | Delivery type. |
orders[].priceType |
string | Price type. |
orders[].validityType |
string | Validity type. |
orders[].executionMode |
string | Execution mode. |
orders[].entryConfig |
object | Entry conditions as returned by Trading API V3. |
orders[].exitConfig |
array | Exit triggers as returned by Trading API V3. |
orders[].stratTags |
array | Strategy tag echoed back inside a one-item list. Tag values use hyphen-separated text only. |
orders[].echoFields |
string | Echo metadata. |
orders[].entryPrice |
int | Strategy entry price. |
orders[].ltp |
int | Latest traded price. |
orders[].orderPrice |
int | Order price. |
orders[].filledPrice |
int | Fill price. |
orders[].rejectionMsg |
string | Rejection reason when rejected. |
orders[].timestamps |
object | Lifecycle timestamps. |
orders[].positionId |
string | Position identifier when available. |
orders[].intentOrderType |
string | Trading API V3 intent order type. |
Important Rules¶
Important Rules
- This is one strategy order, not multiple independent orders.
isMultiLegmust betrue.legsmust be non-empty.- Top-level
refIdmust be absent. - Top-level
sideshould beBUYfor the strategy shape; leg direction is represented by signedlegs[].unitQty. - Use FNO
refIdvalues inlegs[]. - Use
deliveryType: "CNC"for the strategy order payload. executionModeis required.- Pass only one tag inside
stratTags, for example["abc-def"]. - Use hyphen-separated tag names only, for example
abc-def. Do not use underscores, spaces, colons, plus signs, timestamps, or other special characters. - Use
qtyas the common executable strategy quantity andlegs[].unitQtyas the per-leg signed lot multiplier. - Use integer paise for all prices, and snap limit or trigger values to the contract
tick_size. - Use
ENTRY_AND_EXITwhen the same strategy payload has both entry fields andexitConfig. - Do not send a top-level
multiplierfield. - Use Get Order Margin before placement when margin impact matters.