Для AI-агентов: markdown этой страницы — /docs-content/source-storage/registry.md индекс документации — /llms.txt
Реестр исходников и состояние портала
Где посмотреть все задепонированные снапшоты сразу — страница кабинета и её API-двойник GET /v1/me/sources. Плюс программная проверка того, включено ли сохранение исходников на портале.
Проверка состояния портала
GET /v1/me возвращает блок data.capabilities.apps.sourceStorage:
При включённом сохранении:
{
"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 приходит в этом блоке, только пока публикация проверяет возраст снапшота. Его отсутствие читается как «возраст не проверяется», поэтому по составу блока видно, какое правило действует для вашего портала.
При отключённом сохранении:
{
"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) — все снапшоты портала, включая снапшоты других участников. Может скачать любой снапшот.
Как скачать:
- Откройте «Исходники приложений» в меню.
- Найдите нужную строку (сервер или приложение).
- В меню строки выберите «Скачать последнюю версию» — браузер загрузит архив.
У строк-приложений в меню строки есть пункт «История версий» — он открывает страницу истории версий приложения в разделе «Хранилище».
Примечание: страница работает независимо от того, включено ли депонирование на уровне платформы — исторические снапшоты доступны даже если новые сохранения временно отключены.
Сводный реестр исходников
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:
{
"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 — ключ не распознан:
{
"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, если ваш ключ не относится к приложению, привязанному к этому серверу.