> 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.

# Create Evaluation Accounts

POST https://live.tradovateapi.com/v1/user/createevaluationaccounts
Content-Type: application/json

### Batch create up to 100 simulation accounts at once.
A higher level B2B Partner operation that can help to greatly reduce your application's API usage footprint. This call is able to batch the functionality of several calls at once for each EvaluationAccount configuration object provided:
- The `userId` field controls which user will be assigned a Trading Permission for this account once it is created.
- Providing a `preTradeRisk` will allow you to apply `userAccountPositionLimit` and `userAccountRiskParameter` settings directly.
- Providing a `postTradeRisk` will allow you to set the `userAccountAutoLiq` settings directly.

It is strongly advised to use this endpoint when creating new accounts to minimize API traffic.

***Note***: This endpoint replaces [/user/openDemoAccount](/api/rest-api-endpoints/users/open-demo-account) and [/user/createTradingPermission](/api/rest-api-endpoints/users/create-trading-permission).

Reference: https://partner.ninjatrader.com/eval/api/rest-api-endpoints/users/create-evaluation-accounts

## OpenAPI Specification

```yaml
openapi: 3.1.0
info:
  title: eval
  version: 1.0.0
paths:
  /user/createevaluationaccounts:
    post:
      operationId: create-evaluation-accounts
      summary: Create Evaluation Accounts
      description: >-
        ### Batch create up to 100 simulation accounts at once.

        A higher level B2B Partner operation that can help to greatly reduce
        your application's API usage footprint. This call is able to batch the
        functionality of several calls at once for each EvaluationAccount
        configuration object provided:

        - The `userId` field controls which user will be assigned a Trading
        Permission for this account once it is created.

        - Providing a `preTradeRisk` will allow you to apply
        `userAccountPositionLimit` and `userAccountRiskParameter` settings
        directly.

        - Providing a `postTradeRisk` will allow you to set the
        `userAccountAutoLiq` settings directly.


        It is strongly advised to use this endpoint when creating new accounts
        to minimize API traffic.


        ***Note***: This endpoint replaces
        [/user/openDemoAccount](/api/rest-api-endpoints/users/open-demo-account)
        and
        [/user/createTradingPermission](/api/rest-api-endpoints/users/create-trading-permission).
      tags:
        - subpackage_users
      parameters:
        - name: Authorization
          in: header
          description: Bearer authentication
          required: true
          schema:
            type: string
      responses:
        '200':
          description: CreateEvaluationAccountsResponse
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CreateEvaluationAccountsResponse'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateEvaluationAccounts'
servers:
  - url: https://live.tradovateapi.com/v1
    description: https://live.tradovateapi.com/v1
components:
  schemas:
    PreTradeRiskProductType:
      type: string
      enum:
        - CommonStock
        - Continuous
        - Cryptocurrency
        - Futures
        - MarketInternals
        - Options
        - Spread
        - Swap
      description: >-
        CommonStock, Continuous, Cryptocurrency, Futures, MarketInternals,
        Options, Spread, Swap
      title: PreTradeRiskProductType
    PreTradeRiskProductVerificationStatus:
      type: string
      enum:
        - Inactive
        - Locked
        - ReadyForContracts
        - ReadyToTrade
        - Verified
      description: Inactive, Locked, ReadyForContracts, ReadyToTrade, Verified
      title: PreTradeRiskProductVerificationStatus
    PreTradeRiskTotalBy:
      type: string
      enum:
        - Contract
        - ContractGroup
        - DiscountGroup
        - Exchange
        - FungibleProduct
        - Overall
        - Product
        - ProductType
      description: >-
        Contract, ContractGroup, DiscountGroup, Exchange, FungibleProduct,
        Overall, Product, ProductType
      title: PreTradeRiskTotalBy
    PreTradeRiskParameterProductType:
      type: string
      enum:
        - CommonStock
        - Continuous
        - Cryptocurrency
        - Futures
        - MarketInternals
        - Options
        - Spread
        - Swap
      description: >-
        CommonStock, Continuous, Cryptocurrency, Futures, MarketInternals,
        Options, Spread, Swap
      title: PreTradeRiskParameterProductType
    PreTradeRiskParameterProductVerificationStatus:
      type: string
      enum:
        - Inactive
        - Locked
        - ReadyForContracts
        - ReadyToTrade
        - Verified
      description: Inactive, Locked, ReadyForContracts, ReadyToTrade, Verified
      title: PreTradeRiskParameterProductVerificationStatus
    PreTradeRiskParameter:
      type: object
      properties:
        contractId:
          type: integer
          format: int64
        productId:
          type: integer
          format: int64
        exchangeId:
          type: integer
          format: int64
        productType:
          $ref: '#/components/schemas/PreTradeRiskParameterProductType'
          description: >-
            CommonStock, Continuous, Cryptocurrency, Futures, MarketInternals,
            Options, Spread, Swap
        riskDiscountContractGroupId:
          type: integer
          format: int64
        productVerificationStatus:
          $ref: '#/components/schemas/PreTradeRiskParameterProductVerificationStatus'
          description: Inactive, Locked, ReadyForContracts, ReadyToTrade, Verified
        contractGroupId:
          type: integer
          format: int64
        fungibleProductId:
          type: integer
          format: int64
        maxOpeningOrderQty:
          type: integer
        maxClosingOrderQty:
          type: integer
        fungibleMaxOpeningOrderQty:
          type: integer
        fungibleMaxClosingOrderQty:
          type: integer
        maxBackMonth:
          type: integer
        preExpirationDays:
          type: integer
        marginPercentage:
          type: number
          format: double
        marginDollarValue:
          type: number
          format: double
        hardLimit:
          type: boolean
      title: PreTradeRiskParameter
    PreTradeRisk:
      type: object
      properties:
        contractId:
          type: integer
          format: int64
        productId:
          type: integer
          format: int64
        exchangeId:
          type: integer
          format: int64
        productType:
          $ref: '#/components/schemas/PreTradeRiskProductType'
          description: >-
            CommonStock, Continuous, Cryptocurrency, Futures, MarketInternals,
            Options, Spread, Swap
        riskDiscountContractGroupId:
          type: integer
          format: int64
        productVerificationStatus:
          $ref: '#/components/schemas/PreTradeRiskProductVerificationStatus'
          description: Inactive, Locked, ReadyForContracts, ReadyToTrade, Verified
        contractGroupId:
          type: integer
          format: int64
        fungibleProductId:
          type: integer
          format: int64
        active:
          type: boolean
        riskTimePeriodId:
          type: integer
          format: int64
        totalBy:
          $ref: '#/components/schemas/PreTradeRiskTotalBy'
          description: >-
            Contract, ContractGroup, DiscountGroup, Exchange, FungibleProduct,
            Overall, Product, ProductType
        shortLimit:
          type: integer
        longLimit:
          type: integer
        exposedLimit:
          type: integer
        fungibleExposedLimit:
          type: integer
        description:
          type: string
        parameters:
          type: array
          items:
            $ref: '#/components/schemas/PreTradeRiskParameter'
      required:
        - active
        - totalBy
        - parameters
      title: PreTradeRisk
    PostTradeRiskTrailingMaxDrawdownMode:
      type: string
      enum:
        - EOD
        - RealTime
      description: EOD, RealTime
      title: PostTradeRiskTrailingMaxDrawdownMode
    PostTradeRisk:
      type: object
      properties:
        marginPercentageAlert:
          type: number
          format: double
          description: Margin % for an Alert
        dailyLossPercentageAlert:
          type: number
          format: double
          description: Daily Loss % for an Alert
        dailyLossAlert:
          type: number
          format: double
          description: $ Daily Loss for an Alert
        marginPercentageLiqOnly:
          type: number
          format: double
          description: Margin % for an Liq Only
        dailyLossPercentageLiqOnly:
          type: number
          format: double
          description: Daily Loss % for an Liq Only
        dailyLossLiqOnly:
          type: number
          format: double
          description: $ Daily Loss for an Liq Only
        marginPercentageAutoLiq:
          type: number
          format: double
          description: Margin % for an Auto-Liq
        dailyLossPercentageAutoLiq:
          type: number
          format: double
          description: Daily Loss % for an AutoLiq
        dailyLossAutoLiq:
          type: number
          format: double
          description: $ Daily Loss for an Auto-Liq
        weeklyLossAutoLiq:
          type: number
          format: double
          description: $ Weekly Loss for an Auto-Liq
        flattenTimestamp:
          type: string
          format: date-time
          description: Flatten &amp; Cancel
        trailingMaxDrawdown:
          type: number
          format: double
          description: $ Trailing Max Drawdown
        trailingMaxDrawdownLimit:
          type: number
          format: double
          description: $ Trailing Max Drawdown Limit
        trailingMaxDrawdownMode:
          $ref: '#/components/schemas/PostTradeRiskTrailingMaxDrawdownMode'
          description: EOD, RealTime
        dailyProfitAutoLiq:
          type: number
          format: double
          description: $ Daily Profit for an Auto-Liq
        weeklyProfitAutoLiq:
          type: number
          format: double
          description: $ Weekly Profit for an Auto-Liq
        doNotUnlock:
          type: boolean
          description: Do not automatically unlock account if triggered
        changesLocked:
          type: boolean
          description: Changes Locked
        steppedUnlimited:
          type: boolean
      title: PostTradeRisk
    EvaluationAccount:
      type: object
      properties:
        userId:
          type: integer
          format: int64
        templateAccountId:
          type: integer
          format: int64
        name:
          type: string
        initialBalance:
          type: number
          format: double
        preTradeRisk:
          type: array
          items:
            $ref: '#/components/schemas/PreTradeRisk'
        postTradeRisk:
          $ref: '#/components/schemas/PostTradeRisk'
      required:
        - userId
        - templateAccountId
        - name
        - initialBalance
      title: EvaluationAccount
    CreateEvaluationAccounts:
      type: object
      properties:
        accounts:
          type: array
          items:
            $ref: '#/components/schemas/EvaluationAccount'
      required:
        - accounts
      title: CreateEvaluationAccounts
    CreateEvaluationAccountResponse:
      type: object
      properties:
        errorText:
          type: string
        accountId:
          type: integer
          format: int64
        tradingPermissionId:
          type: integer
          format: int64
      title: CreateEvaluationAccountResponse
    CreateEvaluationAccountsResponse:
      type: object
      properties:
        errorText:
          type: string
          description: Non-empty if the request failed
        results:
          type: array
          items:
            $ref: '#/components/schemas/CreateEvaluationAccountResponse'
      required:
        - results
      title: CreateEvaluationAccountsResponse
  securitySchemes:
    bearer_access_token:
      type: http
      scheme: bearer

```

## Examples



**Request**

```json
{
  "accounts": [
    {
      "userId": 1,
      "templateAccountId": 1,
      "name": "string",
      "initialBalance": 1.1
    }
  ]
}
```

**Response**

```json
{
  "results": [
    {
      "errorText": "string",
      "accountId": 1,
      "tradingPermissionId": 1
    }
  ],
  "errorText": "string"
}
```

**SDK Code**

```python
import requests

url = "https://live.tradovateapi.com/v1/user/createevaluationaccounts"

payload = { "accounts": [
        {
            "userId": 1,
            "templateAccountId": 1,
            "name": "string",
            "initialBalance": 1.1
        }
    ] }
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/user/createevaluationaccounts';
const options = {
  method: 'POST',
  headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
  body: '{"accounts":[{"userId":1,"templateAccountId":1,"name":"string","initialBalance":1.1}]}'
};

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/user/createevaluationaccounts"

	payload := strings.NewReader("{\n  \"accounts\": [\n    {\n      \"userId\": 1,\n      \"templateAccountId\": 1,\n      \"name\": \"string\",\n      \"initialBalance\": 1.1\n    }\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/user/createevaluationaccounts")

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  \"accounts\": [\n    {\n      \"userId\": 1,\n      \"templateAccountId\": 1,\n      \"name\": \"string\",\n      \"initialBalance\": 1.1\n    }\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/user/createevaluationaccounts")
  .header("Authorization", "Bearer <token>")
  .header("Content-Type", "application/json")
  .body("{\n  \"accounts\": [\n    {\n      \"userId\": 1,\n      \"templateAccountId\": 1,\n      \"name\": \"string\",\n      \"initialBalance\": 1.1\n    }\n  ]\n}")
  .asString();
```

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

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://live.tradovateapi.com/v1/user/createevaluationaccounts', [
  'body' => '{
  "accounts": [
    {
      "userId": 1,
      "templateAccountId": 1,
      "name": "string",
      "initialBalance": 1.1
    }
  ]
}',
  'headers' => [
    'Authorization' => 'Bearer <token>',
    'Content-Type' => 'application/json',
  ],
]);

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

```csharp
using RestSharp;

var client = new RestClient("https://live.tradovateapi.com/v1/user/createevaluationaccounts");
var request = new RestRequest(Method.POST);
request.AddHeader("Authorization", "Bearer <token>");
request.AddHeader("Content-Type", "application/json");
request.AddParameter("application/json", "{\n  \"accounts\": [\n    {\n      \"userId\": 1,\n      \"templateAccountId\": 1,\n      \"name\": \"string\",\n      \"initialBalance\": 1.1\n    }\n  ]\n}", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
```

```swift
import Foundation

let headers = [
  "Authorization": "Bearer <token>",
  "Content-Type": "application/json"
]
let parameters = ["accounts": [
    [
      "userId": 1,
      "templateAccountId": 1,
      "name": "string",
      "initialBalance": 1.1
    ]
  ]] as [String : Any]

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

let request = NSMutableURLRequest(url: NSURL(string: "https://live.tradovateapi.com/v1/user/createevaluationaccounts")! 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()
```