Skip to main content
Upsert — это операция “создать или обновить”. Если пользователь с указанным email, телефоном, Telegram ID или внешним идентификатором extId уже существует — его данные будут обновлены. Если пользователя нет — он будет создан.

Заголовки запроса

Authorization
string
required
API токен сервисного пользователя в формате Bearer. Получите токен в панели администратора школы. Формат: Bearer YOUR_TOKEN.
Seller-Id
string
required
Уникальный идентификатор продавца в системе. Используется для разграничения доступа между разными продавцами.
School-Id
string
required
Уникальный идентификатор школы в системе. Определяет контекст выполнения операции.
PUT /saas/v2/user/upsert
Требуется аутентификация и право SchoolManageUsers.

Параметры запроса

Для определения существующего пользователя по логину — передайте хотя бы один из ниже перечисленных параметров, в противном случае пользователь будет создаваться при каждом запросе.
В случае если пользователь найден по указанным ниже полям — произойдет только его обновление. В случае создания — логин и пароль для входа отправятся новому пользователю автоматически.
email
string
Email адрес пользователя. Должен быть валидным email форматом. При передаче пустой строки — преобразуется в null.
phone
string
Номер телефона пользователя. Должен быть в международном формате (например, +9876543210). При передаче пустой строки — преобразуется в null.
tgId
integer
Telegram ID пользователя. Целое число или null.
extId
string
Внешний идентификатор пользователя из вашей системы. Строка или null.

Параметры профиля

profile
object
Объект с данными профиля пользователя.
При создании пользователя автоматически создается связанный профиль с указанными данными. Если профиль не указан, создается пустой профиль, поля firstName и lastName будут заполнены пользователем при первом входе в аккаунт.
curl --location --request PUT 'https://api.exode.biz/saas/v2/user/upsert' \
  --header 'Seller-Id: {{ sellerId }}' \
  --header 'School-Id: {{ schoolId }}' \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer YOUR_TOKEN' \
  --data-raw '{
    "email": "[email protected]",
    "phone": "+9876543210",
    "extId": "crm_12345",
    "tgId": null,
    "banned": false,
    "profile": {
      "firstName": "Firstname",
      "lastName": "Lastname",
      "bdate": "1990-01-01",
      "sex": "Men",
      "role": "Student"
    }
  }'
{
  "success": true,
  "code": 200,
  "payload": {
    "isCreated": true,
    "user": {
      "id": 1684,
      "createdAt": "2026-07-02T11:15:46.896Z",
      "updatedAt": "2026-07-02T11:15:46.940Z",
      "archivedAt": null,
      "uuid": "e-cjTT0CWMCB",
      "active": true,
      "activated": true,
      "banned": false,
      "alive": true,
      "domain": "id1684",
      "email": "[email protected]",
      "phone": "+9876543210",
      "tgId": null,
      "vkId": null,
      "appleId": null,
      "extId": "crm_12345",
      "schoolId": 198,
      "language": null,
      "timezone": null,
      "lastOnlineAt": null,
      "starsBalance": 0,
      "currentTime": "2026-07-02T11:15:46+00:00",
      "isSleepingNow": false,
      "profile": {
        "id": 1666,
        "createdAt": "2026-07-02T11:15:46.932Z",
        "updatedAt": "2026-07-02T11:15:46.932Z",
        "archivedAt": null,
        "userId": 1684,
        "official": false,
        "firstName": "Firstname",
        "lastName": "Lastname",
        "fullName": "Firstname Lastname",
        "fullNameShort": "Firstname L.",
        "bdate": null,
        "sex": "Ufo",
        "country": null,
        "city": null,
        "role": "Student",
        "status": null,
        "title": "",
        "emojiTitle": "",
        "avatar": {
          "id": 1666,
          "small": "https://storage.exode.biz/production/user/1683/xK2mVwNib9b0/small/avatar.png",
          "medium": "https://storage.exode.biz/production/user/1683/xK2mVwNib9b0/medium/avatar.png",
          "maximum": "https://storage.exode.biz/production/user/1683/xK2mVwNib9b0/avatar.png"
        },
        "titleState": {
          "manualTitle": null,
          "manualEmojiTitle": null,
          "manualNextTitle": null,
          "manualNextEmojiTitle": null,
          "manualExpiredAt": null,
          "locationTitle": null,
          "locationEmojiTitle": null,
          "achievementTitle": null,
          "achievementEmojiTitle": null
        }
      }
    }
  }
}

Требования к правам доступа

Для создания или обновления пользователя требуется право на управление пользователями школы.
Сервисный пользователь должен быть аутентифицирован по токену и иметь соответствующие права доступа к указанной школе.
При установке статуса banned: true все активные сессии пользователя автоматически завершаются — это реализовано для обеспечения безопасности.