Skip to main content

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

Authorization
string
required
API токен сервисного пользователя в формате Bearer. Получите токен в панели администратора школы. Формат: Bearer YOUR_TOKEN.
Seller-Id
string
required
Уникальный идентификатор продавца в системе. Используется для разграничения доступа между разными продавцами.
School-Id
string
required
Уникальный идентификатор школы в системе. Определяет контекст выполнения операции.
Департаменты — это иерархические подразделения школы. Каждый департамент может иметь родительский департамент (parentId), за счёт чего строится дерево организационной структуры. Департаменты используются модулем персонала (staff) для распределения сотрудников по подразделениям и назначения руководителей.
Все эндпоинты модуля персонала доступны только для школ корпоративного сегмента (Corporate). Запрос от школы другого сегмента будет отклонён.

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

Чтение (tree, list) требует права StaffView. Создание, обновление и удаление требуют права StaffManage. Во всех случаях необходима аутентификация по токену и принадлежность школы к сегменту Corporate.
Сервисный пользователь должен быть аутентифицирован по токену и иметь соответствующие права доступа к указанной школе.

Дерево департаментов

GET /saas/v2/staff/department/tree
Требуется аутентификация и право StaffView.
Эндпоинт возвращает плоский массив всех департаментов школы. Иерархия задаётся полем parentId каждого департамента (null — корневой департамент). Само дерево строится на стороне клиента группировкой элементов по parentId.

Ответ

payload
array
required
Массив департаментов школы. Поле parentId указывает на родительский департамент (null — корневой).
curl --location 'https://api.exode.biz/saas/v2/staff/department/tree' \
  --header 'Seller-Id: {{ sellerId }}' \
  --header 'School-Id: {{ schoolId }}' \
  --header 'Authorization: Bearer YOUR_TOKEN'
{
  "success": true,
  "code": 200,
  "payload": [
    {
      "id": 3,
      "createdAt": "2026-07-02T11:15:47.223Z",
      "updatedAt": "2026-07-02T11:15:47.223Z",
      "archivedAt": null,
      "schoolId": 198,
      "parentId": null,
      "name": "Engineering"
    },
    {
      "id": 4,
      "createdAt": "2026-07-02T11:15:47.234Z",
      "updatedAt": "2026-07-02T11:15:47.247Z",
      "archivedAt": null,
      "schoolId": 198,
      "parentId": 3,
      "name": "Backend & Infra Team"
    }
  ]
}

Список департаментов

GET /saas/v2/staff/department/list
Требуется аутентификация и право StaffView.
В отличие от tree, эндпоинт возвращает пагинированный список департаментов. Параметры пагинации и фильтрации передаются как query-параметры.

Параметры

skip
integer
Количество пропускаемых записей (offset-пагинация). Минимум 0.
take
integer
Количество возвращаемых записей на странице. От 1 до 1000.
page
integer
Номер страницы (альтернатива skip). Минимум 1.
parentIds
array
Массив ID родительских департаментов для фильтрации (до 250 значений). Возвращает только дочерние департаменты указанных родителей.
Поиск по названию департамента. Максимум 50 символов.
createdAt
enum
Направление сортировки по дате создания. Возможные значения: ASC, DESC.

Ответ

payload
object
required
Пагинированный объект: items (массив департаментов), page, count, pages, isFirst, isLast, next, prev.
curl --location 'https://api.exode.biz/saas/v2/staff/department/list?take=10&page=1&search=Engineering' \
  --header 'Seller-Id: {{ sellerId }}' \
  --header 'School-Id: {{ schoolId }}' \
  --header 'Authorization: Bearer YOUR_TOKEN'
{
  "success": true,
  "code": 200,
  "payload": {
    "page": 1,
    "count": 2,
    "pages": 1,
    "isFirst": true,
    "isLast": true,
    "items": [
      {
        "id": 4,
        "createdAt": "2026-07-02T11:15:47.234Z",
        "updatedAt": "2026-07-02T11:15:47.247Z",
        "archivedAt": null,
        "schoolId": 198,
        "parentId": 3,
        "name": "Backend & Infra Team"
      },
      {
        "id": 3,
        "createdAt": "2026-07-02T11:15:47.223Z",
        "updatedAt": "2026-07-02T11:15:47.223Z",
        "archivedAt": null,
        "schoolId": 198,
        "parentId": null,
        "name": "Engineering"
      }
    ],
    "next": {
      "skip": 0,
      "take": 10,
      "page": 1
    },
    "prev": {
      "skip": 0,
      "take": 10,
      "page": 1
    }
  }
}

Создание департамента

POST /saas/v2/staff/department/create
Требуется аутентификация и право StaffManage.

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

name
string
required
Название департамента. От 1 до 100 символов. Пробелы в начале и конце обрезаются автоматически.
parentId
integer
ID родительского департамента. Если указан — должен принадлежать той же школе, иначе будет возвращена ошибка StaffDepartmentNotFound. Если не указан — департамент создаётся корневым.
curl --location 'https://api.exode.biz/saas/v2/staff/department/create' \
  --header 'Seller-Id: {{ sellerId }}' \
  --header 'School-Id: {{ schoolId }}' \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer YOUR_TOKEN' \
  --data-raw '{
    "name": "Engineering",
    "parentId": null
  }'
{
  "success": true,
  "code": 201,
  "payload": {
    "id": 3,
    "createdAt": "2026-07-02T11:15:47.223Z",
    "updatedAt": "2026-07-02T11:15:47.223Z",
    "archivedAt": null,
    "schoolId": 198,
    "parentId": null,
    "name": "Engineering"
  }
}

Обновление департамента

PUT /saas/v2/staff/department/{departmentId}/update
Требуется аутентификация и право StaffManage.
Обновляется только название департамента. Родительский департамент (parentId) через этот эндпоинт не изменяется.

Параметры

departmentId
integer
required
ID обновляемого департамента в рамках школы.
name
string
Новое название департамента. От 1 до 100 символов. Пробелы в начале и конце обрезаются автоматически.
curl --location --request PUT 'https://api.exode.biz/saas/v2/staff/department/4/update' \
  --header 'Seller-Id: {{ sellerId }}' \
  --header 'School-Id: {{ schoolId }}' \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer YOUR_TOKEN' \
  --data-raw '{
    "name": "Backend & Infra Team"
  }'
{
  "success": true,
  "code": 200,
  "payload": {
    "id": 4,
    "createdAt": "2026-07-02T11:15:47.234Z",
    "updatedAt": "2026-07-02T11:15:47.247Z",
    "archivedAt": null,
    "schoolId": 198,
    "parentId": 3,
    "name": "Backend & Infra Team"
  }
}

Удаление департамента

DELETE /saas/v2/staff/department/{departmentId}/delete
Требуется аутентификация и право StaffManage.
Удалить можно только «листовой» департамент без активных сотрудников:
  • если у департамента есть дочерние подразделения — вернётся ошибка StaffDepartmentHasChildren (удаление узла в середине дерева осиротило бы его потомков). Сначала удалите или перенесите дочерние департаменты;
  • если в департаменте есть активные сотрудники — вернётся ошибка StaffDepartmentHasActiveEmployments. Сначала переведите или уволите сотрудников.

Параметры

departmentId
integer
required
ID удаляемого департамента в рамках школы.

Ответ

deleted
boolean
required
Флаг успешного удаления департамента.
curl --location --request DELETE 'https://api.exode.biz/saas/v2/staff/department/4/delete' \
  --header 'Seller-Id: {{ sellerId }}' \
  --header 'School-Id: {{ schoolId }}' \
  --header 'Authorization: Bearer YOUR_TOKEN'
{
  "success": true,
  "code": 200,
  "payload": {
    "deleted": true
  }
}