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

Реестр исходников и состояние портала

Где посмотреть все задепонированные снапшоты сразу — страница кабинета и её API-двойник GET /v1/me/sources. Плюс программная проверка того, включено ли сохранение исходников на портале.

Проверка состояния портала

GET /v1/me возвращает блок data.capabilities.apps.sourceStorage:

При включённом сохранении:

JSON
{
  "capabilities": {
    "apps": {
      "sourceStorage": {
        "enabled": true,
        "requiredBeforeDeploy": false,
        "automaticOnDeploy": true,
        "limits": {
          "maxBlobBytes": 524288000
        },
        "endpoint": "POST /v1/apps/:id/sources",
        "mcpToolName": "save_sources",
        "contentTypes": [
          "application/gzip",
          "application/x-tar",
          "application/zip",
          "application/octet-stream"
        ],
        "docs": "https://vibecode.bitrix24.tech/docs-content/source-storage.md"
      }
    }
  }
}

Вместе с лимитами блок отдаёт и указатели на способ сохранения: endpoint, mcpToolName, допустимые contentTypes и адрес этой документации.

Поле freshnessWindowMinutes приходит в этом блоке, только пока публикация проверяет возраст снапшота. Его отсутствие читается как «возраст не проверяется», поэтому по составу блока видно, какое правило действует для вашего портала.

При отключённом сохранении:

JSON
{
  "capabilities": {
    "apps": {
      "sourceStorage": {
        "enabled": false,
        "requiredBeforeDeploy": false,
        "automaticOnDeploy": false,
        "disabledBy": "platform",
        "readOperations": "available",
        "reactivation": {
          "scope": "platform",
          "permission": "platform admin"
        }
      }
    }
  }
}

Два набора полей взаимоисключающие: при enabled: false указателей на сохранение в блоке нет. Поле disabledBy — "platform" (функция не включена на уровне платформы) или "portal" (владелец портала отключил). Поле readOperations: "available" означает, что список версий и скачивание остаются доступными даже при отключённом сохранении. Блок reactivation указывает, на каком уровне (платформа или портал) включается функция и какие права для этого нужны.

Отключение для портала

Администратор портала может отключить сохранение исходников в кабинете: раздел администрирования «Настройки», блок «Автосохранение исходников приложений». При отключении:

  • POST /v1/apps/:id/sources возвращает 200 { skipped: true, reason: "DISABLED_FOR_PORTAL" }.
  • POST /v1/apps/:id/publish не проверяет наличие снапшота.
  • GET /v1/apps/:id/sources продолжает возвращать ранее сохранённые версии.
  • GET /v1/apps/:id/sources/:versionId/download остаётся доступным.

История сохранений переживает повторное включение — ранее созданные версии остаются доступными.

Реестр исходников

Страница «Исходники приложений» доступна в личном кабинете через левое меню (иконка пакета). Она показывает сводный список всех задепонированных снапшотов — чтобы передать код новому разработчику или возобновить AI-сессию.

Кто что видит:

  • Участник портала (MEMBER) — только свои снапшоты (те, что он загружал).
  • Администратор портала (ADMIN) — все снапшоты портала, включая снапшоты других участников. Может скачать любой снапшот.

Как скачать:

  1. Откройте «Исходники приложений» в меню.
  2. Найдите нужную строку (сервер или приложение).
  3. В меню строки выберите «Скачать последнюю версию» — браузер загрузит архив.

У строк-приложений в меню строки есть пункт «История версий» — он открывает страницу истории версий приложения в разделе «Хранилище».

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

Сводный реестр исходников

GET /v1/me/sources

API-двойник страницы кабинета «Исходники приложений». Возвращает список владельцев снапшотов исходников (серверов и legacy-приложений) по всему, чем владеет вызывающий ключ. Ключ администратора аккаунта (ADMIN) видит весь аккаунт.

Требует портального ключа API. Менеджмент-ключ или ключ без привязки к порталу → 403 PORTAL_KEY_REQUIRED.

Параметры

Параметр Тип По умолч. Описание
page (query) number 1 Номер страницы.
limit (query) number 25 Размер страницы, максимум 100.
search (query) string — Фильтр по названию / имени сервера / имени владельца.

Поля ответа

Поле Тип Описание
success boolean Всегда true при успехе.
data array Владельцы снапшотов — серверы и legacy-приложения. Состав строки — в таблице ниже.
total number Общее число строк, попавших под запрос.
page number Номер отданной страницы.
limit number Размер страницы, с которым обработан запрос.

Состав строки data[]:

Поле Тип Описание
kind string server или legacy-app.
ownerKey string Идентификатор владельца строки: id сервера (kind: server) или id приложения (kind: legacy-app).
title string Отображаемое название (сервер или приложение).
server object | null Для kind: server: id, name, displayName, mode в верхнем регистре, status в нижнем, blackholeStatus, deleted. Иначе null.
app object | null Для kind: legacy-app: id, title. Иначе null.
user object | null Владелец: id, name. Может быть null.
latestVersionId string Идентификатор самой свежей версии (vN).
latestSavedAt string Время сохранения последней версии (ISO 8601).
versionsCount number Количество версий.
totalSizeBytes number Суммарный размер архивов в байтах.
reachableViaApi boolean Доступна ли запись через V1-эндпоинты (см. ниже).
listEndpoint string | null Готовый путь для получения списка версий владельца, либо null.
latestDownloadEndpoint string | null Готовый путь для скачивания последней версии, либо null.

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

HTTP 200:

JSON
{
  "success": true,
  "data": [
    {
      "kind": "server",
      "ownerKey": "8de64f8d-...",
      "title": "Prod",
      "server": {
        "id": "8de64f8d-...",
        "name": "srv-prod",
        "displayName": "Prod",
        "mode": "BLACKHOLE",
        "status": "sleeping",
        "blackholeStatus": "DISCONNECTED",
        "deleted": false
      },
      "app": null,
      "user": { "id": "8f1a2b3c-...", "name": "Alex" },
      "latestVersionId": "v4",
      "latestSavedAt": "2026-05-21T10:15:30.000Z",
      "versionsCount": 4,
      "totalSizeBytes": 552960,
      "reachableViaApi": true,
      "listEndpoint": "/v1/infra/servers/8de64f8d-.../sources",
      "latestDownloadEndpoint": "/v1/infra/servers/8de64f8d-.../sources/v4/download"
    }
  ],
  "total": 1,
  "page": 1,
  "limit": 25
}

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

401 — ключ не распознан:

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

Ошибки

HTTP Код Описание
403 PORTAL_KEY_REQUIRED Ключ не привязан к порталу — менеджмент-ключ реестр не читает.
401 MISSING_API_KEY Заголовок X-Api-Key не передан.
401 INVALID_API_KEY Ключ не распознан платформой.

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

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

  • reachableViaApi. Поле отвечает на один вопрос: пустит ли ВЫЗЫВАЮЩИЙ КЛЮЧ детальный переход по V1. Значение false приходит в пяти случаях:

    • Сервер, чей управляющий ключ был удалён, — это осиротевшая запись. Переход вернёт 404.
    • Мягко удалённое legacy-приложение.
    • Сервер, если запрос сделан ключом OAuth-приложения: такой ключ открывает исходники только того сервера, которым владеет сам, даже если сервер создан вашим личным ключом. Переход вернёт 403 NOT_AUTHORIZED.
    • Строка приложения, если запрос сделан ключом другого приложения: ключ приложения открывает только своё приложение, даже если автор у приложений один. Переход вернёт 403 SOURCE_APP_ID_MISMATCH — этот отказ приходит раньше проверки авторства, поэтому у него отдельный код.
    • Сервер, созданный другим вашим личным ключом, если ваш ключ не относится к приложению, привязанному к этому серверу. Так бывает даже у администратора портала. Переход вернёт 404.

    У таких строк listEndpoint и latestDownloadEndpoint равны null, но сама строка в списке остаётся, чтобы вы видели эти исходники. Перед переходом по listEndpoint проверяйте reachableViaApi.

    Исключение из последнего случая — ключ десктопа Cowork/Code: он получает true у сервера, к которому привязано приложение владельца ключа, пока сервер не удалён. Указатели ведут к списку версий и скачиванию. Удалённый сервер остаётся true для его управляющего ключа и для администратора портала, если сервер принадлежит другому пользователю: чтение и очистка его версий работают — Версии удалённого сервера.

  • Статус сервера. Для сервера Black Hole значение status: "sleeping" — это нормальное «припаркованное» состояние (сервер просыпается по требованию), а не сбой. Сопоставляйте его с blackholeStatus, чтобы отличить «припаркован, проснётся по требованию» от реальной проблемы. Значение — статус из БД, поддерживаемый флот-поллером (согласуется не мгновенно, ~15 с), а не результат живой сверки с провайдером.

  • Отличие от GET /v1/infra/servers. Тот список ограничен строго серверами вызывающего ключа, поэтому сервер, привязанный к другому ключу того же владельца, там отсутствует, но присутствует в этом реестре — с reachableViaApi: false, если ваш ключ не относится к приложению, привязанному к этому серверу.

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