Skip to content

Update a person profile

Identity module

PATCH/person-profiles/{id}personProfiles.update

A person's profile page, owned by the person. New profiles start Private. Updates the fields sent; omitted fields are unchanged. Requires `If-Match` with the current `ETag`: a stale tag returns 412 and a missing tag returns 428.

  • Requires the capability me.profile.write.
  • OAuth scopes: me.
  • Send If-Match with the ETag you read. A stale tag returns 412; a missing tag returns 428.
  • Error statuses: 400, 401, 404, 412, 422, 428, 429. Errors are RFC 9457 problem details.

Path and query parameters

personProfiles.update: Path and query parameters
FieldTypeRequiredDescription
idstring (uuid)YesIdentifier of the person profile.

Request body: PersonProfileUpdate

personProfiles.update: PersonProfileUpdate
FieldTypeRequiredDescription
headlinestring | nullNoHeadline.Constraints: length 1 to 300
biostring | nullNoBio.Constraints: length 1 to 20000
pronounsstring | nullNoPronouns, optional.Constraints: length 1 to 300
localitystring | nullNoCity.Constraints: length 1 to 300
countrystring | nullNoISO 3166-1 alpha-2 country code.Constraints: pattern ^[A-Z]{2}$
visibilityProfileVisibilityNoProfile visibility. Sections and fields may be set lower than the profile, never higher.Constraints: one of "Public", "Network", "Private"
search_indexingbooleanNoWhether search engines may index a public profile.
handlestringNoUnique handle for /u/{handle} or /c/{handle}: 3 to 40 lowercase letters, digits and single hyphens. Changeable once every 30 days; the old handle redirects for 90 days.Constraints: pattern ^[a-z0-9]([a-z0-9-]{1,38}[a-z0-9])$
preferred_namestring | nullNoName the person goes by.Constraints: length 1 to 100
{
  "headline": "Head Rigger, Festivals and Arenas",
  "bio": "Fifteen years rigging touring shows.",
  "pronouns": "they/them",
  "locality": "Miami",
  "country": "US",
  "search_indexing": false,
  "handle": "northwind-live",
  "preferred_name": "Alex"
}

Response 200: PersonProfile

personProfiles.update: PersonProfile
FieldTypeRequiredDescription
idstring (uuid)YesIdentifier of the person profile.
created_atstring (date-time)YesWhen the row was created.
updated_atstring (date-time)YesWhen the row was last updated.
person_idstring (uuid)YesIdentifier of the person.
headlinestring | nullYesHeadline.Constraints: length 1 to 300
biostring | nullYesBio.Constraints: length 1 to 20000
pronounsstring | nullYesPronouns, optional.Constraints: length 1 to 300
localitystring | nullYesCity.Constraints: length 1 to 300
countrystring | nullYesISO 3166-1 alpha-2 country code.Constraints: pattern ^[A-Z]{2}$
visibilityProfileVisibilityYesProfile visibility. Sections and fields may be set lower than the profile, never higher.Constraints: one of "Public", "Network", "Private"
search_indexingbooleanYesWhether search engines may index a public profile.
handlestringYesUnique handle for /u/{handle} or /c/{handle}: 3 to 40 lowercase letters, digits and single hyphens. Changeable once every 30 days; the old handle redirects for 90 days.Constraints: pattern ^[a-z0-9]([a-z0-9-]{1,38}[a-z0-9])$
handle_changed_atstring (date-time) | nullYesWhen the handle last changed; null until the first change. Set by the database.
preferred_namestring | nullYesName the person goes by.Constraints: length 1 to 100
{
  "id": "0192f1e2-7c3a-7b4d-9e8f-1a2b3c4d5e6f",
  "created_at": "2026-10-08T14:30:00Z",
  "updated_at": "2026-10-08T14:30:00Z",
  "person_id": "0192f1e2-7c3a-7b4d-9e8f-1a2b3c4d5e6f",
  "headline": "Head Rigger, Festivals and Arenas",
  "bio": "Fifteen years rigging touring shows.",
  "pronouns": "they/them",
  "locality": "Miami",
  "country": "US",
  "visibility": "Private",
  "search_indexing": false,
  "handle": "northwind-live",
  "handle_changed_at": "2026-10-08T14:30:00Z",
  "preferred_name": "Alex"
}

Code samples

curl -X PATCH "$XOS_BASE_URL/person-profiles/0192f1e2-7c3a-7b4d-9e8f-1a2b3c4d5e6f" \
  -H "Authorization: Bearer $XOS_API_KEY" \
  -H 'If-Match: W/"etag-from-your-last-read"' \
  -H "Content-Type: application/json" \
  -d '{"headline":"Head Rigger, Festivals and Arenas","bio":"Fifteen years rigging touring shows.","pronouns":"they/them","locality":"Miami","country":"US","search_indexing":false,"handle":"northwind-live","preferred_name":"Alex"}'
const { data, etag } = await xos.personProfiles.update("0192f1e2-7c3a-7b4d-9e8f-1a2b3c4d5e6f", {
    "headline": "Head Rigger, Festivals and Arenas",
    "bio": "Fifteen years rigging touring shows.",
    "pronouns": "they/them",
    "locality": "Miami",
    "country": "US",
    "search_indexing": false,
    "handle": "northwind-live",
    "preferred_name": "Alex"
  }, { ifMatch: etag });
response = xos.person_profiles.update("0192f1e2-7c3a-7b4d-9e8f-1a2b3c4d5e6f", {"headline": "Head Rigger, Festivals and Arenas", "bio": "Fifteen years rigging touring shows.", "pronouns": "they/them", "locality": "Miami", "country": "US", "search_indexing": False, "handle": "northwind-live", "preferred_name": "Alex"}, if_match=etag)
xos person-profiles update 0192f1e2-7c3a-7b4d-9e8f-1a2b3c4d5e6f --data '{"headline":"Head Rigger, Festivals and Arenas","bio":"Fifteen years rigging touring shows.","pronouns":"they/them","locality":"Miami","country":"US","search_indexing":false,"handle":"northwind-live","preferred_name":"Alex"}' --if-match auto