Skip to Content
MuoCeon Docs
v1account context

Account profile

GET /v1/account/me and PATCH /v1/account/me — field table, update semantics and constraints.

/v1/account/me is the account's extended profile. Identity fields come from auth and the extended profile belongs to account; the response keeps them in two blocks instead of flattening them, because merging into one layer would erase "which context owns this field" from the contract entirely.

GET /me

curl 'https://id.example.com/v1/account/me' \
  -H "Authorization: Bearer $ACCOUNT_ACCESS_TOKEN"
{
  "success": true,
  "sub": "usr_...",
  "username": "alice",
  "display_name": "Alice",
  "email": "[email protected]",
  "email_verified": true,
  "created_at": "2026-01-04T10:00:00.000Z",
  "profile": {
    "gender": "female",
    "birthdate": "1994-03-08",
    "age": 32,
    "locale": "zh-Hans",
    "timezone": "Asia/Shanghai",
    "bio": "Hello",
    "metadata": {}
  }
}
FieldOwnerNotes
subauthUnique user identifier
usernameauthUsername, may be null
display_nameauthDisplay name
email / email_verifiedauthPrimary email and its verification state
created_atauthAccount creation time
profile.genderaccountGender, nullable
profile.birthdateaccountBirthdate, YYYY-MM-DD, nullable
profile.ageaccountAge derived from the birthdate, read-only, nullable
profile.localeaccountLanguage preference, nullable
profile.timezoneaccountTime zone, nullable
profile.bioaccountBio, up to 2000 chars
profile.metadataaccountCustom key/value pairs, bounded on write

PATCH /me

Partial update: omitted fields stay unchanged, an explicit null clears a value.

ParameterTypeNotes
genderstring | null1–32 chars
birthdatestring | nullYYYY-MM-DD, must be a real calendar date
localestring | null1–35 chars
timezonestring | null1–64 chars
biostring | nullUp to 2000 chars
metadataobjectKeys 1–64 chars, at most 32 keys, 4096 bytes serialized
curl -X PATCH 'https://id.example.com/v1/account/me' \
  -H "Authorization: Bearer $ACCOUNT_ACCESS_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{"bio":"Hello","timezone":"Asia/Shanghai"}'

Unknown fields are rejected

The body is strict: a field that is not declared is an error, not silently ignored. Extra keys in a PATCH usually mean the client misspelled a name, and ignoring them lets the user believe the change applied when nothing happened.

The birthdate must be a real date

Format validation alone is not enough: 2023-02-30 is well-formed but does not exist, and storing it makes the derived age come out negative or NaN.

Rules

RuleNotes
No step-upUpdating the profile loses no data
age is not writableDerived from birthdate, so the two can never contradict each other
metadata boundsEnforced on write only, not on read; otherwise historical data would make GET fail validation

On this page