Skip to main content

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

string
обязательно
API-токен сервисного пользователя в формате Bearer YOUR_TOKEN. Токен выпускает владелец школы в кабинете: Управление → Школа → Для разработчиков → API-ключи — подробнее в разделе «Аутентификация».
integer
обязательно
Числовой ID продавца — аккаунта, которому принадлежит школа. Скопируйте его на странице API-ключи в карточке «Данные для интеграции → Идентификаторы». По этому ID проверяются права токена.
integer
обязательно
Числовой ID школы, берётся там же, где Seller-Id. Значение должно совпадать со школой продавца — иначе вернётся ошибка 400 с cause: "ForbiddenSchoolMismatch".
Трудоустройство (employment) связывает пользователя школы с департаментом и, опционально, должностью. У сотрудника может быть несколько записей трудоустройства в истории, но только одна активная для конкретной пары департамент + должность. Должность можно не указывать — тогда сотрудник числится в департаменте без должности, и активная запись такого типа уникальна по паре департамент + пользователь. У записи также фиксируются условия занятости: вид (kind), тип (type) и ставка (rate).
Все эндпоинты модуля staff доступны только для школ сегмента Corporate. Для остальных сегментов запрос вернёт 401 с cause: "Forbidden" и сообщением Allowed only for Corporate school.
Перевод (transfer) и повышение (promote) не изменяют текущую запись, а закрывают её (finishAt, статус Terminated) и создают новую активную запись в целевом департаменте либо с новой должностью. Условия занятости (kind, type, rate) и внешний идентификатор extId переносятся в новую запись без изменений. В ответе возвращается именно новая запись трудоустройства — с новым id. Поэтому в своей системе храните extId трудоустройства, а не id: id меняется при каждом переводе и повышении, extId — нет. Назначение руководителем департамента переходит на новую запись автоматически; ранее созданные отсутствия остаются привязанными к закрытой записи.
У трудоустройства может быть внешний идентификатор extId — ID записи в системе клиента (например, HR-системе). От 1 до 50 символов, без / и пробелов. Уникален в рамках школы среди открытых (не завершённых) трудоустройств: при переводе или повышении extId переносится на новую активную запись (закрытая сохраняет копию), а после увольнения освобождается — его можно снова передать при повторном найме. По extId доступны отдельные роуты ext/{extId}/transfer, ext/{extId}/promote и ext/{extId}/terminate; они находят только открытую запись, поэтому для уже закрытого трудоустройства вернут StaffEmploymentNotFound.

Какую операцию выбрать

Удаления трудоустройства в API нет: запись закрывается только через terminate и остаётся в истории. Каждая операция изменения есть в двух вариантах: по employmentId в теле запроса и по extId в пути (ext/{extId}/...). Работают они одинаково; вариант с extId удобнее при синхронизации — не нужно хранить внутренние ID Exode.

Список трудоустройств

Требуется аутентификация и право «Просмотр персонала» (StaffView).

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

Параметры-массивы передаются повторением параметра в строке запроса: userIds=1&userIds=2&userIds=3.

Пагинация

integer
Количество записей, которые нужно пропустить. По умолчанию 0.
integer
Номер страницы (альтернатива skip). Начинается с 1.
integer
Количество записей на странице. По умолчанию 100, максимум 1000.

Фильтрация

integer[]
Фильтр по ID трудоустройств. До 250 значений.
string[]
Фильтр по внешним идентификаторам (extId) трудоустройств. До 250 значений, каждое до 50 символов.
integer[]
Фильтр по ID пользователей. До 250 значений.
integer[]
Фильтр по ID департаментов. До 250 значений.
string[]
Фильтр по внешним идентификаторам (extId) департаментов. До 250 значений, каждое до 50 символов.
integer[]
Фильтр по ID должностей. До 250 значений.
string[]
Фильтр по внешним идентификаторам (extId) должностей. До 250 значений, каждое до 50 символов.
enum[]
Фильтр по статусам трудоустройства. Возможные значения: Active, Terminated. До 250 значений.
boolean
Если true — вернуть только действующие на текущий момент трудоустройства: статус Active, дата startAt уже наступила. Наём с будущей датой startAt сюда не попадёт до её наступления — чтобы получить и такие записи, используйте statuses=Active.
Поиск по сотруднику: ФИО, логин, ID пользователя. Максимум 50 символов.

Сортировка

enum
Направление сортировки по дате создания записи: ASC или DESC. Аналогично работают параметры id и updatedAt. Без параметров сортировки записи одного сотрудника идут подряд (группировка по userId).

Поля ответа

object
Постраничный список трудоустройств.

Нанять сотрудника

Требуется аутентификация и право «Управление персоналом» (StaffManage). Создаёт новую активную запись трудоустройства. Пользователь, департамент и должность (если указана) должны принадлежать школе. У сотрудника не может быть активного дубля с той же парой департамент + должность, а при найме без должности — с той же парой департамент + пользователь. Если пользователь ранее был уволен и имеет статус Terminated, найм автоматически возвращает ему статус Active. Департамент обязателен и указывается по ID или внешнему идентификатору: в паре departmentId / departmentExtId передаётся ровно один параметр. Должность опциональна: передайте ровно один параметр из пары positionId / positionExtId, либо не передавайте оба — тогда сотрудник нанимается без должности. Оба поля одной пары одновременно передавать нельзя.

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

integer
обязательно
ID пользователя, который принимается на работу. Пользователь должен быть уже зарегистрирован в школе, иначе вернётся UserNotBelongsToSchool. ID возвращается при создании пользователя; по вашему внешнему идентификатору его можно найти через user/find. Чтобы создать пользователя и сразу нанять его одним вызовом, используйте extra.staff.employments в user/create или user/upsert.
string
Внешний идентификатор трудоустройства из системы клиента. От 1 до 50 символов, без / и пробелов. Должен быть уникален в рамках школы среди открытых (не завершённых) трудоустройств.
integer
ID должности. Должность должна принадлежать школе. Опционально: передайте один параметр из пары positionId / positionExtId, либо не передавайте оба — сотрудник будет нанят без должности.
string
Внешний идентификатор (extId) должности — альтернатива positionId.
integer
ID департамента. Департамент должен принадлежать школе. Передаётся ровно один параметр из пары departmentId / departmentExtId.
string
Внешний идентификатор (extId) департамента — альтернатива departmentId.
string
Дата начала трудоустройства в формате ISO 8601 (например, 2026-07-02T00:00:00.000Z). По умолчанию — текущий момент. Можно указать дату в прошлом (перенос истории) или в будущем (запланированный приём): будущая запись сразу получает статус Active, но до наступления startAt не попадает в выборку activeOnly=true и не может быть назначена руководителем департамента.
enum
Вид занятости: Main (основное место работы), InternalSecondary (внутреннее совместительство), ExternalSecondary (внешнее совместительство). По умолчанию Main.
enum
Тип занятости: FullTime (полная) или PartTime (частичная). По умолчанию FullTime.
number
Ставка — доля полной ставки, от 0.01 до 1. По умолчанию 1.

Перевести в другой департамент

Требуется аутентификация и право «Управление персоналом» (StaffManage). Закрывает текущую активную запись трудоустройства (finishAt, статус Terminated) и создаёт новую активную запись в целевом департаменте с сохранением должности. Целевой департамент должен принадлежать школе. Если у сотрудника в целевом департаменте уже есть открытая запись с той же должностью, вернётся StaffEmploymentAlreadyExists.

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

integer
обязательно
ID переводимой активной записи трудоустройства.
integer
ID целевого департамента. Департамент должен принадлежать школе. Передаётся ровно один параметр из пары toDepartmentId / toDepartmentExtId.
string
Внешний идентификатор (extId) целевого департамента — альтернатива toDepartmentId.
string
Дата перевода в формате ISO 8601. Должна быть не раньше startAt текущей записи, иначе вернётся StaffEmploymentInvalidTransitionDate. По умолчанию — текущий момент.

Перевести по внешнему идентификатору

Требуется аутентификация и право «Управление персоналом» (StaffManage). Аналог перевода по employmentId, но активная запись трудоустройства находится по внешнему идентификатору extId в рамках школы. Тело запроса — как у обычного перевода, без поля employmentId.

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

string
обязательно
Внешний идентификатор активной записи трудоустройства. Значение в пути должно быть URL-encoded.
integer
ID целевого департамента. Департамент должен принадлежать школе. Передаётся ровно один параметр из пары toDepartmentId / toDepartmentExtId.
string
Внешний идентификатор (extId) целевого департамента — альтернатива toDepartmentId.
string
Дата перевода в формате ISO 8601. Должна быть не раньше startAt текущей записи, иначе вернётся StaffEmploymentInvalidTransitionDate. По умолчанию — текущий момент.

Сменить должность

Требуется аутентификация и право «Управление персоналом» (StaffManage). Закрывает текущую активную запись трудоустройства (finishAt, статус Terminated) и создаёт новую активную запись с новой должностью в том же департаменте. Целевая должность должна принадлежать школе. Если у сотрудника в этом департаменте уже есть открытая запись с новой должностью, вернётся StaffEmploymentAlreadyExists. Запрос должен явно выражать намерение: передайте должность (toPositionId или toPositionExtId), чтобы назначить её, либо toPositionId: null, чтобы снять должность (сотрудник останется в департаменте без должности). Если не передать ни одно из этих полей, вернётся ошибка StaffEmploymentInputRequired.

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

integer
обязательно
ID изменяемой активной записи трудоустройства.
integer | null
ID целевой должности. Должность должна принадлежать школе. Передаётся ровно один параметр из пары toPositionId / toPositionExtId. Значение null снимает должность — трудоустройство остаётся в департаменте без должности. Оба поля пары одновременно передавать нельзя.
string
Внешний идентификатор (extId) целевой должности — альтернатива toPositionId.
string
Дата смены должности в формате ISO 8601. Должна быть не раньше startAt текущей записи, иначе вернётся StaffEmploymentInvalidTransitionDate. По умолчанию — текущий момент.

Сменить должность по внешнему идентификатору

Требуется аутентификация и право «Управление персоналом» (StaffManage). Аналог смены должности по employmentId, но активная запись трудоустройства находится по внешнему идентификатору extId в рамках школы. Тело запроса — как у обычной смены должности, без поля employmentId: передайте должность, чтобы назначить её, либо toPositionId: null, чтобы снять её; иначе — ошибка StaffEmploymentInputRequired.

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

string
обязательно
Внешний идентификатор активной записи трудоустройства. Значение в пути должно быть URL-encoded.
integer | null
ID целевой должности. Должность должна принадлежать школе. Передаётся ровно один параметр из пары toPositionId / toPositionExtId. Значение null снимает должность — трудоустройство остаётся в департаменте без должности. Оба поля пары одновременно передавать нельзя.
string
Внешний идентификатор (extId) целевой должности — альтернатива toPositionId.
string
Дата смены должности в формате ISO 8601. Должна быть не раньше startAt текущей записи, иначе вернётся StaffEmploymentInvalidTransitionDate. По умолчанию — текущий момент.

Уволить сотрудника

Требуется аутентификация и право «Управление персоналом» (StaffManage). Закрывает активную запись трудоустройства: проставляет finishAt, переводит статус в Terminated и снимает сотрудника с руководства департаментами. В ответе возвращается закрытая запись.
Увольнение с последнего активного трудоустройства автоматически переводит пользователя в статус Terminated — доступ к платформе закрывается: вход запрещён, активные сессии завершаются. Повторный найм (hire) пользователя со статусом Terminated автоматически возвращает ему статус Active.
Защиты при увольнении с последнего активного трудоустройства: нельзя уволить самого себя — пользователя, от имени которого выполняется запрос (StaffCannotTerminateSelf), и владельца школы (StaffCannotTerminateSchoolOwner). При сверке полного списка сотрудников пропускайте этих пользователей.
Увольнение вступает в силу в момент вызова: запись сразу получает статус Terminated, а при увольнении с последнего трудоустройства сразу закрывается доступ — даже если finishAt указан в будущем. Отложенного увольнения нет, поэтому вызывайте terminate в день фактического увольнения.

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

integer
обязательно
ID увольняемой активной записи трудоустройства.
string
Дата увольнения в формате ISO 8601, сохраняется в записи. Должна быть не раньше startAt трудоустройства, иначе вернётся StaffEmploymentInvalidTransitionDate. По умолчанию — текущий момент.

Уволить по внешнему идентификатору

Требуется аутентификация и право «Управление персоналом» (StaffManage). Аналог увольнения по employmentId, но активная запись трудоустройства находится по внешнему идентификатору extId в рамках школы. Тело запроса — как у обычного увольнения, без поля employmentId. Действуют те же защиты и та же логика перевода пользователя в статус Terminated при увольнении с последнего активного трудоустройства.

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

string
обязательно
Внешний идентификатор активной записи трудоустройства. Значение в пути должно быть URL-encoded.
string
Дата увольнения в формате ISO 8601, сохраняется в записи. Должна быть не раньше startAt трудоустройства, иначе вернётся StaffEmploymentInvalidTransitionDate. По умолчанию — текущий момент.

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

Модуль staff доступен только для школ сегмента Corporate. Для чтения списка требуется право «Просмотр персонала» (StaffView), для операций найма, перевода, повышения и увольнения — право «Управление персоналом» (StaffManage).
Сервисный пользователь должен быть аутентифицирован по токену и иметь соответствующие права доступа к указанной школе.

Обновлено: 2026-09-25 13:43 UTC