Медиабанк API

Единое хранилище фото, видео и аудио всех сервисов siteaccess. Файлы лежат в S3, к каждому автоматически добавляются название, описание, теги, категория и векторы для поиска по смыслу и по картинке.

Базовый адрес: https://media-bank.siteaccess.ru/v1

Ключи и доступ

Банк общий: все пользователи и сервисы видят все файлы на равных. Владелец (owner) и сервис-загрузчик (created_by) — только метаданные, не ограничение доступа.

Ключ передаётся в заголовке Authorization: Bearer mb_… (или x-api-key). Права ключа: read — поиск и скачивание, write — загрузка и изменение метаданных. Ключи выдаёт администратор сервера:

cd /var/www/lovable.siteaccess.ru/platform && node src/cli.ts bank:key "имя сервиса" read,write

Методы

ПутьПраваЧто делает
GET/v1/assetsreadпоиск и список: по смыслу (q), похожие (similar), фильтры
POST/v1/search/by-imagereadпоиск по картинке (тело — изображение)
GET/v1/assets/{id}readкарточка файла
GET/v1/assets/{id}/{variant}readфайл: original, w1600, w800, w400, poster, web — переадресация 302 на подписанную ссылку S3 (1 час)
POST/v1/assets?filename=…writeзагрузить файл (тело — байты файла), метаданные в заголовке x-bank-meta
PATCH/v1/assets/{id}writeизменить метаданные
POST/v1/assets/{id}/usagewriteотметить использование файла (проект, место)
POST/v1/sources/fileswriteфайл, уже лежащий на сервере (например, выход ComfyUI): занести в банк сразу и добавить метаданные
GET/v1/sources/file?source=&name=readоригинал по имени файла в сервисе-источнике (после очистки локальных копий)
GET/v1/statsreadсколько файлов по типам и источникам, популярные категории
GET/v1/health—проверка доступности

Загрузка

Тело запроса — сами байты файла (Content-Type: image/*, video/*, audio/* или application/octet-stream), до 500 МБ. Имя с расширением — в ?filename=. Метаданные — JSON в заголовке x-bank-meta (для длинных промптов и нелатинских символов — base64 от JSON, или добавьте их потом через PATCH).

curl -X POST "https://media-bank.siteaccess.ru/v1/assets?filename=coffee.png" \
  -H "Authorization: Bearer $BANK_KEY" \
  -H "Content-Type: image/png" \
  -H "x-bank-meta: $(printf '%s' '{"prompt":"кофейня на рассвете","model":"z-image-turbo","owner":"user@example.com","tags":["кофе","интерьер"]}' | base64 -w0)" \
  --data-binary @coffee.png

Ответ 201 — новый файл, 200 с "duplicate": true — такой файл (по sha256) уже есть: метаданные будут добавлены к существующему. Описание и теги банк дополняет сам в течение нескольких минут (status: new → ready).

Файл уже на сервере

curl -X POST "https://media-bank.siteaccess.ru/v1/sources/files" -H "Authorization: Bearer $BANK_KEY" -H "Content-Type: application/json" \
  -d '{"source":"comfyui","name":"api/1a2b3c/abc_00001_.png","meta":{"prompt":"…","model":"z-image-turbo","owner":"user@example.com","source_ref":"api:gen_123"}}'
curl "https://media-bank.siteaccess.ru/v1/assets?q=кофе на рассвете&kind=image&orientation=landscape&limit=20" -H "Authorization: Bearer $BANK_KEY"
ПараметрЗначение
qзапрос словами на любом языке — поиск по смыслу (векторы bge-m3) и по словам
similarid файла — похожие (по картинке и по смыслу)
kindimage, video, audio, voice
category, tagsкатегория (начало строки, например «Еда и напитки»), теги через запятую — все должны быть
orientation, ratiolandscape / portrait / square; 16:9, 4:3, 1:1, 9:16 …
peopletrue / false — есть ли люди
source, statusисточник (comfyui, studio, music, lovable, ваш сервис); new / ready / failed
limit, offsetдо 200, по умолчанию 40

Без q и similar — новые сверху. Поиск по картинке: POST /v1/search/by-image с изображением в теле.

Файлы

urls в ответе — постоянные ссылки API. По ним (с ключом) отдаётся переадресация на подписанную ссылку S3 на 1 час: перемотка видео и докачка работают, файл идёт напрямую из хранилища.

Метаданные

ПолеТип
title, description, categoryстрокаесли не заданы — заполнит банк
tagsмассив строкпри загрузке объединяются, в PATCH — заменяются
prompt, model, paramsстрока, строка, объектдля сгенерированных файлов
ownerстрокакто создал (email или id) — для истории, доступ не ограничивает
source, source_refстрокасервис и id в нём (по умолчанию source — имя ключа)

Объект файла

{
  "id": "b3f9c2a1d4e5", "kind": "image", "source": "comfyui", "source_ref": "api:gen_123",
  "owner": "user@example.com", "created_by": "api.siteaccess.ru", "status": "ready",
  "title": "Кофейня на рассвете", "description": "…", "tags": ["кофе", "интерьер"], "category": "Еда и напитки / Кофе",
  "prompt": "…", "model": "z-image-turbo", "params": {"seed": 42},
  "width": 1344, "height": 768, "ratio": "16:9", "orientation": "landscape", "mime": "image/png", "bytes": 1543210,
  "urls": {"original": "https://media-bank.siteaccess.ru/v1/assets/b3f9c2a1d4e5/original", "w800": "…"},
  "created_at": "2026-11-13T10:00:00Z"
}

Ошибки

{ "error": { "message": "invalid or missing API key", "type": "authentication_error" } }

400 неверный запрос · 401 нет ключа · 403 у ключа нет прав · 404 не найдено · 413 файл больше 500 МБ · 500 внутренняя ошибка.