Skip to main content

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

Authorization
string
required
API токен сервисного пользователя в формате Bearer. Получите токен в панели администратора школы. Формат: Bearer YOUR_TOKEN.
Seller-Id
string
required
Уникальный идентификатор продавца в системе. Используется для разграничения доступа между разными продавцами.
School-Id
string
required
Уникальный идентификатор школы в системе. Определяет контекст выполнения операции.
Трудоустройство (employment) связывает пользователя школы с департаментом и должностью. У сотрудника может быть несколько записей трудоустройства в истории, но только одна активная для конкретной пары департамент + должность. У записи также фиксируются условия занятости: вид (kind), тип (type) и ставка (rate).
Все эндпоинты модуля staff доступны только для школ сегмента Corporate. Для остальных сегментов запрос вернёт ошибку 403 Forbidden.
Перевод (transfer) и повышение (promote) не изменяют текущую запись, а закрывают её (finishAt, статус Terminated) и создают новую активную запись в целевом департаменте либо с новой должностью. Условия занятости (kind, type, rate) переносятся в новую запись без изменений. В ответе возвращается именно новая запись трудоустройства.

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

GET /saas/v2/staff/employment/list
Требуется аутентификация и право StaffView.

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

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

Пагинация

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

Фильтрация

userIds
integer[]
Фильтр по ID пользователей. До 250 значений.
departmentIds
integer[]
Фильтр по ID департаментов. До 250 значений.
positionIds
integer[]
Фильтр по ID должностей. До 250 значений.
statuses
enum[]
Фильтр по статусам трудоустройства. Возможные значения: Active, Terminated. До 250 значений.
activeOnly
boolean
Если true — вернуть только активные трудоустройства.

Поля ответа

payload
object
Постраничный список трудоустройств.
curl --location 'https://api.exode.biz/saas/v2/staff/employment/list?take=10&activeOnly=true' \
  --header 'Seller-Id: {{ sellerId }}' \
  --header 'School-Id: {{ schoolId }}' \
  --header 'Authorization: Bearer YOUR_TOKEN'
{
  "success": true,
  "code": 200,
  "payload": {
    "page": 1,
    "count": 4,
    "pages": 1,
    "isFirst": true,
    "isLast": true,
    "items": [
      {
        "id": 9,
        "createdAt": "2026-07-02T11:15:47.312Z",
        "updatedAt": "2026-07-02T11:15:47.312Z",
        "archivedAt": null,
        "schoolId": 198,
        "userId": 1683,
        "positionId": 4,
        "departmentId": 4,
        "startAt": "2026-07-02T11:15:47.316Z",
        "finishAt": null,
        "status": "Active",
        "kind": "Main",
        "type": "FullTime",
        "rate": 1
      },
      {
        "id": 8,
        "createdAt": "2026-07-02T11:15:47.295Z",
        "updatedAt": "2026-07-02T11:15:47.312Z",
        "archivedAt": null,
        "schoolId": 198,
        "userId": 1683,
        "positionId": 3,
        "departmentId": 4,
        "startAt": "2026-07-02T11:15:47.299Z",
        "finishAt": "2026-07-02T11:15:47.316Z",
        "status": "Terminated",
        "kind": "Main",
        "type": "FullTime",
        "rate": 1
      }
    ],
    "next": {
      "skip": 0,
      "take": 10,
      "page": 1
    },
    "prev": {
      "skip": 0,
      "take": 10,
      "page": 1
    }
  }
}

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

POST /saas/v2/staff/employment/hire
Требуется аутентификация и право StaffManage. Создаёт новую активную запись трудоустройства. Пользователь, департамент и должность должны принадлежать школе. У сотрудника не может быть активного дубля с той же парой департамент + должность.

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

userId
integer
required
ID пользователя, который принимается на работу. Пользователь должен принадлежать школе.
positionId
integer
required
ID должности. Должность должна принадлежать школе.
departmentId
integer
required
ID департамента. Департамент должен принадлежать школе.
startAt
string
Дата начала трудоустройства в формате ISO 8601. По умолчанию — текущий момент.
kind
enum
Вид занятости: Main (основное место работы), InternalSecondary (внутреннее совместительство), ExternalSecondary (внешнее совместительство). По умолчанию Main.
type
enum
Тип занятости: FullTime (полная) или PartTime (частичная). По умолчанию FullTime.
rate
number
Ставка — доля полной ставки, от 0.01 до 1. По умолчанию 1.
curl --location 'https://api.exode.biz/saas/v2/staff/employment/hire' \
  --header 'Seller-Id: {{ sellerId }}' \
  --header 'School-Id: {{ schoolId }}' \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer YOUR_TOKEN' \
  --data-raw '{
    "userId": 1683,
    "positionId": 3,
    "departmentId": 3,
    "startAt": "2026-07-02T00:00:00.000Z",
    "kind": "Main",
    "type": "PartTime",
    "rate": 0.5
  }'
{
  "success": true,
  "code": 201,
  "payload": {
    "id": 6,
    "createdAt": "2026-07-02T11:15:47.273Z",
    "updatedAt": "2026-07-02T11:15:47.273Z",
    "archivedAt": null,
    "schoolId": 198,
    "userId": 1683,
    "positionId": 3,
    "departmentId": 3,
    "startAt": "2026-07-02T11:15:47.273Z",
    "finishAt": null,
    "status": "Active",
    "kind": "Main",
    "type": "PartTime",
    "rate": 0.5
  }
}

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

POST /saas/v2/staff/employment/transfer
Требуется аутентификация и право StaffManage. Закрывает текущую активную запись трудоустройства (finishAt, статус Terminated) и создаёт новую активную запись в целевом департаменте с сохранением должности. Целевой департамент должен принадлежать школе, у сотрудника не должно быть активного дубля в целевом департаменте.

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

employmentId
integer
required
ID переводимой активной записи трудоустройства.
toDepartmentId
integer
required
ID целевого департамента. Департамент должен принадлежать школе.
startAt
string
Дата перевода в формате ISO 8601. Должна попадать в интервал текущего трудоустройства. По умолчанию — текущий момент.
curl --location 'https://api.exode.biz/saas/v2/staff/employment/transfer' \
  --header 'Seller-Id: {{ sellerId }}' \
  --header 'School-Id: {{ schoolId }}' \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer YOUR_TOKEN' \
  --data-raw '{
    "employmentId": 6,
    "toDepartmentId": 4,
    "startAt": "2026-07-02T00:00:00.000Z"
  }'
{
  "success": true,
  "code": 201,
  "payload": {
    "id": 8,
    "createdAt": "2026-07-02T11:15:47.295Z",
    "updatedAt": "2026-07-02T11:15:47.295Z",
    "archivedAt": null,
    "schoolId": 198,
    "userId": 1683,
    "positionId": 3,
    "departmentId": 4,
    "startAt": "2026-07-02T11:15:47.299Z",
    "finishAt": null,
    "status": "Active",
    "kind": "Main",
    "type": "FullTime",
    "rate": 1
  }
}

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

POST /saas/v2/staff/employment/promote
Требуется аутентификация и право StaffManage. Закрывает текущую активную запись трудоустройства (finishAt, статус Terminated) и создаёт новую активную запись с новой должностью в том же департаменте. Целевая должность должна принадлежать школе, у сотрудника не должно быть активного дубля с новой должностью.

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

employmentId
integer
required
ID изменяемой активной записи трудоустройства.
toPositionId
integer
required
ID целевой должности. Должность должна принадлежать школе.
startAt
string
Дата смены должности в формате ISO 8601. Должна попадать в интервал текущего трудоустройства. По умолчанию — текущий момент.
curl --location 'https://api.exode.biz/saas/v2/staff/employment/promote' \
  --header 'Seller-Id: {{ sellerId }}' \
  --header 'School-Id: {{ schoolId }}' \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer YOUR_TOKEN' \
  --data-raw '{
    "employmentId": 8,
    "toPositionId": 4,
    "startAt": "2026-07-02T00:00:00.000Z"
  }'
{
  "success": true,
  "code": 201,
  "payload": {
    "id": 9,
    "createdAt": "2026-07-02T11:15:47.312Z",
    "updatedAt": "2026-07-02T11:15:47.312Z",
    "archivedAt": null,
    "schoolId": 198,
    "userId": 1683,
    "positionId": 4,
    "departmentId": 4,
    "startAt": "2026-07-02T11:15:47.316Z",
    "finishAt": null,
    "status": "Active",
    "kind": "Main",
    "type": "FullTime",
    "rate": 1
  }
}

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

POST /saas/v2/staff/employment/terminate
Требуется аутентификация и право StaffManage. Закрывает активную запись трудоустройства: проставляет finishAt, переводит статус в Terminated и снимает сотрудника с руководства департаментами. В ответе возвращается закрытая запись.

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

employmentId
integer
required
ID увольняемой активной записи трудоустройства.
finishAt
string
Дата увольнения в формате ISO 8601. Должна попадать в интервал текущего трудоустройства. По умолчанию — текущий момент.
curl --location 'https://api.exode.biz/saas/v2/staff/employment/terminate' \
  --header 'Seller-Id: {{ sellerId }}' \
  --header 'School-Id: {{ schoolId }}' \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer YOUR_TOKEN' \
  --data-raw '{
    "employmentId": 7,
    "finishAt": "2026-07-02T00:00:00.000Z"
  }'
{
  "success": true,
  "code": 201,
  "payload": {
    "id": 7,
    "createdAt": "2026-07-02T11:15:47.284Z",
    "updatedAt": "2026-07-02T11:15:47.400Z",
    "archivedAt": null,
    "schoolId": 198,
    "userId": 1684,
    "positionId": 3,
    "departmentId": 4,
    "startAt": "2026-07-02T11:15:47.285Z",
    "finishAt": "2026-07-02T11:15:47.401Z",
    "status": "Terminated",
    "kind": "Main",
    "type": "FullTime",
    "rate": 1
  }
}

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

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