API · MCP

API и MCP «Помощника SA»

Внешнее API платформы «Помощник SA»: проекты, папки и артефакты всех инструментов (DBML, PlantUML, OpenAPI, AsyncAPI, BPMN, XSD, WSDL, XML, JSON Schema, YAML, JSON, Markdown, AsciiDoc) с историей версий.

Адрес APIhttps://helper-sa.ru/api/ext/v1
MCP-серверhttps://helper-sa.ru/api/mcp
Версияv1.0.0

Начало работы

Доступ. API доступно на тарифах «Про» и выше (в том числе на пробном периоде). Создайте ключ в профиле («Ключи API») и передавайте его в заголовке Authorization: Bearer sah_… (или X-API-Key: sah_…). Права — те же, что у владельца ключа в веб-интерфейсе: лимиты тарифа, доступ к проектам, удаление — автор или владелец проекта.

Версии. Каждое изменение содержимого создаёт версию артефакта, как кнопка «Сохранить» в редакторе. В истории версий указаны автор и источник изменений: WEB, API, MCP или AI. Откат к версии создаёт новую версию; …/diff показывает разницу между версиями (unified diff).

Защита от затирания. Артефакт возвращается с номером текущей версии version. Передайте его как baseVersion при изменении (PUT, …/edit): если с тех пор артефакт сохранил кто-то другой (в редакторе, через API или MCP), правка не применяется — ответ 409 VERSION_CONFLICT. Перечитайте артефакт и повторите.

Точечные правки. POST …/edit заменяет фрагменты текста (oldText → newText) без передачи файла целиком.

Проверка синтаксиса (без ИИ) — POST /validate для текста и GET …/validation для сохранённого артефакта: те же правила, что в редакторах (DBML, PlantUML, OpenAPI, AsyncAPI, JSON Schema, XSD/WSDL со связанными файлами проекта, BPMN, XML, YAML, JSON).

Ошибки — JSON { "code": "…", "message": "…" }: API_KEY_INVALID (401); API_TARIFF_REQUIRED, AUTH_USER_BLOCKED, FORBIDDEN (403 — тариф ниже «Про», пользователь заблокирован, действие доступно только владельцу проекта или автору); NOT_FOUND (404); VALIDATION_FAILED, EDIT_NOT_FOUND / EDIT_AMBIGUOUS (400, точечная правка); VERSION_CONFLICT (409); PROJECT_LIMIT, <TOOL>_DIAGRAM_LIMIT (409, лимиты тарифа), PROJECT_FOLDER_NAME_TAKEN, PROJECT_FOLDER_CYCLE (409, дерево папок).

Одновременная работа. Если артефакт открыт в редакторе у участников проекта, ваша правка через API не потеряется и не затрёт их изменения молча: сохранение в редакторе от устаревшей версии покажет им окно конфликта (затереть, посмотреть текущую версию, сохранить как новый артефакт или отменить).

Для ИИ-агентов тот же набор операций доступен через MCP-сервер /api/mcp.

Первый запрос

curl 'https://helper-sa.ru/api/ext/v1/projects' \
  -H 'Authorization: Bearer sah_ВАШ_КЛЮЧ'

Владелец ключа и доступные инструменты

GET/me

Владелец ключа — логин, имя, тариф и срок его действия

Ответы

  • 200 Пользователь — ExtUser
  • 401 Нет ключа, ключ неизвестен или истёк (`API_KEY_INVALID`)
  • 403 `API_TARIFF_REQUIRED` — тариф владельца ключа ниже «Про»; `AUTH_USER_BLOCKED` — пользователь заблокирован; `FORBIDDEN` — действие доступно не всем участникам (изменить или удалить проект — владелец; удалить артефакт — автор или владелец проекта; перенести артефакт — автор)
curl
curl -X GET 'https://helper-sa.ru/api/ext/v1/me' \
  -H 'Authorization: Bearer sah_ВАШ_КЛЮЧ'
GET/tools

Инструменты, артефакты которых доступны через API

Ответы

  • 200 Коды инструментов — ExtTool[]
  • 401 Нет ключа, ключ неизвестен или истёк (`API_KEY_INVALID`)
  • 403 `API_TARIFF_REQUIRED` — тариф владельца ключа ниже «Про»; `AUTH_USER_BLOCKED` — пользователь заблокирован; `FORBIDDEN` — действие доступно не всем участникам (изменить или удалить проект — владелец; удалить артефакт — автор или владелец проекта; перенести артефакт — автор)
curl
curl -X GET 'https://helper-sa.ru/api/ext/v1/tools' \
  -H 'Authorization: Bearer sah_ВАШ_КЛЮЧ'

Проекты, папки и размещение артефактов

GET/projects

Мои проекты (владелец или участник)

Ответы

  • 200 Проекты — ExtProject[]
  • 401 Нет ключа, ключ неизвестен или истёк (`API_KEY_INVALID`)
  • 403 `API_TARIFF_REQUIRED` — тариф владельца ключа ниже «Про»; `AUTH_USER_BLOCKED` — пользователь заблокирован; `FORBIDDEN` — действие доступно не всем участникам (изменить или удалить проект — владелец; удалить артефакт — автор или владелец проекта; перенести артефакт — автор)
curl
curl -X GET 'https://helper-sa.ru/api/ext/v1/projects' \
  -H 'Authorization: Bearer sah_ВАШ_КЛЮЧ'
POST/projects

Создать проект

Тело запроса ExtProjectInput

name*string пример: Оплата заказа
descriptionstring | null

Ответы

  • 201 Проект — ExtProject
  • 400 Некорректный запрос (`VALIDATION_FAILED`)
  • 401 Нет ключа, ключ неизвестен или истёк (`API_KEY_INVALID`)
  • 403 `API_TARIFF_REQUIRED` — тариф владельца ключа ниже «Про»; `AUTH_USER_BLOCKED` — пользователь заблокирован; `FORBIDDEN` — действие доступно не всем участникам (изменить или удалить проект — владелец; удалить артефакт — автор или владелец проекта; перенести артефакт — автор)
  • 409 Лимит тарифа (`PROJECT_LIMIT` — проекты, `<TOOL>_DIAGRAM_LIMIT` — артефакты инструмента) или конфликт в дереве папок (`PROJECT_FOLDER_NAME_TAKEN` — папка с таким названием уже есть, `PROJECT_FOLDER_CYCLE` — папку нельзя перенести в саму себя или во вложенную)
curl
curl -X POST 'https://helper-sa.ru/api/ext/v1/projects' \
  -H 'Authorization: Bearer sah_ВАШ_КЛЮЧ' \
  -H 'Content-Type: application/json' \
  -d '{"name":"Оплата заказа"}'
GET/projects/search

Поиск проектов с фильтрами, сортировкой и страницами

Параметры

queryquery · stringПодстрока в названии или описании (без учёта регистра)
rolequery · string any | owner | memberТолько свои (owner), только чужие, где вы участник (member), или все (any)
updatedFromquery · string(date-time)Изменены не раньше
updatedToquery · string(date-time)Изменены не позже
sortquery · string updatedAt | createdAt | name
orderquery · string asc | desc
pagequery · integer
sizequery · integer

Ответы

  • 200 Страница проектов — ExtProjectPage
  • 400 Некорректный запрос (`VALIDATION_FAILED`)
  • 401 Нет ключа, ключ неизвестен или истёк (`API_KEY_INVALID`)
  • 403 `API_TARIFF_REQUIRED` — тариф владельца ключа ниже «Про»; `AUTH_USER_BLOCKED` — пользователь заблокирован; `FORBIDDEN` — действие доступно не всем участникам (изменить или удалить проект — владелец; удалить артефакт — автор или владелец проекта; перенести артефакт — автор)
curl
curl -X GET 'https://helper-sa.ru/api/ext/v1/projects/search' \
  -H 'Authorization: Bearer sah_ВАШ_КЛЮЧ'
GET/projects/{projectId}

Проект

Параметры

projectId*path · string(uuid)

Ответы

  • 200 Проект — ExtProject
  • 401 Нет ключа, ключ неизвестен или истёк (`API_KEY_INVALID`)
  • 403 `API_TARIFF_REQUIRED` — тариф владельца ключа ниже «Про»; `AUTH_USER_BLOCKED` — пользователь заблокирован; `FORBIDDEN` — действие доступно не всем участникам (изменить или удалить проект — владелец; удалить артефакт — автор или владелец проекта; перенести артефакт — автор)
  • 404 Не найдено или нет доступа (`NOT_FOUND`)
curl
curl -X GET 'https://helper-sa.ru/api/ext/v1/projects/<projectId>' \
  -H 'Authorization: Bearer sah_ВАШ_КЛЮЧ'
PUT/projects/{projectId}

Изменить название и описание (владелец)

Параметры

projectId*path · string(uuid)

Тело запроса ExtProjectInput

name*string пример: Оплата заказа
descriptionstring | null

Ответы

  • 200 Проект — ExtProject
  • 401 Нет ключа, ключ неизвестен или истёк (`API_KEY_INVALID`)
  • 403 `API_TARIFF_REQUIRED` — тариф владельца ключа ниже «Про»; `AUTH_USER_BLOCKED` — пользователь заблокирован; `FORBIDDEN` — действие доступно не всем участникам (изменить или удалить проект — владелец; удалить артефакт — автор или владелец проекта; перенести артефакт — автор)
  • 404 Не найдено или нет доступа (`NOT_FOUND`)
curl
curl -X PUT 'https://helper-sa.ru/api/ext/v1/projects/<projectId>' \
  -H 'Authorization: Bearer sah_ВАШ_КЛЮЧ' \
  -H 'Content-Type: application/json' \
  -d '{"name":"Оплата заказа"}'
DELETE/projects/{projectId}

Удалить проект (владелец); артефакты вернутся в личное пространство авторов

Параметры

projectId*path · string(uuid)

Ответы

  • 204 Удалён
  • 401 Нет ключа, ключ неизвестен или истёк (`API_KEY_INVALID`)
  • 403 `API_TARIFF_REQUIRED` — тариф владельца ключа ниже «Про»; `AUTH_USER_BLOCKED` — пользователь заблокирован; `FORBIDDEN` — действие доступно не всем участникам (изменить или удалить проект — владелец; удалить артефакт — автор или владелец проекта; перенести артефакт — автор)
  • 404 Не найдено или нет доступа (`NOT_FOUND`)
curl
curl -X DELETE 'https://helper-sa.ru/api/ext/v1/projects/<projectId>' \
  -H 'Authorization: Bearer sah_ВАШ_КЛЮЧ'
GET/projects/{projectId}/tree

Дерево проекта — папки и артефакты с путями

Путь артефакта «папка/подпапка/название» — адрес для ссылок между файлами ($ref, include, schemaLocation).

Параметры

projectId*path · string(uuid)

Ответы

  • 200 Дерево — ExtTree
  • 401 Нет ключа, ключ неизвестен или истёк (`API_KEY_INVALID`)
  • 403 `API_TARIFF_REQUIRED` — тариф владельца ключа ниже «Про»; `AUTH_USER_BLOCKED` — пользователь заблокирован; `FORBIDDEN` — действие доступно не всем участникам (изменить или удалить проект — владелец; удалить артефакт — автор или владелец проекта; перенести артефакт — автор)
  • 404 Не найдено или нет доступа (`NOT_FOUND`)
curl
curl -X GET 'https://helper-sa.ru/api/ext/v1/projects/<projectId>/tree' \
  -H 'Authorization: Bearer sah_ВАШ_КЛЮЧ'
GET/projects/{projectId}/folders

Папки проекта — все или по подстроке в названии

Параметры

projectId*path · string(uuid)
queryquery · stringПодстрока в названии папки (без учёта регистра); нет — все папки
parentIdquery · string(uuid)Только вложенные в эту папку (на любую глубину)

Ответы

  • 200 Папки с путями, по алфавиту путей — ExtFolder[]
  • 401 Нет ключа, ключ неизвестен или истёк (`API_KEY_INVALID`)
  • 403 `API_TARIFF_REQUIRED` — тариф владельца ключа ниже «Про»; `AUTH_USER_BLOCKED` — пользователь заблокирован; `FORBIDDEN` — действие доступно не всем участникам (изменить или удалить проект — владелец; удалить артефакт — автор или владелец проекта; перенести артефакт — автор)
  • 404 Не найдено или нет доступа (`NOT_FOUND`)
curl
curl -X GET 'https://helper-sa.ru/api/ext/v1/projects/<projectId>/folders' \
  -H 'Authorization: Bearer sah_ВАШ_КЛЮЧ'
POST/projects/{projectId}/folders

Создать папку

Параметры

projectId*path · string(uuid)

Тело запроса ExtFolderInput

name*string пример: schemas
parentIdstring(uuid) | nullРодительская папка; нет — корень

Ответы

  • 201 Папка — ExtFolder
  • 400 Некорректный запрос (`VALIDATION_FAILED`)
  • 401 Нет ключа, ключ неизвестен или истёк (`API_KEY_INVALID`)
  • 403 `API_TARIFF_REQUIRED` — тариф владельца ключа ниже «Про»; `AUTH_USER_BLOCKED` — пользователь заблокирован; `FORBIDDEN` — действие доступно не всем участникам (изменить или удалить проект — владелец; удалить артефакт — автор или владелец проекта; перенести артефакт — автор)
  • 409 Лимит тарифа (`PROJECT_LIMIT` — проекты, `<TOOL>_DIAGRAM_LIMIT` — артефакты инструмента) или конфликт в дереве папок (`PROJECT_FOLDER_NAME_TAKEN` — папка с таким названием уже есть, `PROJECT_FOLDER_CYCLE` — папку нельзя перенести в саму себя или во вложенную)
curl
curl -X POST 'https://helper-sa.ru/api/ext/v1/projects/<projectId>/folders' \
  -H 'Authorization: Bearer sah_ВАШ_КЛЮЧ' \
  -H 'Content-Type: application/json' \
  -d '{"name":"schemas"}'
GET/projects/{projectId}/folders/{folderId}

Папка с содержимым — вложенные папки и артефакты

Параметры

projectId*path · string(uuid)
folderId*path · string(uuid)
recursivequery · booleantrue — всё содержимое на любую глубину; false — только непосредственное

Ответы

  • 200 Папка и её содержимое — ExtFolderContent
  • 401 Нет ключа, ключ неизвестен или истёк (`API_KEY_INVALID`)
  • 403 `API_TARIFF_REQUIRED` — тариф владельца ключа ниже «Про»; `AUTH_USER_BLOCKED` — пользователь заблокирован; `FORBIDDEN` — действие доступно не всем участникам (изменить или удалить проект — владелец; удалить артефакт — автор или владелец проекта; перенести артефакт — автор)
  • 404 Не найдено или нет доступа (`NOT_FOUND`)
curl
curl -X GET 'https://helper-sa.ru/api/ext/v1/projects/<projectId>/folders/<folderId>' \
  -H 'Authorization: Bearer sah_ВАШ_КЛЮЧ'
PUT/projects/{projectId}/folders/{folderId}

Переименовать или перенести папку

Параметры

projectId*path · string(uuid)
folderId*path · string(uuid)

Тело запроса ExtFolderInput

name*string пример: schemas
parentIdstring(uuid) | nullРодительская папка; нет — корень

Ответы

  • 200 Папка — ExtFolder
  • 400 Некорректный запрос (`VALIDATION_FAILED`)
  • 401 Нет ключа, ключ неизвестен или истёк (`API_KEY_INVALID`)
  • 403 `API_TARIFF_REQUIRED` — тариф владельца ключа ниже «Про»; `AUTH_USER_BLOCKED` — пользователь заблокирован; `FORBIDDEN` — действие доступно не всем участникам (изменить или удалить проект — владелец; удалить артефакт — автор или владелец проекта; перенести артефакт — автор)
  • 404 Не найдено или нет доступа (`NOT_FOUND`)
curl
curl -X PUT 'https://helper-sa.ru/api/ext/v1/projects/<projectId>/folders/<folderId>' \
  -H 'Authorization: Bearer sah_ВАШ_КЛЮЧ' \
  -H 'Content-Type: application/json' \
  -d '{"name":"schemas"}'
DELETE/projects/{projectId}/folders/{folderId}

Удалить папку (содержимое переходит в родительскую)

Параметры

projectId*path · string(uuid)
folderId*path · string(uuid)

Ответы

  • 204 Удалена
  • 401 Нет ключа, ключ неизвестен или истёк (`API_KEY_INVALID`)
  • 403 `API_TARIFF_REQUIRED` — тариф владельца ключа ниже «Про»; `AUTH_USER_BLOCKED` — пользователь заблокирован; `FORBIDDEN` — действие доступно не всем участникам (изменить или удалить проект — владелец; удалить артефакт — автор или владелец проекта; перенести артефакт — автор)
  • 404 Не найдено или нет доступа (`NOT_FOUND`)
curl
curl -X DELETE 'https://helper-sa.ru/api/ext/v1/projects/<projectId>/folders/<folderId>' \
  -H 'Authorization: Bearer sah_ВАШ_КЛЮЧ'
PUT/projects/{projectId}/placements

Положить артефакт проекта в папку (folderId = null — в корень)

Параметры

projectId*path · string(uuid)

Тело запроса ExtPlacement

tool*string пример: xsd
artifactId*string(uuid)
folderIdstring(uuid) | null

Ответы

  • 204 Размещён
  • 401 Нет ключа, ключ неизвестен или истёк (`API_KEY_INVALID`)
  • 403 `API_TARIFF_REQUIRED` — тариф владельца ключа ниже «Про»; `AUTH_USER_BLOCKED` — пользователь заблокирован; `FORBIDDEN` — действие доступно не всем участникам (изменить или удалить проект — владелец; удалить артефакт — автор или владелец проекта; перенести артефакт — автор)
  • 404 Не найдено или нет доступа (`NOT_FOUND`)
curl
curl -X PUT 'https://helper-sa.ru/api/ext/v1/projects/<projectId>/placements' \
  -H 'Authorization: Bearer sah_ВАШ_КЛЮЧ' \
  -H 'Content-Type: application/json' \
  -d '{"tool":"xsd","artifactId":"…"}'

Артефакты инструментов и их версии

GET/artifacts

Артефакты — личные или проекта

Параметры

projectIdquery · string(uuid)Проект; не задан — личные артефакты
toolquery · stringТолько артефакты этого инструмента

Ответы

  • 200 Артефакты (без содержимого) — ExtArtifactMeta[]
  • 401 Нет ключа, ключ неизвестен или истёк (`API_KEY_INVALID`)
  • 403 `API_TARIFF_REQUIRED` — тариф владельца ключа ниже «Про»; `AUTH_USER_BLOCKED` — пользователь заблокирован; `FORBIDDEN` — действие доступно не всем участникам (изменить или удалить проект — владелец; удалить артефакт — автор или владелец проекта; перенести артефакт — автор)
  • 404 Не найдено или нет доступа (`NOT_FOUND`)
curl
curl -X GET 'https://helper-sa.ru/api/ext/v1/artifacts' \
  -H 'Authorization: Bearer sah_ВАШ_КЛЮЧ'
POST/artifacts

Создать артефакт (версия 1)

Тело запроса ExtArtifactCreate

tool*string пример: openapi
name*string пример: orders.yaml
source*string
projectIdstring(uuid) | nullПроект; нет — личный артефакт
folderIdstring(uuid) | nullПапка проекта

Ответы

  • 201 Артефакт — ExtArtifact
  • 400 Некорректный запрос (`VALIDATION_FAILED`)
  • 401 Нет ключа, ключ неизвестен или истёк (`API_KEY_INVALID`)
  • 403 `API_TARIFF_REQUIRED` — тариф владельца ключа ниже «Про»; `AUTH_USER_BLOCKED` — пользователь заблокирован; `FORBIDDEN` — действие доступно не всем участникам (изменить или удалить проект — владелец; удалить артефакт — автор или владелец проекта; перенести артефакт — автор)
  • 409 Лимит тарифа (`PROJECT_LIMIT` — проекты, `<TOOL>_DIAGRAM_LIMIT` — артефакты инструмента) или конфликт в дереве папок (`PROJECT_FOLDER_NAME_TAKEN` — папка с таким названием уже есть, `PROJECT_FOLDER_CYCLE` — папку нельзя перенести в саму себя или во вложенную)
curl
curl -X POST 'https://helper-sa.ru/api/ext/v1/artifacts' \
  -H 'Authorization: Bearer sah_ВАШ_КЛЮЧ' \
  -H 'Content-Type: application/json' \
  -d '{"tool":"openapi","name":"orders.yaml","source":"…"}'
GET/artifacts/search

Поиск артефактов по названию и содержимому

Без projectId ищет в личных артефактах и во всех ваших проектах. inContent=true — искать подстроку и в тексте артефактов; в ответе — найденные строки с номерами.

Параметры

queryquery · stringПодстрока (без учёта регистра); нет — все артефакты по остальным фильтрам
inContentquery · booleanИскать также в исходном тексте артефактов
projectIdquery · string(uuid)
personalquery · booleantrue — только личные артефакты (вне проектов)
folderIdquery · string(uuid)Только в этой папке и вложенных (нужен projectId)
toolquery · string
updatedFromquery · string(date-time)Изменены не раньше
updatedToquery · string(date-time)Изменены не позже
sortquery · string updatedAt | createdAt | name | path
orderquery · string asc | desc
pagequery · integer
sizequery · integer

Ответы

  • 200 Страница найденных артефактов — ExtArtifactSearchPage
  • 400 Некорректный запрос (`VALIDATION_FAILED`)
  • 401 Нет ключа, ключ неизвестен или истёк (`API_KEY_INVALID`)
  • 403 `API_TARIFF_REQUIRED` — тариф владельца ключа ниже «Про»; `AUTH_USER_BLOCKED` — пользователь заблокирован; `FORBIDDEN` — действие доступно не всем участникам (изменить или удалить проект — владелец; удалить артефакт — автор или владелец проекта; перенести артефакт — автор)
  • 404 Не найдено или нет доступа (`NOT_FOUND`)
curl
curl -X GET 'https://helper-sa.ru/api/ext/v1/artifacts/search' \
  -H 'Authorization: Bearer sah_ВАШ_КЛЮЧ'
GET/artifacts/{tool}/{artifactId}

Артефакт с содержимым

Параметры

tool*path · stringКод инструмента (`GET /tools`), например `openapi`
artifactId*path · string(uuid)

Ответы

  • 200 Артефакт — ExtArtifact
  • 401 Нет ключа, ключ неизвестен или истёк (`API_KEY_INVALID`)
  • 403 `API_TARIFF_REQUIRED` — тариф владельца ключа ниже «Про»; `AUTH_USER_BLOCKED` — пользователь заблокирован; `FORBIDDEN` — действие доступно не всем участникам (изменить или удалить проект — владелец; удалить артефакт — автор или владелец проекта; перенести артефакт — автор)
  • 404 Не найдено или нет доступа (`NOT_FOUND`)
curl
curl -X GET 'https://helper-sa.ru/api/ext/v1/artifacts/openapi/<artifactId>' \
  -H 'Authorization: Bearer sah_ВАШ_КЛЮЧ'
PUT/artifacts/{tool}/{artifactId}

Изменить название и/или содержимое — при изменениях создаётся версия

Параметры

tool*path · stringКод инструмента (`GET /tools`), например `openapi`
artifactId*path · string(uuid)

Тело запроса ExtArtifactUpdate

namestring
sourcestring
baseVersionintegerВерсия, от которой сделана правка; если артефакт с тех пор изменён — 409 VERSION_CONFLICT

Ответы

  • 200 Артефакт — ExtArtifact
  • 400 Некорректный запрос (`VALIDATION_FAILED`)
  • 401 Нет ключа, ключ неизвестен или истёк (`API_KEY_INVALID`)
  • 403 `API_TARIFF_REQUIRED` — тариф владельца ключа ниже «Про»; `AUTH_USER_BLOCKED` — пользователь заблокирован; `FORBIDDEN` — действие доступно не всем участникам (изменить или удалить проект — владелец; удалить артефакт — автор или владелец проекта; перенести артефакт — автор)
  • 404 Не найдено или нет доступа (`NOT_FOUND`)
  • 409 `VERSION_CONFLICT` — артефакт изменён после версии `baseVersion`; правка не применена. Перечитайте артефакт (номер текущей версии — `version`) и повторите правку.
curl
curl -X PUT 'https://helper-sa.ru/api/ext/v1/artifacts/openapi/<artifactId>' \
  -H 'Authorization: Bearer sah_ВАШ_КЛЮЧ' \
  -H 'Content-Type: application/json' \
  -d '{}'
DELETE/artifacts/{tool}/{artifactId}

Удалить артефакт (автор или владелец проекта)

Параметры

tool*path · stringКод инструмента (`GET /tools`), например `openapi`
artifactId*path · string(uuid)

Ответы

  • 204 Удалён
  • 401 Нет ключа, ключ неизвестен или истёк (`API_KEY_INVALID`)
  • 403 `API_TARIFF_REQUIRED` — тариф владельца ключа ниже «Про»; `AUTH_USER_BLOCKED` — пользователь заблокирован; `FORBIDDEN` — действие доступно не всем участникам (изменить или удалить проект — владелец; удалить артефакт — автор или владелец проекта; перенести артефакт — автор)
  • 404 Не найдено или нет доступа (`NOT_FOUND`)
curl
curl -X DELETE 'https://helper-sa.ru/api/ext/v1/artifacts/openapi/<artifactId>' \
  -H 'Authorization: Bearer sah_ВАШ_КЛЮЧ'
POST/artifacts/{tool}/{artifactId}/edit

Точечные правки — замена фрагментов текста (при изменениях создаётся версия)

Правки применяются по порядку, к результату предыдущей. oldText должен встречаться в тексте ровно один раз (иначе EDIT_NOT_FOUND или EDIT_AMBIGUOUS — добавьте окружающие строки); replaceAll: true заменяет все вхождения. Если хотя бы одна правка не применяется, артефакт не меняется. В ответе — номер новой версии и результат проверки синтаксиса.

Параметры

tool*path · stringКод инструмента (`GET /tools`), например `openapi`
artifactId*path · string(uuid)

Тело запроса ExtArtifactEdit

edits*ExtEdit[]
baseVersionintegerВерсия, от которой сделана правка; если артефакт с тех пор изменён — 409 VERSION_CONFLICT

Ответы

  • 200 Результат — ExtEditResult
  • 400 Некорректный запрос (`VALIDATION_FAILED`)
  • 401 Нет ключа, ключ неизвестен или истёк (`API_KEY_INVALID`)
  • 403 `API_TARIFF_REQUIRED` — тариф владельца ключа ниже «Про»; `AUTH_USER_BLOCKED` — пользователь заблокирован; `FORBIDDEN` — действие доступно не всем участникам (изменить или удалить проект — владелец; удалить артефакт — автор или владелец проекта; перенести артефакт — автор)
  • 404 Не найдено или нет доступа (`NOT_FOUND`)
  • 409 `VERSION_CONFLICT` — артефакт изменён после версии `baseVersion`; правка не применена. Перечитайте артефакт (номер текущей версии — `version`) и повторите правку.
curl
curl -X POST 'https://helper-sa.ru/api/ext/v1/artifacts/openapi/<artifactId>/edit' \
  -H 'Authorization: Bearer sah_ВАШ_КЛЮЧ' \
  -H 'Content-Type: application/json' \
  -d '{"edits":null}'
GET/artifacts/{tool}/{artifactId}/diff

Разница между версиями (unified diff)

Номера версий: to — по умолчанию текущая, from — по умолчанию предыдущая перед to (без параметров — что изменило последнее сохранение). Сервер хранит ограниченное число последних версий; для более старой — 404.

Параметры

tool*path · stringКод инструмента (`GET /tools`), например `openapi`
artifactId*path · string(uuid)
fromquery · integerНомер версии «было» (0 — пустой текст)
toquery · integerНомер версии «стало»
contextquery · integerСколько неизменённых строк показывать вокруг изменений

Ответы

  • 200 Разница — ExtDiff
  • 400 Некорректный запрос (`VALIDATION_FAILED`)
  • 401 Нет ключа, ключ неизвестен или истёк (`API_KEY_INVALID`)
  • 403 `API_TARIFF_REQUIRED` — тариф владельца ключа ниже «Про»; `AUTH_USER_BLOCKED` — пользователь заблокирован; `FORBIDDEN` — действие доступно не всем участникам (изменить или удалить проект — владелец; удалить артефакт — автор или владелец проекта; перенести артефакт — автор)
  • 404 Не найдено или нет доступа (`NOT_FOUND`)
curl
curl -X GET 'https://helper-sa.ru/api/ext/v1/artifacts/openapi/<artifactId>/diff' \
  -H 'Authorization: Bearer sah_ВАШ_КЛЮЧ'
PUT/artifacts/{tool}/{artifactId}/project

Перенести в проект или в личное пространство (автор)

Параметры

tool*path · stringКод инструмента (`GET /tools`), например `openapi`
artifactId*path · string(uuid)

Тело запроса ExtArtifactMove

projectIdstring(uuid) | nullПроект; null — личное пространство

Ответы

  • 200 Артефакт — ExtArtifact
  • 401 Нет ключа, ключ неизвестен или истёк (`API_KEY_INVALID`)
  • 403 `API_TARIFF_REQUIRED` — тариф владельца ключа ниже «Про»; `AUTH_USER_BLOCKED` — пользователь заблокирован; `FORBIDDEN` — действие доступно не всем участникам (изменить или удалить проект — владелец; удалить артефакт — автор или владелец проекта; перенести артефакт — автор)
  • 404 Не найдено или нет доступа (`NOT_FOUND`)
curl
curl -X PUT 'https://helper-sa.ru/api/ext/v1/artifacts/openapi/<artifactId>/project' \
  -H 'Authorization: Bearer sah_ВАШ_КЛЮЧ' \
  -H 'Content-Type: application/json' \
  -d '{}'
GET/artifacts/{tool}/{artifactId}/versions

История версий (новые сверху)

Параметры

tool*path · stringКод инструмента (`GET /tools`), например `openapi`
artifactId*path · string(uuid)

Ответы

  • 200 Версии без содержимого — ExtVersion[]
  • 401 Нет ключа, ключ неизвестен или истёк (`API_KEY_INVALID`)
  • 403 `API_TARIFF_REQUIRED` — тариф владельца ключа ниже «Про»; `AUTH_USER_BLOCKED` — пользователь заблокирован; `FORBIDDEN` — действие доступно не всем участникам (изменить или удалить проект — владелец; удалить артефакт — автор или владелец проекта; перенести артефакт — автор)
  • 404 Не найдено или нет доступа (`NOT_FOUND`)
curl
curl -X GET 'https://helper-sa.ru/api/ext/v1/artifacts/openapi/<artifactId>/versions' \
  -H 'Authorization: Bearer sah_ВАШ_КЛЮЧ'
GET/artifacts/{tool}/{artifactId}/versions/{versionId}

Версия с содержимым

Параметры

tool*path · stringКод инструмента (`GET /tools`), например `openapi`
artifactId*path · string(uuid)
versionId*path · string(uuid)

Ответы

  • 200 Версия — ExtVersion
  • 401 Нет ключа, ключ неизвестен или истёк (`API_KEY_INVALID`)
  • 403 `API_TARIFF_REQUIRED` — тариф владельца ключа ниже «Про»; `AUTH_USER_BLOCKED` — пользователь заблокирован; `FORBIDDEN` — действие доступно не всем участникам (изменить или удалить проект — владелец; удалить артефакт — автор или владелец проекта; перенести артефакт — автор)
  • 404 Не найдено или нет доступа (`NOT_FOUND`)
curl
curl -X GET 'https://helper-sa.ru/api/ext/v1/artifacts/openapi/<artifactId>/versions/<versionId>' \
  -H 'Authorization: Bearer sah_ВАШ_КЛЮЧ'
POST/artifacts/{tool}/{artifactId}/versions/{versionId}/restore

Откатить к версии — создаётся новая версия с её содержимым

Параметры

tool*path · stringКод инструмента (`GET /tools`), например `openapi`
artifactId*path · string(uuid)
versionId*path · string(uuid)

Ответы

  • 200 Артефакт после отката — ExtArtifact
  • 401 Нет ключа, ключ неизвестен или истёк (`API_KEY_INVALID`)
  • 403 `API_TARIFF_REQUIRED` — тариф владельца ключа ниже «Про»; `AUTH_USER_BLOCKED` — пользователь заблокирован; `FORBIDDEN` — действие доступно не всем участникам (изменить или удалить проект — владелец; удалить артефакт — автор или владелец проекта; перенести артефакт — автор)
  • 404 Не найдено или нет доступа (`NOT_FOUND`)
curl
curl -X POST 'https://helper-sa.ru/api/ext/v1/artifacts/openapi/<artifactId>/versions/<versionId>/restore' \
  -H 'Authorization: Bearer sah_ВАШ_КЛЮЧ'

Проверка синтаксиса без ИИ

GET/artifacts/{tool}/{artifactId}/validation

Проверка синтаксиса сохранённого артефакта (без ИИ; связанные файлы — из проекта)

Параметры

tool*path · stringКод инструмента (`GET /tools`), например `openapi`
artifactId*path · string(uuid)

Ответы

  • 200 Результат проверки — ExtValidation
  • 401 Нет ключа, ключ неизвестен или истёк (`API_KEY_INVALID`)
  • 403 `API_TARIFF_REQUIRED` — тариф владельца ключа ниже «Про»; `AUTH_USER_BLOCKED` — пользователь заблокирован; `FORBIDDEN` — действие доступно не всем участникам (изменить или удалить проект — владелец; удалить артефакт — автор или владелец проекта; перенести артефакт — автор)
  • 404 Не найдено или нет доступа (`NOT_FOUND`)
curl
curl -X GET 'https://helper-sa.ru/api/ext/v1/artifacts/openapi/<artifactId>/validation' \
  -H 'Authorization: Bearer sah_ВАШ_КЛЮЧ'
POST/validate

Проверка синтаксиса текста (без ИИ и без сохранения)

С projectId и path ссылки на другие файлы (xs:include/import в XSD, схемы WSDL, $ref в JSON Schema) ищутся в дереве этого проекта относительно path.

Тело запроса ExtValidateRequest

tool*string пример: dbml
source*string
projectIdstring(uuid)Проект для поиска связанных файлов
pathstringПуть файла в проекте («папка/файл») — от него разрешаются ссылки

Ответы

  • 200 Результат проверки — ExtValidation
  • 400 Некорректный запрос (`VALIDATION_FAILED`)
  • 401 Нет ключа, ключ неизвестен или истёк (`API_KEY_INVALID`)
  • 403 `API_TARIFF_REQUIRED` — тариф владельца ключа ниже «Про»; `AUTH_USER_BLOCKED` — пользователь заблокирован; `FORBIDDEN` — действие доступно не всем участникам (изменить или удалить проект — владелец; удалить артефакт — автор или владелец проекта; перенести артефакт — автор)
  • 404 Не найдено или нет доступа (`NOT_FOUND`)
curl
curl -X POST 'https://helper-sa.ru/api/ext/v1/validate' \
  -H 'Authorization: Bearer sah_ВАШ_КЛЮЧ' \
  -H 'Content-Type: application/json' \
  -d '{"tool":"dbml","source":"…"}'

Схемы данных

ExtError

code*string пример: NOT_FOUND
message*string

ExtUser

id*string(uuid)
login*string пример: ivan.petrov
name*string пример: Иван Петров
emailstring | null
tariff*string пример: pro
tariffExpiresAt*string(date-time) | nullДо какого момента действует тариф, в том числе пробный период (null — бессрочно) пример: 2026-12-31T23:59:59Z

ExtTool

code*string пример: openapi

ExtProjectInput

name*string пример: Оплата заказа
descriptionstring | null

ExtProject

id*string(uuid)
name*string
descriptionstring | null
owner*booleanВы — владелец проекта
createdAt*string(date-time)
updatedAt*string(date-time)

ExtProjectPage

items*ExtProject[]
page*integer
size*integer
total*integer(int64)

ExtFolderContent

folder*ExtFolder
folders*ExtFolder[]Вложенные папки (с recursive — на любую глубину)
artifacts*ExtArtifactMeta[]Артефакты папки (с recursive — и вложенных папок)

ExtMatch

line*integerНомер строки (с 1)
text*stringСтрока с найденной подстрокой (до 200 символов)

ExtArtifactHit

id*string(uuid)
tool*string
name*string
projectIdstring(uuid) | null
projectNamestring | null
folderIdstring(uuid) | null
pathstring | nullПуть в дереве проекта «папка/название»
createdAt*string(date-time)
updatedAt*string(date-time)
matchesExtMatch[]Найденные строки содержимого (при inContent, до 5)

ExtArtifactSearchPage

items*ExtArtifactHit[]
page*integer
size*integer
total*integer(int64)

ExtFolderInput

name*string пример: schemas
parentIdstring(uuid) | nullРодительская папка; нет — корень

ExtFolder

id*string(uuid)
name*string
parentIdstring(uuid) | null
path*string пример: api/schemas

ExtPlacement

tool*string пример: xsd
artifactId*string(uuid)
folderIdstring(uuid) | null

ExtArtifactMeta

id*string(uuid)
tool*string пример: openapi
name*string пример: orders.yaml
projectIdstring(uuid) | null
folderIdstring(uuid) | null
pathstring | nullПуть в дереве проекта «папка/название»
createdAt*string(date-time)
updatedAt*string(date-time)

ExtArtifact

id*string(uuid)
tool*string
name*string
source*stringИсходный текст артефакта
version*integerНомер текущей версии — передайте как baseVersion при изменении
projectIdstring(uuid) | null
createdAt*string(date-time)
updatedAt*string(date-time)

ExtArtifactCreate

tool*string пример: openapi
name*string пример: orders.yaml
source*string
projectIdstring(uuid) | nullПроект; нет — личный артефакт
folderIdstring(uuid) | nullПапка проекта

ExtArtifactUpdate

namestring
sourcestring
baseVersionintegerВерсия, от которой сделана правка; если артефакт с тех пор изменён — 409 VERSION_CONFLICT

ExtArtifactEdit

edits*ExtEdit[]
baseVersionintegerВерсия, от которой сделана правка; если артефакт с тех пор изменён — 409 VERSION_CONFLICT

ExtEdit

oldText*stringЗаменяемый фрагмент — точно как в тексте, с отступами
newText*stringНовый фрагмент (пустая строка — удалить)
replaceAllbooleanЗаменить все вхождения

ExtEditResult

id*string(uuid)
tool*string
name*string
projectIdstring(uuid) | null
version*integerНомер текущей версии после правки
changed*booleanТекст изменился (создана новая версия)
replacementsintegerСколько фрагментов заменено
updatedAt*string(date-time)
validation*ExtValidation

ExtValidateRequest

tool*string пример: dbml
source*string
projectIdstring(uuid)Проект для поиска связанных файлов
pathstringПуть файла в проекте («папка/файл») — от него разрешаются ссылки

ExtValidation

tool*string
valid*booleanОшибок нет (предупреждения допускаются)
checked*booleanПроверка выполнена (false — для инструмента нет проверки синтаксиса или она недоступна)
problems*ExtProblem[]

ExtProblem

line*integerСтрока (с 1)
column*integerСтолбец (с 1)
endLineinteger
endColumninteger
severity*string error | warning
message*string
pathstring | nullСвязанный файл с ошибкой (нет — проверяемый документ)

ExtDiff

from*integerНомер версии «было» (0 — пустой текст)
to*integerНомер версии «стало»
identical*boolean
added*integerДобавлено строк
removed*integerУдалено строк
diff*stringUnified diff (строки «+» и «-», заголовки «@@»)

ExtArtifactMove

projectIdstring(uuid) | nullПроект; null — личное пространство

ExtVersion

id*string(uuid)
number*integer
name*string
changeSource*string WEB | API | MCP | AIИсточник изменений
restoredFrominteger | nullОткат к версии с этим номером
authorNamestringКто сохранил версию («—» — пользователь удалён)
createdAt*string(date-time)
sourcestring | nullСодержимое (только при запросе конкретной версии)