Для AI-агентов: markdown этой страницы — /docs-content/changelog/2026-09-23.md индекс документации — /llms.txt
Изменения API: 23 сентября 2026
← Журнал изменений · Сентябрь 2026
NEW-0923-2: выключение и включение уведомлений чата
Новый эндпоинт POST /v1/chats/:chatId/mute выключает ("mute": true) или включает обратно ("mute": false) уведомления из чата. Настройка личная: она меняется у того пользователя, от имени которого идёт вызов. Чтобы поменять её сотруднику, открывшему ваше приложение, вызывайте эндпоинт с ключом приложения и сессией этого сотрудника. Поле mute обязательно, запрос без него отклоняется кодом 400 MISSING_PARAMS до обращения в Битрикс24.
BC-0923-3: создание сделки или лида со стадией не из справочника больше не отвечает успехом
Поддержка старого формата до: не предусмотрена
Было
POST /v1/deals и POST /v1/leads со стадией, которой нет в справочнике аккаунта, отвечали 201: Битрикс24 принимал запись и молча клал её на стадию по умолчанию. Так вели себя опечатка в stageId, другой регистр букв, лишние пробелы, стадия другой воронки без её categoryId и стадия сделки в statusId лида. Клиент видел успех, а запись лежала не там, куда просили. Остальные двери — PATCH, /move, пакетные записи и импорт — такую стадию уже отклоняли.
Стало
Перед записью стадия сверяется со справочником аккаунта буквально, как её сверяет сам Битрикс24: у сделки — со стадиями воронки из categoryId (без него — основной, DEAL_STAGE, для другой воронки — DEAL_STAGE_{categoryId} со стадиями вида C{categoryId}:NEW), у лида — со статусами STATUS. Стадии в справочнике нет — ответ 400 UNKNOWN_STAGE, запись не создаётся. message называет ключ и справочник и подсказывает ближайшее точное написание либо categoryId, который нужно передать вместе со стадией другой воронки; details.knownStages перечисляет стадии справочника (до пятидесяти), details.entityId — какой справочник смотреть через GET /v1/statuses?filter[entityId]=…. Любое написание ключа, которое Битрикс24 читает как STAGE_ID или CATEGORY_ID (сырое STAGE_ID, stage_id, StageId), проверяется так же; при нескольких написаниях в теле действует последнее, и ошибка называет его в details.field. Список или объект вместо названия стадии под сырым написанием ключа — тоже 400 UNKNOWN_STAGE, потому что Битрикс24 кладёт такую запись на стадию по умолчанию (под stageId / statusId его раньше отклоняет проверка формы — 400 INVALID_PARAMS); отказ выносится без чтения справочника: details.knownStages пуст, details.stageId называет форму значения. Пустая стадия ("", null) по-прежнему не проверяется — запись ложится на стадию по умолчанию. Справочник читается один раз на аккаунт и воронку и хранится пять минут, поэтому обычное создание не стало дороже; если справочник прочитать не удалось или он пришёл неполным, запись выполняется как прежде. Стадия из справочника отвечает как раньше.
Что делать интеграторам
Проверьте, что стадии в ваших запросах совпадают со справочником буква в букву: GET /v1/statuses?filter[entityId]=DEAL_STAGE для основной воронки сделок, DEAL_STAGE_{categoryId} для остальных, STATUS для лидов. Стадию другой воронки передавайте вместе с её categoryId. Обрабатывайте 400 UNKNOWN_STAGE — повторять запрос с той же стадией бессмысленно, выберите одну из details.knownStages.
BC-0923-4: CRM_CREATE в конфигурациях открытых линий теперь принимает только поддерживаемые значения
Поддержка старого формата до: не предусмотрена
Было
POST /v1/openline-configs и PATCH /v1/openline-configs/:id возвращали 200 для значений contact, company и других неподдерживаемых значений crmCreate, после чего Битрикс24 сохранял режим как lead.
Стало
Для crmCreate и его вариантов написания принимаются только точные строки none, lead, deal. Любое другое значение возвращает HTTP 400 с кодом VALIDATION_ERROR и сообщением с полем и полным списком допустимых значений. Запрос отклоняется до изменения конфигурации.
Что делать интеграторам
Передавайте только none, lead или deal. Клиентам, которые отправляли contact или company, нужно выбрать поддерживаемый режим и обрабатывать 400 VALIDATION_ERROR.
FIX-0923-5: Проверка имён полей при чтении реквизитов
Было
Некоторые несуществующие имена полей, включая constructor, __proto__ и toString, ошибочно проходили проверку фильтрации и сортировки реквизитов.
Стало
Проверка полей теперь отклоняет унаследованные имена до обращения к Битрикс24: с 400 UNKNOWN_FILTER_FIELD для фильтра и 400 UNKNOWN_SORT_FIELD для сортировки. Порядок обработки запроса не меняется: разбор тела может отказать раньше проверки полей, а объект order по-прежнему имеет приоритет над sort. Допустимые поля и их поддерживаемые алиасы работают как прежде.
Затронутый эндпоинт: GET /v1/requisite-presets/:presetId/fields.
Влияние на интеграторов
Запросы с допустимыми именами полей менять не требуется.
FIX-0923-6: Повторное использование сервера после перепривязки ключа
Было
Для приложений с ранее утраченной привязкой ключа повторный POST /v1/infra/servers мог пытаться создать ещё один сервер. При конфликте перепривязки сервер и карточка могли остаться связаны с разными ключами.
Стало
Конфликт перепривязки сохраняет прежнюю связь сервера и карточки целиком. Создание распознаёт единственный подходящий сервер приложения, уже управляемый текущим ключом, и восстанавливает пустую привязку. Ответ при повторном использовании остаётся HTTP 201 с reused: true. При конкурентном изменении привязки возвращается HTTP 409 APPLICATION_REUSE_CONFLICT с retryable: true; запрос можно повторить. GET /v1/me показывает необязательный deployment.standalone.reuseTarget и checklist для существующего сервера, не меняя привязки. TRIAL_PORTAL_LIMIT содержит retryable: false и подсказку без повторного создания.
FIX-0923-7: Скобочная форма `order` и `scope` больше не даёт внутреннюю ошибку
Было
Запрос с параметром в скобочной форме, например ?order[x]=1 к GET /v1/tasks/:taskId/history или ?scope[x]=1 к POST /v1/pages/:id/publication, отвечал 500 вместо штатного ответа.
Стало
GET /v1/tasks/:taskId/history считает такой order неизвестным значением и сортирует по возрастанию, как без параметра; ответ остаётся HTTP 200. POST /v1/pages/:id/publication отклоняет такой scope с 400 INVALID_SCOPE и показывает полученное значение в тексте ошибки, как для любого другого недопустимого scope.
Влияние на интеграторов
Запросы со строковыми order и scope менять не требуется.
FIX-0923-8: диагностика galaxy-приложения проверяет публичный адрес
Было
Блок reachability в ответе GET /v1/infra/servers/:id собирал вердикт effectiveStatus только
из состояния контейнера и маршрутизации на самой галактике. Оба факта измеряются на хосте, а
последний участок пути до https://app-XXXX.vibecode.bitrix24.tech — это туннель приложения на
шлюзе, и на хосте его не видно: запущенный юнит маршрутизации означает, что его запустили, а не
что он дозвонился до шлюза. Приложение, чей публичный адрес снаружи не отвечал, поэтому могло
приходить как "effectiveStatus": "running".
Стало
Вердикт учитывает публичный вход, и рядом приходит новое поле reachability.publicEntry —
live, если у шлюза есть живой туннель на поддомен приложения, no-tunnel, если туннеля нет, и
unknown, если состояние шлюза узнать не удалось. Приложение с живым контейнером и активной
маршрутизацией, но без туннеля, отвечает "effectiveStatus": "unreachable". Значение unknown
вердикт не ухудшает: «не смогли посмотреть» — это не «ничего не работает». Остальные значения
effectiveStatus и все прежние поля блока не изменились, запросы править не нужно. Описание
значений — Сон и пробуждение Galaxy-приложения.
FIX-0923-9: снятие доступа к серверу прекращает уже открытые сессии
Было
Пользователь, открывший приложение обычным путём, получал сессию браузера, и дальше она жила сама по себе: снятие его записи из списка доступа (DELETE /v1/infra/servers/{id}/access/{accessId}) на неё не влияло. Та же вкладка продолжала открывать приложение, а при активности пользователя срок сессии продлевался — то есть доступ сохранялся неограниченно долго. Отказ приходил только новым входом.
Стало
Право на вход перепроверяется и у уже открытой сессии. После снятия доступа — записью пользователя, отделом или сменой политики — приложение перестаёт открываться в течение минуты, и сессия больше не продлевает себя.
Режим «только владелец» — исключение: часть уже открытых сессий доживает до конца своего срока, до 40 минут, и продлить себя они больше не могут. Рассчитывайте на этот срок, если переводите сервер в этот режим ради немедленного закрытия доступа.
Влияние на интеграторов
Действий не требуется. Доступ по ссылке-приглашению работает как прежде: он не подчиняется списку доступа сервера и отзывается отдельно, отзывом самой ссылки.
FIX-0923-10: Устаревшие GET-агрегаты сообщают о неполных данных
Было
GET /v1/{entity}/aggregate мог вернуть HTTP 200 с числами по части записей без признака неполноты.
Стало
Ответ остаётся HTTP 200. Прежние числовые поля и группировка сохраняются. В data.meta всегда присутствуют recordsProcessed и truncated. При известном общем числе записей добавляется totalRecords, при положительном недоборе — recordsShortfall, при ошибке страницы — безопасный образец pageErrorSample с code и message.
Частичный результат содержит truncated: true в data, каждом элементе data.groups и data.total, если есть группировка. Пометка группы означает неполноту общей выборки, а не доказанную потерю строк именно в этой группе. Добавляется data.meta.warnings с кодом AGGREGATE_TRUNCATED. В полном ответе условные пометки и предупреждение отсутствуют, а data.meta.truncated равно false.
Если общее число неизвестно, totalRecords и recordsShortfall отсутствуют. Явный признак неполноты сохраняется даже без количественной оценки потери. Операция count на этом GET-пути также считает прочитанные строки и может быть частичной. Прежний отказ HTTP 422 при превышении лимита в 10 000 записей и заголовки устаревания сохраняются.
Влияние на интеграторов
Проверяйте data.meta.truncated, прежде чем считать числа окончательными. При частичном результате сузьте фильтр. Контракт POST-агрегации не изменился.
BC-0923-11: fieldName при создании пользовательского поля проверяется до обращения к Битрикс24
Поддержка старого формата до: не предусмотрена
Было
POST /v1/userfields/:entity отправлял fieldName в Битрикс24 каким получил, не проверяя его. Пустая строка, null, число, массив или объект доезжали до портала, и что с ними будет, решала уже та сторона: пустое имя возвращалось ошибкой без кода — наружу 422 BITRIX_ERROR с b24Code: "0", по которому нельзя понять, что именно в запросе не принято, — а не-строковое значение могло быть приведено к строке и создать поле с мусорным именем под успешным ответом.
Стало
Значение проверяется до обращения к порталу: оно обязано быть строкой, в которой есть хотя бы один непробельный символ, иначе отказ 400 INVALID_FIELD_NAME. Проверяется именно то значение, которое уедет в Битрикс24, — если тело несёт оба написания, fieldName и прямой аналог FIELD_NAME, в портал уходит последнее из них, его и судит проверка. То же правило распространилось на обязательный userTypeId, и для тел с ОДНИМ написанием не изменилось ничего: пропущенный или пустой тип, как и прежде, отбивается 400 MISSING_FIELD. Разница только там, где тело несёт оба написания сразу — прежде судилось первое непустое, теперь то, которое уезжает в Битрикс24. Тело {"userTypeId": "string", "USER_TYPE_ID": ""} раньше доезжало до портала и возвращало его непрозрачный ответ, а теперь получает 400 MISSING_FIELD; обратное тело {"userTypeId": "", "USER_TYPE_ID": "string"} раньше отбивалось 400 MISSING_FIELD, а теперь создаёт поле с типом string. Формат имени по-прежнему за Битрикс24: префикс UF_CRM_, длину и набор символов проверяет он.
Что делать интеграторам
Вызовы с корректным fieldName не затронуты, как и вызовы вообще без этого ключа — там имя поля генерирует Битрикс24. Менять код нужно тем, кто подставлял в fieldName не строку, пустую строку или строку из одних пробелов: такой вызов теперь отвечает 400 INVALID_FIELD_NAME вместо прежнего ответа. Под это попадает и имя из необрезанного пользовательского ввода или из ячейки выгрузки — обрезайте пробелы на своей стороне. Чтобы имя сгенерировала платформа, ключ не передают вовсе: пустая строка и null для этого не годятся.
NEW-0923-12: карточка сервера отдаёт команду запуска, установки и порт последнего деплоя
Ответ GET /v1/infra/servers/:id дополнен тремя полями: startCommand, installCommand,
deployPort — снимок start/install/port из тела последнего УСПЕШНОГО
POST /v1/infra/servers/:id/deploy. Для серверов без единого успешного деплоя все три
поля возвращают null. Участник команды разработки (access.via: "collaborator") получает эти поля так же, как владелец.
NEW-0923-13: в отказе по активным серверам приложения появился владелец сервера
В ответе 409 APP_HAS_ACTIVE_SERVERS на DELETE /v1/apps/:id каждый элемент details.servers получил необязательное поле ownerName — имя владельца сервера либо null, если владельца у сервера нет. Раньше по такому ответу нельзя было понять, чей именно сервер мешает удалить приложение, и владельца искали вручную. Остальные поля элемента и код ошибки прежние, запросы старых клиентов работают как работали.
BC-0923-14: повтор создания приложения Коворка после сетевого сбоя возвращает исход первой попытки — если он ещё свежий
Поддержка старого формата до: не предусмотрена
Было
POST /v1/cowork/applications после отказа при выписке ключа (например, недоступность Битрикс24 Нетворк на стадии обращения к порталу) навсегда занимал ключ идемпотентности: повтор с тем же Idempotency-Key отвечал общим 409 IDEMPOTENCY_KEY_ALREADY_USED независимо от причины первого отказа, и восстановить заготовку было нельзя — но повтор тем же ключом гарантированно никогда не создавал дубликат: он либо реплеился в 409, либо не проходил вовсе.
Стало
Такой повтор в течение 20 минут после первого отказа получает ТОТ ЖЕ ответ, что и первая попытка — тот же HTTP-статус, тот же error.code, то же тело — с добавленным заголовком Idempotent-Replayed: true. Спустя 20 минут ключ идемпотентности забывается, и повтор с ним выполняется как совершенно новая попытка со всеми проверками заново. Если первый отказ произошёл ПОСЛЕ обращения к порталу (например, 502 BITRIX_UNAVAILABLE), портал мог уже получить вебхук от первой попытки; повтор тем же ключом спустя 20 минут этого не проверяет и может выписать ВТОРОЙ ключ и создать вторую заявку поверх первой. 409 IDEMPOTENCY_KEY_ALREADY_USED теперь означает только «ключ принадлежит приложению, которое с тех пор удалили» — постоянный отказ, как и раньше.
Что делать интеграторам
Код IDEMPOTENCY_KEY_ALREADY_USED для сценария «первая попытка дошла до Битрикс24 и там не удалась» клиенты больше не увидят: вместо него в окне 20 минут приходит исходный отказ (например, 502 BITRIX_UNAVAILABLE) с заголовком Idempotent-Replayed: true. Повторяйте тем же Idempotency-Key только ВНУТРИ этого окна — там реплей детерминирован и безопасен. Спустя 20 минут после первого отказа смена значения Idempotency-Key от дубля не защищает: что старым, что новым ключом повтор выполняется как совершенно новая попытка, и если первый отказ случился после обращения к порталу, она может выписать второй ключ поверх первого. На платформе при этом, как правило, нечего проверить — заявка на бронь удаляется вместе с исходом отказа, а ключ на большинстве стадий отказа не чеканится вовсе; возможный дубль в этом случае ищите в самом портале Битрикс24, если это возможно, и считайте риск частью цены повтора спустя окно. Исключение — 500 APPLICATION_CREATE_FAILED: если ключ уже выписан, а карточку записать не удалось, лишний ключ можно найти и отозвать в разделе ключей кабинета платформы; пустой список значит, что чистить нечего. Ветвление по error.code менять не нужно; полагаться на постоянство IDEMPOTENCY_KEY_ALREADY_USED для отказов ПОСЛЕ обращения к порталу больше нельзя.