Get a member's user profile
curl --request GET \
--url https://web-api.soxai.site/api/orgs/{org_id}/orgUsers/{uid}/UserProfile \
--header 'Authorization: Bearer <token>'import requests
url = "https://web-api.soxai.site/api/orgs/{org_id}/orgUsers/{uid}/UserProfile"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
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": "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
Get a member's user profile
Fetch a member’s personal profile ({uid}/user_profile): their
device and account attributes, as opposed to their roster entry in this organization.
What is returned depends on who asks.
- The target reading their own profile receives every field except
ring_tokenandisSOXAITester. - Anybody else receives only
firmware_version,device_nameandlast_sync_time.
Parameters
org_id(path, required) - organization identifier.uid(path, required) - the member whose profile is read. They must be a member oforg_id; a SOXAIAdmin, and the target themselves, are exempt from that requirement.
Response
200returns the profile object, already reduced to the fields the caller may see. An existing profile holding none of them answers200 {}rather than a 404.
Errors
| Status | Condition |
|---|---|
| 403 | The target is not a member of org_id |
| 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.
GET
/
api
/
orgs
/
{org_id}
/
orgUsers
/
{uid}
/
UserProfile
Get a member's user profile
curl --request GET \
--url https://web-api.soxai.site/api/orgs/{org_id}/orgUsers/{uid}/UserProfile \
--header 'Authorization: Bearer <token>'import requests
url = "https://web-api.soxai.site/api/orgs/{org_id}/orgUsers/{uid}/UserProfile"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
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": "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
Response
The profile, already reduced to the fields the caller may see. An existing profile holding none of them answers with an empty object.