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

[← Журнал изменений](/docs/changelog) · [Июль 2026](/docs/changelog/2026-07)

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

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

Эндпоинты приёма исходников — [POST /v1/apps/{id}/sources](/docs/source-storage) и [POST /v1/infra/servers/{id}/sources](/docs/source-storage) — теперь принимают тело только с заголовком `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](/docs/infra/access/b24-users) мог возвращать неактивных пользователей и пользователей, которые не являются сотрудниками.

**Стало**

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

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

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

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

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

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

Чтобы приложение сообщало платформе свою высоту, оно постит родительскому окну сообщение `{ type: 'vibe:resize', height }` — контракт описан в разделе [Приложение в Битрикс24](/docs/infra/app-runtime).

### 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`](/docs/infra/access-tokens), [`POST /v1/infra/servers/:id/wake`](/docs/infra/lifecycle/wake) и остальные операции сервера без тела.

**Стало**

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