Update a member's user profile
curl --request PUT \
--url https://web-api.dev.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.dev.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.dev.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
Not callable with a Sandbox key
A request authenticated with a Sandbox soxai-api-key is answered 403 This endpoint is not available in the sandbox., because it changes state that every Sandbox caller shares. It is published here because the Sandbox runs the same build; use it in Production. See Sandbox.
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.dev.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.dev.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.dev.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.