# Загрузить файл

`POST https://api.souz.ai/v1/files`

Референс для генераций: картинка (`png`/`jpeg`/`webp`, до 50 МиБ, JPEG до 300 Мп), ролик
(`mp4`/`mov`, до 200 МиБ), звук (`wav`/`mp3`, до 15 МиБ). Полученный `file_…`
подставляется в поля запросов вместо байтов. Файл живёт 1 день. Тяжёлые
картинки-референсы загружайте так заранее: тело запроса генерации остаётся маленьким, и
запрос принимается сразу. Загрузки аккаунта, срок которых ещё не вышел, — не больше
10 ГБ, после первого пополнения — не больше 50 ГБ; сверх — `413 storage_limit_exceeded`.
Файлы, присланные в самом запросе, в квоту не входят.

## Авторизация

- `BearerAuth`: API-ключ из кабинета souz.ai — запускает модели. Ключ управления здесь не подходит: `403 forbidden` с `detail[].reason: requires_api_key`.

## Тело запроса (`multipart/form-data`)

Схема `FileUploadRequest`.

| Поле | Обязательно | Тип | Описание |
|---|---|---|---|
| `file` | да | `string` | Файл; имя берётся из части формы. |
| `purpose` | нет | `string` | Поле SDK OpenAI; принимается и ни на что не влияет. |

## Пример запроса

```bash
curl -X POST 'https://api.souz.ai/v1/files' \
  -H "Authorization: Bearer $SOUZ_API_KEY" \
  -F 'file=@file.png'
```

```python
import os
import requests

response = requests.post(
    "https://api.souz.ai/v1/files",
    headers={"Authorization": f"Bearer {os.environ['SOUZ_API_KEY']}"},
    files={"file": open("file.png", "rb")},
)
print(response.json())
```

```ts
import { openAsBlob } from "node:fs";

const form = new FormData();
form.append("file", await openAsBlob("file.png"), "file.png");

const response = await fetch("https://api.souz.ai/v1/files", {
  method: "POST",
  headers: { Authorization: `Bearer ${process.env.SOUZ_API_KEY}` },
  body: form,
});
console.log(await response.json());
```

## Ответы

### 201

Файл сохранён.

- `application/json`, схема `File`

### 400

Запрос отклонён; `error.detail[]` называет поля и допустимые значения.

- `application/json`, схема `Error`

```json
{
  "error": {
    "code": "capability_mismatch",
    "detail": [
      {
        "allowed": [
          "1:1",
          "16:9",
          "9:16"
        ],
        "path": "aspect_ratio",
        "reason": "unsupported_value"
      }
    ],
    "message": "the model does not support this value",
    "type": "invalid_request_error"
  }
}
```

### 401

Нет ключа или ключ недействителен.

- `application/json`, схема `Error`

### 403

Нельзя: у ключа не тот вид (модели запускает API-ключ, аккаунт — ключ управления), у роли участника нет права или подпись ссылки на файл не сходится. `detail[].reason` говорит, что именно: `requires_api_key`, `requires_management_key`, `cabinet_only` (только в кабинете), `insufficient_role` (в `allowed` — роли, которым можно), `not_key_author` (секрет ключа открывает только тот, кто его создал).

- `application/json`, схема `Error`

```json
{
  "error": {
    "code": "forbidden",
    "detail": [
      {
        "reason": "requires_api_key"
      }
    ],
    "message": "this endpoint takes an API key; a management key manages the account only",
    "type": "permission_error"
  }
}
```

### 413

Тело или файл больше предела (`invalid_input`, `detail[].reason: too_large`) или — только у `POST /v1/files` — загрузки аккаунта заняли квоту (`storage_limit_exceeded`).

- `application/json`, схема `Error`

### 415

Тип тела не тот, что принимает метод: `Content-Type: application/json` (у загрузки файла и транскрибации — `multipart/form-data`). В `detail[]` — `{"path": "body", "reason": "unsupported_format"}` и принимаемые типы.

- `application/json`, схема `Error`

### 429

Слишком часто — повторите через `Retry-After` секунд. Запуск моделей, задачи и файлы результатов частотой не ограничены (их ограничивают баланс и лимиты трат); здесь 429 — на поток запросов с ключом, который сервер не знает, с одного адреса, и на потоки сверх 1000 одновременных на аккаунт (события задачи, чат с `stream: true`). Пределы — раздел «Лимиты» руководства.

- `application/json`, схема `Error`

### 503

Сервер занят большими запросами (`overloaded`) — повторите через `Retry-After`. На плановых работах — `maintenance` (ответ `Maintenance`).

- `application/json`, схема `Error`

---

Оглавление документации: https://souz.ai/llms.txt. Всё руководство одним файлом: https://souz.ai/llms-full.txt. Справочник методов: https://souz.ai/docs/api-reference.md.
