## Получить метаданные версии

`GET /v1/apps/:id/sources/:versionId`

Возвращает метаданные одной версии исходного кода приложения, без архива. Нужен, когда идентификатор версии уже известен и полный список забирать незачем.

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

## Параметры

| Параметр | Тип | Обяз. | Описание |
|----------|-----|:-----:|----------|
| `id` (path) | UUID | да | Идентификатор приложения. Получить — [`GET /v1/apps`](/docs/apps/list). |
| `versionId` (path) | string | да | Идентификатор версии вида `v<N>`. Получить — [Список версий](/docs/source-storage/versions). Номер `savedVersionId` из ответа [деплоя](/docs/infra/deploy/deploy) сервера на личном ключе относится к истории сервера, а не приложения: по нему этот метод вернёт другую версию приложения или `404 VERSION_NOT_FOUND`. Такую версию запрашивайте через [серверные эндпоинты](/docs/source-storage/servers). |

## Примеры

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

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

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

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

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

```javascript
const res = await fetch(
  `https://vibecode.bitrix24.tech/v1/apps/${appId}/sources/v1`,
  { headers: { 'X-Api-Key': 'YOUR_API_KEY' } },
)
const { data } = await res.json()
console.log(data.versionId, data.tags, data.note)
```

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

```javascript
const res = await fetch(
  `https://vibecode.bitrix24.tech/v1/apps/${appId}/sources/v1`,
  {
    headers: {
      'X-Api-Key': 'YOUR_APP_KEY',
      'Authorization': 'Bearer USER_SESSION_TOKEN',
    },
  },
)
const { data } = await res.json()
console.log(data.versionId, data.tags, data.note)
```

## Поля ответа

Поля `data.id` в этом ответе нет: внутренний идентификатор записи приходит только при сохранении.

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

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

`HTTP 200`:

```json
{
  "success": true,
  "data": {
    "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
  }
}
```

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

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

```json
{
  "success": false,
  "error": {
    "code": "VERSION_NOT_FOUND",
    "message": "Version v99 not found"
  }
}
```

## Ошибки

| HTTP | Код | Описание |
|------|-----|----------|
| 400 | `INVALID_VERSION_ID` | Формат `versionId` не соответствует `v<целое неотрицательное число>`. |
| 403 | `SOURCE_APP_ID_MISMATCH` | Вызов сделан ключом авторизации `vibe_app_…`, выписанным на другое приложение. Такой ключ обращается только к снапшотам своего приложения, даже если оба приложения создал один автор. |
| 403 | `NOT_AUTHORIZED` | Личный ключ не принадлежит ни автору приложения, ни администратору портала и не выписан на это приложение. |
| 404 | `APP_NOT_FOUND` | Приложение не существует, удалено или принадлежит другому порталу. |
| 404 | `VERSION_NOT_FOUND` | Версия с таким `versionId` не существует или была удалена. |

Полный список общих ошибок API — [Ошибки](/docs/errors).

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

- [Хранилище исходного кода](/docs/source-storage)
- [Список версий](/docs/source-storage/versions)
- [Скачать архив](/docs/source-storage/versions-download)
- [Теги и комментарии версии](/docs/source-storage/metadata)
- [Сохранить снапшот](/docs/source-storage/save)
- [Серверные эндпоинты исходников](/docs/source-storage/servers)
