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

Список версий

GET /v1/apps/:id/sources

Возвращает историю сохранённых версий исходного кода приложения и связанные с ним серверные версии.

Операция доступна и при отключённом сохранении исходников: ранее сохранённая история остаётся читаемой.

Параметры

Параметр Тип Обяз. Описание
id (path) UUID да Идентификатор приложения. Получить — GET /v1/apps.
sha256 (query) string нет Проба на существование архива с таким содержимым: ровно 64 шестнадцатеричных символа в любом регистре, иначе 400 INVALID_SHA256. Ответ той же формы, что без параметра, но в нём только версии с этим хешем: архив найден — в versions одна или несколько записей (одно и то же содержимое могли сохранить и в приложение, и на его сервер), а currentVersionId, totalVersions и totalSizeBytes считаются только по ним. Не найден — пустой массив и totalVersions равно 0. Секция linkedServerSources при этом не вычисляется, чтобы проба оставалась лёгкой: массив пуст, linkedServerSourcesTruncated равно false, поля linkedServerHint нет.

Примеры

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

Terminal
curl -H "X-Api-Key: YOUR_API_KEY" \
  https://vibecode.bitrix24.tech/v1/apps/<APP_ID>/sources

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

Terminal
curl -H "X-Api-Key: YOUR_APP_KEY" \
  -H "Authorization: Bearer USER_SESSION_TOKEN" \
  https://vibecode.bitrix24.tech/v1/apps/<APP_ID>/sources

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

javascript
const res = await fetch(
  `https://vibecode.bitrix24.tech/v1/apps/${appId}/sources`,
  { headers: { 'X-Api-Key': 'YOUR_API_KEY' } },
)
const { data } = await res.json()
console.log(`Версий: ${data.totalVersions}, последняя: ${data.currentVersionId}`)

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

javascript
const res = await fetch(
  `https://vibecode.bitrix24.tech/v1/apps/${appId}/sources`,
  {
    headers: {
      'X-Api-Key': 'YOUR_APP_KEY',
      'Authorization': 'Bearer USER_SESSION_TOKEN',
    },
  },
)
const { data } = await res.json()
console.log(`Версий: ${data.totalVersions}, последняя: ${data.currentVersionId}`)

Поля ответа

Поле Тип Описание
success boolean Всегда true при успехе.
data.totalVersions number Общее количество актуальных версий. Считается без ограничения, поэтому при длинной истории превышает длину массива versions.
data.currentVersionId string | null Идентификатор самой свежей версии (v<N>). null, если версий нет.
data.totalSizeBytes number Суммарный размер всех архивов в байтах.
data.versions array Список версий от самой свежей к старым. Удалённые версии в список не входят. Отдаётся не более 500 записей — при более длинной истории массив обрезается.
data.versions[].versionId string Идентификатор версии вида v<N>.
data.versions[].filename string Имя файла в хранилище. Содержит суффикс -published или -manual по текущим тегам версии, при обоих тегах — -published.
data.versions[].contentType string | null Тип архива, с которым его сохранили: application/gzip, application/x-tar, application/zip или application/octet-stream. null — у ранних версий, для которых тип не записан.
data.versions[].timestamp string Время сохранения (ISO 8601, UTC).
data.versions[].size number Размер архива в байтах.
data.versions[].sha256 string SHA-256 содержимого архива. Используется для дедупликации в пределах владельца.
data.versions[].tags string[] Теги версии. manual и published защищают её от автоматической очистки, остальные — произвольные метки из заголовка X-Tags при сохранении или из PATCH.
data.versions[].savedBy.userId string | null Идентификатор пользователя Вайбкод.
data.versions[].savedBy.session string | null Идентификатор AI-сессии из заголовка X-AI-Session-Id.
data.versions[].linkedDeployId string | null Метка последнего события с версией. deploy:… — версию сохранил или подтвердил деплой. publish:<время> — версию опубликовали через POST /v1/apps/:id/publish. Публикация перезаписывает метку деплоя. null — у версии не было ни деплоя, ни публикации.
data.versions[].deployStatus string | null Чем закончился последний деплой этой версии: success или failed. null — версию не деплоили: например, сохранили вручную и не передавали в source.versionId деплоя. Публикация поле не меняет, но у части старых опубликованных версий success записан публикацией, а не деплоем.
data.versions[].note string | null Комментарий из заголовка X-Note при сохранении или из PATCH. У версии, которую сохранил деплой, — текст поля changelog деплоя, а без него служебная строка Auto-saved on deploy … с той же меткой деплоя, что в linkedDeployId.
data.versions[].serverContext object | null Сервер, которым управляет ключ этого приложения (vibe_app_*), если версия с ним связана. Данные сервера — на момент запроса. null — версия с сервером не связана.
data.versions[].serverContext.serverId string Идентификатор сервера. Получить — GET /v1/infra/servers.
data.versions[].serverContext.serverName string Системное имя сервера.
data.versions[].serverContext.serverDisplayName string Отображаемое имя сервера. Пустая строка, если у сервера его нет.
data.versions[].serverContext.linkedApp object | null Приложение, на которое выписан управляющий ключ сервера. null — сервер управляется личным ключом.
data.versions[].serverContext.linkedApp.appId string Идентификатор приложения. Получить — GET /v1/apps.
data.versions[].serverContext.linkedApp.title string Название приложения.

Связанные серверные версии

Массив versions перечисляет версии, привязанные к приложению. В их числе версии сервера, которым управляет ключ этого приложения (vibe_app_*): у них заполнено serverContext. Версии серверов на личном ключе (сохранённые через POST /v1/infra/servers/:id/sources или авто-сохранением при деплое) в versions не входят — они возвращаются отдельным полем data.linkedServerSources, сгруппированным по серверу. Пример с заполненной секцией — в разделе «Пример ответа».

Поле Тип Описание
data.linkedServerSources[] array Группы серверных версий, по одной на сервер. Приходит всегда. Пуст, если связанных серверных версий нет или секция не вычислялась, — когда так бывает, сказано под таблицей.
data.linkedServerSources[].serverContext object Сервер группы. Поля те же, что у data.versions[].serverContext.
data.linkedServerSources[].totalVersions number Точное число версий на сервере, не ограничено размером списка ниже.
data.linkedServerSources[].totalSizeBytes number Суммарный размер версий этого сервера.
data.linkedServerSources[].versions[] array Версии сервера в том же формате, что versions[], но без поля serverContext: оно стоит у группы. Номер версии здесь — из истории сервера: он может совпасть с номером другой версии в versions, а последовательность сервера может начинаться не с v1 и идти с пропусками.
data.linkedServerSourcesTruncated boolean Приходит всегда. true — секция неполная: серверов с версиями больше 50 или их версий в сумме больше 200. Ещё true приходит, когда секцию не удалось собрать, — тогда массив пуст. Полный список — по каждому серверу через GET /v1/infra/servers/:serverId/sources.
data.linkedServerHint object Приходит, только когда linkedServerSources не пуст, иначе поля в ответе нет. Указывает на авторитетные эндпоинты списка и скачивания серверных версий.
data.linkedServerHint.message string Пояснение, где хранятся серверные версии и куда за ними идти. Текст приходит на английском.
data.linkedServerHint.listEndpoint string Шаблон адреса списка версий сервера.
data.linkedServerHint.downloadEndpoint string Шаблон адреса скачивания версии сервера.
data.linkedServerHint.docs string Ссылка на markdown-страницу раздела «Хранилище исходного кода».

Поле linkedServerSources заполняется при запросе без ?sha256=, когда вызывающий — автор приложения (личный vibe_api_* ключ) или администратор портала. Автор видит в секции только серверы ключа, которым сделан запрос, и сервер, к которому привязано приложение этого ключа. Серверы, созданные другими личными ключами автора, в секцию не попадают, даже если автор — администратор портала: на запрос их исходников этот ключ получит 404 SERVER_NOT_FOUND. При вызове ключом OAuth-приложения секция пуста: машинный ключ не перечисляет личные серверы автора. Скачивание и полный список по серверу — через GET /v1/infra/servers/:serverId/sources, идентификатор в serverContext.serverId.

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

HTTP 200:

JSON
{
  "success": true,
  "data": {
    "totalVersions": 2,
    "currentVersionId": "v2",
    "totalSizeBytes": 49678,
    "versions": [
      {
        "versionId": "v2",
        "filename": "2026-08-04T10-36-36-711Z-v2.tar.gz",
        "contentType": "application/gzip",
        "timestamp": "2026-08-04T10:36:36.711Z",
        "size": 174,
        "sha256": "1b8d9dcdb0960d4cea381ae1f80bfaab4af3a27ec9645136242575ac35f9da3b",
        "tags": [],
        "savedBy": {
          "userId": "48bdfd33-5fbe-4ad1-a02c-9b5c7ae65f77",
          "session": null
        },
        "linkedDeployId": null,
        "deployStatus": null,
        "note": "Исправил форму входа",
        "serverContext": null
      },
      {
        "versionId": "v1",
        "filename": "2026-08-04T10-01-25-947Z-v1.tar.gz",
        "contentType": "application/gzip",
        "timestamp": "2026-08-04T10:01:25.947Z",
        "size": 49504,
        "sha256": "e28aaf8af203804c934e6881c94472a420174f58c9442ecef82dba44c6cf989b",
        "tags": [],
        "savedBy": {
          "userId": "48bdfd33-5fbe-4ad1-a02c-9b5c7ae65f77",
          "session": null
        },
        "linkedDeployId": null,
        "deployStatus": null,
        "note": "Первая версия",
        "serverContext": null
      }
    ],
    "linkedServerSources": [
      {
        "serverContext": {
          "serverId": "86dba796-5b36-49ef-a12e-55f1fc2229dd",
          "serverName": "shop-api",
          "serverDisplayName": "Магазин: API",
          "linkedApp": null
        },
        "totalVersions": 1,
        "totalSizeBytes": 1430,
        "versions": [
          {
            "versionId": "v1",
            "filename": "2026-09-03T07-30-46-098Z-v1.tar.gz",
            "contentType": "application/gzip",
            "timestamp": "2026-09-03T07:30:46.098Z",
            "size": 1430,
            "sha256": "3ac41f26c943713b4ed4b85a8ec20a7b7d1dbdfeeee0634712251419a15a328b",
            "tags": [],
            "savedBy": {
              "userId": "48bdfd33-5fbe-4ad1-a02c-9b5c7ae65f77",
              "session": null
            },
            "linkedDeployId": "deploy:2026-09-03T07:30:44.843Z",
            "deployStatus": "success",
            "note": "Auto-saved on deploy 2026-09-03T07:30:44.843Z"
          }
        ]
      },
      {
        "serverContext": {
          "serverId": "07312566-9915-4338-bf3f-997318013237",
          "serverName": "landing",
          "serverDisplayName": "Лендинг",
          "linkedApp": null
        },
        "totalVersions": 1,
        "totalSizeBytes": 374,
        "versions": [
          {
            "versionId": "v1",
            "filename": "2026-08-07T11-53-13-340Z-v1.tar.gz",
            "contentType": "application/gzip",
            "timestamp": "2026-08-07T11:53:13.340Z",
            "size": 374,
            "sha256": "98021c03c7ccd84493d872e1dfcbb083686368b6df8e2b53b64a1ce8bfd72e20",
            "tags": [],
            "savedBy": {
              "userId": null,
              "session": null
            },
            "linkedDeployId": "deploy:2026-08-07T11:53:13.038Z",
            "deployStatus": "success",
            "note": "Auto-saved on deploy 2026-08-07T11:53:13.038Z"
          }
        ]
      }
    ],
    "linkedServerSourcesTruncated": false,
    "linkedServerHint": {
      "message": "This app has source versions stored under a server (server-keyed storage). List and download them via the server endpoint.",
      "listEndpoint": "GET /v1/infra/servers/:serverId/sources",
      "downloadEndpoint": "GET /v1/infra/servers/:serverId/sources/:versionId/download",
      "docs": "https://vibecode.bitrix24.tech/docs-content/source-storage.md"
    }
  }
}

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

404 — приложения с таким идентификатором нет:

JSON
{
  "success": false,
  "error": {
    "code": "APP_NOT_FOUND",
    "message": "Application not found"
  }
}

Ошибки

HTTP Код Описание
400 INVALID_SHA256 Параметр sha256 не равен 64 шестнадцатеричным символам.
403 SOURCE_APP_ID_MISMATCH Вызов сделан ключом авторизации vibe_app_…, выписанным на другое приложение. Такой ключ обращается только к снапшотам своего приложения, даже если оба приложения создал один автор.
403 NOT_AUTHORIZED Личный ключ не принадлежит ни автору приложения, ни администратору портала и не выписан на это приложение.
404 APP_NOT_FOUND Приложение не существует, удалено или принадлежит другому порталу.

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

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