Update user profile
Updates the authenticated user’s profile. All fields are optional. Nationality should be ISO 3166-1 alpha-2 code (e.g., US, GB, NL). Username can only be changed once every 30 days. If the user has no profile yet, one is auto-created with a private placeholder username (user + id prefix) and the updates are applied to it — completing KYC never requires visiting the profile page first.
curl --request PUT \
--url https://api.hyperprop.com/platform/v1/user/profile \
--header 'Content-Type: application/json' \
--data '
{
"username": "johndoe2",
"displayName": "John Doe",
"name": "John Michael Doe",
"avatarUrl": "https://example.com/new-avatar.jpg",
"bio": "Updated bio",
"firstName": "John",
"lastName": "Doe",
"dateOfBirth": "1990-05-15",
"nationality": "US",
"countryOfResidence": "US",
"address1": "123 Main St",
"address2": "Apt 4B",
"city": "New York",
"region": "NY",
"postal": "10001",
"isPublic": true,
"socialLinks": [
{
"url": "<string>"
}
],
"showBadgesBehindName": true,
"tradingIdentity": [],
"showPnlAmount": true,
"pnlAsPercent": true
}
'import requests
url = "https://api.hyperprop.com/platform/v1/user/profile"
payload = {
"username": "johndoe2",
"displayName": "John Doe",
"name": "John Michael Doe",
"avatarUrl": "https://example.com/new-avatar.jpg",
"bio": "Updated bio",
"firstName": "John",
"lastName": "Doe",
"dateOfBirth": "1990-05-15",
"nationality": "US",
"countryOfResidence": "US",
"address1": "123 Main St",
"address2": "Apt 4B",
"city": "New York",
"region": "NY",
"postal": "10001",
"isPublic": True,
"socialLinks": [{ "url": "<string>" }],
"showBadgesBehindName": True,
"tradingIdentity": [],
"showPnlAmount": True,
"pnlAsPercent": True
}
headers = {"Content-Type": "application/json"}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
username: 'johndoe2',
displayName: 'John Doe',
name: 'John Michael Doe',
avatarUrl: 'https://example.com/new-avatar.jpg',
bio: 'Updated bio',
firstName: 'John',
lastName: 'Doe',
dateOfBirth: '1990-05-15',
nationality: 'US',
countryOfResidence: 'US',
address1: '123 Main St',
address2: 'Apt 4B',
city: 'New York',
region: 'NY',
postal: '10001',
isPublic: true,
socialLinks: [{url: '<string>'}],
showBadgesBehindName: true,
tradingIdentity: [],
showPnlAmount: true,
pnlAsPercent: true
})
};
fetch('https://api.hyperprop.com/platform/v1/user/profile', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.hyperprop.com/platform/v1/user/profile",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => json_encode([
'username' => 'johndoe2',
'displayName' => 'John Doe',
'name' => 'John Michael Doe',
'avatarUrl' => 'https://example.com/new-avatar.jpg',
'bio' => 'Updated bio',
'firstName' => 'John',
'lastName' => 'Doe',
'dateOfBirth' => '1990-05-15',
'nationality' => 'US',
'countryOfResidence' => 'US',
'address1' => '123 Main St',
'address2' => 'Apt 4B',
'city' => 'New York',
'region' => 'NY',
'postal' => '10001',
'isPublic' => true,
'socialLinks' => [
[
'url' => '<string>'
]
],
'showBadgesBehindName' => true,
'tradingIdentity' => [
],
'showPnlAmount' => true,
'pnlAsPercent' => true
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.hyperprop.com/platform/v1/user/profile"
payload := strings.NewReader("{\n \"username\": \"johndoe2\",\n \"displayName\": \"John Doe\",\n \"name\": \"John Michael Doe\",\n \"avatarUrl\": \"https://example.com/new-avatar.jpg\",\n \"bio\": \"Updated bio\",\n \"firstName\": \"John\",\n \"lastName\": \"Doe\",\n \"dateOfBirth\": \"1990-05-15\",\n \"nationality\": \"US\",\n \"countryOfResidence\": \"US\",\n \"address1\": \"123 Main St\",\n \"address2\": \"Apt 4B\",\n \"city\": \"New York\",\n \"region\": \"NY\",\n \"postal\": \"10001\",\n \"isPublic\": true,\n \"socialLinks\": [\n {\n \"url\": \"<string>\"\n }\n ],\n \"showBadgesBehindName\": true,\n \"tradingIdentity\": [],\n \"showPnlAmount\": true,\n \"pnlAsPercent\": true\n}")
req, _ := http.NewRequest("PUT", url, payload)
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.put("https://api.hyperprop.com/platform/v1/user/profile")
.header("Content-Type", "application/json")
.body("{\n \"username\": \"johndoe2\",\n \"displayName\": \"John Doe\",\n \"name\": \"John Michael Doe\",\n \"avatarUrl\": \"https://example.com/new-avatar.jpg\",\n \"bio\": \"Updated bio\",\n \"firstName\": \"John\",\n \"lastName\": \"Doe\",\n \"dateOfBirth\": \"1990-05-15\",\n \"nationality\": \"US\",\n \"countryOfResidence\": \"US\",\n \"address1\": \"123 Main St\",\n \"address2\": \"Apt 4B\",\n \"city\": \"New York\",\n \"region\": \"NY\",\n \"postal\": \"10001\",\n \"isPublic\": true,\n \"socialLinks\": [\n {\n \"url\": \"<string>\"\n }\n ],\n \"showBadgesBehindName\": true,\n \"tradingIdentity\": [],\n \"showPnlAmount\": true,\n \"pnlAsPercent\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.hyperprop.com/platform/v1/user/profile")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"username\": \"johndoe2\",\n \"displayName\": \"John Doe\",\n \"name\": \"John Michael Doe\",\n \"avatarUrl\": \"https://example.com/new-avatar.jpg\",\n \"bio\": \"Updated bio\",\n \"firstName\": \"John\",\n \"lastName\": \"Doe\",\n \"dateOfBirth\": \"1990-05-15\",\n \"nationality\": \"US\",\n \"countryOfResidence\": \"US\",\n \"address1\": \"123 Main St\",\n \"address2\": \"Apt 4B\",\n \"city\": \"New York\",\n \"region\": \"NY\",\n \"postal\": \"10001\",\n \"isPublic\": true,\n \"socialLinks\": [\n {\n \"url\": \"<string>\"\n }\n ],\n \"showBadgesBehindName\": true,\n \"tradingIdentity\": [],\n \"showPnlAmount\": true,\n \"pnlAsPercent\": true\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"message": "Profile updated successfully",
"data": {
"profile": {
"id": "550e8400-e29b-41d4-a716-446655440000",
"username": "johndoe2",
"display_name": "John Doe",
"name": "John Michael Doe",
"avatar_url": "https://example.com/new-avatar.jpg",
"bio": "Updated bio",
"date_of_birth": "1990-05-15",
"nationality": "US",
"is_public": true
}
}
}{
"statusCode": 400,
"error": "Bad Request",
"message": "You can only change your username once every 30 days. You can change it again in 15 days.",
"code": "USERNAME_COOLDOWN",
"data": {
"nextChangeDate": "2025-02-15T10:00:00.000Z",
"daysSinceLastChange": 15
}
}{
"success": false,
"statusCode": 401,
"error": "Unauthorized",
"message": "Authentication required",
"code": "UNAUTHORIZED"
}{
"success": false,
"statusCode": 409,
"error": "Conflict",
"message": "Username is already taken",
"code": "USERNAME_TAKEN"
}{
"success": false,
"statusCode": 500,
"error": "Internal Server Error",
"message": "An unexpected error occurred",
"code": "INTERNAL_ERROR"
}Body
2 - 24^[a-zA-Z0-9]+$"johndoe2"
2 - 50^[a-zA-Z\s\-']+$"John Doe"
2 - 100^[a-zA-Z\s\-']+$"John Michael Doe"
"https://example.com/new-avatar.jpg"
280"Updated bio"
1 - 50^[a-zA-Z\s\-']+$"John"
1 - 50^[a-zA-Z\s\-']+$"Doe"
"1990-05-15"
"US"
"US"
200"123 Main St"
200"Apt 4B"
100"New York"
100"NY"
20"10001"
Whether the profile is publicly visible
true
Public social links (one per platform)
5Show child attributes
Show child attributes
Show pinned badges next to the display name
Selected trading-identity tag ids
5scalper, day-trader, swing-trader, position, long-only, short-only, both-sides, news-trader, overnight-holder, extended-hours, technical, macro, data-driven, intuitive, nq, es, cl, gc, si, zb, 6e, mnq, mes Show the user's P&L amount on public surfaces
Render P&L as a percentage instead of a dollar value
Related topics
Update your organization profileCreate user profileDelete user profileGet user profile by usernameGet own user profilecurl --request PUT \
--url https://api.hyperprop.com/platform/v1/user/profile \
--header 'Content-Type: application/json' \
--data '
{
"username": "johndoe2",
"displayName": "John Doe",
"name": "John Michael Doe",
"avatarUrl": "https://example.com/new-avatar.jpg",
"bio": "Updated bio",
"firstName": "John",
"lastName": "Doe",
"dateOfBirth": "1990-05-15",
"nationality": "US",
"countryOfResidence": "US",
"address1": "123 Main St",
"address2": "Apt 4B",
"city": "New York",
"region": "NY",
"postal": "10001",
"isPublic": true,
"socialLinks": [
{
"url": "<string>"
}
],
"showBadgesBehindName": true,
"tradingIdentity": [],
"showPnlAmount": true,
"pnlAsPercent": true
}
'import requests
url = "https://api.hyperprop.com/platform/v1/user/profile"
payload = {
"username": "johndoe2",
"displayName": "John Doe",
"name": "John Michael Doe",
"avatarUrl": "https://example.com/new-avatar.jpg",
"bio": "Updated bio",
"firstName": "John",
"lastName": "Doe",
"dateOfBirth": "1990-05-15",
"nationality": "US",
"countryOfResidence": "US",
"address1": "123 Main St",
"address2": "Apt 4B",
"city": "New York",
"region": "NY",
"postal": "10001",
"isPublic": True,
"socialLinks": [{ "url": "<string>" }],
"showBadgesBehindName": True,
"tradingIdentity": [],
"showPnlAmount": True,
"pnlAsPercent": True
}
headers = {"Content-Type": "application/json"}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
username: 'johndoe2',
displayName: 'John Doe',
name: 'John Michael Doe',
avatarUrl: 'https://example.com/new-avatar.jpg',
bio: 'Updated bio',
firstName: 'John',
lastName: 'Doe',
dateOfBirth: '1990-05-15',
nationality: 'US',
countryOfResidence: 'US',
address1: '123 Main St',
address2: 'Apt 4B',
city: 'New York',
region: 'NY',
postal: '10001',
isPublic: true,
socialLinks: [{url: '<string>'}],
showBadgesBehindName: true,
tradingIdentity: [],
showPnlAmount: true,
pnlAsPercent: true
})
};
fetch('https://api.hyperprop.com/platform/v1/user/profile', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.hyperprop.com/platform/v1/user/profile",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => json_encode([
'username' => 'johndoe2',
'displayName' => 'John Doe',
'name' => 'John Michael Doe',
'avatarUrl' => 'https://example.com/new-avatar.jpg',
'bio' => 'Updated bio',
'firstName' => 'John',
'lastName' => 'Doe',
'dateOfBirth' => '1990-05-15',
'nationality' => 'US',
'countryOfResidence' => 'US',
'address1' => '123 Main St',
'address2' => 'Apt 4B',
'city' => 'New York',
'region' => 'NY',
'postal' => '10001',
'isPublic' => true,
'socialLinks' => [
[
'url' => '<string>'
]
],
'showBadgesBehindName' => true,
'tradingIdentity' => [
],
'showPnlAmount' => true,
'pnlAsPercent' => true
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.hyperprop.com/platform/v1/user/profile"
payload := strings.NewReader("{\n \"username\": \"johndoe2\",\n \"displayName\": \"John Doe\",\n \"name\": \"John Michael Doe\",\n \"avatarUrl\": \"https://example.com/new-avatar.jpg\",\n \"bio\": \"Updated bio\",\n \"firstName\": \"John\",\n \"lastName\": \"Doe\",\n \"dateOfBirth\": \"1990-05-15\",\n \"nationality\": \"US\",\n \"countryOfResidence\": \"US\",\n \"address1\": \"123 Main St\",\n \"address2\": \"Apt 4B\",\n \"city\": \"New York\",\n \"region\": \"NY\",\n \"postal\": \"10001\",\n \"isPublic\": true,\n \"socialLinks\": [\n {\n \"url\": \"<string>\"\n }\n ],\n \"showBadgesBehindName\": true,\n \"tradingIdentity\": [],\n \"showPnlAmount\": true,\n \"pnlAsPercent\": true\n}")
req, _ := http.NewRequest("PUT", url, payload)
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.put("https://api.hyperprop.com/platform/v1/user/profile")
.header("Content-Type", "application/json")
.body("{\n \"username\": \"johndoe2\",\n \"displayName\": \"John Doe\",\n \"name\": \"John Michael Doe\",\n \"avatarUrl\": \"https://example.com/new-avatar.jpg\",\n \"bio\": \"Updated bio\",\n \"firstName\": \"John\",\n \"lastName\": \"Doe\",\n \"dateOfBirth\": \"1990-05-15\",\n \"nationality\": \"US\",\n \"countryOfResidence\": \"US\",\n \"address1\": \"123 Main St\",\n \"address2\": \"Apt 4B\",\n \"city\": \"New York\",\n \"region\": \"NY\",\n \"postal\": \"10001\",\n \"isPublic\": true,\n \"socialLinks\": [\n {\n \"url\": \"<string>\"\n }\n ],\n \"showBadgesBehindName\": true,\n \"tradingIdentity\": [],\n \"showPnlAmount\": true,\n \"pnlAsPercent\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.hyperprop.com/platform/v1/user/profile")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"username\": \"johndoe2\",\n \"displayName\": \"John Doe\",\n \"name\": \"John Michael Doe\",\n \"avatarUrl\": \"https://example.com/new-avatar.jpg\",\n \"bio\": \"Updated bio\",\n \"firstName\": \"John\",\n \"lastName\": \"Doe\",\n \"dateOfBirth\": \"1990-05-15\",\n \"nationality\": \"US\",\n \"countryOfResidence\": \"US\",\n \"address1\": \"123 Main St\",\n \"address2\": \"Apt 4B\",\n \"city\": \"New York\",\n \"region\": \"NY\",\n \"postal\": \"10001\",\n \"isPublic\": true,\n \"socialLinks\": [\n {\n \"url\": \"<string>\"\n }\n ],\n \"showBadgesBehindName\": true,\n \"tradingIdentity\": [],\n \"showPnlAmount\": true,\n \"pnlAsPercent\": true\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"message": "Profile updated successfully",
"data": {
"profile": {
"id": "550e8400-e29b-41d4-a716-446655440000",
"username": "johndoe2",
"display_name": "John Doe",
"name": "John Michael Doe",
"avatar_url": "https://example.com/new-avatar.jpg",
"bio": "Updated bio",
"date_of_birth": "1990-05-15",
"nationality": "US",
"is_public": true
}
}
}{
"statusCode": 400,
"error": "Bad Request",
"message": "You can only change your username once every 30 days. You can change it again in 15 days.",
"code": "USERNAME_COOLDOWN",
"data": {
"nextChangeDate": "2025-02-15T10:00:00.000Z",
"daysSinceLastChange": 15
}
}{
"success": false,
"statusCode": 401,
"error": "Unauthorized",
"message": "Authentication required",
"code": "UNAUTHORIZED"
}{
"success": false,
"statusCode": 409,
"error": "Conflict",
"message": "Username is already taken",
"code": "USERNAME_TAKEN"
}{
"success": false,
"statusCode": 500,
"error": "Internal Server Error",
"message": "An unexpected error occurred",
"code": "INTERNAL_ERROR"
}