Документация API

Внешний REST API Selpo для учётных систем (1С и аналоги). Через него создают участки и задачи, читают статусы с табло и забирают журнал событий.

Как устроена интеграция

Учётная система — источник заказов и заданий. Selpo — цеховое табло: показывает задачи, фиксирует статусы и время.

  1. Получить API-токен клиента.
  2. Создать или сопоставить участки (цеха).
  3. Отправлять задачи на табло.
  4. Опрашивать журнал событий и статусы — переносить факты обратно в учёт.
Интеграция идёт только через REST /api/v1. WebSocket нужен браузерному табло, не учётной системе.

Базовые параметры

ПараметрЗначение
Базовый URL (prod)https://selpotask.ru
Префикс API/api/v1
Полный URL метода{BASE_URL}/api/v1/{path}
ФорматJSON, UTF-8
Заголовок телаContent-Type: application/json; charset=utf-8
АутентификацияAuthorization: Bearer <token>
Токен и пароль в URL передавать нельзя — только в заголовке Bearer или в JSON-теле для /auth/token.

Аутентификация

Получить токен

POST /api/v1/auth/token
{
  "login": "zavod_a",
  "password": "********"
}

Ответ 200: { "token": "…" } — строка 32 символа. Каждый успешный запрос выдаёт новый токен и инвалидирует предыдущий.

Обновить токен без логина/пароля

POST /api/v1/auth/token/refresh

Нужен текущий Bearer. В ответе — новый токен; старый перестаёт действовать. Удобно, если в учётной системе хранится только токен.

Использование

Authorization: Bearer a1b2c3d4e5f6789012345678abcdef01

Заголовок обязателен для всех методов, кроме POST /auth/token и GET /config/delay.

HTTPКодСмысл
401auth_requiredНет или пустой Bearer
401auth_failedНеверный или устаревший токен / логин
403account_blockedАккаунт заблокирован
403account_expiredИстёк срок подписки
При 401 сначала вызовите /auth/token/refresh, затем один раз повторите исходный запрос. Не запрашивайте токен на каждый вызов.

Bootstrap — параметры клиента одним запросом

GET /api/v1/bootstrap

После указания адреса сервиса и токена один запрос отдаёт URL, тариф, лимиты опроса, список участков и табло диспетчера с PIN (bootstrapVersion ≥ 3).

БлокЗачем
urlsbase, api, adminPanel, health
clientИмя, логин, срок, флаги
tariff / usageЛимиты и текущее использование (в т.ч. usage.dispatcherBoards)
integration.pollMinIntervalSecМинимальный интервал опроса
divisions[]Участки: divId, ссылка на табло, PIN в password
dispatcherBoards[]Табло диспетчера: boardId, link, divisionIds (до 3), PIN в password

Пароль администратора и сам API-токен в ответе не возвращаются.

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

Успех: JSON-объект или массив без обёртки { data: … }. Код 200 или 201 при создании.

Ошибка:

{
  "code": "validation_error",
  "error": "Краткий текст",
  "reason": "Что делать",
  "httpStatus": 400,
  "details": {}
}
HTTPКогда
400Невалидное тело или query
401 / 403Авторизация и доступ
404Нет участка или задачи
409Дубликат или недопустимый статус
423Лимит тарифа / пауза между запросами
429Слишком много запросов

Статусы и важные поля

Статус задачи (taskStatus)

ЗначениеИмяНа таблоСмысл
0PLANNEDДаПоступила, не начата
1RUNДаВ работе
2STOPДаПауза
5DONEНетВыполнена
6CANCELНетОтменена

Приоритет

0 — обычная, 1 — срочная (метка «СРОЧНО», выше в списке).

Идентификаторы

  • divId — алиас участка (генерирует сервер при создании; в задачах указывается этот id).
  • taskId — ваш внешний ключ задачи (1–100 символов, уникален на участке). В URL кодируйте спецсимволы.

Интервал опроса

GET /api/v1/config/delay

Ответ: { "delay": 10 } — рекомендуемый интервал в секундах. Не опрашивайте чаще.

Участки

POST /api/v1/divisions
{
  "name": "Упаковка",
  "password": "0000",
  "timezone": 3
}
ПолеОбяз.Ограничения
nameда1–200 символов
passwordдаPIN табло, 1–50
timezoneнет2–12, по умолчанию 3

Ответ 201 содержит divId, link (URL табло) и password (PIN). Сохраните их в учётной системе.

МетодПутьНазначение
GET/divisionsСписок участков
GET/divisions/{divId}Один участок
PATCH/divisions/{divId}Имя / PIN / часовой пояс
DELETE/divisions/{divId}Удалить участок, задачи и исполнителей

Задачи

POST /api/v1/tasks
{
  "taskId": "550e8400-e29b-41d4-a716-446655440000",
  "taskNum": 101,
  "taskDate": "03.09.2026",
  "priority": 1,
  "qty": 50,
  "item": "Крышка",
  "itemPrt": "пластик",
  "description": "Технологическая инструкция для рабочего.",
  "orderNum": "З-4501",
  "orderDate": "01.09.2026 10:00:00",
  "orderType": "Производство",
  "divId": "e24be3b2848a"
}
ПолеОбяз.Комментарий
taskIdдаВнешний id, уникален на участке
taskNumдаНомер на карточке табло
taskDateдаРекомендуется dd.mm.yyyy
divIdдаУчасток этого клиента
priorityнет0 или 1
descriptionнетДо 2000 символов — текст для рабочего

Управление статусом из учёта

Все методы — POST, тело пустое.

ДействиеПутьДопустимый статус
Начать / продолжить/tasks/{taskId}/run0 или 2
Пауза/tasks/{taskId}/pause1
Завершить/tasks/{taskId}/done1 или 2
Отменить/tasks/{taskId}/cancel0, 1 или 2

Приоритет: POST …/priority/up и …/priority/down. Удаление: DELETE /tasks/{taskId}.

Статус и время для учёта

GET /api/v1/tasks/{taskId}/status
ПолеСмысл
times.workMsЧистое рабочее время, мс
times.pauseMsВремя пауз, мс
times.totalMsОт первого «Начать», мс
executorNameКто назначен на табло
taskStatusТекущий статус

Список изменённых задач: GET /tasks?since={unix_ms} → { tasks, time }. Сохраняйте time для следующего опроса.

Журнал событий

Основной канал обратной связи с табло.

GET /api/v1/events?since={unix_ms}
{
  "events": [
    {
      "taskId": "550e8400-…",
      "divId": "e24be3b2848a",
      "action": "run",
      "timestamp": 1788446425000,
      "data": { "taskStatus": 1 }
    }
  ],
  "time": 1788446550000
}
actionКогда
create / deleteСоздание / удаление задачи
run / stopСтарт или пауза (табло или API)
done / cancelЗавершение / отмена
priorityСмена срочности
Алгоритм: прочитать since → обработать события → при run/stop/done/cancel запросить /tasks/{id}/status для времени → сохранить новый since → ждать delay секунд.

Типовой сценарий

  1. POST /auth/token или ввод готового токена → сохранить Bearer.
  2. GET /bootstrap → URL, тариф, участки и PIN.
  3. Сопоставить цеха учёта с divId (или POST /divisions).
  4. При запуске заказа — POST /tasks.
  5. Регламент: GET /events?since=…, обновлять статусы и время в учёте.
  6. При необходимости управлять срочностью и отменой из учёта через /priority/* и /cancel.
Токен одного клиента не видит данные другого. Один экземпляр интеграции = один клиент Selpo.

Файлы расширений и дистрибутивы: раздел «Файлы».