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

Самоописание ключа

GET /v1/me

Возвращает самоописание ключа, которым выполнен запрос: его тип, привязанный портал, тариф и доступные на портале возможности платформы. Скоуп не нужен — эндпоинт отвечает на любой действующий ключ и служит для AI-модели стартовой точкой знакомства с порталом.

Форма ответа зависит от типа ключа. Как ключ передаётся в запросе — Передача ключа.

Параметры

Параметр Тип Обяз. Значения Описание
refresh (query) string нет tariff Форсирует повторную проверку тарифа портала в Битрикс24 перед формированием ответа. Работает только для ключей, привязанных к порталу. Без параметра ответ отдаётся из серверного кэша.

Примеры

curl — личный ключ

Terminal
curl https://vibecode.bitrix24.tech/v1/me \
  -H "X-Api-Key: YOUR_API_KEY"

curl — OAuth-приложение

Terminal
curl https://vibecode.bitrix24.tech/v1/me \
  -H "X-Api-Key: YOUR_APP_KEY" \
  -H "Authorization: Bearer USER_SESSION_TOKEN"

JavaScript — личный ключ

javascript
const res = await fetch('https://vibecode.bitrix24.tech/v1/me', {
  headers: { 'X-Api-Key': 'YOUR_API_KEY' },
})
const { data } = await res.json()
console.log('Тип ключа:', data.type, '· портал:', data.portal)

JavaScript — OAuth-приложение

javascript
const res = await fetch('https://vibecode.bitrix24.tech/v1/me', {
  headers: {
    'X-Api-Key': 'YOUR_APP_KEY',
    'Authorization': 'Bearer USER_SESSION_TOKEN',
  },
})
const { data } = await res.json()

Поля ответа

Ответ описывает ключ, а не сущность портала. Верхнеуровневые блоки data.* — это карта возможностей: часть блоков общая для всех ключей, часть появляется только у ключа определённого типа. В колонке «Тип ключа» указано, для какого ключа блок присутствует.

Если вы знакомитесь с ключом впервые, достаточно четырёх блоков. type говорит, каким ключом вы работаете. scopes — к каким данным есть доступ. accessMode — разрешена ли запись. capabilities — какие операции доступны на этом портале и по какой причине отказано в остальных. Остальные блоки нужны под конкретную задачу: deployment и infra — при работе с серверами, ai и webSearch — при вызовах моделей, storage — при загрузке файлов.

Поле Тип Тип ключа Описание
success boolean все Всегда true при успехе
data.type string все Тип ключа: personal, oauth_app или management
data.portal string vibe_api_, vibe_app_ Домен привязанного портала Битрикс24
data.portalId string vibe_api_, vibe_app_ Устойчивый идентификатор привязанного портала Битрикс24. В отличие от домена не меняется при переименовании и переезде портала — берите его, когда локальные данные раскладываются по аккаунтам. Ключ без портала до этого ответа не доходит: он получает 401 NO_PORTAL, поэтому в успешном ответе поле непустое
data.tariff object все Тариф портала: code, name, isCommercial, wasEverCommercial, checkedAt, kind
data.tariff.name string · null все Читаемое название редакции — для показа человеку, не для сравнения в коде. Может быть null. Подробности ниже
data.tariff.wasEverCommercial boolean все Портал когда-либо наблюдался на коммерческом тарифе. Это история, а не доступ. Признак не односторонний — см. ниже
data.tariff.checkedAt string все Время последней ПОПЫТКИ сверить тариф с Битрикс24, ISO 8601. Обновляется при вызове с ?refresh=tariff — в том числе тогда, когда сверка не удалась и тариф прочитать не вышло. Отметку об УДАЧНОЙ сверке несёт отдельный заголовок ответа X-Tariff-Checked-At (см. Инфраструктура и деплой), и на этот же ответ он может не прийти вовсе. Поле есть, а заголовка нет — значит сверку пробовали и тариф не прочитали
data.scopes array все Скоупы ключа. Подбор набора — Скоупы
data.api.scopeRequirements object все Карта прав ключа: чего у него нет и что каждое недостающее право откроет. Предварительная проверка вместо вызова наугад. Разбор ниже
data.api.scopeRequirements.granted object все Выданные права, разложенные на bitrix24 и platform — их получают по-разному
data.api.scopeRequirements.coverage object все Полнота карты: entities — всегда complete, pathscomplete либо partial. При partial перечень путей неполон, и отсутствие пути в unlocks НЕ доказывает, что путь не гейтится
data.api.scopeRequirements.missing object все Недостающие права. У каждого: entities — сущности, которые оно откроет, unlocks — адреса (не более пяти, остаток в unlocksRemaining рядом с truncated), howToObtain — способ получить
data.api.scopeRequirements.unobtainable object все Права, которые этому ключу получить нельзя, и почему. Две причины: личный ключ-вебхук не несёт прав контекста приложения, и есть права, которые платформа выдаёт сама — пользователю они недоступны ни на какой поверхности
data.api.scopeRequirements.aliases object все Написания, которые Битрикс24 считает одним правом (task и tasks)
data.accessMode string все Режим доступа ключа: READWRITE или READONLY. Подробнее — Режим доступа
data.capabilities object все Матрица доступных операций. Ключи первого уровня — группы, внутри каждой группы — слоты-операции. Строение слота описано ниже
data.capabilities.apps object все Слоты-операции create — создать приложение, publish — опубликовать в каталоге, bindPlacements — привязать места встраивания. Плюс sourceStorage — не операция, а блок настроек хранилища исходников со своим набором полей
data.capabilities.apps.sourceStorage object все Настройки хранилища исходников: enabled, requiredBeforeDeploy, automaticOnDeploy, limits.maxBlobBytes, endpoint, mcpToolName, contentTypes, docs. Поле freshnessWindowMinutes добавляется, только когда платформа проверяет возраст снапшота перед публикацией. Полей available и reason у этого блока нет
data.capabilities.servers object все Слоты create — создать сервер, deploy — опубликовать исходники, preview — работать с токенами доступа: ссылка предпросмотра и Bearer-токен для сквозной (E2E) проверки, wake — разбудить
data.capabilities.agents object все Слот create — создать AI-агента
data.capabilities.managedBots object все Слот create — создать управляемого бота
data.capabilities.aiRouter object все Слоты chatCompletions — вызовы моделей, byok — работа со своим ключом провайдера
data.capabilities.<группа>.<слот>.available boolean все Доступна ли операция этому ключу на этом портале прямо сейчас
data.capabilities.<группа>.<слот>.reason string все Код состояния слота. Приходит и при available: trueCOMMERCIAL, TRIAL_ACTIVE, — и при отказе — например SESSION_REQUIRED, WRITE_BLOCKED_READONLY_KEY, MARKETPLACE_REQUIRED, BILLING_EXHAUSTED, FEATURE_DISABLED, INFRA_NOT_PERMITTED, SERVER_CREATION_DISABLED, SERVER_CREATION_ADMINS_ONLY, INT_TARIFF_REQUIRED, COMMERCIAL_PLAN_REQUIRED, TRIAL_PORTAL_LIMIT, PLAN_NOT_ALLOWED_ON_TRIAL. Набор расширяется — обрабатывайте незнакомый код как отказ, опираясь на available
data.capabilities.<группа>.<слот>.userMessage string все Готовый текст на языке пользователя. Приходит при отказе, показывайте его как есть
data.capabilities.<группа>.<слот>.note string все Условие, которое available: true не покрывает: требование на стороне Битрикс24, счётчик занятых мест лимита или ограничение бесплатного доступа
data.webResearch.promptForAgents string все Готовая подсказка для агента: как вызывать исследование и где смотреть каталог провайдеров
data.capabilities.<группа>.<слот>.limits object все Действующие ограничения слота — например allowedPlans и maxPortalTotal при бесплатном доступе
data.capabilities.<группа>.<слот>.alternatives array все Что сделать вместо заблокированной операции: элементы с полями type, description, url или endpoint
data.api object все Правила работы с API в массиве _rules, список сущностей entity API в entityApi, ссылка на полный справочник
data.rateLimit object все Лимиты скорости вызовов: requestsPerSecond — лимит портала Битрикс24, общий для всех его ключей, edgeRequestsPerSecondPerIp — граница платформы на IP-адрес клиента. Подробнее — Лимиты запросов
data.ai object все Доступ к AI Router: модель по умолчанию, доступные модели, размер каталога. Подробнее — AI
data.webSearch object все Провайдеры веб-поиска и их стоимость. Подробнее — Список провайдеров
data.webResearch object все Глубокое исследование: available, endpoint, providers, defaultProvider, streaming, docs. Подробнее — Глубокое исследование
data.webResearch.providers[].cost object все Стоимость одного исследования у провайдера: research — цена в Вайбах (Ꝟ), currency — единица списания. У провайдера на своём ключе research равен 0
data.storage object все Объектное хранилище: использование, тарифы, эндпоинты загрузки. Подробнее — Хранилище
data.deployment object все Контракт публикации приложений, зависит от типа целевого сервера. Подробнее — Публикация
data.deployment.primary string все Основная модель размещения для этого аккаунта: galaxyApp — приложение в галактике, standalone — отдельная виртуальная машина
data.deployment.galaxyApp object все Контракт развёртывания в галактике. На пробном доступе блок приходит, только когда сохранённое состояние показывает подходящий хост. Это предварительная оценка: текущую вместимость окончательно проверяет POST /v1/infra/servers
data.deployment.placementNote string все Причина недоступности галактики и порядок развёртывания в этом состоянии. На пробном доступе поле различает отсутствие хоста и существующий, но непригодный хост. При выключенном режиме галактик поля нет, см. Galaxy-приложение
data.deployment.limits object все Действующие пределы публикации: потолки тела и архива, бюджет времени на шаг, число строк лога, потолок одновременных публикаций встроенным телом
data.deployment.limits.uploadInlineMax string все Потолок HTTP-тела для публикации со встроенным архивом, строкой с единицей измерения — например 96MB. Сверх него приходит 413 INLINE_SOURCE_TOO_LARGE. См. Публикация
data.deployment.limits.uploadInlineMaxArchive string все Тот же потолок, выраженный в размере самого архива, — например 72MB. Меньше uploadInlineMax примерно на четверть: содержимое едет в base64 и тяжелее исходных байт. Значение приходит из той же константы, что и отказ, поэтому пересчитывать потолок самостоятельно не нужно
data.deployment.limits.uploadUrlMax string все Потолок для публикации по ссылке и по сохранённой версии — 500MB. Эти пути передаются потоком и под потолок встроенного тела не попадают
data.infra object все Инфраструктура: провайдеры, лимит серверов, список нездоровых серверов, серверы чужих команд, в которых состоит владелец ключа. Подробнее — Инфраструктура
data.infra.collaboratorServers object все Серверы, где владелец ключа состоит в команде разработки, а не владеет: total — сколько членств всего, count — сколько строк уместилось в ответ, items — сами строки. В лимит infra.limits эти серверы не входят — машины чужие. Те же серверы приходят в GET /v1/infra/servers с блоком access.via: "collaborator"
data.infraState object все Остановлена ли инфраструктура за неуплату. Строки внутри блока машинные, текст для человека пишет клиент
data.infraState.frozen boolean все Остановлены ли за неуплату серверы, деплой и хранилище. При true отказ 402 ACCOUNT_FROZEN приходит на вызовах, которые оплачиваются балансом Вайбкод, а обращения к своему Битрикс24, AI в пределах месячной квоты тарифа и оплаченный период подписки Cowork/Code продолжают работать. Пока сужение отказа не дошло до портала, true означает «остановлено практически всё»: работают самоописание, справочник, спека, четыре вызова переписки по обращениям — создание, список, чтение одного обращения и комментарий к нему — и отзыв своего ключа Cowork/Code, остальное отвечает 402 ACCOUNT_FROZEN. Полный состав отказа — Коды ошибок
data.infraState.reason string или null все Код причины остановки: DEBT либо null, когда остановки нет
data.infraState.topupUrl string или null все Адрес пополнения кабинета либо null, когда пополнять нечего
data.feedback object все Эндпоинты и лимиты обратной связи. Подробнее — Обратная связь
data.auth object все Как передать ключ в запросе: заголовки, а для ключа авторизации — шаги OAuth-авторизации
data.quickstart object все Короткий список первых вызовов для знакомства с API
data.b24Credentials object vibe_api_ Готовность ключа к вызовам Битрикс24: ready. При ready: false дополнительно reason, а для тарифных причин paywallCode и upgradeUrl. Поле hint приходит, когда состояние доступа стоит перечитать. Блок отсутствует у ключа без портала и у ключа без скоупов Битрикс24 — там признак неприменим. Значения reason и что делать по каждому — Коды ошибок
data.b24Credentials.ready boolean vibe_api_ true — на ключе есть креды для вызовов портала, false — их нет, и любой вызов к порталу ответит 401 TOKEN_MISSING
data.docs string все Ссылка на полный справочник API — GET /v1/guide
data.errorCodes object все Формат ответа при ошибке и ссылка на полный справочник кодов
data.changelog object все Ссылка на журнал изменений API
data.expiresAt string или null vibe_api_ Срок действия ключа. null — без ограничения
data.owner object vibe_api_ Владелец ключа: name, userId
data.portalEmbedding object vibe_api_ Порядок встраивания через POST /v1/apps → OAuth-авторизацию → POST /v1/apps/:id/publish и границы личного ключа: он не вызывает placements/bind напрямую и сам не является ключом прозрачной авторизации
data.app object vibe_app_ Привязанное приложение: title, id
data.currentUser object или null vibe_app_ Пользователь Битрикс24, от лица которого идёт запрос. Заполняется при переданном токене сессии, без него приходит null
data.placements object vibe_app_ Встраивание приложения в интерфейс портала: доступные и зарегистрированные размещения, эндпоинты, порядок приёма запросов. Подробнее — Встраивание приложения в портал
data.placements.bindPrerequisite object vibe_app_ Условие на стороне Битрикс24, без которого привязка места встраивания не пройдёт. Состав блока зависит от региона и типа портала
data.placements.bindPrerequisite.subscriptionRequired boolean vibe_app_ true — порталу нужна активная подписка Маркетплейса Битрикс24, коммерческого тарифа недостаточно. false — достаточно коммерческого тарифа Битрикс24
data.placements.bindPrerequisite.note string vibe_app_ Текст с описанием условия и способом его выполнить
data.placements.bindPrerequisite.errorCodes array vibe_app_ Коды, которыми привязка ответит при невыполненном условии. BITRIX_UNAVAILABLE приходит в обоих случаях. К нему добавляются B24_MARKET_SUBSCRIPTION_REQUIRED и B24_MARKET_TRIAL_USED при subscriptionRequired: true, либо INT_TARIFF_REQUIRED при false. На коробочном портале в набор добавляется SESSION_REQUIRES_ADMIN. Независимо от региона и типа портала в наборе есть PLACEMENT_APP_GRANT_MISSING, PLACEMENT_OPTIONS_REQUIRED и PLACEMENT_NOT_REST_BINDABLE — отказы по конкретному месту встраивания, а не по доступу портала
data.oauth object vibe_app_ URL и обязательные параметры OAuth-авторизации
data.oauthTutorial object vibe_app_ Пошаговый порядок OAuth-авторизации
data.eventDelivery object vibe_app_ Серверный приём событий портала без опроса
data.schemaDiscovery object vibe_app_ Как прочитать схему полей без токена сессии

Менеджмент-ключ (vibe_live_) возвращает другой набор блоков — portals, totalAppKeys, урезанный capabilities — и не несёт данных портала. Описание — Менеджмент-ключи.

Пример ответа

Личный ключ (vibe_api_) — показаны основные поля:

JSON
{
  "success": true,
  "data": {
    "type": "personal",
    "portal": "mycompany.bitrix24.ru",
    "portalId": "8c3d1e04-…",
    "tariff": {
      "code": "ru_basic",
      "name": "Базовый",
      "isCommercial": true,
      "wasEverCommercial": true,
      "checkedAt": "2026-07-08T08:57:58.270Z",
      "kind": "CLOUD"
    },
    "scopes": ["crm", "task", "tasks", "im", "imbot", "disk", "user"],
    "accessMode": "READWRITE",
    "capabilities": {
      "apps": {
        "create": { "available": true },
        "publish": { "available": true },
        "bindPlacements": { "available": true }
      },
      "servers": {
        "create": { "available": true, "reason": "COMMERCIAL" },
        "deploy": { "available": true, "reason": "COMMERCIAL" },
        "preview": { "available": true },
        "wake": { "available": true }
      },
      "agents": {
        "create": {
          "available": true,
          "reason": "COMMERCIAL",
          "note": "Agent servers count toward the portal's infrastructure limit (currently 2/10)."
        }
      },
      "managedBots": {
        "create": {
          "available": true,
          "reason": "COMMERCIAL",
          "note": "Managed bot servers count toward the portal infrastructure limit."
        }
      },
      "aiRouter": {
        "chatCompletions": { "available": true },
        "byok": { "available": true }
      }
    },
    "owner": { "name": "Иван Петров", "userId": "1" },
    "expiresAt": null
  }
}

У слотов apps.publish и apps.bindPlacements поле note приходит всегда — в примере выше оно опущено, полный текст возвращает сам эндпоинт.

Ключ авторизации (vibe_app_) без токена сессии — показаны блоки, которых нет у личного ключа:

JSON
{
  "success": true,
  "data": {
    "type": "oauth_app",
    "portal": "mycompany.bitrix24.ru",
    "portalId": "8c3d1e04-…",
    "accessMode": "READWRITE",
    "app": { "title": "CRM Dashboard", "id": "f2342f7a-…" },
    "currentUser": null,
    "placements": {
      "available": true,
      "registered": ["LEFT_MENU"],
      "endpoints": [
        "POST https://vibecode.bitrix24.tech/v1/placements/bind",
        "POST https://vibecode.bitrix24.tech/v1/placements/unbind",
        "GET https://vibecode.bitrix24.tech/v1/placements",
        "GET https://vibecode.bitrix24.tech/v1/placements/available"
      ],
      "bindPrerequisite": {
        "subscriptionRequired": true,
        "note": "Binding a placement requires a Bitrix24-side prerequisite that depends on the dispatch path…",
        "errorCodes": [
          "B24_MARKET_SUBSCRIPTION_REQUIRED",
          "B24_MARKET_TRIAL_USED",
          "BITRIX_UNAVAILABLE"
        ]
      }
    }
  }
}

oauth.authorizeUrl — это шаблон, а не готовая ссылка. Эндпоинт /v1/oauth/authorize требует обязательный параметр state (16–512 символов) — это CSRF-токен по RFC 6749 §10.12, который генерирует клиент: создайте криптослучайную строку, добавьте её в URL и сверьте значение, вернувшееся в callback. Сервер не может сгенерировать state за вас — иначе защита от CSRF не работает. Открытие authorizeUrl как есть вернёт 400 INVALID_REQUEST "state: Required". Опционально добавьте redirect_uri — ваш адрес возврата, без него используется встроенная страница /oauth/complete, — и scope. Пример полной ссылки:

https://vibecode.bitrix24.tech/v1/oauth/authorize?app_key=vibe_app_…&state=aAbBcCdDeEfFgGhH&redirect_uri=https://myapp.com/callback

Пример ответа при ошибке

401 — неверный ключ:

JSON
{
  "success": false,
  "error": {
    "code": "INVALID_API_KEY",
    "message": "Invalid API key"
  }
}

Ошибки

HTTP Код Описание
401 MISSING_API_KEY Не передан заголовок X-Api-Key
401 INVALID_API_KEY Ключ не опознан: такой строки на платформе нет
401 KEY_INACTIVE Ключ отозван
401 KEY_EXPIRED Срок действия ключа истёк
401 KEY_NOT_FOUND Ключ удалён во время обработки запроса
403 IP_NOT_ALLOWED Запрос с адреса вне списка разрешённых IP

Полный список общих ошибок API — Ошибки.

Известные особенности

?refresh=tariff проверяет тариф не чаще одного раза в минуту. Параметр форсирует живую проверку тарифа портала в Битрикс24 и сбрасывает кэш ответа. Если предыдущая проверка была меньше минуты назад, запрос возвращает уже известное значение без новой проверки. Для менеджмент-ключа параметр не делает ничего — такой ключ не привязан к порталу.

Ответ кэшируется на стороне сервера около 30 секунд. Смена скоупов или режима доступа отражается в ответе сразу. Тариф, баланс и состояние инфраструктуры обновляются при первом чтении после истечения кэша. Запрос с ?refresh=tariff сбрасывает кэш, и следующее чтение без этого параметра отдаёт свежий тариф.

У ключа в режиме «только чтение» часть слотов capabilities приходит закрытыми. Это apps.publish, apps.bindPlacements, servers.create, servers.wake, agents.create, managedBots.create и обе операции aiRouter — все они отдают available: false и reason: "WRITE_BLOCKED_READONLY_KEY". Слот servers.deploy в этот список не входит: доставка на уже свой сервер такому ключу разрешена. У ключа «только чтение» в корне ответа приходит и поле writeRestriction — код WRITE_BLOCKED_READONLY_KEY, область действия и ссылка на страницу про режимы. Поле появляется только пока запрет включён: платформенный админ вправе его снять, и тогда поле из ответа исчезает вместе с самим запретом. Внутри поля есть список exceptions — маршруты, которые центральный запрет не трогает. Читайте состав из ответа, а не из этой страницы: там POST /v1/apps, где ключом «только чтение» создаётся приложение в том же режиме, два не-GET адреса, которые записью не являются — DELETE /v1/cowork/key (аварийный отзыв ключа) и DELETE /v1/infra/servers/{id}/lock (снятие залипшего лока, причём БЕЗУСЛОВНОЕ, — второй шаг, допустимый лишь после независимо подтверждённого простоя сервера; поле recoveryAction ответа EXEC_BUSY указывает не на него, а на POST /v1/infra/servers/{id}/unstick), — и пять операций на свой сервер: деплой, выполнение команд, загрузка файла, иконка приложения и снятие залипшего exec-лока (POST /v1/infra/servers/{id}/unstick, восстановление ровно для разрешённых операций). У управляющего ключа поле тоже приходит, но снять его нельзя ничем: запрет записи для таких ключей безусловен. Оно нужно потому, что тело ответа называет пишущие ручки в трёх десятках мест (подсказки хранилища, обращений, автосохранения исходников, коворка): это адреса, а не разрешения. Доступность конкретной операции — в capabilities.

Слот apps.create закрытым НЕ приходит: приложение в режиме READONLY таким ключом создаётся, а запрет на режим READWRITE описан в поле note этого слота. Чтения режим не затрагивает — например, servers.preview. Подробнее — Режим доступа.

Название тарифа предназначено для показа, а не для сравнения. Поле data.tariff.name собирается при чтении и может меняться, не меняя самого тарифа. Платформа берёт его по такому порядку. Если код тарифа известен справочнику редакций — оттуда, на русском языке. Иначе — название лицензии, как его сообщил Битрикс24, на языке портала. Иначе — сохранённое ранее название. Иначе — null. Из этого следуют три вещи. Первая: null — штатное значение, а не ошибка. Вторая: название не зависит от того, кто спрашивает, — его не меняют ни Accept-Language, ни язык интерфейса владельца ключа. Третья: код тарифа вместо названия не подставляется никогда — если названия нет, приходит null, а не pro100. Ветвить логику нужно по data.tariff.code, isCommercial и kind. Подписи известных редакций при этом уточнены — три из них: «Демо» стало «Демо-период», «Проект» — «Проект — архивный бесплатный», «NFR» — «NFR — партнёрская лицензия».

Признак wasEverCommercial — история, а не доступ. Значение true означает лишь, что портал когда-либо наблюдался на коммерческом тарифе. Доступа к инфраструктуре и режиму OPEN признак не даёт и отказов в этом доступе не снимает: доступ считается только по текущему состоянию портала — тарифу, подписке и демо. Решение принимайте по capabilities в этом же ответе, а не по признаку.

Признак wasEverCommercial не односторонний. Понижение тарифа значение не сбрасывает, но платформа может сменить его с true на false, если оснований под признаком не нашлось. Логику, которая считает переход возможным только в одну сторону, на этом поле строить нельзя.

Модель размещения определяйте по блоку deployment, а не по тарифу портала. На бесплатном тарифе Битрикс24 новая галактика не создаётся. Если режим галактик включён, но хоста нет, deployment.galaxyApp отсутствует, deployment.primary равен standalone, а deployment.placementNote описывает двухшаговый путь. Он доступен, только когда capabilities.servers.create.available в том же ответе равен true. Допустимый идентификатор тарифа выберите из capabilities.servers.create.limits.allowedPlans. При выключенном режиме галактик placementNote отсутствует, одношаговый запрос с source возвращает 400 SOURCE_AT_CREATE_GALAXY_ONLY, а возможность двухшагового пути определяется тем же слотом capabilities. Если существующий хост проходит предварительную проверку сохранённого состояния, блок galaxyApp присутствует и одношаговое создание с source стоит попробовать. Это не гарантия: текущую вместимость проверяет только POST /v1/infra/servers.

Если существующий хост не проходит предварительную проверку, блок galaxyApp отсутствует. Пока capabilities.servers.create.available равен false, placementNote запрещает двухшаговое создание отдельной машины: при включённом контроле trial-ограничений занятый слот даёт 402 TRIAL_PORTAL_LIMIT. Для нового одношагового запроса дождитесь восстановления хоста, попросите администратора починить его либо повысьте тариф. После удаления хоста заново прочитайте GET /v1/me и используйте объявленный там двухшаговый путь. Следуйте подсказке фактического ответа POST. Порядок вызовов — Создать сервер и Публикация.

Без ключа в браузере эндпоинт отдаёт HTML. Запрос GET /v1/me без заголовка X-Api-Key и с заголовком Accept: text/html возвращает страницу-заглушку со статусом 200, а не JSON. Запрос с ключом или без text/html в заголовке Accept всегда получает JSON-самоописание.

Карта требуемых прав

Раньше границу ключа можно было узнать только вызовом: запрос уходил и возвращался отказом 403 SCOPE_DENIED, называющим недостающее право. Список доступных сущностей показывал только открытое, а закрытое просто отсутствовало — и по отсутствию нельзя было отличить «такой сущности нет в продукте» от «она есть, но вашему ключу закрыта».

Блок data.api.scopeRequirements отвечает на этот вопрос до вызова:

JSON
{
  "granted": { "bitrix24": ["imbot"], "platform": ["vibe:ai", "vibe:search"] },
  "missing": {
    "bitrix24": {
      "crm": {
        "entities": ["deals", "contacts", "companies", "leads"],
        "unlocks": ["/v1/duplicates/find", "/v1/addresses"],
        "unlocksRemaining": 41,
        "truncated": true,
        "howToObtain": "reissue-key"
      }
    },
    "platform": {}
  }
}

Права Битрикс24 закрепляются за ключом в момент выпуска, поэтому howToObtain у них — reissue-key: добавить право в настройках уже выпущенного ключа недостаточно, нужен перевыпуск. Права Вайбкод правятся в кабинете.

Карта описывает только проверку прав на стороне платформы. Она не обещает, что вызов пройдёт. Право, выданное в кабинете уже после выпуска ключа, попадёт в карту, но Битрикс24 его не признает и ответит BITRIX_ACCESS_DENIED. Отказы по виду ключа, владению, режиму только для чтения, заморозке и тарифу — отдельные оси, и в карте они не описаны. Об этом же предупреждает поле _note внутри блока.

Перечень путей пока неполон, и карта говорит об этом сама. Поле coverage.paths со значением partial означает, что часть кастомных роутов ещё не имеет машинного вердикта, поэтому unlocks и unlocksRemaining занижают. Отсутствие пути в списке НЕ доказывает, что путь не гейтится: если вызов всё-таки отвечает отказом по правам, верьте отказу, а не карте. Список сущностей при этом полон всегда.

Отбивка не изменилась: вызов без нужного права по-прежнему возвращает 403 SCOPE_DENIED с именем этого права. Карта добавлена как предварительная проверка, а не как замена отбивки.

Смотрите также