Update a member's user profile
curl --request PUT \
--url https://web-api.soxai.site/api/orgs/{org_id}/orgUsers/{uid}/UserProfile \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '{}'import requests
url = "https://web-api.soxai.site/api/orgs/{org_id}/orgUsers/{uid}/UserProfile"
payload = {}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({})
};
fetch('https://web-api.soxai.site/api/orgs/{org_id}/orgUsers/{uid}/UserProfile', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));{
"firmware_version": 1022,
"device_name": "SOXAI RING",
"last_sync_time": 1756368600000
}{
"error": "bad-request",
"error_msg": "No valid field to update"
}{
"error": "http-error",
"error_msg": "Invalid authentication credentials. <reason>"
}{
"error": "forbidden",
"error_msg": "Not enough permission"
}{
"error": "not-found",
"error_msg": "UserProfile '<uid>' not found"
}{
"error": "unprocessable-entity",
"error_msg": "body.<field>: <validation message>"
}{
"error": "rate-limited",
"error_msg": "Rate limit exceeded. Retry after <n> seconds."
}{
"error": "internal-server-error",
"error_msg": "Failed to fetch data: <error_message>"
}Organization Members
Update a member's user profile
Update fields of a member’s personal profile
({uid}/user_profile).
ring_token and isSOXAITester are never writable through this endpoint and are dropped
from the body. A body left with nothing writable is a 400, not a silent success.
Parameters
org_id(path, required) - organization identifier.uid(path, required) - the member whose profile is written.- Body: an object of profile fields to set. Only the keys present are written.
Response
200returns the updated profile, reduced to the fields the caller may see - so a caller other than the target reads back onlyfirmware_version,device_nameandlast_sync_time.
Errors
| Status | Condition |
|---|---|
| 400 | The body holds no writable field |
| 403 | The target is not a member of org_id, or the caller holds only OrgUser and the target is somebody else. An OrgUser may update only their own profile |
| 404 | The target has no profile document |
Authorization
- Scheme:
Authorization: Bearer <idToken>orsoxai-api-key: <api key>. - Accepted roles:
PartnerAdmin,OrgAdmin,OrgUser Adminis accepted regardless of the roles above.PartnerAdminreaches only an org owned by its own company; any other caller must carry anorgIdclaim naming exactly{org_id}.- Denials: a
PartnerAdminnaming another company’s org receives403 PartnerAdmin can change only the org that belongs to your company; a caller whoseorgIdclaim does not name{org_id}receives403 orgId not match; anyone else receives403 Not enough permission.
PUT
/
api
/
orgs
/
{org_id}
/
orgUsers
/
{uid}
/
UserProfile
Update a member's user profile
curl --request PUT \
--url https://web-api.soxai.site/api/orgs/{org_id}/orgUsers/{uid}/UserProfile \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '{}'import requests
url = "https://web-api.soxai.site/api/orgs/{org_id}/orgUsers/{uid}/UserProfile"
payload = {}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({})
};
fetch('https://web-api.soxai.site/api/orgs/{org_id}/orgUsers/{uid}/UserProfile', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));{
"firmware_version": 1022,
"device_name": "SOXAI RING",
"last_sync_time": 1756368600000
}{
"error": "bad-request",
"error_msg": "No valid field to update"
}{
"error": "http-error",
"error_msg": "Invalid authentication credentials. <reason>"
}{
"error": "forbidden",
"error_msg": "Not enough permission"
}{
"error": "not-found",
"error_msg": "UserProfile '<uid>' not found"
}{
"error": "unprocessable-entity",
"error_msg": "body.<field>: <validation message>"
}{
"error": "rate-limited",
"error_msg": "Rate limit exceeded. Retry after <n> seconds."
}{
"error": "internal-server-error",
"error_msg": "Failed to fetch data: <error_message>"
}Authorizations
HTTPBearerSoxaiApiKey
Path Parameters
Body
application/json
The body is of type User Profile · object.
Response
The updated profile, reduced to the fields the caller may see, so a caller other than the target reads back only firmware_version, device_name and last_sync_time.