
## Публичный доступ к объекту

`GET /v1/public-storage/:portalId/:objectId`

Возвращает содержимое завершённого (`COMPLETED`) публично доступного объекта в виде перенаправления (302) на временную ссылку. Объекты `PENDING` не выдаются и возвращают `404 STORAGE_OBJECT_NOT_FOUND`. Ключ API не требуется — эндпоинт анонимный. Анонимный доступ включается на уровне портала отдельно; по умолчанию выключен.

## Параметры

| Параметр | Тип | Обяз. | Описание |
|----------|-----|:-----:|---------|
| `portalId` (path) | string (UUID) | да | Идентификатор портала в Вайбкод. Формат: `xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx`. Получить через `GET /v1/me` с ключом управления — поле `data.portals[n].id` |
| `objectId` (path) | string (CUID) | да | Внутренний идентификатор объекта (поле `id` из ответов на запись и список) |

## Примеры

**Ключ не требуется.** Оба примера отправляются без заголовков авторизации — это анонимный эндпоинт.

### curl

```bash
curl -L "https://vibecode.bitrix24.tech/v1/public-storage/YOUR_PORTAL_ID/YOUR_OBJECT_ID"
```

### JavaScript

```javascript
const res = await fetch(
  'https://vibecode.bitrix24.tech/v1/public-storage/YOUR_PORTAL_ID/YOUR_OBJECT_ID',
  { redirect: 'follow' }
)
if (!res.ok) {
  const body = await res.json()
  console.error(body.error.code, body.error.message)
  return
}
// res.url — финальный URL файла
```

## Ответ

Поведение зависит от состояния анонимного доступа на портале:

**Анонимный доступ включён на портале.** Для завершённого `PUBLIC`-объекта сервер возвращает `302 Found` с заголовком `Location`, указывающим на временную ссылку хранилища. Ссылка действительна 10 минут. Заголовок ответа: `Cache-Control: private, no-store`.

**Анонимный доступ выключен на портале** (значение по умолчанию для нового портала): `503 STORAGE_PUBLIC_GET_DISABLED_FOR_PORTAL`. Включается администратором портала.

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

503 — анонимный доступ выключен на портале:

```json
{
  "success": false,
  "error": {
    "code": "STORAGE_PUBLIC_GET_DISABLED_FOR_PORTAL",
    "message": "Public storage GET is disabled for this portal"
  }
}
```

## Ошибки

| HTTP | Код | Описание |
|------|-----|---------|
| 404 | `STORAGE_OBJECT_NOT_FOUND` | Загрузка объекта не завершена (`PENDING`), объект не найден, имеет видимость `PRIVATE`, принадлежит другому порталу, или `objectId` не совпадает ни с одним объектом |
| 410 | `STORAGE_OBJECT_DELETED` | Завершённый объект был удалён |
| 429 | `STORAGE_RATE_LIMIT_EXCEEDED` | Превышен лимит 60 запросов в минуту с одного IP-адреса |
| 503 | `STORAGE_PUBLIC_GET_DISABLED_FOR_PORTAL` | Анонимный доступ выключен на данном портале |
| 503 | `STORAGE_FEATURE_DISABLED` | Хранилище временно недоступно на платформе |

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

## Известные особенности

- **Анонимный доступ включается отдельно.** Даже завершённый объект с видимостью `PUBLIC` не становится автоматически доступным через этот эндпоинт — администратор портала должен включить анонимный доступ в настройках хранилища.
- **`objectId` — внутренний идентификатор, не логический ключ.** Используйте поле `id` из ответа на загрузку ([`POST /v1/storage/objects/upload`](/docs/storage/upload)) или из [списка объектов](/docs/storage/objects/list).
- **Не кешируйте адрес перенаправления** — новая временная ссылка формируется при каждом запросе.

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

- [Публичный доступ HEAD](/docs/storage/objects/public-head)
- [Получить объект (авторизованный)](/docs/storage/objects/get)
- [Список объектов](/docs/storage/objects/list)
- [Удалить объект](/docs/storage/objects/delete)
