> ## Documentation Index
> Fetch the complete documentation index at: https://docs.exode.biz/llms.txt
> Use this file to discover all available pages before exploring further.

# Пользователь

> Структура объекта пользователя (user) и его профиля (profile), возвращаемых в Exode API

Объект `user` описывает учётную запись пользователя в школе Exode. Возвращается в методах `user/create`,
`user/update`, `user/upsert`, `user/find`, во вложенных полях других сущностей (счета, доступы, вебхуки) и,
вместе с объектом `profile`, в `userWithProfile`.

<Info>
  Состав полей строго соответствует схеме публичного ответа: служебные/приватные поля (внутренние метаданные,
  токены) не возвращаются.
</Info>

## Поля `user`

### Идентификаторы и логины

<ResponseField name="id" type="integer" required>ID пользователя в Exode.</ResponseField>
<ResponseField name="uuid" type="string" required>UUID пользователя.</ResponseField>
<ResponseField name="domain" type="string" required>Доменный логин вида `id12345`.</ResponseField>
<ResponseField name="email" type="string | null">Email пользователя.</ResponseField>
<ResponseField name="phone" type="string | null">Телефон в международном формате.</ResponseField>
<ResponseField name="tgId" type="integer | null">Telegram ID.</ResponseField>
<ResponseField name="vkId" type="integer | null">VK ID (при авторизации через VK).</ResponseField>
<ResponseField name="appleId" type="string | null">Apple ID (при авторизации через Apple).</ResponseField>

<ResponseField name="extId" type="string | null">
  Внешний идентификатор из вашей системы (CRM/LMS). Задаётся при `user/create`/`update`/`upsert` и используется
  для поиска в `user/find` — связывает пользователя Exode с записью в вашей базе.
</ResponseField>

<ResponseField name="schoolId" type="integer | null">ID школы пользователя.</ResponseField>

### Статусы

<ResponseField name="active" type="boolean" required>Пользователь не отключён администратором.</ResponseField>
<ResponseField name="activated" type="boolean" required>Пользователь подтвердил вход (через код/оплату).</ResponseField>
<ResponseField name="banned" type="boolean" required>Пользователь заблокирован и не может входить.</ResponseField>
<ResponseField name="alive" type="boolean | null">«Живой» доступ: `active === true` и `banned === false`.</ResponseField>

### Локаль и активность

<ResponseField name="language" type="enum | null">Язык интерфейса: `Ru`, `Uz`, `En`, `Qa`.</ResponseField>
<ResponseField name="timezone" type="integer | null">Смещение часового пояса относительно UTC в часах (например, `5`).</ResponseField>
<ResponseField name="lastOnlineAt" type="string | null">Последняя активность (ISO 8601).</ResponseField>
<ResponseField name="currentTime" type="string | null">Текущее локальное время пользователя с учётом часового пояса.</ResponseField>
<ResponseField name="isSleepingNow" type="boolean | null">Эвристика «ночного» времени для пользователя.</ResponseField>

### Платформа и геймификация

<ResponseField name="starsBalance" type="integer" required>Баланс «звёзд» в системе геймификации.</ResponseField>

### Системные поля аудита

<ResponseField name="createdAt" type="string" required>Дата создания (ISO 8601).</ResponseField>
<ResponseField name="updatedAt" type="string" required>Дата последнего обновления (ISO 8601).</ResponseField>
<ResponseField name="archivedAt" type="string | null">Дата архивации (ISO 8601) или `null`.</ResponseField>

## Поля `profile`

В `userWithProfile` объект пользователя дополнен полем `profile` (может быть `null`).

<ResponseField name="id" type="integer" required>ID профиля.</ResponseField>
<ResponseField name="userId" type="integer | null">ID пользователя.</ResponseField>
<ResponseField name="official" type="boolean" required>Признак официального (верифицированного) профиля.</ResponseField>
<ResponseField name="firstName" type="string | null">Имя.</ResponseField>
<ResponseField name="lastName" type="string | null">Фамилия.</ResponseField>
<ResponseField name="fullName" type="string | null">Полное имя.</ResponseField>
<ResponseField name="fullNameShort" type="string | null">Сокращённое имя.</ResponseField>

<ResponseField name="avatar" type="object">
  Аватар пользователя — ссылки на изображение в разных размерах.

  <Expandable title="Свойства avatar">
    <ResponseField name="id" type="integer">ID профиля.</ResponseField>
    <ResponseField name="small" type="string | null">URL миниатюры.</ResponseField>
    <ResponseField name="medium" type="string | null">URL среднего размера.</ResponseField>
    <ResponseField name="maximum" type="string | null">URL максимального размера.</ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="bdate" type="string | null">Дата рождения (`YYYY-MM-DD`).</ResponseField>
<ResponseField name="sex" type="enum">Пол: `Ufo`, `Women`, `Men`.</ResponseField>
<ResponseField name="country" type="string | null">Страна.</ResponseField>
<ResponseField name="city" type="string | null">Город.</ResponseField>
<ResponseField name="role" type="enum">Роль: `Student`, `Tutor`, `Parent`.</ResponseField>
<ResponseField name="status" type="string | null">Статус (произвольный текст).</ResponseField>
<ResponseField name="title" type="string | null">Титул.</ResponseField>
<ResponseField name="emojiTitle" type="string | null">Эмодзи-титул.</ResponseField>
<ResponseField name="titleState" type="object">Состояние титулов (ручные/локационные/достижения).</ResponseField>

## Пример объекта `userWithProfile`

```json theme={null}
{
  "id": 123,
  "uuid": "550e8400-e29b-41d4-a716-446655440000",
  "domain": "id123",
  "email": "user@example.com",
  "phone": "+9876543210",
  "tgId": 987654321,
  "vkId": null,
  "appleId": null,
  "extId": "crm_12345",
  "schoolId": 91,
  "active": true,
  "activated": true,
  "banned": false,
  "alive": true,
  "language": "Ru",
  "timezone": 5,
  "lastOnlineAt": "2025-01-15T11:40:00Z",
  "starsBalance": 0,
  "createdAt": "2025-01-15T10:30:00Z",
  "updatedAt": "2025-01-15T11:45:00Z",
  "archivedAt": null,
  "profile": {
    "id": 456,
    "userId": 123,
    "official": false,
    "firstName": "John",
    "lastName": "Doe",
    "fullName": "John Doe",
    "sex": "Men",
    "role": "Student",
    "bdate": "1990-01-01"
  }
}
```
