Для 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 — личный ключ
curl -H "X-Api-Key: YOUR_API_KEY" \
https://vibecode.bitrix24.tech/v1/apps/<APP_ID>/sources
curl — OAuth-приложение
curl -H "X-Api-Key: YOUR_APP_KEY" \
-H "Authorization: Bearer USER_SESSION_TOKEN" \
https://vibecode.bitrix24.tech/v1/apps/<APP_ID>/sources
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-приложение
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:
{
"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 — приложения с таким идентификатором нет:
{
"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 — Ошибки.