---
title: "Update the signed-in user's profile"
method: PATCH
path: "/v1/account/profile"
tags: ["account"]
---

# Update the signed-in user's profile

`PATCH /v1/account/profile`

## Request

- Base URL: `https://api.getmyhotels.com`
- URL: `https://api.getmyhotels.com/v1/account/profile`
- Auth: HTTP bearer

Runs `user.updateProfile`. PARTIAL update: send only the fields being changed. An omitted field is left untouched — it is not cleared — and at least one field must be present or the call is a 400. There is no clear-a-field verb: no field accepts JSON `null` (that is a 400 too), so a value can only be replaced, never erased. `name` is the field this route exists for. It writes `user.name`, the name the Settings account row and the checkout guest form both render, and it is the only writer of that column outside admin tooling — Sign in with Apple hands back a name on the first consent only, so for most native accounts it starts empty and stays that way until this call runs. An all-whitespace name is ignored rather than written (and an empty string is a 400), so a stray save cannot wipe a name the customer already set. CHANGING `phone` DELIBERATELY RESETS that number's verified state — `phoneVerifiedAt` goes back to null, so booking-confirmation SMS stops being delivered until the customer re-runs `POST /v1/phone/request-otp` then `POST /v1/phone/verify-otp`. Any screen with a phone field must say so and send them back through that flow; the reset is an audit fix, because without it a profile update could point a stay's confirmation SMS at another number while inheriting the old verification. `dateOfBirth` is an ISO-8601 date string (`YYYY-MM-DD`), not a Unix timestamp. `nationality` and `country` are ISO 3166-1 alpha-3; `preferredCountry` is alpha-2, and the three preference fields are enum-validated against the supported currency/language/country lists, so an unsupported value is a 400 rather than a silently stored string. `avatarUrl` must be HTTPS (or an empty string). Returns `{ success: true }` only — it does not echo the saved row, so refetch `GET /v1/account/profile` when the screen needs to show what was stored.

## Request body

- object: Partial update. Every field is optional and an omitted field is left unchanged — this never clears anything. No field accepts null, so a stored value can be replaced but not erased. At least one field must be present.
  - `name` string
  - `phone` union
    - string
    - string
  - `dateOfBirth` string, date
  - `nationality` string
  - `preferredCurrency` 'USD' | 'GBP' | 'EUR' | 'INR'
  - `preferredLanguage` 'en' | 'es' | 'fr' | 'de' | 'zh' | 'hi' | 'pt' | 'it' | 'ja' | 'te' | 'gu' | 'ko' | 'bn' | 'ru'
  - `preferredCountry` 'US' | 'CA' | 'DE' | 'FR' | 'IT' | 'ES' | 'NL' | 'BE' | 'AT' | 'IE' | 'PT' | 'FI' | 'GR' | 'LU' | 'SI' | 'SK' | 'EE' | 'LV' | 'LT' | 'MT' | 'CY' | 'HR' | 'SE' | 'DK' | 'PL' | 'CZ' | 'HU' | 'RO' | 'BG' | 'NO' | 'IS' | 'LI' | 'CH' | 'GB' | 'GG' | 'JE' | 'IM' | 'IN', nullable
  - `address` string
  - `city` string
  - `state` string
  - `country` string, nullable
  - `postalCode` string
  - `avatarUrl` union
    - string, uri
    - ''

## Response `200`

Success

- unknown

## Other responses

- `400`: Request validation failed or the router rejected the input
- `401`: Missing or invalid bearer session token
- `426`: Reported X-GMH-App-Version is below the supported minimum — the app must update
- `500`: Unexpected server error (opaque; details stay in logs)

---

[API](https://skmtc.dev/getmyhotels/apis/getmyhotels-rest-api.md) · [All operations](https://skmtc.dev/getmyhotels/apis/getmyhotels-rest-api/llms.txt) · [OpenAPI document](https://skmtc.dev/getmyhotels/apis/getmyhotels-rest-api/revisions/cba24a9c13f0?raw)
