Загрузка файлов

/v1/storage/upload используется только для подготовки файлов к последующим API-запросам. Endpoint возвращает публичный URL, а уже этот URL передается в параметры модели: imageUrls, imageUrl, audioUrl, videoUrl или другое поле, которое явно указано на странице конкретной модели.

Контракт

Endpoint
POST https://api.mashagpt.ru/v1/storage/upload
Авторизация
Передайте API-ключ в заголовке x-api-key. Session/Bearer тоже поддерживается приложением, но для внешних API-интеграций используйте именно x-api-key.
Body
Только multipart/form-data с одним полем file. За один запрос загружается один файл.
Ответ
JSON вида {"url":"https://static.mashagpt.ru/..."}. Сохраните этот URL и передайте его в запрос модели.
Размер
До 12 МБ без активной подписки, до 50 МБ с активной подпиской. Multipart body имеет небольшой служебный overhead, поэтому не отправляйте файл ровно на границе лимита.
preserveFormat
Необязательный query-параметр ?preserveFormat=true. Используйте, когда downstream-модель требует исходный JPEG/PNG/MOV/MP4 формат. Без него небольшие изображения могут быть оптимизированы в WebP.

Правильная загрузка

Отправляйте настоящий файл как multipart-part. Не выставляйте заголовок Content-Type вручную: HTTP-клиент сам добавит boundary для multipart-запроса.

curl -X POST "https://api.mashagpt.ru/v1/storage/upload" \
  -H "x-api-key: YOUR_API_KEY" \
  -F "file=@./reference.png"
const input = document.querySelector('input[type="file"]');
const file = input.files[0];

const form = new FormData();
form.append("file", file, file.name);

const uploadResponse = await fetch("https://api.mashagpt.ru/v1/storage/upload", {
  method: "POST",
  headers: {
    "x-api-key": apiKey,
  },
  body: form,
});

if (!uploadResponse.ok) {
  throw new Error(await uploadResponse.text());
}

const { url } = await uploadResponse.json();
Если файл создан в коде
Если у вас не File из input, а сгенерированный бинарный контент, оберните его в File с нормальным именем и MIME: например new File([bytes], "reference.png", { type: "image/png" }). Не отправляйте строку blob:..., data:... или base64 в JSON.

Как использовать URL

После загрузки в JSON-запрос модели передается только URL из ответа storage. Название параметра зависит от модели и указано в её документации.

const taskResponse = await fetch("https://api.mashagpt.ru/v1/tasks/nano-banana-pro", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "x-api-key": apiKey,
  },
  body: JSON.stringify({
    prompt: "Сделай продуктовый баннер в стиле референса",
    imageUrls: [url],
    resolution: "2K",
    aspectRatio: "16:9",
  }),
});
Не передавайте локальные ссылки в модель
blob:http://localhost/..., file:///Users/..., data:image/png;base64,... и сырые байты внутри JSON не являются публичными URL. Модель их не скачает. Сначала загрузите файл через /v1/storage/upload и используйте полученный https://static.mashagpt.ru/....

Поддерживаемые типы

Изображения
JPEG/JPG, PNG, GIF, WebP.
Аудио
MP3/MPEG, M4A/MP4 audio, WAV, WebM, OGG, FLAC, AAC, AIFF.
Видео
MP4, MPEG/MPG, MOV/QuickTime, AVI, FLV, WebM, WMV, 3GP.
Документы и текст
PDF, DOC, DOCX, XLSX, PPTX, JSON, TXT, HTML, CSS, CSV, XML, JavaScript, Markdown, YAML, Python, shell, C/C++ source/header.
Архивы
ZIP, RAR, 7z, TAR, GZIP, BZIP2.

MIME определяется по загруженной части и имени файла. Если отправить файл без имени, без MIME или с неподдерживаемым типом, API вернет ошибку вроде Mimetype is required или Unsupported content type.