> This page is for NT Prop.

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

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

### Batch create up to 100 organization users at once.**Available to:** Organization administrators**Environments:** Live**[Rate Limit](/prop/overview/core-concepts/rate-limits):** 100 requests per hour, 1-second back-off, counts failed requests onlyRequests with `firstName` and `lastName` fields exceeding a combined 60 characters are rejected, despite each field individually allowing up to 64 characters.This endpoint can help reduce your application's API usage footprint. It batches the functionality of several calls at once for each `EvaluationUser` configuration object:- Provide a `tradovateSubscriptionPlanId` integer value matching one of your organization-specific Tradovate Subscription plans to assign that membership to the created user without invoking an additional call.
- Provide an `entitlementIds` integer array to pre-assign entitlement subscriptions with matching IDs to the user. One common use case is assigning your organization's TradingView entitlement.Do not include entitlement ID 22 (GroupTrade) in `entitlementIds`. Requests that pass entitlement ID 22 fail, and no users are created. Entitlement ID 22 is deprecated: Group Trading is now standard for any user with two or more accounts in the same environment and no longer requires an entitlement.Use this endpoint when creating new users to minimize API traffic.Users are created individually. When a single user fails to create, that user's entry in the `results` array contains an `errorText` describing the failure, and the remaining users are still created; each successful entry includes the new user's `userId`.**Common Failure Scenarios**- The `users` array is empty or contains more than 100 entries.
- A `tradovateSubscriptionPlanId` or `entitlementIds` value doesn't match a plan or entitlement available to your organization. This fails the entire request; no users are created.
- A user's combined `firstName` and `lastName` exceeds 60 characters.
- Your organization is not currently allowed to add new users.**Error Messages**Access failures reject the whole request and are returned as an `HTTP 401` response with the message text as the response body:| `errorText`                                     | Trigger                                              |
| ----------------------------------------------- | ---------------------------------------------------- |
| `"Users cannot be added for this organization"` | New-user creation is disabled for your organization. |***Note***: This endpoint replaces [/user/signUpOrganizationMember](/prop/api/rest-api-endpoints/users/sign-up-organization-member), [/user/addTradovateSubscription](/prop/api/rest-api-endpoints/users/add-tradovate-subscription), and [/userPlugin/addEntitlementSubscription](/prop/api/rest-api-endpoints/users/add-entitlement-subscription).

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

## Authentication

- `Authorization` header (bearer token, required) — Bearer authentication of the form `Bearer <token>`, where token is your auth token.

## Request

### Body (application/json)

This endpoint expects a CreateEvaluationUsers.

- `users` (list of EvaluationUser, required)

## Response

### 200

CreateEvaluationUsersResponse

- `results` (list of CreateEvaluationUserResponse, required)
- `errorText` (string, optional) — Non-empty if the request failed

## Types

### EvaluationUser

- `name` (string, required)
- `email` (string, required)
- `password` (string, required)
- `firstName` (string, required)
- `lastName` (string, required)
- `tradovateSubscriptionPlanId` (long, optional)
- `entitlementIds` (list of long, optional)

### CreateEvaluationUserResponse

- `errorText` (string, optional)
- `userId` (long, optional)

## Examples

**Request**

```json
{
  "users": [
    {
      "name": "string",
      "email": "string",
      "password": "string",
      "firstName": "string",
      "lastName": "string"
    }
  ]
}
```

**Response**

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

**SDK Code**

```python
import requests

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

payload = { "users": [
        {
            "name": "string",
            "email": "string",
            "password": "string",
            "firstName": "string",
            "lastName": "string"
        }
    ] }
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/createevaluationusers';
const options = {
  method: 'POST',
  headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
  body: '{"users":[{"name":"string","email":"string","password":"string","firstName":"string","lastName":"string"}]}'
};

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/createevaluationusers"

	payload := strings.NewReader("{\n  \"users\": [\n    {\n      \"name\": \"string\",\n      \"email\": \"string\",\n      \"password\": \"string\",\n      \"firstName\": \"string\",\n      \"lastName\": \"string\"\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/createevaluationusers")

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  \"users\": [\n    {\n      \"name\": \"string\",\n      \"email\": \"string\",\n      \"password\": \"string\",\n      \"firstName\": \"string\",\n      \"lastName\": \"string\"\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/createevaluationusers")
  .header("Authorization", "Bearer <token>")
  .header("Content-Type", "application/json")
  .body("{\n  \"users\": [\n    {\n      \"name\": \"string\",\n      \"email\": \"string\",\n      \"password\": \"string\",\n      \"firstName\": \"string\",\n      \"lastName\": \"string\"\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/createevaluationusers', [
  'body' => '{
  "users": [
    {
      "name": "string",
      "email": "string",
      "password": "string",
      "firstName": "string",
      "lastName": "string"
    }
  ]
}',
  'headers' => [
    'Authorization' => 'Bearer <token>',
    'Content-Type' => 'application/json',
  ],
]);

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

```csharp
using RestSharp;

var client = new RestClient("https://live.tradovateapi.com/v1/user/createevaluationusers");
var request = new RestRequest(Method.POST);
request.AddHeader("Authorization", "Bearer <token>");
request.AddHeader("Content-Type", "application/json");
request.AddParameter("application/json", "{\n  \"users\": [\n    {\n      \"name\": \"string\",\n      \"email\": \"string\",\n      \"password\": \"string\",\n      \"firstName\": \"string\",\n      \"lastName\": \"string\"\n    }\n  ]\n}", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
```

```swift
import Foundation

let headers = [
  "Authorization": "Bearer <token>",
  "Content-Type": "application/json"
]
let parameters = ["users": [
    [
      "name": "string",
      "email": "string",
      "password": "string",
      "firstName": "string",
      "lastName": "string"
    ]
  ]] as [String : Any]

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

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