1. Fetch the profile
200 OK:
404, not a 403 - membership is what makes them
visible to you. The profile is the redacted partner view: you get the
derived age_band, never the raw dob.
2. Update profile fields
PATCH takes any subset of the profile fields:
200 OK returns the updated user. Validation matches creation: country
must be an assigned ISO alpha-2 code, dob a real past date.
3. Set typed attributes
Beyond the fixed profile, your org’s enabled attribute registry holds custom typed fields (Members). Write values by key:200 OK:
single_choice
attribute rejects values outside its configured choice list, an attribute key
your org hasn’t enabled is rejected outright. Every stored value carries
provenance, so an API-written value is always distinguishable from one an
admin, the member, or a bulk import wrote.
To clear a value, send the key with "clear": true and no value. Set and
clear entries can share one request; each key may appear only once:
200 OK. The cleared value is deleted, so the response lists only the values
that were set:
"" is a value, and a choice
attribute rejects it. An entry with both clear: true and a value, an entry
with neither, or a key repeated in one request is rejected with
422 ATTRIBUTE_INVALID_VALUE.
4. Read stored attributes
200 OK:
updated_at is the stored value’s last update as an ISO timestamp. Unset and cleared values are absent. A member with no stored values returns { "values": [] }. Unknown, removed and other-organization members return 404.
Core profile fields, including raw date of birth, are absent because they have no attribute-value row. Read those through the profile endpoint, which redacts raw DOB for partner readers. This attribute read creates no audit, attribute or idempotency records and ignores Idempotency-Key.