Skip to content

Create a person profile

Identity module

POST/person-profilespersonProfiles.create

A person's profile page, owned by the person. New profiles start Private. Creates a person profile. Requires `Idempotency-Key`; a replay returns the original response. The organization is derived from the credential or the parent row, never from the body.

  • Requires the capability me.profile.write.
  • OAuth scopes: me.
  • Send an Idempotency-Key header. A replay with the same key returns the original response.
  • Error statuses: 400, 401, 409, 422, 429. Errors are RFC 9457 problem details.

Request body: PersonProfileCreate

personProfiles.create: PersonProfileCreate
FieldTypeRequiredDescription
person_idstring (uuid)YesIdentifier of the person.
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}$
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.
{
  "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
}

Response 201: PersonProfile

personProfiles.create: 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 POST "$XOS_BASE_URL/person-profiles" \
  -H "Authorization: Bearer $XOS_API_KEY" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{"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}'
const { data } = await xos.personProfiles.create({
    "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
  });
response = xos.person_profiles.create({"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})
xos person-profiles create --data '{"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}'