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

# Update Contact Info

POST https://demo.tradovateapi.com/v1/contactInfo/updatecontactinfo
Content-Type: application/json

### Update the authenticated user's full contact information.

**Available to:** All authenticated users

**Environments:** Live <!-- handler gate: returns "Request should be sent to Live server" on Demo -->

**[Rate Limit](/api/authentication#request-rate-limits-and-time-penalties):** No endpoint-specific limit

Replaces the contact information on file for the user identified by `userId`. The request carries the full contact record: required `firstName`, `lastName`, `streetAddress1`, `city`, `country` (two-letter code), and `phone`, plus optional fields including `streetAddress2`, `state`, `postCode`, a separate mailing address (set `mailingIsDifferent` and the `mailing*` fields), and joint-account names (`jointFirstName`, `jointLastName`).

Whether the change applies immediately or is held for review depends on the account. For users whose contact changes require approval and who hold one or more accounts, the update is recorded as a pending change and takes effect only after it is approved. Otherwise the update is applied directly. On success the response returns the resulting `contactInfo`.

This endpoint operates against Live. On Demo it returns an error indicating the request must be sent to the Live server.

To change only the name, country, and phone without sending the full address record, use [`updateContactInfoName`](/api/rest-api-endpoints/users/update-contact-info-name).

<Info>Requests with `firstName` and `lastName` fields exceeding a combined 60 characters are rejected, despite each field individually allowing up to 64 characters. The same limit applies to `jointFirstName` and `jointLastName`.</Info>

**Common Failure Scenarios**

- A required field is missing, or `country`/`mailingCountry` is not a two-letter code.
- The combined `firstName` and `lastName` length exceeds 60 characters.
- The request is sent to a Demo server instead of Live.

**Error Messages**

| `errorText` | Trigger |
|-------------|---------|
| `Request should be sent to Live server` | The request was sent to a Demo server; contact-info updates are processed on Live only. |
| `Failed to update contact info: <id>. Please retry` | The update could not be persisted; retry the request. |
| Non-empty `errorText` | The request failed; the field describes the reason. |

Reference: https://docs.ninjatrader.com/api/rest-api-endpoints/users/update-contact-info

## OpenAPI Specification

```yaml
openapi: 3.1.0
info:
  title: public
  version: 1.0.0
paths:
  /contactInfo/updatecontactinfo:
    post:
      operationId: updateContactInfo
      summary: Update Contact Info
      description: >-
        ### Update the authenticated user's full contact information.


        **Available to:** All authenticated users


        **Environments:** Live <!-- handler gate: returns "Request should be
        sent to Live server" on Demo -->


        **[Rate
        Limit](/api/authentication#request-rate-limits-and-time-penalties):** No
        endpoint-specific limit


        Replaces the contact information on file for the user identified by
        `userId`. The request carries the full contact record: required
        `firstName`, `lastName`, `streetAddress1`, `city`, `country` (two-letter
        code), and `phone`, plus optional fields including `streetAddress2`,
        `state`, `postCode`, a separate mailing address (set
        `mailingIsDifferent` and the `mailing*` fields), and joint-account names
        (`jointFirstName`, `jointLastName`).


        Whether the change applies immediately or is held for review depends on
        the account. For users whose contact changes require approval and who
        hold one or more accounts, the update is recorded as a pending change
        and takes effect only after it is approved. Otherwise the update is
        applied directly. On success the response returns the resulting
        `contactInfo`.


        This endpoint operates against Live. On Demo it returns an error
        indicating the request must be sent to the Live server.


        To change only the name, country, and phone without sending the full
        address record, use
        [`updateContactInfoName`](/api/rest-api-endpoints/users/update-contact-info-name).


        <Info>Requests with `firstName` and `lastName` fields exceeding a
        combined 60 characters are rejected, despite each field individually
        allowing up to 64 characters. The same limit applies to `jointFirstName`
        and `jointLastName`.</Info>


        **Common Failure Scenarios**


        - A required field is missing, or `country`/`mailingCountry` is not a
        two-letter code.

        - The combined `firstName` and `lastName` length exceeds 60 characters.

        - The request is sent to a Demo server instead of Live.


        **Error Messages**


        | `errorText` | Trigger |

        |-------------|---------|

        | `Request should be sent to Live server` | The request was sent to a
        Demo server; contact-info updates are processed on Live only. |

        | `Failed to update contact info: <id>. Please retry` | The update could
        not be persisted; retry the request. |

        | Non-empty `errorText` | The request failed; the field describes the
        reason. |
      tags:
        - Users
      parameters:
        - name: Authorization
          in: header
          description: Bearer authentication
          required: true
          schema:
            type: string
      responses:
        '200':
          description: UpdateContactInfoResponse
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UpdateContactInfoResponse'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/UpdateContactInfo'
servers:
  - url: https://demo.tradovateapi.com/v1
    description: Demo
  - url: https://live.tradovateapi.com/v1
    description: Live
components:
  schemas:
    UpdateContactInfo:
      type: object
      properties:
        userId:
          type: integer
          format: int64
        firstName:
          type: string
        lastName:
          type: string
        streetAddress1:
          type: string
        streetAddress2:
          type: string
        city:
          type: string
        state:
          type: string
        postCode:
          type: string
        country:
          type: string
        phone:
          type: string
        mailingIsDifferent:
          type: boolean
        mailingStreetAddress1:
          type: string
        mailingStreetAddress2:
          type: string
        mailingCity:
          type: string
        mailingState:
          type: string
        mailingPostCode:
          type: string
        mailingCountry:
          type: string
        approvedId:
          type: integer
          format: int64
        jointFirstName:
          type: string
        jointLastName:
          type: string
      required:
        - userId
        - firstName
        - lastName
        - streetAddress1
        - city
        - country
        - phone
      title: UpdateContactInfo
    ContactInfo:
      type: object
      properties:
        id:
          type: integer
          format: int64
        userId:
          type: integer
          format: int64
        firstName:
          type: string
        lastName:
          type: string
        streetAddress1:
          type: string
        streetAddress2:
          type: string
        city:
          type: string
        state:
          type: string
        postCode:
          type: string
        country:
          type: string
        phone:
          type: string
        mailingIsDifferent:
          type: boolean
        mailingStreetAddress1:
          type: string
        mailingStreetAddress2:
          type: string
        mailingCity:
          type: string
        mailingState:
          type: string
        mailingPostCode:
          type: string
        mailingCountry:
          type: string
        approvedId:
          type: integer
          format: int64
        jointFirstName:
          type: string
        jointLastName:
          type: string
        iraCustodianName:
          type: string
      required:
        - userId
        - firstName
        - lastName
        - streetAddress1
        - city
        - country
        - phone
      title: ContactInfo
    UpdateContactInfoResponse:
      type: object
      properties:
        errorText:
          type: string
          description: Non-empty if the request failed
        contactInfo:
          $ref: '#/components/schemas/ContactInfo'
      title: UpdateContactInfoResponse
  securitySchemes:
    bearer_access_token:
      type: http
      scheme: bearer

```

## Examples



**Request**

```json
{
  "userId": 1,
  "firstName": "string",
  "lastName": "string",
  "streetAddress1": "string",
  "city": "string",
  "country": "string",
  "phone": "string"
}
```

**Response**

```json
{
  "errorText": "string",
  "contactInfo": {
    "userId": 1,
    "firstName": "string",
    "lastName": "string",
    "streetAddress1": "string",
    "city": "string",
    "country": "string",
    "phone": "string",
    "id": 1,
    "streetAddress2": "string",
    "state": "string",
    "postCode": "string",
    "mailingIsDifferent": true,
    "mailingStreetAddress1": "string",
    "mailingStreetAddress2": "string",
    "mailingCity": "string",
    "mailingState": "string",
    "mailingPostCode": "string",
    "mailingCountry": "string",
    "approvedId": 1,
    "jointFirstName": "string",
    "jointLastName": "string",
    "iraCustodianName": "string"
  }
}
```

**SDK Code**

```python
import requests

url = "https://demo.tradovateapi.com/v1/contactInfo/updatecontactinfo"

payload = {
    "userId": 1,
    "firstName": "string",
    "lastName": "string",
    "streetAddress1": "string",
    "city": "string",
    "country": "string",
    "phone": "string"
}
headers = {
    "Authorization": "Bearer <token>",
    "Content-Type": "application/json"
}

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

print(response.json())
```

```javascript
const url = 'https://demo.tradovateapi.com/v1/contactInfo/updatecontactinfo';
const options = {
  method: 'POST',
  headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
  body: '{"userId":1,"firstName":"string","lastName":"string","streetAddress1":"string","city":"string","country":"string","phone":"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://demo.tradovateapi.com/v1/contactInfo/updatecontactinfo"

	payload := strings.NewReader("{\n  \"userId\": 1,\n  \"firstName\": \"string\",\n  \"lastName\": \"string\",\n  \"streetAddress1\": \"string\",\n  \"city\": \"string\",\n  \"country\": \"string\",\n  \"phone\": \"string\"\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://demo.tradovateapi.com/v1/contactInfo/updatecontactinfo")

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  \"userId\": 1,\n  \"firstName\": \"string\",\n  \"lastName\": \"string\",\n  \"streetAddress1\": \"string\",\n  \"city\": \"string\",\n  \"country\": \"string\",\n  \"phone\": \"string\"\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://demo.tradovateapi.com/v1/contactInfo/updatecontactinfo")
  .header("Authorization", "Bearer <token>")
  .header("Content-Type", "application/json")
  .body("{\n  \"userId\": 1,\n  \"firstName\": \"string\",\n  \"lastName\": \"string\",\n  \"streetAddress1\": \"string\",\n  \"city\": \"string\",\n  \"country\": \"string\",\n  \"phone\": \"string\"\n}")
  .asString();
```

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

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://demo.tradovateapi.com/v1/contactInfo/updatecontactinfo', [
  'body' => '{
  "userId": 1,
  "firstName": "string",
  "lastName": "string",
  "streetAddress1": "string",
  "city": "string",
  "country": "string",
  "phone": "string"
}',
  'headers' => [
    'Authorization' => 'Bearer <token>',
    'Content-Type' => 'application/json',
  ],
]);

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

```csharp
using RestSharp;

var client = new RestClient("https://demo.tradovateapi.com/v1/contactInfo/updatecontactinfo");
var request = new RestRequest(Method.POST);
request.AddHeader("Authorization", "Bearer <token>");
request.AddHeader("Content-Type", "application/json");
request.AddParameter("application/json", "{\n  \"userId\": 1,\n  \"firstName\": \"string\",\n  \"lastName\": \"string\",\n  \"streetAddress1\": \"string\",\n  \"city\": \"string\",\n  \"country\": \"string\",\n  \"phone\": \"string\"\n}", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
```

```swift
import Foundation

let headers = [
  "Authorization": "Bearer <token>",
  "Content-Type": "application/json"
]
let parameters = [
  "userId": 1,
  "firstName": "string",
  "lastName": "string",
  "streetAddress1": "string",
  "city": "string",
  "country": "string",
  "phone": "string"
] as [String : Any]

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

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