REST API

Внешний REST API для интеграций — работает независимо от веб-интерфейса, на отдельном порту. Ключ для доступа выдаётся в разделе «Администрирование → API‑ключи» — как его получить, описано в статье «API-ключи».

Базовые сведения и аутентификация

  • Base URL: http://<адрес сервера>:8081/api/v1/
  • Порт 8081 фиксирован и не настраивается через интерфейс.
  • Все ответы — JSON, кодировка UTF‑8.
  • Видимость данных зависит от прав пользователя, к которому привязан ключ — те же правила, что и в веб-интерфейсе (заявитель, исполнитель и администратор видят разное).

Каждый запрос должен содержать заголовок:

Authorization: Bearer <ваш_ключ>

Без заголовка или с неверным/просроченным ключом сервер возвращает 401 — подробнее обо всех кодах ошибок в самом конце статьи.

Все доступные эндпоинты:

Метод и путь Описание
GET /tasks/{id} Одна задача целиком
GET /tasks Список задач
GET /tasks/report Счётчики задач по статусам
POST /tasks Создать задачу
PUT/PATCH /tasks/{id} Обновить задачу
DELETE /tasks/{id} Удалить задачу
GET /trees Ветки услуг (для поля id_tree)
GET /groups Группы
GET /users Пользователи
GET /debug/pool Состояние пула подключений к БД (только администратор)

Работа с задачами

Получение одной задачи

GET /api/v1/tasks/{id} — одна задача целиком

Отдаёт те же поля, что и список, плюс body — текст описания задачи.

Пример запроса (получить задачу №42):

curl -H "Authorization: Bearer $API_KEY" "http://server:8081/api/v1/tasks/42"

Пример ответа:

{
  "id": 42,
  "id_status": 1,
  "status": "Новая",
  "id_priority": 2,
  "priority": "Средний",
  "name": "Не печатает принтер в приёмной",
  "id_tree": 8,
  "service": "Принтеры и МФУ",
  "id_group": 16,
  "group": "IT-отдел",
  "id_applicant": 5,
  "id_worker": -1,
  "date_create": "2026-07-18 09:12:00",
  "date_must_be_end": "2026-07-18 17:12:00",
  "date_end": null,
  "body": "Не печатает, индикатор мигает жёлтым. Перезагрузка не помогла."
}

Получение списка задач

GET /api/v1/tasks — список задач

Пример запроса (список задач без фильтров):

curl -H "Authorization: Bearer $API_KEY" "http://server:8081/api/v1/tasks"

Пример ответа:

[
  {
    "id": 42,
    "id_status": 1,
    "status": "Новая",
    "id_priority": 2,
    "priority": "Средний",
    "name": "Не печатает принтер в приёмной",
    "id_tree": 8,
    "service": "Принтеры и МФУ",
    "id_group": 16,
    "group": "IT-отдел",
    "id_applicant": 5,
    "id_worker": -1,
    "date_create": "2026-07-18 09:12:00",
    "date_must_be_end": "2026-07-18 17:12:00",
    "date_end": null
  }
]

Список можно сузить query-параметрами — все необязательные:

Параметр Описание
id_status фильтр по статусу
id_tree фильтр по ветке услуги
id_group фильтр по группе
limit размер страницы, по умолчанию 50, максимум 200
last_id курсорная пагинация — id последней задачи с предыдущей страницы, чтобы получить следующую

Пример запроса (первые 20 новых задач):

curl -H "Authorization: Bearer $API_KEY" \
  "http://server:8081/api/v1/tasks?id_status=1&limit=20"

Формат ответа тот же, что и без фильтров. Пагинация вперёд: возьмите id последней задачи из ответа и передайте его как last_id в следующем запросе.

GET /api/v1/tasks/report — счётчики по статусам

Отдаёт не сами задачи, а количество задач в каждом статусе — удобно для дашбордов и быстрых отчётов, когда не нужен весь список, а нужны только цифры.

Пример запроса (счётчики по всем задачам, без фильтра по датам):

curl -H "Authorization: Bearer $API_KEY" "http://server:8081/api/v1/tasks/report"

Пример ответа:

[
  { "id_status": 1, "status": "Новая", "count": 40 },
  { "id_status": 2, "status": "В работе", "count": 30 },
  { "id_status": 3, "status": "Завершена", "count": 25 }
]

Если нужны счётчики не за всё время, а за конкретный период — например, для еженедельного отчёта — период можно сузить необязательными параметрами date_from, date_to (формат YYYY-MM-DD, фильтр по дате создания, можно передать только один из них):

Пример запроса (счётчики за июль 2026):

curl -H "Authorization: Bearer $API_KEY" \
  "http://server:8081/api/v1/tasks/report?date_from=2026-07-01&date_to=2026-07-31"

Формат ответа тот же.

Создание, изменение и удаление

POST /api/v1/tasks — создать задачу

Заявителем становится пользователь, привязанный к ключу — как и при создании через обычную форму.

Пример запроса (создать задачу с минимальным набором полей):

curl -X POST -H "Authorization: Bearer $API_KEY" -H "Content-Type: application/json" \
  -d '{"name":"Не работает Wi-Fi в кабинете 210","id_tree":9}' \
  "http://server:8081/api/v1/tasks"

Пример ответа (созданная задача целиком, в том же формате, что и GET /api/v1/tasks/{id}):

{
  "id": 105,
  "id_status": 1,
  "status": "Новая",
  "id_priority": 2,
  "priority": "Средний",
  "name": "Не работает Wi-Fi в кабинете 210",
  "id_tree": 9,
  "service": "Сеть и интернет",
  "id_group": 16,
  "group": "IT-отдел",
  "id_applicant": 5,
  "id_worker": -1,
  "date_create": "2026-07-20 11:02:00",
  "date_must_be_end": "2026-07-20 19:02:00",
  "date_end": null,
  "body": null
}

Обязательные поля — без них задачу не создать:

Поле Описание
name название задачи
id_tree id ветки услуги — обязательно активная услуга, не категория верхнего уровня

Кроме обязательных, можно сразу передать и необязательные поля:

Поле Описание
comment описание задачи
watchers список id пользователей-наблюдателей, например [3,7]

Пример запроса (то же самое, но сразу с описанием и наблюдателями):

curl -X POST -H "Authorization: Bearer $API_KEY" -H "Content-Type: application/json" \
  -d '{"name":"Не работает Wi-Fi в кабинете 210","id_tree":9,"comment":"Пропадает сигнал каждые 10 минут","watchers":[3,7]}' \
  "http://server:8081/api/v1/tasks"

Формат ответа тот же, только поле body будет заполнено переданным описанием.

PUT / PATCH /api/v1/tasks/{id} — обновить задачу

Частичное обновление — присылайте только те поля, которые хотите изменить, остальные останутся как есть.

Пример запроса (перевести задачу №42 в статус «В работе»):

curl -X PATCH -H "Authorization: Bearer $API_KEY" -H "Content-Type: application/json" \
  -d '{"id_status":2}' \
  "http://server:8081/api/v1/tasks/42"

В ответ — та же задача целиком, уже с обновлённым полем.

В одном запросе можно менять сразу несколько полей — доступны: name, id_tree, comment, id_group, id_applicant, id_worker, id_status, id_priority, watchers.

Пример запроса (тот же перевод в работу, но сразу с назначением исполнителя):

curl -X PATCH -H "Authorization: Bearer $API_KEY" -H "Content-Type: application/json" \
  -d '{"id_status":2,"id_worker":19}' \
  "http://server:8081/api/v1/tasks/42"
  • Если watchers не передан — текущий список наблюдателей сохраняется как есть.
  • id_worker — используйте -1 (или не указывайте), чтобы задача осталась без исполнителя.

DELETE /api/v1/tasks/{id} — удалить задачу

Удалять может только администратор.

Пример запроса (удалить задачу №42):

curl -X DELETE -H "Authorization: Bearer $API_KEY" "http://server:8081/api/v1/tasks/42"

Пример ответа:

{ "deleted": true }

Справочники

GET /api/v1/trees — ветки услуг

Доступные пользователю ключа ветки, куда можно создавать задачи — для заполнения id_tree.

Пример ответа:

[
  { "id": 8, "name": "Принтеры и МФУ", "id_parent": 1 },
  { "id": 1, "name": "IT и техника", "id_parent": null }
]

GET /api/v1/groups — группы

Пример ответа:

[
  { "id": 16, "name": "IT-отдел", "tipe": 2 }
]

tipe: 1 — Пользователь, 2 — Исполнитель, 3 — Администратор.

GET /api/v1/users — пользователи

Пример запроса (все пользователи):

curl -H "Authorization: Bearer $API_KEY" "http://server:8081/api/v1/users"

Пример ответа:

[
  { "id": 5, "login": "a.ivanov", "name": "Иванов Андрей", "tipe": 1 }
]

Искать по логину или имени можно необязательным параметром search:

Пример запроса (поиск по фамилии «Иванов»):

curl -H "Authorization: Bearer $API_KEY" "http://server:8081/api/v1/users?search=иванов"

Формат ответа тот же.

Удалённые пользователи в выдачу не попадают.

Диагностика

GET /api/v1/debug/pool — состояние пула подключений к БД

Снимок текущего состояния пула соединений с базой данных. Доступно только администратору.

Ошибки

Все ошибки — в едином формате:

{ "error": "текст ошибки" }

Общие коды:

Код Значение
400 некорректный запрос — не хватает обязательного поля, тело не JSON и т.п.
401 ключ отсутствует, неверен или просрочен
403 ключ действителен, но у пользователя недостаточно прав на это действие
404 эндпоинт или задача не найдены
500 внутренняя ошибка сервера

Частые причины по конкретным эндпоинтам:

Эндпоинт Код Когда
GET /tasks/{id} 404 задача не существует или недоступна пользователю ключа
POST /tasks 400 не указано название или ветка, либо ветка не является активной услугой
PUT/PATCH /tasks/{id} 403 недостаточно прав — например, обычный пользователь пытается назначить исполнителя
PUT/PATCH /tasks/{id} 404 задача не найдена или недоступна
DELETE /tasks/{id} 403 пользователь ключа не администратор
GET /debug/pool 403 пользователь ключа не администратор

Справочные значения по умолчанию

Статусы (id_status) Приоритеты (id_priority)
1 — Новая 1 — Низкий
2 — В работе 2 — Средний
3 — Завершена 3 — Высокий
4 — Отложена

Точный список и порядок могут отличаться, если администратор их менял — актуальный список всегда можно посмотреть в самом интерфейсе.