Для AI-агентов: markdown этой страницы — /docs-content/changelog/2026-08-24.md индекс документации — /llms.txt
Изменения API: 24 августа 2026
← Журнал изменений · Август 2026
BC-0824-1: тип дела нельзя изменить после создания
Поддержка старого формата до: не предусмотрена
Было
PATCH /v1/activities/:id принимал поле typeId. Значение до записи не доходило: тип дела фиксирован при создании, поэтому оно отбрасывалось. Запрос, в котором typeId был единственным полем, оставался с пустым набором полей и возвращал невнятный отказ «Fields is not specified.» — по нему нельзя понять, что причина именно в неизменяемости типа. Запрос, где рядом было хотя бы одно изменяемое поле, отвечал успехом, и вызывающая сторона считала, что тип сменился.
Стало
typeId объявлен полем, которое задаётся только при создании. PATCH /v1/activities/:id с этим полем возвращает 400 READONLY_FIELD и называет поле. Так же отвечают обе пакетные операции обновления. POST /v1/activities поле принимает как раньше — там он обязателен. В выдаче GET /v1/activities/fields у typeId теперь стоит признак createOnly.
Что делать интеграторам
Уберите typeId из тела PATCH /v1/activities/:id. Если тип действительно нужно поменять, создайте дело с нужным типом и удалите прежнее — изменить тип существующего дела нельзя. Признак createOnly в ответе GET /v1/activities/fields позволяет отличать такие поля до отправки запроса.
FIX-0824-2: платный портал больше не получает отказ с предложением оплатить тариф повторно
Было
POST /v1/apps мог вернуть платному порталу 403 с предложением оплатить тариф, если установка приложения через Битрикс24 завершалась отказом.
Стало
Если Битрикс24 подтверждает оплату тарифа, метод возвращает технический отказ 502 CONNECTOR_REST_UNAVAILABLE с безопасной причиной и без предложения повторной оплаты. Подтверждённое отсутствие оплаты по-прежнему возвращает тарифный отказ 403.
Влияние на интеграторов
Менять запросы не нужно. Технический отказ можно повторить, тарифный требует оплаты.
BC-0824-3: блок deployment у аккаунтов Беларуси меняет форму вместе с моделью доступа
Поддержка старого формата до: не предусмотрена
Было
Аккаунт Беларуси попадал в бакет ограниченного доступа при трёх условиях сразу: есть
демо-подписка, нет платной подписки и нет истории коммерческих оплат. Тариф Битрикс24 —
платный он или бесплатный — на попадание в бакет не влиял, а вот аккаунт, который платил
когда-либо раньше, в бакет не попадал вовсе. В
GET /v1/me такой аккаунт получал блок deployment без под-блока
galaxyApp, с primary = standalone и с полем placementNote, объяснявшим, что своя
галактика ему не создаётся и разворачивать приложение нужно в два шага. Одношаговое
создание с полем source отвечало 400 SOURCE_AT_CREATE_GALAXY_ONLY.
Стало
На тарифной модели бакета ограниченного доступа нет вовсе, поэтому аккаунт Беларуси выходит
из него в обе стороны сразу: на платном или демо-тарифе Битрикс24 он получает полный доступ,
на бесплатном — отказ. В обоих случаях форма блока deployment меняется одинаково — при
условии, что режим галактик аккаунту открыт и своей галактики у него ещё нет (оба карв-аута
названы ниже): под-блок
deployment.galaxyApp появляется, поле deployment.placementNote исчезает, а
deployment.primary переключается со standalone на galaxyApp. У аккаунта с полным
доступом одношаговое создание с полем source при этом начинает работать.
Что делать интеграторам
Определяйте модель размещения по НАЛИЧИЮ под-блока deployment.galaxyApp, как и предписывает
описание ответа. Ветку, привязанную к присутствию placementNote или к значению primary,
перепишите: оба поля меняются вместе с моделью доступа аккаунта, а не только с его тарифом.
Разрешение на создание сервера читайте отдельно — в capabilities.servers.create: блок
deployment описывает КОНТРАКТ размещения и у аккаунта без доступа тоже присутствует, а
POST /v1/infra/servers такому аккаунту ответит 402.
Два карв-аута, у которых форма ответа не меняется вовсе. Первый — аккаунт с выключенным
режимом галактик: обоих полей у него нет ни до, ни после. Второй — аккаунт, у которого
галактика УЖЕ есть: placementNote объяснял отсутствие собственной галактики, поэтому
владелец живого galaxy-хоста и в бакете получал galaxyApp и не получал placementNote.
Изменение приходит к аккаунту в момент перевода его на тарифную модель, поэтому обе формы
ответа встречаются одновременно у разных аккаунтов.
NEW-0824-4: новый код отказа доступа для аккаунтов Беларуси
В Беларуси доступ к инфраструктуре Вайбкод открывает платный тариф Битрикс24, демо-тариф
Битрикс24 ИЛИ платная подписка Битрикс24 Маркет Плюс — достаточно любого одного из трёх.
Аккаунт, у которого нет ни одного, получает 402 с error.code = BY_PAID_ONLY вместо
прежнего MARKETPLACE_REQUIRED. Тот же код приходит на создание сервера
(POST /v1/infra/servers), на публикацию приложения, на
пробуждение уснувшей машины и на выписку нового ключа, а в
GET /v1/me он же приезжает в capabilities.servers.create.reason.
Изменение аддитивное: форма тела ответа прежняя, прочие ветки отказа не тронуты. Разбирайте
новый код так же, как остальные отказы 402, — читайте error.code, показывайте
error.userMessage, ведите человека по details.upgradeUrl. Если разбор кодов у вас
исчерпывающий, заведите ветку BY_PAID_ONLY: без неё отказ провалится в default.
Переход поэтапный. Код появляется у аккаунта не раньше, чем платформа переведёт его на
тарифную модель доступа; до перевода тот же аккаунт получает прежний
MARKETPLACE_REQUIRED. Планировать разбор поэтому нужно на оба кода сразу, а не на один.
FIX-0824-5: подсказка о создании серверов в ответе о ключе перестала звать в тупик
Было
Аккаунт, которому доступ открывает тариф Битрикс24, а не подписка, получал в
GET /v1/me слот capabilities.servers.create с общей формулировкой:
серверы доступны на коммерческих тарифах или во время активного пробного периода. Она врала
дважды. Пробный период такому аккаунту не положен — право на него считается по подписочной
модели, — а адрес, по которому тариф выбирается, в тексте не назывался вовсе. Отдельно у
аккаунтов Беларуси поле alternatives[].url вело на кассу подписки внутри самого аккаунта
и продолжало бы вести туда и после перевода аккаунта на тарифную модель, где отказ подпиской
не лечится.
Стало
Слот называет рабочие пути и адрес: платный или демо-тариф Битрикс24, а для Беларуси ещё и
платная подписка. Текст в capabilities.servers.create.userMessage теперь совпадает с телом
402, которое вернёт POST /v1/infra/servers на том же
аккаунте, — один код отказа больше не говорит на двух поверхностях разное. У аккаунтов
Беларуси, переведённых на тарифную модель, alternatives[].url ведёт на страницу выбора
тарифа, а не на кассу подписки.
Влияние на интеграторов
Действий не требует: изменились значения текстового поля и адреса, структура ответа прежняя.
Правка касается Казахстана и Узбекистана сразу, Беларуси — по мере перевода аккаунта на
тарифную модель. Если вы показываете пользователю собственный текст вместо
userMessage, сверьте его: обещание пробного периода на этих аккаунтах неверно.
FIX-0824-6: отказ по тарифу в Казахстане и Узбекистане больше не зовёт оформить подписку
Было
Портал из Казахстана или Узбекистана на бесплатном тарифе получал в теле 402 код
MARKETPLACE_REQUIRED, а поле error.userMessage звало подключить подписку. В этих
странах подписка не продаётся, поэтому названное действие клиент выполнить не мог:
текст вёл в тупик, а платный и демо-тариф Битрикс24 — рабочие пути к доступу — в нём
не назывались вовсе.
Стало
Такой портал получает код KZ_PAID_ONLY или UZ_PAID_ONLY, а текст называет оба
рабочих пути — платный или демо-тариф Битрикс24 — и адрес, где тариф выбирается.
Бренда подписки в тексте больше нет.
Новый код приходит на всех поверхностях, где отказ в доступе виден клиенту: создание
сервера (POST /v1/infra/servers), публикация приложения,
пробуждение уснувшей машины и выписка нового ключа. В GET /v1/me
он же приезжает в capabilities.servers.create.reason.
Код в теле ошибки для этих порталов сменился с MARKETPLACE_REQUIRED на
KZ_PAID_ONLY / UZ_PAID_ONLY. Действий на стороне клиента это не требует: обе
ветки уже были в контракте и отдавались в других сценариях, структура тела не
изменилась. Проверьте только, что разбор кодов не падает в default — если у вас
исчерпывающий switch, ветка *_PAID_ONLY в нём уже есть.
BC-0824-7: повторная авторизация бота стала безопасной и явной
Поддержка старого формата до: не предусмотрена
Было
POST /v1/bots/:botId/reauth мог снять любое отключение бота, а ответ 410 BOT_DISABLED не сообщал клиенту, допустимо ли автоматическое восстановление.
Стало
410 BOT_DISABLED содержит boolean error.details.reauthAllowed. Вызывайте POST /v1/bots/:botId/reauth автоматически только при reauthAllowed=true; сервер выдаёт этот сигнал только для доступного на запись бота, отключённого из-за ошибок авторизации, и включает его поэтапно. Ручной вызов также остаётся проверкой учётных данных активного бота после переноса владения. Для остальных отключённых состояний endpoint сразу отвечает 409 BOT_REAUTH_NOT_ALLOWED; при параллельном изменении состояния — 409 BOT_REAUTH_STATE_CHANGED. Обновите клиентов, которые вызывали повторную авторизацию для любого BOT_DISABLED.
FIX-0824-8: деплой galaxy-приложения предупреждает о сбросе переменных окружения
Было
Успешный /deploy без пользовательского env пересоздавал galaxy-приложение без прежних переменных, но не сообщал об этом в ответе.
Стало
Ответ содержит строку в warnings[], которая просит передавать полный env при каждом деплое. Деплой участника команды разработки, где переменные владельца сохраняются, ложного предупреждения не получает.
Влияние
Статус и поведение деплоя не изменились; клиентам следует читать существующий массив warnings[].
NEW-0824-9: связи задач стали доступны через API
Было
Карточка задачи в Битрикс24 показывает блок «Связанные задачи», а через API их получить было нечем: полей связей нет ни в списке задач, ни в записи по идентификатору, в описании полей задачи они не описаны, отдельного эндпоинта не существовало. Дашборд, которому нужен граф зависимостей, собрать его не мог.
Стало
Появились два эндпоинта только для чтения. GET /v1/tasks/:taskId/dependencies отдаёт связи одной задачи массивом пар «идентификатор и название», отсортированным по идентификатору. POST /v1/tasks/dependencies/bulk принимает до 50 задач и отвечает по каждой отдельно: успешные в results, отказавшие в errors, счётчики в meta.
Пакетный вызов отвечает 200 даже тогда, когда отказали все подвызовы — частичный отказ и есть его смысл, поэтому смотреть надо errors, а не только results. Дубли в списке идентификаторов схлопываются молча, и счётчик запрошенных считает уникальные, поэтому «запрошено» всегда равно сумме «успешно» и «отказано».
Границы, названные явно
Отдаются только предшественники — задачи, от которых зависит запрошенная. Обратного направления Битрикс24 в API не отдаёт, и дашборд строит его инверсией собранных пар. Тип связи не читается ни одним методом портала, поэтому в ответе его нет вовсе: пустое или угаданное значение в контракте хуже, чем отсутствие поля.
Связи, добавленные через диаграмму Ганта, этими эндпоинтами не видны: портал хранит их отдельно и не возвращает ни одним методом чтения. Отличить «связей нет» от «связи есть, но в невидимом хранилище» нельзя ни здесь, ни в сыром REST.
Задачи, у которых связей больше, чем эндпоинт отдаёт, получают явный отказ, а не усечённый список: ответ либо полный, либо отказ.
Влияние на интеграторов
Ломающих изменений нет — оба маршрута новые. Запись связей отдельного эндпоинта не получила: набор по-прежнему меняется полем DEPENDS_ON при обновлении задачи, и семантика там — полная замена набора, а не добавление.
FIX-0824-10: опрос ботов останавливается при неактивной подписке Маркетплейса
Было
Маршруты существующего бота повторяли запросы в Битрикс24 после истечения
подписки Маркетплейса и возвращали общий 403 BITRIX_ACCESS_DENIED на каждый
вызов. Цикл polling не получал однозначного сигнала остановки.
Стало
Первый подтверждённый отказ паркует бота. Следующие вызовы отвечают локально
HTTP 403 с кодом B24_MARKET_SUBSCRIPTION_REQUIRED, заголовком
Retry-After: 3600 и error.details.retryable:false, не обращаясь в Битрикс24.
После продления GET /v1/me?refresh=tariff автоматически восстанавливает всех
ботов аккаунта.
Что делать интеграторам
Остановите polling при этом коде. После продления обновите тариф указанным вызовом и только затем запустите цикл снова.
BC-0824-11: открытие рабочего дня больше не подтверждает истёкшее состояние
Поддержка старого формата до: не предусмотрена
Было
POST /v1/workday/open отвечал 200 success:true, когда Битрикс24 оставлял
рабочий день в статусе EXPIRED. Новый день при этом не открывался.
Стало
Неизменившийся статус EXPIRED возвращается как HTTP 409 с success:false и
кодом WORKDAY_EXPIRED. Инструкция предлагает прочитать статус того же
сотрудника, закрыть истёкший день с датой его timeStart и отчётом, затем
повторить открытие.
Что делать интеграторам
Обрабатывайте success:false и HTTP 409 как явный признак, что день не открыт;
сначала разрешите состояние прежнего дня по подсказке ответа.
NEW-0824-12: события календаря связываются с элементами CRM
У события календаря появилось поле crmFields — привязка встречи к элементам CRM: сделкам, лидам, контактам и компаниям. Поле читается и записывается, объявлено в GET /v1/calendar-events/fields и доступно в select.
Значение — массив типизированных ссылок: D_<id> сделка, C_<id> контакт, L_<id> лид, CO_<id> компания. На создании и обновлении значение обязано быть массивом; [] снимает все привязки, а отсутствие поля в теле сохраняет уже записанные. Очистка пустым массивом работает на POST и PATCH; в батч-запросе пустой массив отклоняется вместо тихого успеха — подкоманда батча передать его не может. У POST /v1/batch это INVALID_PARAMS в data.errors под id вызова, у POST /v1/calendar-events/batch — 400 BATCH_ITEM_VALIDATION на весь пакет, где имя INVALID_PARAMS и индекс элемента приходят внутри message. Событие без привязок читается как [] — пустое значение никогда не приходит как null или пустая строка, поэтому проверка crmFields.length безопасна всегда. Неизвестный префикс или ссылка на несуществующую запись отклоняются.
Затронутые эндпоинты: GET /v1/calendar-events, GET /v1/calendar-events/:id, POST /v1/calendar-events/search, POST /v1/calendar-events, PATCH /v1/calendar-events/:id, GET /v1/calendar-events/fields.
FIX-0824-13: приложение на незагружающемся galaxy-хосте удаляется без живого туннеля
Было
DELETE /v1/infra/servers/{id} по galaxy-приложению отвечал 502 с кодом
GALAXY_HOST_UNREACHABLE, если хост был не на связи, — независимо от причины. Когда гостевая
операционная система хоста не загружается вовсе (поле provisionErrorCode карточки сервера равно
GUEST_NOT_BOOTING), туннель не появится уже никогда, поэтому повтор запроса не помогал ни через
минуту, ни через сутки. Удалить сам хост тоже было нельзя: он отвечал 409 с кодом
GALAXY_HAS_APPS, потому что приложения на нём формально оставались живыми. Владелец оказывался в
замкнутом круге и продолжал занимать слот квоты машиной, которая уже не работает.
Стало
Если платформа доказала, что гостевая операционная система хоста не загружается, приложение на нём
удаляется без обращения к хосту: DELETE /v1/infra/servers/{id} отвечает 200, запись приложения
закрывается, освобождаются его токены доступа, домен и карточка в каталоге. Удалив приложения по
одному, владелец затем удаляет и сам хост обычным вызовом — отказ GALAXY_HAS_APPS больше не
возникает. Код GALAXY_HOST_UNREACHABLE сохраняет прежний смысл для всех остальных случаев: хост
временно не на связи, повтор осмыслен. ⚠️ Метка «не загружается» сама по себе 200 не
гарантирует: перед удалением без обращения к хосту платформа ещё и убеждается через шлюз,
что живого туннеля нет. Проверка fail-safe — если шлюз недоступен, ответил без списка
соединений или хост тем временем поднялся, ответ остаётся 502. Клиентам менять ничего не нужно — цикл повторов для этого
состояния просто перестаёт быть нужным.
BC-0824-14: незнакомое имя поля в select отклоняется с 400 почти на всех сущностях
Поддержка старого формата до: 18.02.2027
До сих пор такой запрос отвечал
200, а запрошенного поля в записи просто не было — то есть «старый формат» здесь означает неполный ответ, а не рабочий.
Было
Имя поля, которого у сущности нет, уходило в отбор молча. Запрос выполнялся, поле в записях
отсутствовало, а объяснение лежало в meta.warnings — там, куда обычно не смотрят. Опечатка
в select поэтому выглядела как успешный запрос с загадочно неполными записями:
GET /v1/deals?select=id,titel → 200, в записях только id
Ошибкой такое имя отвечали только события календаря.
Стало
Запрос отклоняется до вызова Битрикс24 — 400 с кодом UNKNOWN_SELECT_FIELD и списком
допустимых имён в сообщении. Этот список и есть точный ответ на вопрос «что можно запрашивать».
Действует на сущностях, у которых набор полей выверен по Битрикс24: сделки, контакты, компании,
лиды, предложения, дела, адреса, смарт-процессы, товары и разделы товаров, каталоги и их товары
и разделы, заказы и статусы заказов, статусы, валюты, разделы календаря, файлы, папки,
хранилища, подразделения, рабочие группы, шаблоны документов. На остальных
поведение прежнее — предупреждение в meta.warnings.
Отдельный класс — имя, которое у сущности ЕСТЬ, но никогда не возвращается: GET /v1/{entity}/fields показывает такое поле с notReturned: true. В когорте это, например,
currencyId у товаров и sort у разделов товаров. Оно тоже отклоняется 400, но СВОИМ кодом
SELECT_FIELD_NOT_RETURNED и сообщением, которое называет причину. Код отдельный намеренно:
UNKNOWN_SELECT_FIELD утверждает «такого имени нет», а справочник сущности это имя публикует —
клиент, честно взявший имя оттуда, иначе читал бы ответ как «справочник врёт».
Проверяется только имя. Пользовательские поля (UF_*, ufCrm*) принимаются как раньше и на
любой сущности; свойства товаров принимаются каждое на СВОЕЙ сущности: PROPERTY_295 — на товарах,
property295 — на товарах каталога, где их номера назначает портал; чужое написание метод не
понимает, и его гейт отклоняет. Значение * (и UF_*) по-прежнему означает
«вернуть все поля», и опечатка рядом с ним отклонения не вызывает — приходит предупреждение.
Отбор полей в обоих пакетных вызовах — и в общем, и в пакете по одной сущности — отклоняет
только свой подвызов, соседние выполняются.
Что делать интеграторам
Сверьте имена полей в своих select со списком из сообщения об ошибке или со схемой
GET /v1/{entity}/fields. Запрос, который раньше «работал», но возвращал записи без части
запрошенных полей, теперь ответит 400 с точным указанием, какое имя не найдено — это и есть
его исходная ошибка.
FIX-0824-15: схема поля `datePeriod` теперь видна в `GET /v1/bookings/fields`
Было
Поле datePeriod описывалось как "type": "object" без вложенной схемы. Форму объекта нельзя было узнать из самого контракта — клиент отправлял {} или строку с датой и получал 422 BITRIX_ERROR, и только по тексту ошибки догадывался о нужных ключах.
Стало
У полей типа object с известной вложенной формой ответ несёт ключ properties с рекурсивной схемой вложенных ключей. Для datePeriod это from и to, у каждого timestamp (number, Unix-секунды) и timezone (string, зона в формате IANA). Тот же ключ появился у requisiteLink в GET /v1/orders/fields и на обеих поверхностях сразу — в fieldsDetailed у GET /v1/guide тоже, поэтому форму видно и без токенов портала. Массивы объектов схему элемента по-прежнему не несут. Изменение аддитивное: прежние ключи описаний полей остались на месте, проверка данных при создании не ужесточалась.
NEW-0824-16: этапы Scrum-канбана и список спринтов в API
Появились четыре операции для работы с колонками Scrum-доски. Этапы принадлежат спринту, а не рабочей группе: у разных спринтов одного проекта наборы колонок независимы, поэтому адрес коллекции начинается со спринта.
GET /v1/scrum/sprints возвращает спринты проекта — это единственный способ получить sprintId, который нужен остальным трём операциям; без параметра groupId придут все спринты, доступные ключу.
GET /v1/scrum/sprints/:sprintId/stages отдаёт колонки спринта, приводя id, sort и sprintId к числам. POST /v1/scrum/sprints/:sprintId/stages создаёт колонку и возвращает её перечитанной целиком, вместе с подставленными значениями по умолчанию. PATCH /v1/scrum/stages/:stageId переименовывает, перекрашивает и переставляет колонку.
Проверки на стороне платформы Вайбкод закрывают места, где Битрикс24 отвечает успехом и сохраняет другое значение: имя длиннее 255 символов, цвет длиннее шести символов и значение type вне набора NEW, WORK, FINISH теперь получают понятный отказ вместо тихой подмены. Цвет можно передавать и с ведущим # — он будет срезан.
Перенос колонки в другой спринт не выставлен: sprintId в теле запроса отклоняется. Обновление несуществующей или недоступной колонки отвечает кодом STAGE_NOT_FOUND_OR_NO_ACCESS; различить эти два случая нельзя, потому что Битрикс24 отвечает на них одинаково.
FIX-0824-17: код ACCOUNT_FROZEN описан в спеке создания сервера
Ответ 402 у POST /v1/infra/servers перечислял только отказы по тарифу, пробному периоду и подписке Маркетплейса. Кода ACCOUNT_FROZEN, которым платформа отвечает порталу с замороженным кошельком, в перечислении не было, хотя ручка отдавала его и раньше: проверка баланса срабатывает до обработчика, и создание сервера под неё подпадает.
Из-за пропуска клиент, сгенерированный по /v1/openapi.json, считал этот код невозможным и терял отказ, у которого есть понятное действие — пополнить баланс. Поведение ручки не менялось, изменилось только описание.