Для AI-агентов: markdown этой страницы — /docs-content/changelog/2026-08-23.md индекс документации — /llms.txt
Изменения API: 23 августа 2026
← Журнал изменений · Август 2026
BC-0823-1: OpenAPI не предлагает поля только для создания в PATCH
Поддержка старого формата до: не предусмотрена
Было
Поля, которые API принимает только при создании записи, выглядели в GET /v1/openapi.json как обычные свойства тела PATCH. Сгенерированный по этой схеме клиент мог отправить их при обновлении и получить 400 READONLY_FIELD.
Стало
Для сущностей с полями только для создания PATCH использует отдельную входную схему без таких полей. У остальных сущностей PATCH по-прежнему использует прежнюю входную схему. Входная схема POST в обоих случаях сохраняет контракт создания.
Что делать интеграторам
Перегенерируйте SDK по новой OpenAPI-схеме и используйте тип, на который ссылается requestBody конкретного PATCH. Для затронутых сущностей это UpdateInput, для остальных остаётся Input. Удалите из тела обновления поля, которые разрешены только при создании; POST по-прежнему использует Input.
NEW-0823-2: совместная работа нескольких сотрудников над кодом приложения
Владелец сервера может собрать команду разработки: сотрудники портала работают с сервером своими личными ключами, без передачи ключа владельца и без перепривязки сервера. Роль «Разработчик» получает выкладку, команды, файлы, логи и хранилище исходников; роль «Администратор» — дополнительно управление машиной: жизненный цикл (стоп, старт, перезагрузка, расписание сна, починка), настройки и безопасность, тариф и диск, резервные копии, свой домен, карточку каталога, аудиторию приложения и расходы. Состав команды, удаление сервера, ссылки доступа и перепривязка ключа остаются за владельцем. Состав команды правит владелец или администратор портала на вкладке «Совместная работа».
Права даёт членство, а не ключ, поэтому снятие из команды закрывает доступ сразу же.
У выкладки участника три отличия от выкладки владельца. Переменные окружения сохраняются:
поле env из его запроса не применяется (в ответе приходит предупреждение), а существующие
переменные приложения переживают выкладку — в том числе у приложений в галактике, где раньше
их гасила любая выкладка. Карточка каталога Битрикс24 и анонс подписчикам остаются за
владельцем: displayName, description и рассылка changelog от роли «Разработчик»
игнорируются с предупреждением, а само примечание к версии сохраняется в хранилище исходников.
Плюс защита от затирания чужой работы: поле baseVersionId в теле
POST /v1/infra/servers/:id/deploy («я основывался вот на этой
версии исходников», например v12). Если в хранилище появилась более новая версия, выкладка
отклоняется кодом SOURCE_VERSION_STALE с номером актуальной версии и ссылкой на её
скачивание — вместо молчаливой перезаписи.
Заявленная версия проверяется на существование: номер впереди хранилища отклоняется кодом
BASE_VERSION_NOT_FOUND с номером актуальной версии — иначе защиту снимал бы любой
несуществующий номер.
На сервере, где владелец собрал команду разработки, это поле обязательно, как только в
хранилище есть хотя бы одна версия: выкладка без него отвечает BASE_VERSION_REQUIRED и
называет актуальную версию. Так выкладка вслепую поверх чужих правок отклоняется, даже если
о защите не знали. На сервере без команды поле по-прежнему необязательно, и выкладка без него
работает как раньше. Чтобы номер версии было откуда взять, ответ операции скачивания версии
теперь несёт поле versionId рядом со ссылкой — Хранилище исходного кода.
Отказ 409 EXEC_BUSY теперь называет занявшего сервер: в error.hint.holder приходят имя
сотрудника, вид операции и время её начала, а error.hint.reason начинается с имени. У фоновой
операции платформы человека-инициатора нет, там holder.name приходит пустым. Поле аддитивное —
прежние поля отказа не изменились.
Участник теперь видит сервер в API, а не только работает с ним вслепую.
GET /v1/infra/servers отдаёт и те серверы, где человек состоит в
команде разработки: такие строки несут блок access с полем via: "collaborator", ролью,
перечнем доступных действий и списком открытых вызовов, а собственные строки ключа —
access.via: "owner". GET /v1/infra/servers/:id отвечает участнику 200 с урезанной
карточкой (без IP, доступа по SSH и управляющего ключа; расходы и порог сна — по роли)
вместо прежнего 404. GET /v1/me перечисляет членства в infra.collaboratorServers.
Пробуждение машины POST /v1/infra/servers/:id/wake открыто и
роли «Разработчик» — раньше право было объявлено матрицей, но вызов отвечал 404. Поиск
сотрудника для настройки аудитории, GET /v1/infra/servers/:id/b24-users,
открыт роли «Администратор» — раньше отвечал отказом, хотя саму аудиторию эта роль уже
настраивает.
Дополнительно: администратор команды теперь может через свой личный API-ключ выполнять все
операции сервера, разрешённые его роли, — управление жизненным циклом (остановка, запуск,
перезагрузка, сон, ручное восстановление, расписание пробуждения, метрики), настройки
(SSH-доступ, порт, подписки на события портала, переключение режима BLACKHOLE/OPEN через
PATCH /v1/infra/servers/:id/mode), карточку каталога
(PATCH /v1/infra/servers/:id — имя и описание) и аудиторию доступа
(политика доступа, список пользователей и подразделений). Раньше эти операции через V1-ключ участника отвечали 403/404 независимо
от роли — работали только через личный кабинет. Списки членств в V1 научились отдавать
страницу: GET /v1/infra/servers принимает необязательные page и limit и возвращает
рядом честный total. Без параметров ответ прежний и полный — контракт не меняется. В
/v1/me блок infra.collaboratorServers получил поле total.
Удаление версий исходников остаётся за владельцем: DELETE /v1/infra/servers/:id/sources/:versionId
и массовая чистка POST /v1/infra/servers/:id/sources/cleanup отвечают участнику любой роли
403 NOT_AUTHORIZED. Список, скачивание, депонирование и теги ему по-прежнему открыты.
Выкладка участника, которая обязана сохранить переменные окружения, отказывается работать,
если прочитать их не удалось: вместо молчаливого выката с пустым окружением приходит
502 GALAXY_PRESERVED_ENV_UNREADABLE с признаком retryable. Приложение при этом продолжает
работать на прежней версии.
Отказ по роли отделён от «сервера нет». Управляющая операция, которой роль участника не
покрывает, отвечает 403 SERVER_ROLE_FORBIDDEN; в error.hint приходят его роль,
необходимый порог, отказанное действие и перечень вызовов, которые ему открыты. Для
постороннего ключа существование сервера по-прежнему скрыто — там остаётся 404.
Приложение, у которого удалён владелец, остаётся жить только если в его команде есть администратор — он может подхватить приложение вместо ушедшего. Команда из одних разработчиков приложение не удерживает: управлять им некому, и оно убирается как обычное приложение без владельца.
Поле appUrl в GET /v1/infra/servers, GET /v1/infra/servers/:id
и GET /v1/me (блок infra.collaboratorServers) больше не обещает участнику команды
ссылку, которую он не вправе открыть. Раньше поле возвращалось непустым, как только у
сервера был поддомен, независимо от того, разрешает ли аудитория приложения открыть его
именно этому человеку — переход по такой ссылке отвечал отказом. Теперь appUrl пуст,
если аудитория (accessPolicy) не открывает приложение всем сотрудникам портала и у
участника нет личного гранта доступа. Есть исключение: участнику, которому доступ открыт
через подразделение, ссылка пока не показывается, хотя открыть приложение он может — такому
участнику её называет владелец или администратор команды.
FIX-0823-3: метаданные OAuth и welcome-страница указывают на публичные адреса платформы
Было
Метаданные OAuth (GET /.well-known/oauth-authorization-server) могли объявлять в issuer и адресах эндпоинтов http://localhost:3000 — адрес, недоступный ни одному клиенту.
Кнопки «Документация» / «На главную» welcome-страницы GET /v1/me могли вести не в тот кабинет, с которого её открыли.
Стало
Метаданные OAuth объявляют публичный домен платформы.
Кнопки welcome-страницы ведут в кабинет той платформы, с которой страницу открыли.