---
title: "Get User Profile"
method: GET
path: "/user"
---

# Get User Profile

`GET /user`

Get the current user's profile including onboarding status and preferences.

## Response `200`

Successful Response

- UserProfileResponse — Response model for user profile data.
  - `user_id` string, uuid4, required
  - `stytch_user_id` string, nullable, required
  - `email` string, nullable
  - `name` string, nullable
  - `username` string, nullable
  - `city` string, nullable
  - `home_location` HomeLocation — The user's home locality and home airports. Provenance drives the confirmation UX: backfilled values carry ``source="auto"`` with ``confirmed_at=None`` until the user accepts or edits them; anything the user picks or accepts is confirmed. The decision engine may consume unconfirmed values, but the app keeps nudging until ``confirmed_at`` is set.
    - `place_id` string, required — Google place_id of the selected locality
    - `lat` number, required
    - `lng` number, required
    - `city` string, required — Canonical locality name, e.g. "São Paulo"
    - `region` string, nullable — Admin area, e.g. "SP" or "California"
    - `country` string, required
    - `country_code` string, nullable — ISO-3166-1 alpha-2, e.g. 'BR'
    - `airports` string[] — Home-airport IATA codes, ordered by relevance
    - `source` 'user' | 'auto'
    - `confirmed_at` string, date-time, nullable
    - `raw_input` string, nullable — Free text the user typed, or the pre-migration users.city value
  - `avatar_color` string, nullable
  - `avatar_url` string, nullable
  - `timezone` string, nullable
  - `preferences` UserPreferences — Consolidated user preferences matching the onboarding form.
    - `preferred_airlines` object[], nullable
    - `preferred_class` string, nullable
    - `other_travel_preferences` string, nullable
    - `liked_airlines` string[], nullable
    - `avoided_airlines` string[], nullable
    - `airline_freeform_text` string, nullable
    - `selected_hotels` string[], nullable
    - `other_hotel` string, nullable
    - `selected_budget_ranges` string[], nullable
    - `other_budget_range` string, nullable
    - `travels_for_work` boolean, nullable
    - `work_arrival_preference` string, nullable
    - `work_arrival_details` string, nullable
    - `work_departure_preference` string, nullable
    - `work_departure_details` string, nullable
    - `work_location_priority` string, nullable
    - `other_location_priority` string, nullable
    - `work_transportation` string[], nullable
    - `other_transportation` string, nullable
    - `onboarding_interests` OnboardingInterestsRun[], nullable
      - `run_id` string, uuid, required
      - `destinations` string[]
      - `country` string, nullable
      - `categories` string[]
      - `subcategories` string[]
      - `at` string, date-time, required
    - `airport_buffers` AirportBufferPreference — How early the user likes to be at a mainline terminal, by flight class. Stored at users.preferences["airport_buffers"]; the defaults ARE the product defaults, so an absent or garbled payload means "defaults".
      - `domestic_minutes` integer
      - `international_minutes` integer
  - `onboarding_completed` boolean
  - `onboarding_completed_at` string, date-time, nullable
  - `created_at` string, date-time, required
  - `updated_at` string, date-time, required
  - `last_login_at` string, date-time, nullable
  - `detected_country` string, nullable
  - `detected_city` string, nullable
  - `is_travel_agent` boolean
  - `show_heard_about_us` boolean
  - `tutorial_steps_seen` string[]
  - `tutorial_steps_completed` string[]
  - `home_location_pending` boolean
  - `show_home_location_prompt` boolean
  - `is_internal` boolean
  - `explore_enabled` boolean
  - `home_feed_enabled` boolean
  - `place_chat_enabled` boolean
  - `image_attachments_enabled` boolean
  - `explore_tab_enabled` boolean
  - `stay_card_redesign_enabled` boolean
  - `tier` 'free' | 'paid'
  - `paywall` PaywallStatus — Paywall A/B state for the current user, surfaced on the profile so the web client can render the banner / blocked state. See api/services/chat_admission.py + docs/PAYWALL_PR2_EXPERIMENT.md.
    - `state` 'allowed' | 'downgraded' | 'blocked', required
    - `arm` string, required
    - `messages_used` integer, required
    - `messages_limit` integer, nullable
    - `reset_at` string, date-time, nullable
    - `deep_answers_remaining` integer, nullable

---

[API](https://skmtc.dev/stardrift/apis/fastapi.md) · [All operations](https://skmtc.dev/stardrift/apis/fastapi/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/stardrift/fastapi/revisions/00746572572a/schema)
