
## Публичные метаданные объекта

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

Возвращает метаданные завершённого (`COMPLETED`) публично доступного объекта в заголовках ответа без передачи содержимого. Объекты `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 -I "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',
  { method: 'HEAD' }
)
if (res.ok) {
  console.log('MIME-тип:', res.headers.get('content-type'))
  console.log('Размер:', res.headers.get('content-length'))
}
```

## Ответ

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

**Анонимный доступ включён на портале.** Для завершённого `PUBLIC`-объекта сервер возвращает `200 OK` с заголовками:

| Заголовок | Значение |
|-----------|---------|
| `Content-Type` | MIME-тип содержимого объекта |
| `Content-Length` | Размер объекта в байтах |
| `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).
- **Заголовок `Content-Length` содержит реальный размер объекта** из базы данных — не длину сериализованного ответа.

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

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