## Скачать архив

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

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

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

## Параметры

| Параметр | Тип | Обяз. | Описание |
|----------|-----|:-----:|----------|
| `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/v3/download

# Скачать архив по полученной ссылке, без дополнительных заголовков
curl -o source-v3.tar.gz "<url из ответа выше>"
```

### 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/v3/download

# Скачать архив по полученной ссылке, без дополнительных заголовков
curl -o source-v3.tar.gz "<url из ответа выше>"
```

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

```javascript
const { data } = await fetch(
  `https://vibecode.bitrix24.tech/v1/apps/${appId}/sources/v3/download`,
  { headers: { 'X-Api-Key': 'YOUR_API_KEY' } },
).then((r) => r.json())

const archive = await fetch(data.url)
const buffer = await archive.arrayBuffer()
// Дальше — распаковка архива: tar.gz читается tar-библиотекой, zip — JSZip или аналогом
```

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

```javascript
const { data } = await fetch(
  `https://vibecode.bitrix24.tech/v1/apps/${appId}/sources/v3/download`,
  {
    headers: {
      'X-Api-Key': 'YOUR_APP_KEY',
      'Authorization': 'Bearer USER_SESSION_TOKEN',
    },
  },
).then((r) => r.json())

const archive = await fetch(data.url)
const buffer = await archive.arrayBuffer()
// Дальше — распаковка архива: tar.gz читается tar-библиотекой, zip — JSZip или аналогом
```

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

| Поле | Тип | Описание |
|------|-----|----------|
| `success` | boolean | Всегда `true` при успехе. |
| `data.url` | string | Подписанная ссылка на архив. Дополнительных заголовков при скачивании не требует. Формат архива — поле `contentType` версии, см. [Получить метаданные версии](/docs/source-storage/versions-get). |
| `data.expiresAt` | string | Момент истечения подписи (ISO 8601, UTC). Ссылка запрашивается на 30 минут, но подпись может истечь раньше: скачивайте архив сразу и сверяйтесь с этим полем. |

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

`HTTP 200`, подписанная ссылка в примере сокращена:

```json
{
  "success": true,
  "data": {
    "url": "https://<storage-endpoint>/...",
    "expiresAt": "2026-10-07T09:12:22.000Z"
  }
}
```

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

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` не существует или была удалена. |
| 410 | `SOURCE_VERSION_BYTES_PURGED` | Запись о версии жива, но её байты уже вычищены из хранилища. Восстановление одно — [сохранить архив заново](/docs/source-storage/save). |
| 502 | `SOURCE_DOWNLOAD_URL_FAILED` | Хранилище временно недоступно — повторите запрос. |

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

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

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