> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://partner.ninjatrader.com/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://partner.ninjatrader.com/_mcp/server.

# Place OSO

POST https://live.tradovateapi.com/v1/order/placeoso
Content-Type: application/json

### Place an Order Sends Order order strategy.
In the Trader application, the details of OSO orders can be viewed by adding the Order Ticket module to your workspace and selecting the Advanced workspace options with Brackets enabled. OSO orders allow for the most complex multi-bracket trading strategies. As an example, imagine MESM1 is trading around 4175.00 points. You want to place a Buy order for 4150.00 points, buying below market. We place an OSO to take profits at 4200.00 points. If the initial order is filled, the `bracket1` order will be sent. Below is an example in JavaScript:

```js
const URL = 'demo.tradovateapi.com/v1'

const oso = {
    action: 'Sell',
    orderType: 'Limit',
    price: 4200.00,
}

const initial = {
    accountSpec: yourUserName,
    accountId: yourAcctId,
    action: "Buy",
    symbol: "MESM1",
    orderQty: 1,
    orderType: "Limit",
    price: 4150.00,
    isAutomated: true //must be true if this isn't an order made directly by a human
    bracket1: oso
}

const response = await fetch(URL + '/order/placeOSO', {
    method: 'POST',
    headers: {
        'Accept': 'application/json',
        'Authorization': `Bearer ${myAccessToken}`,
    },
    body: JSON.stringify(initial)
})

const json = await response.json() // { orderId: 0000000 }
```

>*Note:* If you specify both `bracket1` and `bracket2` the two orders will be linked as an OCO, where filling one will cancel the other.

Reference: https://partner.ninjatrader.com/connect/api/rest-api-endpoints/orders/place-oso

## OpenAPI Specification

```yaml
openapi: 3.1.0
info:
  title: connect
  version: 1.0.0
paths:
  /order/placeoso:
    post:
      operationId: place-oso
      summary: Place OSO
      description: >-
        ### Place an Order Sends Order order strategy.

        In the Trader application, the details of OSO orders can be viewed by
        adding the Order Ticket module to your workspace and selecting the
        Advanced workspace options with Brackets enabled. OSO orders allow for
        the most complex multi-bracket trading strategies. As an example,
        imagine MESM1 is trading around 4175.00 points. You want to place a Buy
        order for 4150.00 points, buying below market. We place an OSO to take
        profits at 4200.00 points. If the initial order is filled, the
        `bracket1` order will be sent. Below is an example in JavaScript:


        ```js

        const URL = 'demo.tradovateapi.com/v1'


        const oso = {
            action: 'Sell',
            orderType: 'Limit',
            price: 4200.00,
        }


        const initial = {
            accountSpec: yourUserName,
            accountId: yourAcctId,
            action: "Buy",
            symbol: "MESM1",
            orderQty: 1,
            orderType: "Limit",
            price: 4150.00,
            isAutomated: true //must be true if this isn't an order made directly by a human
            bracket1: oso
        }


        const response = await fetch(URL + '/order/placeOSO', {
            method: 'POST',
            headers: {
                'Accept': 'application/json',
                'Authorization': `Bearer ${myAccessToken}`,
            },
            body: JSON.stringify(initial)
        })


        const json = await response.json() // { orderId: 0000000 }

        ```


        >*Note:* If you specify both `bracket1` and `bracket2` the two orders
        will be linked as an OCO, where filling one will cancel the other.
      tags:
        - subpackage_orders
      parameters:
        - name: Authorization
          in: header
          description: Bearer authentication
          required: true
          schema:
            type: string
      responses:
        '200':
          description: PlaceOsoResult
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PlaceOsoResult'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PlaceOSO'
servers:
  - url: https://live.tradovateapi.com/v1
    description: https://live.tradovateapi.com/v1
components:
  schemas:
    PlaceOsoAction:
      type: string
      enum:
        - Buy
        - Sell
      description: Buy, Sell
      title: PlaceOsoAction
    PlaceOsoOrderType:
      type: string
      enum:
        - Limit
        - LimitIfTouched
        - MIT
        - Market
        - MarketLimit
        - MarketStopWithProtection
        - MarketWithProtection
        - QTS
        - Stop
        - StopLimit
        - TrailingStop
        - TrailingStopLimit
      description: >-
        Limit, LimitIfTouched, MIT, Market, MarketLimit,
        MarketStopWithProtection, MarketWithProtection, QTS, Stop, StopLimit,
        TrailingStop, TrailingStopLimit
      title: PlaceOsoOrderType
    PlaceOsoTimeInForce:
      type: string
      enum:
        - Day
        - FOK
        - GTC
        - GTD
        - IOC
      description: Day, FOK, GTC, GTD, IOC
      title: PlaceOsoTimeInForce
    RestrainedOrderVersionAction:
      type: string
      enum:
        - Buy
        - Sell
      description: Buy, Sell
      title: RestrainedOrderVersionAction
    RestrainedOrderVersionOrderType:
      type: string
      enum:
        - Limit
        - LimitIfTouched
        - MIT
        - Market
        - MarketLimit
        - MarketStopWithProtection
        - MarketWithProtection
        - QTS
        - Stop
        - StopLimit
        - TrailingStop
        - TrailingStopLimit
      description: >-
        Limit, LimitIfTouched, MIT, Market, MarketLimit,
        MarketStopWithProtection, MarketWithProtection, QTS, Stop, StopLimit,
        TrailingStop, TrailingStopLimit
      title: RestrainedOrderVersionOrderType
    RestrainedOrderVersionTimeInForce:
      type: string
      enum:
        - Day
        - FOK
        - GTC
        - GTD
        - IOC
      description: Day, FOK, GTC, GTD, IOC
      title: RestrainedOrderVersionTimeInForce
    RestrainedOrderVersion:
      type: object
      properties:
        action:
          $ref: '#/components/schemas/RestrainedOrderVersionAction'
          description: Buy, Sell
        clOrdId:
          type: string
        orderType:
          $ref: '#/components/schemas/RestrainedOrderVersionOrderType'
          description: >-
            Limit, LimitIfTouched, MIT, Market, MarketLimit,
            MarketStopWithProtection, MarketWithProtection, QTS, Stop,
            StopLimit, TrailingStop, TrailingStopLimit
        price:
          type: number
          format: double
        stopPrice:
          type: number
          format: double
        limitIfTouchedPrice:
          type: number
          format: double
        maxShow:
          type: integer
        pegDifference:
          type: number
          format: double
        timeInForce:
          $ref: '#/components/schemas/RestrainedOrderVersionTimeInForce'
          description: Day, FOK, GTC, GTD, IOC
        expireTime:
          type: string
          format: date-time
        text:
          type: string
      required:
        - action
        - orderType
      title: RestrainedOrderVersion
    PlaceOSO:
      type: object
      properties:
        accountSpec:
          type: string
        accountId:
          type: integer
          format: int64
        clOrdId:
          type: string
        action:
          $ref: '#/components/schemas/PlaceOsoAction'
          description: Buy, Sell
        symbol:
          type: string
        orderQty:
          type: integer
        orderType:
          $ref: '#/components/schemas/PlaceOsoOrderType'
          description: >-
            Limit, LimitIfTouched, MIT, Market, MarketLimit,
            MarketStopWithProtection, MarketWithProtection, QTS, Stop,
            StopLimit, TrailingStop, TrailingStopLimit
        price:
          type: number
          format: double
        stopPrice:
          type: number
          format: double
        limitIfTouchedPrice:
          type: number
          format: double
        maxShow:
          type: integer
        pegDifference:
          type: number
          format: double
        timeInForce:
          $ref: '#/components/schemas/PlaceOsoTimeInForce'
          description: Day, FOK, GTC, GTD, IOC
        expireTime:
          type: string
          format: date-time
        text:
          type: string
        activationTime:
          type: string
          format: date-time
        customTag50:
          type: string
        isAutomated:
          type: boolean
        bracket1:
          $ref: '#/components/schemas/RestrainedOrderVersion'
        bracket2:
          $ref: '#/components/schemas/RestrainedOrderVersion'
      required:
        - action
        - symbol
        - orderQty
        - orderType
        - bracket1
      title: PlaceOSO
    PlaceOsoResultFailureReason:
      type: string
      enum:
        - AccountClosed
        - AdvancedTrailingStopUnsupported
        - AnotherCommandPending
        - BackMonthProhibited
        - ExecutionProviderNotConfigured
        - ExecutionProviderUnavailable
        - InvalidContract
        - InvalidPrice
        - KeyInformationDocumentRequired
        - LiquidationOnly
        - LiquidationOnlyBeforeExpiration
        - MaxOrderQtyIsNotSpecified
        - MaxOrderQtyLimitReached
        - MaxPosLimitMisconfigured
        - MaxPosLimitReached
        - MaxTotalPosLimitReached
        - MultipleAccountPlanRequired
        - NoQuote
        - NotEnoughLiquidity
        - OtherExecutionRelated
        - ParentRejected
        - RiskCheckTimeout
        - SSFNFAComplianceRequired
        - SSFNFAComplianceRequiredJointOnly
        - SSFRiskDisclosureAcknowledgmentRequired
        - SessionClosed
        - Success
        - TooLate
        - TradingLocked
        - TrailingStopNonOrderQtyModify
        - Unauthorized
        - UnknownReason
        - Unsupported
      description: >-
        AccountClosed, AdvancedTrailingStopUnsupported, AnotherCommandPending,
        BackMonthProhibited, ExecutionProviderNotConfigured,
        ExecutionProviderUnavailable, InvalidContract, InvalidPrice,
        KeyInformationDocumentRequired, LiquidationOnly,
        LiquidationOnlyBeforeExpiration, MaxOrderQtyIsNotSpecified,
        MaxOrderQtyLimitReached, MaxPosLimitMisconfigured, MaxPosLimitReached,
        MaxTotalPosLimitReached, MultipleAccountPlanRequired, NoQuote,
        NotEnoughLiquidity, OtherExecutionRelated, ParentRejected,
        RiskCheckTimeout, SSFNFAComplianceRequired,
        SSFNFAComplianceRequiredJointOnly,
        SSFRiskDisclosureAcknowledgmentRequired, SessionClosed, Success,
        TooLate, TradingLocked, TrailingStopNonOrderQtyModify, Unauthorized,
        UnknownReason, Unsupported
      title: PlaceOsoResultFailureReason
    PlaceOsoResult:
      type: object
      properties:
        failureReason:
          $ref: '#/components/schemas/PlaceOsoResultFailureReason'
          description: >-
            AccountClosed, AdvancedTrailingStopUnsupported,
            AnotherCommandPending, BackMonthProhibited,
            ExecutionProviderNotConfigured, ExecutionProviderUnavailable,
            InvalidContract, InvalidPrice, KeyInformationDocumentRequired,
            LiquidationOnly, LiquidationOnlyBeforeExpiration,
            MaxOrderQtyIsNotSpecified, MaxOrderQtyLimitReached,
            MaxPosLimitMisconfigured, MaxPosLimitReached,
            MaxTotalPosLimitReached, MultipleAccountPlanRequired, NoQuote,
            NotEnoughLiquidity, OtherExecutionRelated, ParentRejected,
            RiskCheckTimeout, SSFNFAComplianceRequired,
            SSFNFAComplianceRequiredJointOnly,
            SSFRiskDisclosureAcknowledgmentRequired, SessionClosed, Success,
            TooLate, TradingLocked, TrailingStopNonOrderQtyModify, Unauthorized,
            UnknownReason, Unsupported
        failureText:
          type: string
        orderId:
          type: integer
          format: int64
        oso1Id:
          type: integer
          format: int64
        oso2Id:
          type: integer
          format: int64
      title: PlaceOsoResult
  securitySchemes:
    bearer_access_token:
      type: http
      scheme: bearer

```

## Examples



**Request**

```json
{
  "action": "Buy",
  "symbol": "string",
  "orderQty": 1,
  "orderType": "Limit",
  "bracket1": {
    "action": "Buy",
    "orderType": "Limit"
  }
}
```

**Response**

```json
{
  "failureReason": "AccountClosed",
  "failureText": "string",
  "orderId": 1,
  "oso1Id": 1,
  "oso2Id": 1
}
```

**SDK Code**

```python
import requests

url = "https://live.tradovateapi.com/v1/order/placeoso"

payload = {
    "action": "Buy",
    "symbol": "string",
    "orderQty": 1,
    "orderType": "Limit",
    "bracket1": {
        "action": "Buy",
        "orderType": "Limit"
    }
}
headers = {
    "Authorization": "Bearer <token>",
    "Content-Type": "application/json"
}

response = requests.post(url, json=payload, headers=headers)

print(response.json())
```

```javascript
const url = 'https://live.tradovateapi.com/v1/order/placeoso';
const options = {
  method: 'POST',
  headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
  body: '{"action":"Buy","symbol":"string","orderQty":1,"orderType":"Limit","bracket1":{"action":"Buy","orderType":"Limit"}}'
};

try {
  const response = await fetch(url, options);
  const data = await response.json();
  console.log(data);
} catch (error) {
  console.error(error);
}
```

```go
package main

import (
	"fmt"
	"strings"
	"net/http"
	"io"
)

func main() {

	url := "https://live.tradovateapi.com/v1/order/placeoso"

	payload := strings.NewReader("{\n  \"action\": \"Buy\",\n  \"symbol\": \"string\",\n  \"orderQty\": 1,\n  \"orderType\": \"Limit\",\n  \"bracket1\": {\n    \"action\": \"Buy\",\n    \"orderType\": \"Limit\"\n  }\n}")

	req, _ := http.NewRequest("POST", url, payload)

	req.Header.Add("Authorization", "Bearer <token>")
	req.Header.Add("Content-Type", "application/json")

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
```

```ruby
require 'uri'
require 'net/http'

url = URI("https://live.tradovateapi.com/v1/order/placeoso")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n  \"action\": \"Buy\",\n  \"symbol\": \"string\",\n  \"orderQty\": 1,\n  \"orderType\": \"Limit\",\n  \"bracket1\": {\n    \"action\": \"Buy\",\n    \"orderType\": \"Limit\"\n  }\n}"

response = http.request(request)
puts response.read_body
```

```java
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

HttpResponse<String> response = Unirest.post("https://live.tradovateapi.com/v1/order/placeoso")
  .header("Authorization", "Bearer <token>")
  .header("Content-Type", "application/json")
  .body("{\n  \"action\": \"Buy\",\n  \"symbol\": \"string\",\n  \"orderQty\": 1,\n  \"orderType\": \"Limit\",\n  \"bracket1\": {\n    \"action\": \"Buy\",\n    \"orderType\": \"Limit\"\n  }\n}")
  .asString();
```

```php
<?php
require_once('vendor/autoload.php');

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://live.tradovateapi.com/v1/order/placeoso', [
  'body' => '{
  "action": "Buy",
  "symbol": "string",
  "orderQty": 1,
  "orderType": "Limit",
  "bracket1": {
    "action": "Buy",
    "orderType": "Limit"
  }
}',
  'headers' => [
    'Authorization' => 'Bearer <token>',
    'Content-Type' => 'application/json',
  ],
]);

echo $response->getBody();
```

```csharp
using RestSharp;

var client = new RestClient("https://live.tradovateapi.com/v1/order/placeoso");
var request = new RestRequest(Method.POST);
request.AddHeader("Authorization", "Bearer <token>");
request.AddHeader("Content-Type", "application/json");
request.AddParameter("application/json", "{\n  \"action\": \"Buy\",\n  \"symbol\": \"string\",\n  \"orderQty\": 1,\n  \"orderType\": \"Limit\",\n  \"bracket1\": {\n    \"action\": \"Buy\",\n    \"orderType\": \"Limit\"\n  }\n}", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
```

```swift
import Foundation

let headers = [
  "Authorization": "Bearer <token>",
  "Content-Type": "application/json"
]
let parameters = [
  "action": "Buy",
  "symbol": "string",
  "orderQty": 1,
  "orderType": "Limit",
  "bracket1": [
    "action": "Buy",
    "orderType": "Limit"
  ]
] as [String : Any]

let postData = JSONSerialization.data(withJSONObject: parameters, options: [])

let request = NSMutableURLRequest(url: NSURL(string: "https://live.tradovateapi.com/v1/order/placeoso")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "POST"
request.allHTTPHeaderFields = headers
request.httpBody = postData as Data

let session = URLSession.shared
let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
  if (error != nil) {
    print(error as Any)
  } else {
    let httpResponse = response as? HTTPURLResponse
    print(httpResponse)
  }
})

dataTask.resume()
```