Для AI-агентов: markdown этой страницы — /docs-content/changelog/2026-07-31.md индекс документации — /llms.txt

Изменения API: 31 июля 2026

← Журнал изменений · Июль 2026

BC-0731-1: приём исходников требует Content-Length

Поддержка старого формата до: 30.01.2027

Эндпоинты приёма исходников — POST /v1/apps/{id}/sources и POST /v1/infra/servers/{id}/sources — теперь принимают тело только с заголовком Content-Length. Запрос без него (передача по частям, Transfer-Encoding: chunked) получает 411 с кодом MISSING_CONTENT_LENGTH.

Причина: тело архива больше не собирается в память целиком, а отправляется в хранилище на пролёте, и для этого длина обязана быть известна заранее.

Подавляющее большинство клиентов заголовок и так шлют: его проставляют curl --data-binary, fetch с телом-буфером и любой HTTP-клиент, отправляющий файл целиком. Затронуты только клиенты, которые сознательно стримят тело неизвестной длины.

Заодно повторное сохранение одного и того же архива теперь стоит дороже: совпадение по содержимому определяется после приёма тела, поэтому ответ приходит чуть медленнее, а объём засчитывается в операции хранилища. Результат прежний — deduplicated: true и та же версия.

Что делать интеграторам

Отправлять архив целиком (--data-binary @file в curl, буфер или файл в теле запроса), а не потоком неизвестной длины. Если клиент стримит тело сам — посчитать размер заранее и выставить Content-Length.

FIX-0731-2: имя тарифа в GET /v1/me — из справочника платформы и по-русски

Было

Поле data.tariff.name бралось из сохранённого снимка тарифа: имя лицензии, как его отдал портал, а если портал имени не дал — значение внутреннего словаря без учёта языка. На части порталов это не было названием тарифа вовсе: приходило либо русское «Демо» на нерусскоязычном портале, либо сам код лицензии, например pro100, выданный за человекочитаемое название.

Стало

Название разрешается в момент ответа. Если код тарифа известен справочнику редакций платформы, поле берётся оттуда и по-русски — Демо-период; имя, сообщённое порталом, при этом не используется, поэтому подпись может измениться и там, где всё было в порядке. Если код справочнику неизвестен, поле по-прежнему несёт имя от портала — как есть, на его языке. И только когда имени нет вовсе либо вместо него приходит сам код лицензии, поле равно null: код лицензии в качестве названия больше не подставляется никогда. Тип поля не менялся — строка или null, сам код по-прежнему в data.tariff.code.

Подписи известных редакций заодно уточнились: Демо → Демо-период, Проект → Проект — архивный бесплатный, NFR → NFR — партнёрская лицензия.

FIX-0731-3: поиск пользователей сервера возвращает только активных сотрудников

Было

GET /v1/infra/servers/:id/b24-users мог возвращать неактивных пользователей и пользователей, которые не являются сотрудниками.

Стало

Эндпоинт возвращает только пользователей, которые подтверждены как активные сотрудники Битрикс24. Изменения со стороны интеграций не требуются.

NEW-0731-4: приложение само решает, включать ли авто-высоту iframe во встройке

У приложения появилось необязательное поле placementResizeEnabled (по умолчанию false). Оно управляет тем, отдаёт ли платформа при открытии встройки страницу-обёртку, которая подстраивает высоту iframe под контент вашего приложения.

Поле возвращается в GET /v1/apps и GET /v1/apps/:id и принимается в PATCH /v1/apps/:id. Прежние вызовы работают без изменений: у всех существующих приложений значение false, то есть поведение открытия встройки прежнее.

Включайте только вместе с правкой на стороне приложения. Обёртка открывает приложение во вложенном iframe на источнике платформы, поэтому у приложения появляется новый источник-предок. Если приложение отдаёт собственный заголовок Content-Security-Policy с директивой frame-ancestors, добавьте в неё источник платформы — иначе браузер откажется открывать приложение. Приложения без своей директивы frame-ancestors правок не требуют.

Если авто-высота у вашего приложения уже работала, включите поле, чтобы сохранить прежнее поведение. Учтите, что поле — необходимое условие, но не единственное: сама возможность раскатывается по порталам постепенно.

Чтобы приложение сообщало платформе свою высоту, оно постит родительскому окну сообщение { type: 'vibe:resize', height } — контракт описан в разделе Приложение в Битрикс24.

FIX-0731-5: пустое тело с заголовком JSON больше не отклоняется на маршрутах инфраструктуры

Было

Операция, которой тело не нужно, отвечала 400 с кодом FST_ERR_CTP_EMPTY_JSON_BODY, если клиент присылал заголовок Content-Type: application/json без тела. Так поступают клиенты, которые ставят этот заголовок на любой запрос — например axios и PowerShell Invoke-RestMethod. Отказ происходил на разборе тела, то есть раньше проверки ключа, поэтому по ответу нельзя было понять, что не так с доступом. Затрагивало DELETE /v1/infra/servers/:id/access-tokens/:tokenId, POST /v1/infra/servers/:id/wake и остальные операции сервера без тела.

Стало

Пустое тело принимается как {}, и операция отвечает по существу — 401 на неверном ключе, 404 на несуществующем сервере, 200 при успехе. Прежний обход, когда тело {} передавалось явно, продолжает работать. Заодно неразбираемое тело на этих маршрутах теперь даёт код INVALID_JSON_BODY вместо FST_ERR_CTP_INVALID_JSON_BODY — тот же код, что уже возвращали соседние операции того же сервера, включая deploy, exec и lock.