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

API

Всё, что делает панель, доступно через REST API https://<сервер>:8443/api/v1: запускать процессы из 1С и других систем, добавлять элементы в очереди, забирать отчёты, выкладывать конфигурацию из CI. Панель сама пользуется этим API.

Вход #

Способ Как Для чего
Токен API Заголовок Authorization: Bearer tlp_… Скрипты и внешние системы
Сеанс панели Cookie tulpar_sid после POST /api/v1/auth/login Браузер

Токен создаётся в панели: «Профиль» → «Токены API» → «Создать токен». Права токена — вид токена в пересечении с правами его владельца (см. права токенов): «Только чтение» разрешает GET и SQL-запросы к базе отчётов (они только читают), «Запуск» — ещё задания, элементы очередей и запись в отчёты, «Полный доступ» — всё, что может владелец.

Изменяющие запросы (POST, PUT, PATCH, DELETE) с cookie обязаны иметь заголовок X-Tulpar-Csrf: 1; с токеном он не нужен.

GET https://orch.company.kg:8443/api/v1/processes?q=сверка&withTotal=true
Authorization: Bearer tlp_…

Общие правила #

Ошибки — JSON { "error": { "code", "message", "details"? } }, message — по-русски, для человека:

HTTP code Когда
400 BadRequest Неверный запрос
401 Unauthorized, InvalidCredentials Нет входа или неверный логин/пароль
403 Forbidden, CsrfHeaderMissing, LicenseRequired Нет права; нет заголовка CSRF; ограниченный режим лицензии
404 NotFound Нет объекта — или он в рабочей области, к которой у вас нет доступа
409 Conflict, ConcurrentUpdate, VersionExists, InvalidState Имя занято; объект изменил другой; версия уже опубликована; недопустимое состояние
422 ValidationFailed Неверные поля: details: [{ "field": "args.amount", "message": "…" }]
423 AccountLocked Учётная запись временно заблокирована после неудачных входов
429 RateLimited Слишком много запросов — повторите позже
503 Unavailable Временно недоступно (например, база отчётов)

Списки — ?limit=50 (до 500), cursor, withTotal=true, sort=поле:asc|desc и фильтры ресурса. Ответ — { "items": [...], "nextCursor": "…" | null, "total"? }. Следующая страница — тот же запрос с cursor=<nextCursor>; курсор устойчив к добавлению новых записей.

Изменение — PATCH с частичным телом и полем version объекта (из GET). Если объект успели изменить, ответ — 409 ConcurrentUpdate: перечитайте объект и повторите.

Время — ISO 8601 в UTC с Z: 2026-11-16T04:30:00.000Z. Идентификаторы — GUID.

Ограничения частоты: токен API — 600 запросов в минуту, вход — 10 попыток в минуту с адреса, поиск по журналу и выгрузки — 30 в минуту на пользователя.

Ресурсы #

Ресурс Основные адреса
Процессы и версии GET /processes, GET /processes/{id}, GET /processes/{id}/versions, POST /processes/{id}/current-version, POST /packages (публикация .tpkg), GET /processes/{id}/passport, GET /processes/{id}/passport/export?format=xlsx
Задания GET /jobs, POST /jobs, GET /jobs/{id}, GET /jobs/{id}/wait, POST /jobs/{id}/stop, POST /jobs/{id}/restart, GET /jobs/{id}/events
Расписания GET /triggers, POST /triggers, PATCH /triggers/{id}, POST /triggers/{id}/run-now, GET /triggers/{id}/history, POST /triggers/preview
Очереди GET /queues, POST /queues, POST /queues/{id}/items, POST /queues/{id}/import, GET /queues/{id}/items, GET /queues/{id}/items/export, POST /queue-items/retry, POST /queue-items/complete
Роботы GET /robots, GET /robots/{id}, POST /robots/{id}/maintenance, POST /robots/{id}/update, POST /robots/{id}/diagnostics
Ресурсы GET /assets, POST /assets, PUT /assets/{id}/value, POST /assets/{id}/copy
Журнал, ошибки, аналитика GET /logs/search, GET /logs/export, GET /errors/groups, GET /analytics/processes, GET /analytics/robots
Оповещения GET /alerts, POST /alerts/{id}/ack, POST /alerts/{id}/resolve, GET /alert-rules
Отчёты GET /reports, GET /reports/{id}/records, POST /reports/{id}/records, GET /reports/{id}/records/export, GET /reports/builtin/process/{id}, GET /reports/builtin/summary, POST /reports/sql/run, POST /reports/queries/{id}/run, POST /reports/queries/{id}/export
Лицензия GET /license, POST /license, GET /license/history, PUT /robots/{id}/license, PUT /users/{id}/studio-seat
Перенос POST /transfer/export, POST /transfer/preview, POST /transfer/import, POST /transfer/copy, GET /transfer/profiles, GET /transfer/runs
Администрирование GET /users, POST /users, GET /workspaces, PUT /workspaces/{id}/members/{userId}, GET /audit, GET /audit/export, GET /system/status
Проверки здоровья (без входа) GET /health/live, GET /health/ready

Пути даны от /api/v1, кроме /health/*. Полный набор запросов с телами — файл docs/orchestrator-api.http в репозитории (открывается в VS Code REST Client и в Rider).

Задания: запусти и дождись #

POST /api/v1/jobs
Authorization: Bearer tlp_…
Content-Type: application/json

{ "processId": "019a…", "args": { "period": "2026-11" }, "priority": "high", "note": "по запросу из 1С" }

Ответ 201 { "job": { "id", "number", "status": "pending", … } }. Без versionId берётся текущая версия; аргументы проверяются по типам (422 с полями args.*). Дождаться результата:

GET /api/v1/jobs/019a…/wait?timeoutSec=120
Authorization: Bearer tlp_…

Запрос ждёт финального статуса не дольше timeoutSec (1–120 с) и возвращает задание: status, error { code, message, stepId }, output — поля, которые процесс записал шагом Результат задания (аргументы и результат видны токену с правом на данные). Не дождались — повторите wait.

Очереди: добавить элементы #

POST /api/v1/queues/019a…/items
Authorization: Bearer tlp_…
Content-Type: application/json

{ "items": [
  { "reference": "З-1001", "payload": { "Номер": "З-1001", "ФИО": "Асанова Айгерим" }, "priority": "high", "deadline": "2026-11-17T12:00:00Z" },
  { "reference": "З-1002", "payload": { "Номер": "З-1002" }, "notBefore": "2026-11-17T03:00:00Z" }
] }

Нужен токен «Запуск» или «Полный доступ». В очереди с „без дубликатов по ссылке“ элемент с существующей ссылкой отклоняется с кодом QueueItemDuplicate. Список элементов — GET /queues/{id}/items?status=failed&errorType=system.

Ресурсы: сменить пароль #

PUT /api/v1/assets/019a…/value
Authorization: Bearer tlp_…
Content-Type: application/json

{ "username": "robot-bank", "password": "новый-пароль" }

С robotId — значение для одного робота. Пароль никогда не возвращается в ответах GET. Удобно для скрипта, который меняет пароль сервисной учётной записи по расписанию.

Отчёты #

Записи пользовательского отчёта с фильтрами — тот же синтаксис, что в адресе страницы отчёта в панели:

GET /api/v1/reports/019a…/records?f.status=Ошибка&createdFrom=2026-11-15&limit=200
Authorization: Bearer tlp_…

f.<поле>=… — равно (у текста — „содержит“), f.<поле>.from / .to — диапазон, f.<поле>.empty=true, q — поиск, createdFrom / createdTo, jobId, source. Выгрузка той же выборки — GET …/records/export?format=csv (или xlsx); для Excel и BI-систем это самый простой способ, хватает токена «Только чтение».

Записать строку от имени оператора — POST /reports/{id}/records с { "values": { "number": "П-0001", "amount": "3 400,50" } }.

SQL-запрос и сохранённый запрос:

POST /api/v1/reports/sql/run
Authorization: Bearer tlp_…
Content-Type: application/json

{ "workspaceId": "019a…",
  "sql": "SELECT process, sum(runs) AS runs FROM process_daily WHERE day >= :from GROUP BY process",
  "values": { "from": "startOfMonth" } }
POST /api/v1/reports/queries/019a…/export
Authorization: Bearer tlp_…
Content-Type: application/json

{ "format": "csv", "values": { "from": "yesterday", "to": "today" } }

Ответ run — колонки и первые 1 000 строк, export — файл (format: csv — без ограничения строк, xlsx). Ошибка SQL — 422 ReportSqlError с позицией. Запросы выполняются только на чтение (транзакция READ ONLY от роли области), поэтому POST /reports/sql/run, /reports/sql/explain, /reports/sql/export и POST /reports/queries/{id}/run, /export принимает и токен «Только чтение» — его удобно отдать Power BI, Excel или другой BI-системе. Права всё равно проверяются по владельцу токена: свой SQL — разработчик, владелец области, аудитор, администратор; сохранённый общий запрос — все, кто видит отчёты области. Сохранить, изменить или удалить запрос токеном «Только чтение» нельзя (403).

Прямое подключение BI к базе отчётов (без API) — ролью области, логин и пароль показывает администратор в «Настройки» → «Отчёты» (см. База отчётов). API этой вкладки — только для администратора: GET /settings/reports (адрес базы и роли областей, без паролей), POST /settings/reports/roles/{workspaceId}/reveal — пароль роли (каждый показ в аудите), POST …/rotate — новый пароль.

Лицензия #

GET /license — состояние, лимиты, занятые места и requestCode; POST /license { "text": "<содержимое .tlic>" } — ввести лицензию (422 LicenseInvalid с причиной); PUT /robots/{id}/license { "licensed": true } — назначить место роботу, PUT /users/{id}/studio-seat { "granted": true } — место студии (409 LicenseLimitReached, если мест нет). Только администратор. Подробнее — Лицензирование.

Перенос #

POST /api/v1/transfer/export
Authorization: Bearer tlp_…
Content-Type: application/json

{ "workspaceId": "019a…",
  "include": { "assets": true, "credentials": "secrets", "queues": true, "triggers": true, "reports": true, "processes": true },
  "password": "Пароль-файла-2026" }

Ответ — файл .tbundle. POST /transfer/preview и /transfer/import принимают multipart: часть file (файл переноса) и часть options — JSON { "workspaceId", "password"?, "robotMapping"?: { "РОБОТ-01": "<id робота цели>" }, "substitutions"?: [{ "find": "test-1c.local", "replace": "prod-1c.local" }], "profileId"?, "defaultPolicy": "update", "policies"?: { "assets/Адрес 1С": "skip" }, "dryRun"? }. Ошибка любого объекта откатывает всё — 422 TransferFailed со списком. Нужен токен «Полный доступ» владельца области или администратора. Для CI проще команды сервера — см. Перенос между средами.